use scopegraphs_macros::compile_regex;
use scopegraphs_regular_expressions::RegexMatcher;
pub enum Alphabet {
A,
B,
C,
}
#[test]
fn test_repeat() {
use Alphabet::*;
compile_regex!(type Machine<Alphabet> = A* B);
assert!(Machine::new().accepts([B]));
assert!(Machine::new().accepts([A, B]));
assert!(Machine::new().accepts([A, A, A, B]));
assert!(!Machine::new().accepts([B, B]));
assert!(!Machine::new().accepts([B, A]));
assert!(!Machine::new().accepts([A, B, A]));
assert!(!Machine::new().accepts([A; 0]));
}
#[test]
fn test_concat() {
use Alphabet::*;
compile_regex!(type Machine<Alphabet> = A B);
assert!(Machine::new().accepts([A, B]));
assert!(!Machine::new().accepts([B, A]));
assert!(!Machine::new().accepts([A; 0]));
assert!(!Machine::new().accepts([A]));
assert!(!Machine::new().accepts([A, B, C]));
}
#[test]
fn test_optional() {
use Alphabet::*;
compile_regex!(type Machine<Alphabet> = A B?);
assert!(!Machine::new().accepts([A; 0]));
assert!(Machine::new().accepts([A]));
assert!(Machine::new().accepts([A, B]));
assert!(!Machine::new().accepts([A, B, C]));
}
#[test]
fn test_one_or_more() {
use Alphabet::*;
compile_regex!(type Machine<Alphabet> = A+);
assert!(!Machine::new().accepts([A; 0]));
assert!(Machine::new().accepts([A]));
assert!(Machine::new().accepts([A, A]));
assert!(Machine::new().accepts([A, A, A, A]));
assert!(!Machine::new().accepts([B]));
assert!(!Machine::new().accepts([A, B]));
}
#[test]
fn test_or_2() {
use Alphabet::*;
compile_regex!(type Machine<Alphabet> = A | B);
assert!(!Machine::new().accepts([A; 0]));
assert!(Machine::new().accepts([A]));
assert!(Machine::new().accepts([B]));
assert!(!Machine::new().accepts([C]));
}
#[test]
fn test_or_3() {
use Alphabet::*;
compile_regex!(type Machine<Alphabet> = A | B | C);
assert!(!Machine::new().accepts([A; 0]));
assert!(Machine::new().accepts([A]));
assert!(Machine::new().accepts([B]));
assert!(Machine::new().accepts([C]));
}
#[test]
fn test_repeat_or_2() {
use Alphabet::*;
compile_regex!(type Machine<Alphabet> = A* (A | B));
assert!(!Machine::new().accepts([A; 0]));
assert!(Machine::new().accepts([A]));
assert!(Machine::new().accepts([B]));
}
#[test]
fn test_repeat_or_3() {
use Alphabet::*;
compile_regex!(type Machine<Alphabet> = A* (A | B | C));
assert!(!Machine::new().accepts([A; 0]));
assert!(Machine::new().accepts([A]));
assert!(Machine::new().accepts([B]));
assert!(Machine::new().accepts([C]));
}
#[test]
fn test_negate() {
use Alphabet::*;
compile_regex!(type Machine<Alphabet> = ~A);
assert!(Machine::new().accepts([A; 0]));
assert!(!Machine::new().accepts([A]));
assert!(Machine::new().accepts([B]));
assert!(Machine::new().accepts([C]));
}
#[test]
fn test_negate_or() {
use Alphabet::*;
compile_regex!(#[graph="negate_or.dot"] type Machine<Alphabet> = ~(A | B));
assert!(Machine::new().accepts([A; 0]));
assert!(!Machine::new().accepts([A]));
assert!(!Machine::new().accepts([B]));
assert!(Machine::new().accepts([C]));
}