pub mod common;
use common::*;
#[test]
fn unicode_sets_breaking_change_from_u_to_v_01() {
test_parse_fails_flags(r#"[(]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_02() {
test_parse_fails_flags(r#"[)]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_03() {
test_parse_fails_flags(r#"[[]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_04() {
test_parse_fails_flags(r#"[{]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_05() {
test_parse_fails_flags(r#"[}]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_06() {
test_parse_fails_flags(r#"[/]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_07() {
test_parse_fails_flags(r#"[-]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_08() {
test_parse_fails_flags(r#"[|]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_09() {
test_parse_fails_flags(r#"[&&]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_10() {
test_parse_fails_flags(r#"[!!]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_11() {
test_parse_fails_flags(r#"[##]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_12() {
test_parse_fails_flags(r#"[$$]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_13() {
test_parse_fails_flags(r#"[%%]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_14() {
test_parse_fails_flags(r#"[**]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_15() {
test_parse_fails_flags(r#"[++]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_16() {
test_parse_fails_flags(r#"[,,]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_17() {
test_parse_fails_flags(r#"[..]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_18() {
test_parse_fails_flags(r#"[::]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_19() {
test_parse_fails_flags(r#"[;;]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_20() {
test_parse_fails_flags(r#"[<<]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_21() {
test_parse_fails_flags(r#"[==]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_22() {
test_parse_fails_flags(r#"[>>]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_23() {
test_parse_fails_flags(r#"[??]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_24() {
test_parse_fails_flags(r#"[@@]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_25() {
test_parse_fails_flags(r#"[``]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_26() {
test_parse_fails_flags(r#"[~~]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_27() {
test_parse_fails_flags(r#"[^^^]"#, "v");
}
#[test]
fn unicode_sets_breaking_change_from_u_to_v_28() {
test_parse_fails_flags(r#"[_^^]"#, "v");
}
fn test_unicode_sets_matches(tc: TestConfig, expression: &str, matches: &[&str], fails: &[&str]) {
for m in matches {
tc.test_match_succeeds(expression, "v", m);
}
for f in fails {
tc.test_match_fails(expression, "v", f);
}
}
#[test]
fn unicode_sets_rgi_emoji_13_1() {
const EXPRESSION: &str = "^\\p{RGI_Emoji}+$";
const MATCHES: &[&str] = &[
"\u{2764}\u{FE0F}\u{200D}\u{1F525}",
"\u{2764}\u{FE0F}\u{200D}\u{1FA79}",
"\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F468}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F468}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F468}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F468}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F468}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FB}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FC}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FD}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FE}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FF}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FB}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FC}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FD}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FE}",
"\u{1F469}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FF}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FB}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FC}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FD}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FE}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FF}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FB}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FC}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FD}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FE}",
"\u{1F469}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FF}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FB}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FC}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FD}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FE}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FF}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FB}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FC}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FD}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FE}",
"\u{1F469}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FF}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FB}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FC}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FD}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FE}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FF}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FB}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FC}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FD}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FE}",
"\u{1F469}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FF}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FB}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FC}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FD}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FE}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}\u{1F3FF}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FB}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FC}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FD}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FE}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}\u{1F3FF}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FB}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FC}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FD}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FE}",
"\u{1F469}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}\u{1F3FF}",
"\u{1F48F}\u{1F3FB}",
"\u{1F48F}\u{1F3FC}",
"\u{1F48F}\u{1F3FD}",
"\u{1F48F}\u{1F3FE}",
"\u{1F48F}\u{1F3FF}",
"\u{1F491}\u{1F3FB}",
"\u{1F491}\u{1F3FC}",
"\u{1F491}\u{1F3FD}",
"\u{1F491}\u{1F3FE}",
"\u{1F491}\u{1F3FF}",
"\u{1F62E}\u{200D}\u{1F4A8}",
"\u{1F635}\u{200D}\u{1F4AB}",
"\u{1F636}\u{200D}\u{1F32B}\u{FE0F}",
"\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FC}",
"\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FD}",
"\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FE}",
"\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FF}",
"\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FC}",
"\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FD}",
"\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FE}",
"\u{1F9D1}\u{1F3FB}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FF}",
"\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FB}",
"\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FD}",
"\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FE}",
"\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FF}",
"\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FB}",
"\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FD}",
"\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FE}",
"\u{1F9D1}\u{1F3FC}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FF}",
"\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FB}",
"\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FC}",
"\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FE}",
"\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FF}",
"\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FB}",
"\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FC}",
"\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FE}",
"\u{1F9D1}\u{1F3FD}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FF}",
"\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FB}",
"\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FC}",
"\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FD}",
"\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FF}",
"\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FB}",
"\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FC}",
"\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FD}",
"\u{1F9D1}\u{1F3FE}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FF}",
"\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FB}",
"\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FC}",
"\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FD}",
"\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F9D1}\u{1F3FE}",
"\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FB}",
"\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FC}",
"\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FD}",
"\u{1F9D1}\u{1F3FF}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F9D1}\u{1F3FE}",
"\u{1F9D4}\u{200D}\u{2640}\u{FE0F}",
"\u{1F9D4}\u{200D}\u{2642}\u{FE0F}",
"\u{1F9D4}\u{1F3FB}\u{200D}\u{2640}\u{FE0F}",
"\u{1F9D4}\u{1F3FB}\u{200D}\u{2642}\u{FE0F}",
"\u{1F9D4}\u{1F3FC}\u{200D}\u{2640}\u{FE0F}",
"\u{1F9D4}\u{1F3FC}\u{200D}\u{2642}\u{FE0F}",
"\u{1F9D4}\u{1F3FD}\u{200D}\u{2640}\u{FE0F}",
"\u{1F9D4}\u{1F3FD}\u{200D}\u{2642}\u{FE0F}",
"\u{1F9D4}\u{1F3FE}\u{200D}\u{2640}\u{FE0F}",
"\u{1F9D4}\u{1F3FE}\u{200D}\u{2642}\u{FE0F}",
"\u{1F9D4}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}",
"\u{1F9D4}\u{1F3FF}\u{200D}\u{2642}\u{FE0F}",
];
const FAILS: &[&str] = &[];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_rgi_emoji_14_0() {
const EXPRESSION: &str = "^\\p{RGI_Emoji}+$";
const MATCHES: &[&str] = &[
"\u{1F6DD}",
"\u{1F6DE}",
"\u{1F6DF}",
"\u{1F7F0}",
"\u{1F91D}\u{1F3FB}",
"\u{1F91D}\u{1F3FC}",
"\u{1F91D}\u{1F3FD}",
"\u{1F91D}\u{1F3FE}",
"\u{1F91D}\u{1F3FF}",
"\u{1F979}",
"\u{1F9CC}",
"\u{1FA7B}",
"\u{1FA7C}",
"\u{1FAA9}",
"\u{1FAAA}",
"\u{1FAAB}",
"\u{1FAAC}",
"\u{1FAB7}",
"\u{1FAB8}",
"\u{1FAB9}",
"\u{1FABA}",
"\u{1FAC3}",
"\u{1FAC3}\u{1F3FB}",
"\u{1FAC3}\u{1F3FC}",
"\u{1FAC3}\u{1F3FD}",
"\u{1FAC3}\u{1F3FE}",
"\u{1FAC3}\u{1F3FF}",
"\u{1FAC4}",
"\u{1FAC4}\u{1F3FB}",
"\u{1FAC4}\u{1F3FC}",
"\u{1FAC4}\u{1F3FD}",
"\u{1FAC4}\u{1F3FE}",
"\u{1FAC4}\u{1F3FF}",
"\u{1FAC5}",
"\u{1FAC5}\u{1F3FB}",
"\u{1FAC5}\u{1F3FC}",
"\u{1FAC5}\u{1F3FD}",
"\u{1FAC5}\u{1F3FE}",
"\u{1FAC5}\u{1F3FF}",
"\u{1FAD7}",
"\u{1FAD8}",
"\u{1FAD9}",
"\u{1FAE0}",
"\u{1FAE1}",
"\u{1FAE2}",
"\u{1FAE3}",
"\u{1FAE4}",
"\u{1FAE5}",
"\u{1FAE6}",
"\u{1FAE7}",
"\u{1FAF0}",
"\u{1FAF0}\u{1F3FB}",
"\u{1FAF0}\u{1F3FC}",
"\u{1FAF0}\u{1F3FD}",
"\u{1FAF0}\u{1F3FE}",
"\u{1FAF0}\u{1F3FF}",
"\u{1FAF1}",
"\u{1FAF1}\u{1F3FB}",
"\u{1FAF1}\u{1F3FB}\u{200D}\u{1FAF2}\u{1F3FC}",
"\u{1FAF1}\u{1F3FB}\u{200D}\u{1FAF2}\u{1F3FD}",
"\u{1FAF1}\u{1F3FB}\u{200D}\u{1FAF2}\u{1F3FE}",
"\u{1FAF1}\u{1F3FB}\u{200D}\u{1FAF2}\u{1F3FF}",
"\u{1FAF1}\u{1F3FC}",
"\u{1FAF1}\u{1F3FC}\u{200D}\u{1FAF2}\u{1F3FB}",
"\u{1FAF1}\u{1F3FC}\u{200D}\u{1FAF2}\u{1F3FD}",
"\u{1FAF1}\u{1F3FC}\u{200D}\u{1FAF2}\u{1F3FE}",
"\u{1FAF1}\u{1F3FC}\u{200D}\u{1FAF2}\u{1F3FF}",
"\u{1FAF1}\u{1F3FD}",
"\u{1FAF1}\u{1F3FD}\u{200D}\u{1FAF2}\u{1F3FB}",
"\u{1FAF1}\u{1F3FD}\u{200D}\u{1FAF2}\u{1F3FC}",
"\u{1FAF1}\u{1F3FD}\u{200D}\u{1FAF2}\u{1F3FE}",
"\u{1FAF1}\u{1F3FD}\u{200D}\u{1FAF2}\u{1F3FF}",
"\u{1FAF1}\u{1F3FE}",
"\u{1FAF1}\u{1F3FE}\u{200D}\u{1FAF2}\u{1F3FB}",
"\u{1FAF1}\u{1F3FE}\u{200D}\u{1FAF2}\u{1F3FC}",
"\u{1FAF1}\u{1F3FE}\u{200D}\u{1FAF2}\u{1F3FD}",
"\u{1FAF1}\u{1F3FE}\u{200D}\u{1FAF2}\u{1F3FF}",
"\u{1FAF1}\u{1F3FF}",
"\u{1FAF1}\u{1F3FF}\u{200D}\u{1FAF2}\u{1F3FB}",
"\u{1FAF1}\u{1F3FF}\u{200D}\u{1FAF2}\u{1F3FC}",
"\u{1FAF1}\u{1F3FF}\u{200D}\u{1FAF2}\u{1F3FD}",
"\u{1FAF1}\u{1F3FF}\u{200D}\u{1FAF2}\u{1F3FE}",
"\u{1FAF2}",
"\u{1FAF2}\u{1F3FB}",
"\u{1FAF2}\u{1F3FC}",
"\u{1FAF2}\u{1F3FD}",
"\u{1FAF2}\u{1F3FE}",
"\u{1FAF2}\u{1F3FF}",
"\u{1FAF3}",
"\u{1FAF3}\u{1F3FB}",
"\u{1FAF3}\u{1F3FC}",
"\u{1FAF3}\u{1F3FD}",
"\u{1FAF3}\u{1F3FE}",
"\u{1FAF3}\u{1F3FF}",
"\u{1FAF4}",
"\u{1FAF4}\u{1F3FB}",
"\u{1FAF4}\u{1F3FC}",
"\u{1FAF4}\u{1F3FD}",
"\u{1FAF4}\u{1F3FE}",
"\u{1FAF4}\u{1F3FF}",
"\u{1FAF5}",
"\u{1FAF5}\u{1F3FB}",
"\u{1FAF5}\u{1F3FC}",
"\u{1FAF5}\u{1F3FD}",
"\u{1FAF5}\u{1F3FE}",
"\u{1FAF5}\u{1F3FF}",
"\u{1FAF6}",
"\u{1FAF6}\u{1F3FB}",
"\u{1FAF6}\u{1F3FC}",
"\u{1FAF6}\u{1F3FD}",
"\u{1FAF6}\u{1F3FE}",
"\u{1FAF6}\u{1F3FF}",
];
const FAILS: &[&str] = &[];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_union_character_class_escape() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}\\d]+$";
const MATCHES: &[&str] = &[
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b",
"c", "d", "e", "f",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_intersection_character_class() {
const EXPRESSION: &str = "^[_&&[0-9]]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"_",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_union_character_property_escape() {
const EXPRESSION: &str = "^[[0-9]\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &[
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b",
"c", "d", "e", "f",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_intersection_character_class_escape() {
const EXPRESSION: &str = "^[\\d&&\\d]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_intersection_character() {
const EXPRESSION: &str = "^[\\d&&_]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_difference_character_property_escape() {
const EXPRESSION: &str = "^[_--\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &["_"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_intersection_character() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}&&_]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"2",
"4",
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_difference_character_property_escape() {
const EXPRESSION: &str = "^[\\d--\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_intersection_string_literal() {
const EXPRESSION: &str = "^[[0-9]&&\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &["0", "2", "4"];
const FAILS: &[&str] = &[
"1",
"3",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_intersection_character_class() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}&&[0-9]]+$";
const MATCHES: &[&str] = &["0", "2", "4"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_difference_character_class_escape() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}--\\d]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_difference_character_class_escape() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}--\\d]+$";
const MATCHES: &[&str] = &["9\u{FE0F}\u{20E3}"];
const FAILS: &[&str] = &[
"0",
"2",
"4",
"6\u{FE0F}\u{20E3}",
"7",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_difference_character() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}--_]+$";
const MATCHES: &[&str] = &["0", "2", "4", "9\u{FE0F}\u{20E3}"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_intersection_string_literal() {
const EXPRESSION: &str = "^[\\d&&\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &["0", "2", "4"];
const FAILS: &[&str] = &[
"1",
"3",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_difference_string_literal() {
const EXPRESSION: &str = "^[[0-9]--\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &["1", "3", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"0",
"2",
"4",
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_intersection_character_class_escape() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}&&\\d]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_difference_character_class() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}--[0-9]]+$";
const MATCHES: &[&str] = &["A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f"];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_difference_string_literal() {
const EXPRESSION: &str = "^[_--\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &["_"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_difference_string_literal() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}--\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &[
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_intersection_string_literal() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}&&\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &["9\u{FE0F}\u{20E3}"];
const FAILS: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_difference_property_of_strings_escape() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}--\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &["0", "2", "4"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_union_character_class() {
const EXPRESSION: &str = "^[[0-9][0-9]]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_difference_string_literal() {
const EXPRESSION: &str = "^[\\d--\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &["1", "3", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"0",
"2",
"4",
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_difference_property_of_strings_escape() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}--\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &[
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b",
"c", "d", "e", "f",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_difference_property_of_strings_escape() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}--\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_union_property_of_strings_escape() {
const EXPRESSION: &str = "^[_\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"_",
];
const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_union_string_literal() {
const EXPRESSION: &str = "^[\\d\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_union_character_property_escape() {
const EXPRESSION: &str = "^[\\d\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &[
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b",
"c", "d", "e", "f",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_union_character_class() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}[0-9]]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0",
"0\u{FE0F}\u{20E3}",
"1",
"1\u{FE0F}\u{20E3}",
"2",
"2\u{FE0F}\u{20E3}",
"3",
"3\u{FE0F}\u{20E3}",
"4",
"4\u{FE0F}\u{20E3}",
"5",
"5\u{FE0F}\u{20E3}",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"7\u{FE0F}\u{20E3}",
"8",
"8\u{FE0F}\u{20E3}",
"9",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &["C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_difference_string_literal() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}--\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &[
"1", "3", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e",
"f",
];
const FAILS: &[&str] = &[
"0",
"2",
"4",
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_union_character_property_escape() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"A",
"B",
"C",
"D",
"E",
"F",
"a",
"b",
"c",
"d",
"e",
"f",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_union_character_property_escape() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0",
"0\u{FE0F}\u{20E3}",
"1",
"1\u{FE0F}\u{20E3}",
"2",
"2\u{FE0F}\u{20E3}",
"3",
"3\u{FE0F}\u{20E3}",
"4",
"4\u{FE0F}\u{20E3}",
"5",
"5\u{FE0F}\u{20E3}",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"7\u{FE0F}\u{20E3}",
"8",
"8\u{FE0F}\u{20E3}",
"9",
"9\u{FE0F}\u{20E3}",
"A",
"B",
"C",
"D",
"E",
"F",
"a",
"b",
"c",
"d",
"e",
"f",
];
const FAILS: &[&str] = &["\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_intersection_character() {
const EXPRESSION: &str = "^[_&&_]+$";
const MATCHES: &[&str] = &["_"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_intersection_character_property_escape() {
const EXPRESSION: &str = "^[_&&\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"_",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_union_character_property_escape() {
const EXPRESSION: &str = "^[_\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &[
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "_", "a",
"b", "c", "d", "e", "f",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_union_string_literal() {
const EXPRESSION: &str = "^[[0-9]\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_union_character_class_escape() {
const EXPRESSION: &str = "^[\\d\\d]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_intersection_character() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}&&_]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_intersection_character_class() {
const EXPRESSION: &str = "^[[0-9]&&[0-9]]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_intersection_character_class_escape() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}&&\\d]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"A",
"B",
"C",
"D",
"E",
"F",
"a",
"b",
"c",
"d",
"e",
"f",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_difference_string_literal() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}--\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"2",
"4",
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_intersection_character() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}&&_]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"A",
"B",
"C",
"D",
"E",
"F",
"a",
"b",
"c",
"d",
"e",
"f",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_union_character_class() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}[0-9]]+$";
const MATCHES: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_union_property_of_strings_escape() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_union_string_literal() {
const EXPRESSION: &str = "^[_\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &["0", "2", "4", "9\u{FE0F}\u{20E3}", "_"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_union_string_literal() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &["0", "2", "4", "9\u{FE0F}\u{20E3}"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_intersection_character_class() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}&&[0-9]]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"A",
"B",
"C",
"D",
"E",
"F",
"a",
"b",
"c",
"d",
"e",
"f",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_intersection_character_class() {
const EXPRESSION: &str = "^[\\d&&[0-9]]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_difference_character() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}--_]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_intersection_string_literal() {
const EXPRESSION: &str = "^[_&&\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"_",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_difference_property_of_strings_escape() {
const EXPRESSION: &str = "^[\\d--\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_union_character_class_escape() {
const EXPRESSION: &str = "^[[0-9]\\d]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_union_character_property_escape() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &[
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b",
"c", "d", "e", "f",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_union_character() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}_]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"_",
];
const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_union_character_class_escape() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}\\d]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0",
"0\u{FE0F}\u{20E3}",
"1",
"1\u{FE0F}\u{20E3}",
"2",
"2\u{FE0F}\u{20E3}",
"3",
"3\u{FE0F}\u{20E3}",
"4",
"4\u{FE0F}\u{20E3}",
"5",
"5\u{FE0F}\u{20E3}",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"7\u{FE0F}\u{20E3}",
"8",
"8\u{FE0F}\u{20E3}",
"9",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &["C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_intersection_character_property_escape() {
const EXPRESSION: &str = "^[[0-9]&&\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_union_character() {
const EXPRESSION: &str = "^[\\d_]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "_"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_difference_character_class_escape() {
const EXPRESSION: &str = "^[[0-9]--\\d]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_intersection_character_class() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}&&[0-9]]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_intersection_string_literal() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}&&\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_union_string_literal() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"A",
"B",
"C",
"D",
"E",
"F",
"a",
"b",
"c",
"d",
"e",
"f",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_difference_property_of_strings_escape() {
const EXPRESSION: &str = "^[[0-9]--\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_difference_character_property_escape() {
const EXPRESSION: &str = "^[[0-9]--\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_difference_character() {
const EXPRESSION: &str = "^[[0-9]--_]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_difference_character_property_escape() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}--\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &["9\u{FE0F}\u{20E3}"];
const FAILS: &[&str] = &[
"0",
"2",
"4",
"6\u{FE0F}\u{20E3}",
"7",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_union_property_of_strings_escape() {
const EXPRESSION: &str = "^[\\d\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0",
"0\u{FE0F}\u{20E3}",
"1",
"1\u{FE0F}\u{20E3}",
"2",
"2\u{FE0F}\u{20E3}",
"3",
"3\u{FE0F}\u{20E3}",
"4",
"4\u{FE0F}\u{20E3}",
"5",
"5\u{FE0F}\u{20E3}",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"7\u{FE0F}\u{20E3}",
"8",
"8\u{FE0F}\u{20E3}",
"9",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &["C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_intersection_character_class_escape() {
const EXPRESSION: &str = "^[[0-9]&&\\d]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_difference_character() {
const EXPRESSION: &str = "^[_--_]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"_",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_difference_character_property_escape() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}--\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"A",
"B",
"C",
"D",
"E",
"F",
"a",
"b",
"c",
"d",
"e",
"f",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_union_character_class_escape() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}\\d]+$";
const MATCHES: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_union_character_class() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}[0-9]]+$";
const MATCHES: &[&str] = &[
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b",
"c", "d", "e", "f",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_union_property_of_strings_escape() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_union_character() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}_]+$";
const MATCHES: &[&str] = &["0", "2", "4", "9\u{FE0F}\u{20E3}", "_"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_difference_character() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}--_]+$";
const MATCHES: &[&str] = &[
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b",
"c", "d", "e", "f",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_rgi_emoji_15_0() {
const EXPRESSION: &str = "^\\p{RGI_Emoji}+$";
const MATCHES: &[&str] = &[
"\u{1F426}\u{200D}\u{2B1B}",
"\u{1F6DC}",
"\u{1FA75}",
"\u{1FA76}",
"\u{1FA77}",
"\u{1FA87}",
"\u{1FA88}",
"\u{1FAAD}",
"\u{1FAAE}",
"\u{1FAAF}",
"\u{1FABB}",
"\u{1FABC}",
"\u{1FABD}",
"\u{1FABF}",
"\u{1FACE}",
"\u{1FACF}",
"\u{1FADA}",
"\u{1FADB}",
"\u{1FAE8}",
"\u{1FAF7}",
"\u{1FAF7}\u{1F3FB}",
"\u{1FAF7}\u{1F3FC}",
"\u{1FAF7}\u{1F3FD}",
"\u{1FAF7}\u{1F3FE}",
"\u{1FAF7}\u{1F3FF}",
"\u{1FAF8}",
"\u{1FAF8}\u{1F3FB}",
"\u{1FAF8}\u{1F3FC}",
"\u{1FAF8}\u{1F3FD}",
"\u{1FAF8}\u{1F3FE}",
"\u{1FAF8}\u{1F3FF}",
];
const FAILS: &[&str] = &[];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_intersection_string_literal() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}&&\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &["0", "2", "4"];
const FAILS: &[&str] = &[
"1",
"3",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"A",
"B",
"C",
"D",
"E",
"F",
"a",
"b",
"c",
"d",
"e",
"f",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_difference_character_class() {
const EXPRESSION: &str = "^[[0-9]--[0-9]]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_intersection_property_of_strings_escape() {
const EXPRESSION: &str = "^[\\d&&\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_intersection_property_of_strings_escape() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}&&\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"A",
"B",
"C",
"D",
"E",
"F",
"a",
"b",
"c",
"d",
"e",
"f",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_difference_character_class() {
const EXPRESSION: &str = "^[\\d--[0-9]]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_difference_character_class() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}--[0-9]]+$";
const MATCHES: &[&str] = &["9\u{FE0F}\u{20E3}"];
const FAILS: &[&str] = &[
"0",
"2",
"4",
"6\u{FE0F}\u{20E3}",
"7",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_intersection_character_property_escape() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}&&\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &["0", "2", "4"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_difference_property_of_strings_escape() {
const EXPRESSION: &str = "^[_--\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &["_"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_intersection_character_class_escape() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}&&\\d]+$";
const MATCHES: &[&str] = &["0", "2", "4"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_union_character_class() {
const EXPRESSION: &str = "^[\\d[0-9]]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_union_character() {
const EXPRESSION: &str = "^[[0-9]_]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "_"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_difference_character_class() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}--[0-9]]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_union_character() {
const EXPRESSION: &str = "^[__]+$";
const MATCHES: &[&str] = &["_"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_union_property_of_strings_escape() {
const EXPRESSION: &str = "^[[0-9]\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0",
"0\u{FE0F}\u{20E3}",
"1",
"1\u{FE0F}\u{20E3}",
"2",
"2\u{FE0F}\u{20E3}",
"3",
"3\u{FE0F}\u{20E3}",
"4",
"4\u{FE0F}\u{20E3}",
"5",
"5\u{FE0F}\u{20E3}",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"7\u{FE0F}\u{20E3}",
"8",
"8\u{FE0F}\u{20E3}",
"9",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &["C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_intersection_character_property_escape() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}&&\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &[
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "a", "b",
"c", "d", "e", "f",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_difference_character_property_escape() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}--\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_intersection_property_of_strings_escape() {
const EXPRESSION: &str = "^[_&&\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"_",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_union_character() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}_]+$";
const MATCHES: &[&str] = &[
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "_", "a",
"b", "c", "d", "e", "f",
];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_difference_character() {
const EXPRESSION: &str = "^[\\d--_]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_intersection_character() {
const EXPRESSION: &str = "^[[0-9]&&_]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_union_character_class() {
const EXPRESSION: &str = "^[_[0-9]]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "_"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_union_property_of_strings_escape() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0",
"0\u{FE0F}\u{20E3}",
"1",
"1\u{FE0F}\u{20E3}",
"2",
"2\u{FE0F}\u{20E3}",
"3",
"3\u{FE0F}\u{20E3}",
"4",
"4\u{FE0F}\u{20E3}",
"5",
"5\u{FE0F}\u{20E3}",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"7\u{FE0F}\u{20E3}",
"8",
"8\u{FE0F}\u{20E3}",
"9",
"9\u{FE0F}\u{20E3}",
"A",
"B",
"C",
"D",
"E",
"F",
"a",
"b",
"c",
"d",
"e",
"f",
];
const FAILS: &[&str] = &["\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_intersection_character_class_escape() {
const EXPRESSION: &str = "^[_&&\\d]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"_",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_property_escape_difference_character_class_escape() {
const EXPRESSION: &str = "^[\\p{ASCII_Hex_Digit}--\\d]+$";
const MATCHES: &[&str] = &["A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f"];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_intersection_character_property_escape() {
const EXPRESSION: &str = "^[\\d&&\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_intersection_property_of_strings_escape() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}&&\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_escape_difference_character_class_escape() {
const EXPRESSION: &str = "^[\\d--\\d]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_class_intersection_property_of_strings_escape() {
const EXPRESSION: &str = "^[[0-9]&&\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"6\u{FE0F}\u{20E3}",
"7",
"8",
"9",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_union_character_class_escape() {
const EXPRESSION: &str = "^[_\\d]+$";
const MATCHES: &[&str] = &["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "_"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_difference_character_class() {
const EXPRESSION: &str = "^[_--[0-9]]+$";
const MATCHES: &[&str] = &["_"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_string_literal_intersection_property_of_strings_escape() {
const EXPRESSION: &str = "^[\\q{0|2|4|9\u{FE0F}\u{20E3}}&&\\p{Emoji_Keycap_Sequence}]+$";
const MATCHES: &[&str] = &["9\u{FE0F}\u{20E3}"];
const FAILS: &[&str] = &[
"0",
"2",
"4",
"6\u{FE0F}\u{20E3}",
"7",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_character_difference_character_class_escape() {
const EXPRESSION: &str = "^[_--\\d]+$";
const MATCHES: &[&str] = &["_"];
const FAILS: &[&str] = &[
"6\u{FE0F}\u{20E3}",
"7",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_intersection_character_property_escape() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}&&\\p{ASCII_Hex_Digit}]+$";
const MATCHES: &[&str] = &[];
const FAILS: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
"C",
"\u{2603}",
"\u{1D306}",
"\u{1F1E7}\u{1F1EA}",
];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_property_of_strings_escape_union_string_literal() {
const EXPRESSION: &str = "^[\\p{Emoji_Keycap_Sequence}\\q{0|2|4|9\u{FE0F}\u{20E3}}]+$";
const MATCHES: &[&str] = &[
"#\u{FE0F}\u{20E3}",
"*\u{FE0F}\u{20E3}",
"0",
"0\u{FE0F}\u{20E3}",
"1\u{FE0F}\u{20E3}",
"2",
"2\u{FE0F}\u{20E3}",
"3\u{FE0F}\u{20E3}",
"4",
"4\u{FE0F}\u{20E3}",
"5\u{FE0F}\u{20E3}",
"6\u{FE0F}\u{20E3}",
"7\u{FE0F}\u{20E3}",
"8\u{FE0F}\u{20E3}",
"9\u{FE0F}\u{20E3}",
];
const FAILS: &[&str] = &["7", "C", "\u{2603}", "\u{1D306}", "\u{1F1E7}\u{1F1EA}"];
test_with_configs_no_ascii(|tc| test_unicode_sets_matches(tc, EXPRESSION, MATCHES, FAILS));
}
#[test]
fn unicode_sets_invalid_patterns() {
test_parse_fails_flags(r#"[ab--c]"#, "v");
test_parse_fails_flags(r#"[a--bc]"#, "v");
test_parse_fails_flags(r#"[ab&&c]"#, "v");
test_parse_fails_flags(r#"[a&&bc]"#, "v");
}
#[test]
fn test_unicode_sets_intersection() {
test_with_configs_no_ascii(test_unicode_sets_intersection_tc)
}
fn test_unicode_sets_intersection_tc(tc: TestConfig) {
tc.test_match_succeeds(r"^[\q{a}]$", "v", "a");
tc.test_match_succeeds(r"^[\q{a}&&\q{a}]$", "v", "a");
tc.test_match_fails(r"^[\q{a}&&\q{b}]$", "v", "a");
tc.test_match_fails(r"^[\q{a}&&\q{b}&&\q{a}]$", "v", "a");
tc.test_match_succeeds(r"^[\q{ab}]$", "v", "ab");
tc.test_match_succeeds(r"^[\q{ab}&&\q{ab}]$", "v", "ab");
tc.test_match_fails(r"^[\q{ab}&&\q{bc}]$", "v", "ab");
tc.test_match_fails(r"^[\q{ab}&&\q{bc}&&\q{ab}]$", "v", "ab");
tc.test_match_succeeds(r"^[\q{ab|bc}&&\q{ab}]$", "v", "ab");
tc.test_match_fails(r"^[\q{ab|bc}&&\q{ab}&&\q{bc}]$", "v", "ab");
tc.test_match_fails(r"^[\q{ab|bc}&&\q{ab}&&\q{bc}]$", "v", "bc");
tc.test_match_succeeds(r"^[\q{a}&&a]$", "v", "a");
tc.test_match_fails(r"^[\q{a}&&b]$", "v", "a");
tc.test_match_fails(r"^[\q{a}&&b]$", "v", "b");
tc.test_match_fails(r"^[\q{ab}&&b]$", "v", "ab");
tc.test_match_fails(r"^[\q{ab}&&b]$", "v", "b");
tc.test_match_succeeds(r"^[\q{ab}c]$", "v", "ab");
tc.test_match_succeeds(r"^[\q{ab}c]$", "v", "c");
}
#[test]
fn test_unicode_sets_subtraction() {
test_with_configs_no_ascii(test_unicode_sets_subtraction_tc)
}
fn test_unicode_sets_subtraction_tc(tc: TestConfig) {
tc.test_match_succeeds(r"^[\q{a|b}--a]$", "v", "b");
tc.test_match_fails(r"^[\q{a|b}--a]$", "v", "a");
tc.test_match_succeeds(r"^[\q{a|b}--\q{a|c}]$", "v", "b");
tc.test_match_fails(r"^[\q{a|b}--\q{a|c}]$", "v", "a");
tc.test_match_fails(r"^[\q{a|b}--\q{a|c}]$", "v", "c");
tc.test_match_fails(r"^[a--\q{a|b}]+$", "v", "a");
tc.test_match_fails(r"^[a--\q{a|b}]+$", "v", "b");
tc.test_match_fails(r"^[c--\q{a|b}]+$", "v", "a");
tc.test_match_fails(r"^[c--\q{a|b}]+$", "v", "b");
tc.test_match_succeeds(r"^[c--\q{a|b}]+$", "v", "c");
}
#[test]
fn test_unicode_sets_nested_class() {
test_with_configs_no_ascii(test_unicode_sets_nested_class_tc)
}
fn test_unicode_sets_nested_class_tc(tc: TestConfig) {
tc.test_match_succeeds(r"^[[ab]]$", "v", "a");
tc.test_match_succeeds(r"^[[ab]]$", "v", "b");
tc.test_match_succeeds(r"^[[ab][c]]$", "v", "a");
tc.test_match_succeeds(r"^[[ab][c]]$", "v", "b");
tc.test_match_succeeds(r"^[[ab][c]]$", "v", "c");
tc.test_match_succeeds(r"^[[\q{a|b}]]$", "v", "a");
tc.test_match_succeeds(r"^[[\q{a|b}]]$", "v", "b");
tc.test_match_succeeds(r"^[[ab][\q{abc}]]$", "v", "a");
tc.test_match_succeeds(r"^[[ab][\q{abc}]]$", "v", "b");
tc.test_match_succeeds(r"^[[ab][\q{abc}]]$", "v", "abc");
tc.test_match_fails(r"^[[ab][\q{abc}]]$", "v", "ab");
tc.test_match_fails(r"^[[ab][\q{abc}]]$", "v", "bc");
tc.test_match_fails(r"^[[ab][\q{abc}]]$", "v", "c");
tc.test_match_fails(r"^[[\q{a|b}]--[\q{a}]]$", "v", "a");
tc.test_match_succeeds(r"^[[\q{a|b}]--[\q{a}]]$", "v", "b");
tc.test_match_succeeds(r"^[[\q{abc}ab]--a]$", "v", "abc");
tc.test_match_succeeds(r"^[[\q{abc}ab]--a]$", "v", "b");
tc.test_match_fails(r"^[[\q{abc}ab]--a]$", "v", "a");
tc.test_match_fails(r"^[[\q{abc}ab]&&a]$", "v", "abc");
tc.test_match_fails(r"^[[\q{abc}ab]&&a]$", "v", "b");
tc.test_match_succeeds(r"^[[\q{abc}ab]&&a]$", "v", "a");
tc.test_match_fails(r"^[a&&[\q{abc}ab]]$", "v", "abc");
tc.test_match_fails(r"^[a&&[\q{abc}ab]]$", "v", "b");
tc.test_match_succeeds(r"^[a&&[\q{abc}ab]]$", "v", "a");
tc.test_match_succeeds(r"^[[\q{a|b}]&&[\q{abc}ab]]$", "v", "a");
tc.test_match_succeeds(r"^[[\q{a|b}]&&[\q{abc}ab]]$", "v", "b");
tc.test_match_fails(r"^[[\q{a|b}]&&[\q{abc}ab]]$", "v", "abc");
tc.test_match_succeeds(r"^[[0-9]&&\q{0|2|4}]$", "v", "0");
tc.test_match_succeeds(r"^[[0-9]&&\q{0|2|4}]$", "v", "2");
tc.test_match_succeeds(r"^[[0-9]&&\q{0|2|4}]$", "v", "4");
}
#[test]
fn test_stuff() {
test_with_configs(test_stuff_tc)
}
fn test_stuff_tc(tc: TestConfig) {
let r = tc.compilef("c|abc", "i").match1f("\u{83}x0abcdef");
assert_eq!(r, "abc");
}