use Perl6::Rules; use Test::Simple "no_plan"; use charnames ":full"; # L Letter ok( "\x{45CD}" =~ m/^<+>$/, q{Match (Letter)} ); ok( "\x{45CD}" =~ m/^<[A]+>$/, q{Match compound (Letter)} ); ok( "\x{45CD}" !~ m/^<->$/, q{Don't match externally inverted (Letter)} ); ok( "\x{45CD}" !~ m/^<[A]->$/, q{Don't match compound inverted (Letter)} ); ok( "\x{45CD}" !~ m/^<+<-L>>$/, q{Don't match internally inverted (Letter)} ); ok( "\x{4DB6}" !~ m/^<+>$/, q{Don't match unrelated (Letter)} ); ok( "\x{4DB6}" =~ m/^<->$/, q{Match unrelated externally inverted (Letter)} ); ok( "\x{4DB6}" =~ m/^<+<-L>>$/, q{Match unrelated internally inverted (Letter)} ); ok( "\x{4DB6}\x{45CD}" =~ m/<+>/, q{Match unanchored (Letter)} ); ok( "\N{HANGUL LETTER SIOS-PIEUP}" =~ m/^<+>$/, q{Match } ); ok( "\N{HANGUL LETTER SIOS-PIEUP}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{HANGUL LETTER SIOS-PIEUP}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{HANGUL LETTER SIOS-PIEUP}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{HANGUL LETTER SIOS-PIEUP}" !~ m/^<+<-Letter>>$/, q{Don't match internally inverted } ); ok( "\x{318F}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{318F}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{318F}" =~ m/^<+<-Letter>>$/, q{Match unrelated internally inverted } ); ok( "\x{318F}\N{HANGUL LETTER SIOS-PIEUP}" =~ m/<+>/, q{Match unanchored } ); # Lu UppercaseLetter ok( "\N{LATIN CAPITAL LETTER A}" =~ m/^<+>$/, q{Match (UppercaseLetter)} ); ok( "\N{LATIN CAPITAL LETTER A}" =~ m/^<[A]+>$/, q{Match compound (UppercaseLetter)} ); ok( "\N{LATIN CAPITAL LETTER A}" !~ m/^<->$/, q{Don't match externally inverted (UppercaseLetter)} ); ok( "\N{LATIN CAPITAL LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted (UppercaseLetter)} ); ok( "\N{LATIN CAPITAL LETTER A}" !~ m/^<+<-Lu>>$/, q{Don't match internally inverted (UppercaseLetter)} ); ok( "\x{5E52}" !~ m/^<+>$/, q{Don't match unrelated (UppercaseLetter)} ); ok( "\x{5E52}" =~ m/^<->$/, q{Match unrelated externally inverted (UppercaseLetter)} ); ok( "\x{5E52}" =~ m/^<+<-Lu>>$/, q{Match unrelated internally inverted (UppercaseLetter)} ); ok( "\x{5E52}" !~ m/^<+>$/, q{Don't match related (UppercaseLetter)} ); ok( "\x{5E52}" =~ m/^<+<-Lu>>$/, q{Match related internally inverted (UppercaseLetter)} ); ok( "\x{5E52}" =~ m/^<->$/, q{Match related externally inverted (UppercaseLetter)} ); ok( "\x{5E52}\x{5E52}\N{LATIN CAPITAL LETTER A}" =~ m/<+>/, q{Match unanchored (UppercaseLetter)} ); ok( "\N{LATIN CAPITAL LETTER A WITH RING BELOW}" =~ m/^<+>$/, q{Match } ); ok( "\N{LATIN CAPITAL LETTER A WITH RING BELOW}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LATIN CAPITAL LETTER A WITH RING BELOW}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LATIN CAPITAL LETTER A WITH RING BELOW}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LATIN CAPITAL LETTER A WITH RING BELOW}" !~ m/^<+<-UppercaseLetter>>$/, q{Don't match internally inverted } ); ok( "\x{1DB9}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{1DB9}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{1DB9}" =~ m/^<+<-UppercaseLetter>>$/, q{Match unrelated internally inverted } ); ok( "\x{1DB9}\N{LATIN CAPITAL LETTER A WITH RING BELOW}" =~ m/<+>/, q{Match unanchored } ); # Ll LowercaseLetter ok( "\N{LATIN SMALL LETTER A}" =~ m/^<+>$/, q{Match (LowercaseLetter)} ); ok( "\N{LATIN SMALL LETTER A}" =~ m/^<[A]+>$/, q{Match compound (LowercaseLetter)} ); ok( "\N{LATIN SMALL LETTER A}" !~ m/^<->$/, q{Don't match externally inverted (LowercaseLetter)} ); ok( "\N{LATIN SMALL LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted (LowercaseLetter)} ); ok( "\N{LATIN SMALL LETTER A}" !~ m/^<+<-Ll>>$/, q{Don't match internally inverted (LowercaseLetter)} ); ok( "\x{83AD}" !~ m/^<+>$/, q{Don't match unrelated (LowercaseLetter)} ); ok( "\x{83AD}" =~ m/^<->$/, q{Match unrelated externally inverted (LowercaseLetter)} ); ok( "\x{83AD}" =~ m/^<+<-Ll>>$/, q{Match unrelated internally inverted (LowercaseLetter)} ); ok( "\x{83AD}" !~ m/^<+>$/, q{Don't match related (LowercaseLetter)} ); ok( "\x{83AD}" =~ m/^<+<-Ll>>$/, q{Match related internally inverted (LowercaseLetter)} ); ok( "\x{83AD}" =~ m/^<->$/, q{Match related externally inverted (LowercaseLetter)} ); ok( "\x{83AD}\x{83AD}\N{LATIN SMALL LETTER A}" =~ m/<+>/, q{Match unanchored (LowercaseLetter)} ); ok( "\N{LATIN SMALL LETTER A}" =~ m/^<+>$/, q{Match } ); ok( "\N{LATIN SMALL LETTER A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LATIN SMALL LETTER A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LATIN SMALL LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LATIN SMALL LETTER A}" !~ m/^<+<-LowercaseLetter>>$/, q{Don't match internally inverted } ); ok( "\x{A9A8}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{A9A8}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{A9A8}" =~ m/^<+<-LowercaseLetter>>$/, q{Match unrelated internally inverted } ); ok( "\x{AC00}" !~ m/^<+>$/, q{Don't match related } ); ok( "\x{AC00}" =~ m/^<+<-LowercaseLetter>>$/, q{Match related internally inverted } ); ok( "\x{AC00}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{A9A8}\x{AC00}\N{LATIN SMALL LETTER A}" =~ m/<+>/, q{Match unanchored } ); # Lt TitlecaseLetter ok( "\N{LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON}" =~ m/^<+>$/, q{Match (TitlecaseLetter)} ); ok( "\N{LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON}" =~ m/^<[A]+>$/, q{Match compound (TitlecaseLetter)} ); ok( "\N{LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON}" !~ m/^<->$/, q{Don't match externally inverted (TitlecaseLetter)} ); ok( "\N{LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON}" !~ m/^<[A]->$/, q{Don't match compound inverted (TitlecaseLetter)} ); ok( "\N{LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON}" !~ m/^<+<-Lt>>$/, q{Don't match internally inverted (TitlecaseLetter)} ); ok( "\x{D187}" !~ m/^<+>$/, q{Don't match unrelated (TitlecaseLetter)} ); ok( "\x{D187}" =~ m/^<->$/, q{Match unrelated externally inverted (TitlecaseLetter)} ); ok( "\x{D187}" =~ m/^<+<-Lt>>$/, q{Match unrelated internally inverted (TitlecaseLetter)} ); ok( "\x{D187}" !~ m/^<+>$/, q{Don't match related (TitlecaseLetter)} ); ok( "\x{D187}" =~ m/^<+<-Lt>>$/, q{Match related internally inverted (TitlecaseLetter)} ); ok( "\x{D187}" =~ m/^<->$/, q{Match related externally inverted (TitlecaseLetter)} ); ok( "\x{D187}\x{D187}\N{LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON}" =~ m/<+>/, q{Match unanchored (TitlecaseLetter)} ); ok( "\N{LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON}" =~ m/^<+>$/, q{Match } ); ok( "\N{LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON}" !~ m/^<+<-TitlecaseLetter>>$/, q{Don't match internally inverted } ); ok( "\x{C2A9}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{C2A9}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{C2A9}" =~ m/^<+<-TitlecaseLetter>>$/, q{Match unrelated internally inverted } ); ok( "\x{C2A9}\N{LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON}" =~ m/<+>/, q{Match unanchored } ); # Lm ModifierLetter ok( "\N{MODIFIER LETTER SMALL H}" =~ m/^<+>$/, q{Match (ModifierLetter)} ); ok( "\N{MODIFIER LETTER SMALL H}" =~ m/^<[A]+>$/, q{Match compound (ModifierLetter)} ); ok( "\N{MODIFIER LETTER SMALL H}" !~ m/^<->$/, q{Don't match externally inverted (ModifierLetter)} ); ok( "\N{MODIFIER LETTER SMALL H}" !~ m/^<[A]->$/, q{Don't match compound inverted (ModifierLetter)} ); ok( "\N{MODIFIER LETTER SMALL H}" !~ m/^<+<-Lm>>$/, q{Don't match internally inverted (ModifierLetter)} ); ok( "\x{8C34}" !~ m/^<+>$/, q{Don't match unrelated (ModifierLetter)} ); ok( "\x{8C34}" =~ m/^<->$/, q{Match unrelated externally inverted (ModifierLetter)} ); ok( "\x{8C34}" =~ m/^<+<-Lm>>$/, q{Match unrelated internally inverted (ModifierLetter)} ); ok( "\x{8C34}" !~ m/^<+>$/, q{Don't match related (ModifierLetter)} ); ok( "\x{8C34}" =~ m/^<+<-Lm>>$/, q{Match related internally inverted (ModifierLetter)} ); ok( "\x{8C34}" =~ m/^<->$/, q{Match related externally inverted (ModifierLetter)} ); ok( "\x{8C34}\x{8C34}\N{MODIFIER LETTER SMALL H}" =~ m/<+>/, q{Match unanchored (ModifierLetter)} ); ok( "\N{MODIFIER LETTER SMALL H}" =~ m/^<+>$/, q{Match } ); ok( "\N{MODIFIER LETTER SMALL H}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{MODIFIER LETTER SMALL H}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{MODIFIER LETTER SMALL H}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{MODIFIER LETTER SMALL H}" !~ m/^<+<-ModifierLetter>>$/, q{Don't match internally inverted } ); ok( "\N{YI SYLLABLE NZAX}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{YI SYLLABLE NZAX}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{YI SYLLABLE NZAX}" =~ m/^<+<-ModifierLetter>>$/, q{Match unrelated internally inverted } ); ok( "\N{YI SYLLABLE NZAX}\N{MODIFIER LETTER SMALL H}" =~ m/<+>/, q{Match unanchored } ); # Lo OtherLetter ok( "\x{8CC9}" =~ m/^<+>$/, q{Match (OtherLetter)} ); ok( "\x{8CC9}" =~ m/^<[A]+>$/, q{Match compound (OtherLetter)} ); ok( "\x{8CC9}" !~ m/^<->$/, q{Don't match externally inverted (OtherLetter)} ); ok( "\x{8CC9}" !~ m/^<[A]->$/, q{Don't match compound inverted (OtherLetter)} ); ok( "\x{8CC9}" !~ m/^<+<-Lo>>$/, q{Don't match internally inverted (OtherLetter)} ); ok( "\x{9FA6}" !~ m/^<+>$/, q{Don't match unrelated (OtherLetter)} ); ok( "\x{9FA6}" =~ m/^<->$/, q{Match unrelated externally inverted (OtherLetter)} ); ok( "\x{9FA6}" =~ m/^<+<-Lo>>$/, q{Match unrelated internally inverted (OtherLetter)} ); ok( "\N{LATIN CAPITAL LETTER A}" !~ m/^<+>$/, q{Don't match related (OtherLetter)} ); ok( "\N{LATIN CAPITAL LETTER A}" =~ m/^<+<-Lo>>$/, q{Match related internally inverted (OtherLetter)} ); ok( "\N{LATIN CAPITAL LETTER A}" =~ m/^<->$/, q{Match related externally inverted (OtherLetter)} ); ok( "\x{9FA6}\N{LATIN CAPITAL LETTER A}\x{8CC9}" =~ m/<+>/, q{Match unanchored (OtherLetter)} ); ok( "\x{BC7D}" =~ m/^<+>$/, q{Match } ); ok( "\x{BC7D}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{BC7D}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{BC7D}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{BC7D}" !~ m/^<+<-OtherLetter>>$/, q{Don't match internally inverted } ); ok( "\x{D7A4}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{D7A4}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{D7A4}" =~ m/^<+<-OtherLetter>>$/, q{Match unrelated internally inverted } ); ok( "\x{D7A4}\x{BC7D}" =~ m/<+>/, q{Match unanchored } ); # Lr # Alias for "Ll", "Lu", and "Lt". ok( "\N{LATIN CAPITAL LETTER A}" =~ m/^<+>$/, q{Match (Alias for "Ll", "Lu", and "Lt".)} ); ok( "\N{LATIN CAPITAL LETTER A}" =~ m/^<[A]+>$/, q{Match compound (Alias for "Ll", "Lu", and "Lt".)} ); ok( "\N{LATIN CAPITAL LETTER A}" !~ m/^<->$/, q{Don't match externally inverted (Alias for "Ll", "Lu", and "Lt".)} ); ok( "\N{LATIN CAPITAL LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted (Alias for "Ll", "Lu", and "Lt".)} ); ok( "\N{LATIN CAPITAL LETTER A}" !~ m/^<+<-Lr>>$/, q{Don't match internally inverted (Alias for "Ll", "Lu", and "Lt".)} ); ok( "\x{CD29}" !~ m/^<+>$/, q{Don't match unrelated (Alias for "Ll", "Lu", and "Lt".)} ); ok( "\x{CD29}" =~ m/^<->$/, q{Match unrelated externally inverted (Alias for "Ll", "Lu", and "Lt".)} ); ok( "\x{CD29}" =~ m/^<+<-Lr>>$/, q{Match unrelated internally inverted (Alias for "Ll", "Lu", and "Lt".)} ); ok( "\x{CD29}" !~ m/^<+>$/, q{Don't match related (Alias for "Ll", "Lu", and "Lt".)} ); ok( "\x{CD29}" =~ m/^<+<-Lr>>$/, q{Match related internally inverted (Alias for "Ll", "Lu", and "Lt".)} ); ok( "\x{CD29}" =~ m/^<->$/, q{Match related externally inverted (Alias for "Ll", "Lu", and "Lt".)} ); ok( "\x{CD29}\x{CD29}\N{LATIN CAPITAL LETTER A}" =~ m/<+>/, q{Match unanchored (Alias for "Ll", "Lu", and "Lt".)} ); # M Mark ok( "\N{TAGALOG VOWEL SIGN I}" =~ m/^<+>$/, q{Match (Mark)} ); ok( "\N{TAGALOG VOWEL SIGN I}" =~ m/^<[A]+>$/, q{Match compound (Mark)} ); ok( "\N{TAGALOG VOWEL SIGN I}" !~ m/^<->$/, q{Don't match externally inverted (Mark)} ); ok( "\N{TAGALOG VOWEL SIGN I}" !~ m/^<[A]->$/, q{Don't match compound inverted (Mark)} ); ok( "\N{TAGALOG VOWEL SIGN I}" !~ m/^<+<-M>>$/, q{Don't match internally inverted (Mark)} ); ok( "\N{CANADIAN SYLLABICS KAAI}" !~ m/^<+>$/, q{Don't match unrelated (Mark)} ); ok( "\N{CANADIAN SYLLABICS KAAI}" =~ m/^<->$/, q{Match unrelated externally inverted (Mark)} ); ok( "\N{CANADIAN SYLLABICS KAAI}" =~ m/^<+<-M>>$/, q{Match unrelated internally inverted (Mark)} ); ok( "\N{CANADIAN SYLLABICS KAAI}\N{TAGALOG VOWEL SIGN I}" =~ m/<+>/, q{Match unanchored (Mark)} ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<+>$/, q{Match } ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<+<-Mark>>$/, q{Don't match internally inverted } ); ok( "\x{4BF0}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{4BF0}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{4BF0}" =~ m/^<+<-Mark>>$/, q{Match unrelated internally inverted } ); ok( "\x{4BF0}\N{COMBINING GRAVE ACCENT}" =~ m/<+>/, q{Match unanchored } ); # Mn NonspacingMark ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<+>$/, q{Match (NonspacingMark)} ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<[A]+>$/, q{Match compound (NonspacingMark)} ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<->$/, q{Don't match externally inverted (NonspacingMark)} ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<[A]->$/, q{Don't match compound inverted (NonspacingMark)} ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<+<-Mn>>$/, q{Don't match internally inverted (NonspacingMark)} ); ok( "\x{CF2C}" !~ m/^<+>$/, q{Don't match unrelated (NonspacingMark)} ); ok( "\x{CF2C}" =~ m/^<->$/, q{Match unrelated externally inverted (NonspacingMark)} ); ok( "\x{CF2C}" =~ m/^<+<-Mn>>$/, q{Match unrelated internally inverted (NonspacingMark)} ); ok( "\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" !~ m/^<+>$/, q{Don't match related (NonspacingMark)} ); ok( "\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" =~ m/^<+<-Mn>>$/, q{Match related internally inverted (NonspacingMark)} ); ok( "\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" =~ m/^<->$/, q{Match related externally inverted (NonspacingMark)} ); ok( "\x{CF2C}\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}\N{COMBINING GRAVE ACCENT}" =~ m/<+>/, q{Match unanchored (NonspacingMark)} ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<+>$/, q{Match } ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<+<-NonspacingMark>>$/, q{Don't match internally inverted } ); ok( "\x{B617}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{B617}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{B617}" =~ m/^<+<-NonspacingMark>>$/, q{Match unrelated internally inverted } ); ok( "\x{B617}\N{COMBINING GRAVE ACCENT}" =~ m/<+>/, q{Match unanchored } ); # Mc SpacingMark ok( "\N{DEVANAGARI SIGN VISARGA}" =~ m/^<+>$/, q{Match (SpacingMark)} ); ok( "\N{DEVANAGARI SIGN VISARGA}" =~ m/^<[A]+>$/, q{Match compound (SpacingMark)} ); ok( "\N{DEVANAGARI SIGN VISARGA}" !~ m/^<->$/, q{Don't match externally inverted (SpacingMark)} ); ok( "\N{DEVANAGARI SIGN VISARGA}" !~ m/^<[A]->$/, q{Don't match compound inverted (SpacingMark)} ); ok( "\N{DEVANAGARI SIGN VISARGA}" !~ m/^<+<-Mc>>$/, q{Don't match internally inverted (SpacingMark)} ); ok( "\N{BALLOT BOX WITH CHECK}" !~ m/^<+>$/, q{Don't match unrelated (SpacingMark)} ); ok( "\N{BALLOT BOX WITH CHECK}" =~ m/^<->$/, q{Match unrelated externally inverted (SpacingMark)} ); ok( "\N{BALLOT BOX WITH CHECK}" =~ m/^<+<-Mc>>$/, q{Match unrelated internally inverted (SpacingMark)} ); ok( "\N{IDEOGRAPHIC LEVEL TONE MARK}" !~ m/^<+>$/, q{Don't match related (SpacingMark)} ); ok( "\N{IDEOGRAPHIC LEVEL TONE MARK}" =~ m/^<+<-Mc>>$/, q{Match related internally inverted (SpacingMark)} ); ok( "\N{IDEOGRAPHIC LEVEL TONE MARK}" =~ m/^<->$/, q{Match related externally inverted (SpacingMark)} ); ok( "\N{BALLOT BOX WITH CHECK}\N{IDEOGRAPHIC LEVEL TONE MARK}\N{DEVANAGARI SIGN VISARGA}" =~ m/<+>/, q{Match unanchored (SpacingMark)} ); ok( "\N{MALAYALAM SIGN ANUSVARA}" =~ m/^<+>$/, q{Match } ); ok( "\N{MALAYALAM SIGN ANUSVARA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{MALAYALAM SIGN ANUSVARA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{MALAYALAM SIGN ANUSVARA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{MALAYALAM SIGN ANUSVARA}" !~ m/^<+<-SpacingMark>>$/, q{Don't match internally inverted } ); ok( "\N{KANNADA LETTER VOCALIC LL}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{KANNADA LETTER VOCALIC LL}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{KANNADA LETTER VOCALIC LL}" =~ m/^<+<-SpacingMark>>$/, q{Match unrelated internally inverted } ); ok( "\N{KANNADA LETTER VOCALIC LL}\N{MALAYALAM SIGN ANUSVARA}" =~ m/<+>/, q{Match unanchored } ); # Me EnclosingMark ok( "\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" =~ m/^<+>$/, q{Match (EnclosingMark)} ); ok( "\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" =~ m/^<[A]+>$/, q{Match compound (EnclosingMark)} ); ok( "\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" !~ m/^<->$/, q{Don't match externally inverted (EnclosingMark)} ); ok( "\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" !~ m/^<[A]->$/, q{Don't match compound inverted (EnclosingMark)} ); ok( "\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" !~ m/^<+<-Me>>$/, q{Don't match internally inverted (EnclosingMark)} ); ok( "\x{C680}" !~ m/^<+>$/, q{Don't match unrelated (EnclosingMark)} ); ok( "\x{C680}" =~ m/^<->$/, q{Match unrelated externally inverted (EnclosingMark)} ); ok( "\x{C680}" =~ m/^<+<-Me>>$/, q{Match unrelated internally inverted (EnclosingMark)} ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<+>$/, q{Don't match related (EnclosingMark)} ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<+<-Me>>$/, q{Match related internally inverted (EnclosingMark)} ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<->$/, q{Match related externally inverted (EnclosingMark)} ); ok( "\x{C680}\N{COMBINING GRAVE ACCENT}\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" =~ m/<+>/, q{Match unanchored (EnclosingMark)} ); ok( "\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" =~ m/^<+>$/, q{Match } ); ok( "\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" !~ m/^<+<-EnclosingMark>>$/, q{Don't match internally inverted } ); ok( "\x{911E}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{911E}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{911E}" =~ m/^<+<-EnclosingMark>>$/, q{Match unrelated internally inverted } ); ok( "\x{911E}\N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}" =~ m/<+>/, q{Match unanchored } ); # N Number ok( "\N{DIGIT ZERO}" =~ m/^<+>$/, q{Match (Number)} ); ok( "\N{DIGIT ZERO}" =~ m/^<[A]+>$/, q{Match compound (Number)} ); ok( "\N{DIGIT ZERO}" !~ m/^<->$/, q{Don't match externally inverted (Number)} ); ok( "\N{DIGIT ZERO}" !~ m/^<[A]->$/, q{Don't match compound inverted (Number)} ); ok( "\N{DIGIT ZERO}" !~ m/^<+<-N>>$/, q{Don't match internally inverted (Number)} ); ok( "\x{3BA3}" !~ m/^<+>$/, q{Don't match unrelated (Number)} ); ok( "\x{3BA3}" =~ m/^<->$/, q{Match unrelated externally inverted (Number)} ); ok( "\x{3BA3}" =~ m/^<+<-N>>$/, q{Match unrelated internally inverted (Number)} ); ok( "\x{3BA3}\N{DIGIT ZERO}" =~ m/<+>/, q{Match unanchored (Number)} ); ok( "\N{DIGIT ZERO}" =~ m/^<+>$/, q{Match } ); ok( "\N{DIGIT ZERO}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{DIGIT ZERO}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{DIGIT ZERO}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{DIGIT ZERO}" !~ m/^<+<-Number>>$/, q{Don't match internally inverted } ); ok( "\x{37D0}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{37D0}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{37D0}" =~ m/^<+<-Number>>$/, q{Match unrelated internally inverted } ); ok( "\x{37D0}\N{DIGIT ZERO}" =~ m/<+>/, q{Match unanchored } ); # Nd DecimalNumber ok( "\N{DIGIT ZERO}" =~ m/^<+>$/, q{Match (DecimalNumber)} ); ok( "\N{DIGIT ZERO}" =~ m/^<[A]+>$/, q{Match compound (DecimalNumber)} ); ok( "\N{DIGIT ZERO}" !~ m/^<->$/, q{Don't match externally inverted (DecimalNumber)} ); ok( "\N{DIGIT ZERO}" !~ m/^<[A]->$/, q{Don't match compound inverted (DecimalNumber)} ); ok( "\N{DIGIT ZERO}" !~ m/^<+<-Nd>>$/, q{Don't match internally inverted (DecimalNumber)} ); ok( "\x{8536}" !~ m/^<+>$/, q{Don't match unrelated (DecimalNumber)} ); ok( "\x{8536}" =~ m/^<->$/, q{Match unrelated externally inverted (DecimalNumber)} ); ok( "\x{8536}" =~ m/^<+<-Nd>>$/, q{Match unrelated internally inverted (DecimalNumber)} ); ok( "\N{SUPERSCRIPT TWO}" !~ m/^<+>$/, q{Don't match related (DecimalNumber)} ); ok( "\N{SUPERSCRIPT TWO}" =~ m/^<+<-Nd>>$/, q{Match related internally inverted (DecimalNumber)} ); ok( "\N{SUPERSCRIPT TWO}" =~ m/^<->$/, q{Match related externally inverted (DecimalNumber)} ); ok( "\x{8536}\N{SUPERSCRIPT TWO}\N{DIGIT ZERO}" =~ m/<+>/, q{Match unanchored (DecimalNumber)} ); ok( "\N{KHMER DIGIT ZERO}" =~ m/^<+>$/, q{Match } ); ok( "\N{KHMER DIGIT ZERO}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{KHMER DIGIT ZERO}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{KHMER DIGIT ZERO}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{KHMER DIGIT ZERO}" !~ m/^<+<-DecimalNumber>>$/, q{Don't match internally inverted } ); ok( "\N{CANADIAN SYLLABICS NWE}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{CANADIAN SYLLABICS NWE}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{CANADIAN SYLLABICS NWE}" =~ m/^<+<-DecimalNumber>>$/, q{Match unrelated internally inverted } ); ok( "\N{CANADIAN SYLLABICS NWE}\N{KHMER DIGIT ZERO}" =~ m/<+>/, q{Match unanchored } ); # Nl LetterNumber ok( "\N{ROMAN NUMERAL ONE}" =~ m/^<+>$/, q{Match (LetterNumber)} ); ok( "\N{ROMAN NUMERAL ONE}" =~ m/^<[A]+>$/, q{Match compound (LetterNumber)} ); ok( "\N{ROMAN NUMERAL ONE}" !~ m/^<->$/, q{Don't match externally inverted (LetterNumber)} ); ok( "\N{ROMAN NUMERAL ONE}" !~ m/^<[A]->$/, q{Don't match compound inverted (LetterNumber)} ); ok( "\N{ROMAN NUMERAL ONE}" !~ m/^<+<-Nl>>$/, q{Don't match internally inverted (LetterNumber)} ); ok( "\x{1B95}" !~ m/^<+>$/, q{Don't match unrelated (LetterNumber)} ); ok( "\x{1B95}" =~ m/^<->$/, q{Match unrelated externally inverted (LetterNumber)} ); ok( "\x{1B95}" =~ m/^<+<-Nl>>$/, q{Match unrelated internally inverted (LetterNumber)} ); ok( "\N{SUPERSCRIPT ZERO}" !~ m/^<+>$/, q{Don't match related (LetterNumber)} ); ok( "\N{SUPERSCRIPT ZERO}" =~ m/^<+<-Nl>>$/, q{Match related internally inverted (LetterNumber)} ); ok( "\N{SUPERSCRIPT ZERO}" =~ m/^<->$/, q{Match related externally inverted (LetterNumber)} ); ok( "\x{1B95}\N{SUPERSCRIPT ZERO}\N{ROMAN NUMERAL ONE}" =~ m/<+>/, q{Match unanchored (LetterNumber)} ); ok( "\N{RUNIC ARLAUG SYMBOL}" =~ m/^<+>$/, q{Match } ); ok( "\N{RUNIC ARLAUG SYMBOL}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{RUNIC ARLAUG SYMBOL}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{RUNIC ARLAUG SYMBOL}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{RUNIC ARLAUG SYMBOL}" !~ m/^<+<-LetterNumber>>$/, q{Don't match internally inverted } ); ok( "\x{9B4F}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{9B4F}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{9B4F}" =~ m/^<+<-LetterNumber>>$/, q{Match unrelated internally inverted } ); ok( "\x{9B4F}" !~ m/^<+>$/, q{Don't match related } ); ok( "\x{9B4F}" =~ m/^<+<-LetterNumber>>$/, q{Match related internally inverted } ); ok( "\x{9B4F}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{9B4F}\x{9B4F}\N{RUNIC ARLAUG SYMBOL}" =~ m/<+>/, q{Match unanchored } ); # No OtherNumber ok( "\N{SUPERSCRIPT TWO}" =~ m/^<+>$/, q{Match (OtherNumber)} ); ok( "\N{SUPERSCRIPT TWO}" =~ m/^<[A]+>$/, q{Match compound (OtherNumber)} ); ok( "\N{SUPERSCRIPT TWO}" !~ m/^<->$/, q{Don't match externally inverted (OtherNumber)} ); ok( "\N{SUPERSCRIPT TWO}" !~ m/^<[A]->$/, q{Don't match compound inverted (OtherNumber)} ); ok( "\N{SUPERSCRIPT TWO}" !~ m/^<+<-No>>$/, q{Don't match internally inverted (OtherNumber)} ); ok( "\x{8F9A}" !~ m/^<+>$/, q{Don't match unrelated (OtherNumber)} ); ok( "\x{8F9A}" =~ m/^<->$/, q{Match unrelated externally inverted (OtherNumber)} ); ok( "\x{8F9A}" =~ m/^<+<-No>>$/, q{Match unrelated internally inverted (OtherNumber)} ); ok( "\N{DIGIT ZERO}" !~ m/^<+>$/, q{Don't match related (OtherNumber)} ); ok( "\N{DIGIT ZERO}" =~ m/^<+<-No>>$/, q{Match related internally inverted (OtherNumber)} ); ok( "\N{DIGIT ZERO}" =~ m/^<->$/, q{Match related externally inverted (OtherNumber)} ); ok( "\x{8F9A}\N{DIGIT ZERO}\N{SUPERSCRIPT TWO}" =~ m/<+>/, q{Match unanchored (OtherNumber)} ); ok( "\N{BENGALI CURRENCY NUMERATOR ONE}" =~ m/^<+>$/, q{Match } ); ok( "\N{BENGALI CURRENCY NUMERATOR ONE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{BENGALI CURRENCY NUMERATOR ONE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{BENGALI CURRENCY NUMERATOR ONE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{BENGALI CURRENCY NUMERATOR ONE}" !~ m/^<+<-OtherNumber>>$/, q{Don't match internally inverted } ); ok( "\x{0522}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{0522}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{0522}" =~ m/^<+<-OtherNumber>>$/, q{Match unrelated internally inverted } ); ok( "\x{0522}\N{BENGALI CURRENCY NUMERATOR ONE}" =~ m/<+>/, q{Match unanchored } ); # P Punctuation ok( "\N{EXCLAMATION MARK}" =~ m/^<+

>$/, q{Match

(Punctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<[A]+

>$/, q{Match compound

(Punctuation)} ); ok( "\N{EXCLAMATION MARK}" !~ m/^<-

>$/, q{Don't match externally inverted

(Punctuation)} ); ok( "\N{EXCLAMATION MARK}" !~ m/^<[A]-

>$/, q{Don't match compound inverted

(Punctuation)} ); ok( "\N{EXCLAMATION MARK}" !~ m/^<+<-P>>$/, q{Don't match internally inverted

(Punctuation)} ); ok( "\x{3753}" !~ m/^<+

>$/, q{Don't match unrelated

(Punctuation)} ); ok( "\x{3753}" =~ m/^<-

>$/, q{Match unrelated externally inverted

(Punctuation)} ); ok( "\x{3753}" =~ m/^<+<-P>>$/, q{Match unrelated internally inverted

(Punctuation)} ); ok( "\x{3753}\N{EXCLAMATION MARK}" =~ m/<+

>/, q{Match unanchored

(Punctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<+>$/, q{Match } ); ok( "\N{EXCLAMATION MARK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{EXCLAMATION MARK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{EXCLAMATION MARK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{EXCLAMATION MARK}" !~ m/^<+<-Punctuation>>$/, q{Don't match internally inverted } ); ok( "\x{9C5E}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{9C5E}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{9C5E}" =~ m/^<+<-Punctuation>>$/, q{Match unrelated internally inverted } ); ok( "\x{9C5E}\N{EXCLAMATION MARK}" =~ m/<+>/, q{Match unanchored } ); # Pc ConnectorPunctuation ok( "\N{LOW LINE}" =~ m/^<+>$/, q{Match (ConnectorPunctuation)} ); ok( "\N{LOW LINE}" =~ m/^<[A]+>$/, q{Match compound (ConnectorPunctuation)} ); ok( "\N{LOW LINE}" !~ m/^<->$/, q{Don't match externally inverted (ConnectorPunctuation)} ); ok( "\N{LOW LINE}" !~ m/^<[A]->$/, q{Don't match compound inverted (ConnectorPunctuation)} ); ok( "\N{LOW LINE}" !~ m/^<+<-Pc>>$/, q{Don't match internally inverted (ConnectorPunctuation)} ); ok( "\x{B2C9}" !~ m/^<+>$/, q{Don't match unrelated (ConnectorPunctuation)} ); ok( "\x{B2C9}" =~ m/^<->$/, q{Match unrelated externally inverted (ConnectorPunctuation)} ); ok( "\x{B2C9}" =~ m/^<+<-Pc>>$/, q{Match unrelated internally inverted (ConnectorPunctuation)} ); ok( "\N{EXCLAMATION MARK}" !~ m/^<+>$/, q{Don't match related (ConnectorPunctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<+<-Pc>>$/, q{Match related internally inverted (ConnectorPunctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<->$/, q{Match related externally inverted (ConnectorPunctuation)} ); ok( "\x{B2C9}\N{EXCLAMATION MARK}\N{LOW LINE}" =~ m/<+>/, q{Match unanchored (ConnectorPunctuation)} ); ok( "\N{LOW LINE}" =~ m/^<+>$/, q{Match } ); ok( "\N{LOW LINE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LOW LINE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LOW LINE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LOW LINE}" !~ m/^<+<-ConnectorPunctuation>>$/, q{Don't match internally inverted } ); ok( "\x{AEFC}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{AEFC}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{AEFC}" =~ m/^<+<-ConnectorPunctuation>>$/, q{Match unrelated internally inverted } ); ok( "\x{AEFC}\N{LOW LINE}" =~ m/<+>/, q{Match unanchored } ); # Pd DashPunctuation ok( "\N{HYPHEN-MINUS}" =~ m/^<+>$/, q{Match (DashPunctuation)} ); ok( "\N{HYPHEN-MINUS}" =~ m/^<[A]+>$/, q{Match compound (DashPunctuation)} ); ok( "\N{HYPHEN-MINUS}" !~ m/^<->$/, q{Don't match externally inverted (DashPunctuation)} ); ok( "\N{HYPHEN-MINUS}" !~ m/^<[A]->$/, q{Don't match compound inverted (DashPunctuation)} ); ok( "\N{HYPHEN-MINUS}" !~ m/^<+<-Pd>>$/, q{Don't match internally inverted (DashPunctuation)} ); ok( "\x{86C8}" !~ m/^<+>$/, q{Don't match unrelated (DashPunctuation)} ); ok( "\x{86C8}" =~ m/^<->$/, q{Match unrelated externally inverted (DashPunctuation)} ); ok( "\x{86C8}" =~ m/^<+<-Pd>>$/, q{Match unrelated internally inverted (DashPunctuation)} ); ok( "\N{EXCLAMATION MARK}" !~ m/^<+>$/, q{Don't match related (DashPunctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<+<-Pd>>$/, q{Match related internally inverted (DashPunctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<->$/, q{Match related externally inverted (DashPunctuation)} ); ok( "\x{86C8}\N{EXCLAMATION MARK}\N{HYPHEN-MINUS}" =~ m/<+>/, q{Match unanchored (DashPunctuation)} ); ok( "\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" =~ m/^<+>$/, q{Match } ); ok( "\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" !~ m/^<+<-DashPunctuation>>$/, q{Don't match internally inverted } ); ok( "\N{HIRAGANA LETTER NI}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{HIRAGANA LETTER NI}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{HIRAGANA LETTER NI}" =~ m/^<+<-DashPunctuation>>$/, q{Match unrelated internally inverted } ); ok( "\N{HIRAGANA LETTER NI}\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" =~ m/<+>/, q{Match unanchored } ); # Ps OpenPunctuation ok( "\N{LEFT PARENTHESIS}" =~ m/^<+>$/, q{Match (OpenPunctuation)} ); ok( "\N{LEFT PARENTHESIS}" =~ m/^<[A]+>$/, q{Match compound (OpenPunctuation)} ); ok( "\N{LEFT PARENTHESIS}" !~ m/^<->$/, q{Don't match externally inverted (OpenPunctuation)} ); ok( "\N{LEFT PARENTHESIS}" !~ m/^<[A]->$/, q{Don't match compound inverted (OpenPunctuation)} ); ok( "\N{LEFT PARENTHESIS}" !~ m/^<+<-Ps>>$/, q{Don't match internally inverted (OpenPunctuation)} ); ok( "\x{B601}" !~ m/^<+>$/, q{Don't match unrelated (OpenPunctuation)} ); ok( "\x{B601}" =~ m/^<->$/, q{Match unrelated externally inverted (OpenPunctuation)} ); ok( "\x{B601}" =~ m/^<+<-Ps>>$/, q{Match unrelated internally inverted (OpenPunctuation)} ); ok( "\N{EXCLAMATION MARK}" !~ m/^<+>$/, q{Don't match related (OpenPunctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<+<-Ps>>$/, q{Match related internally inverted (OpenPunctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<->$/, q{Match related externally inverted (OpenPunctuation)} ); ok( "\x{B601}\N{EXCLAMATION MARK}\N{LEFT PARENTHESIS}" =~ m/<+>/, q{Match unanchored (OpenPunctuation)} ); ok( "\N{LEFT PARENTHESIS}" =~ m/^<+>$/, q{Match } ); ok( "\N{LEFT PARENTHESIS}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LEFT PARENTHESIS}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LEFT PARENTHESIS}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LEFT PARENTHESIS}" !~ m/^<+<-OpenPunctuation>>$/, q{Don't match internally inverted } ); ok( "\x{89C1}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{89C1}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{89C1}" =~ m/^<+<-OpenPunctuation>>$/, q{Match unrelated internally inverted } ); ok( "\x{89C1}\N{LEFT PARENTHESIS}" =~ m/<+>/, q{Match unanchored } ); # Pe ClosePunctuation ok( "\N{RIGHT PARENTHESIS}" =~ m/^<+>$/, q{Match (ClosePunctuation)} ); ok( "\N{RIGHT PARENTHESIS}" =~ m/^<[A]+>$/, q{Match compound (ClosePunctuation)} ); ok( "\N{RIGHT PARENTHESIS}" !~ m/^<->$/, q{Don't match externally inverted (ClosePunctuation)} ); ok( "\N{RIGHT PARENTHESIS}" !~ m/^<[A]->$/, q{Don't match compound inverted (ClosePunctuation)} ); ok( "\N{RIGHT PARENTHESIS}" !~ m/^<+<-Pe>>$/, q{Don't match internally inverted (ClosePunctuation)} ); ok( "\x{5561}" !~ m/^<+>$/, q{Don't match unrelated (ClosePunctuation)} ); ok( "\x{5561}" =~ m/^<->$/, q{Match unrelated externally inverted (ClosePunctuation)} ); ok( "\x{5561}" =~ m/^<+<-Pe>>$/, q{Match unrelated internally inverted (ClosePunctuation)} ); ok( "\N{EXCLAMATION MARK}" !~ m/^<+>$/, q{Don't match related (ClosePunctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<+<-Pe>>$/, q{Match related internally inverted (ClosePunctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<->$/, q{Match related externally inverted (ClosePunctuation)} ); ok( "\x{5561}\N{EXCLAMATION MARK}\N{RIGHT PARENTHESIS}" =~ m/<+>/, q{Match unanchored (ClosePunctuation)} ); ok( "\N{RIGHT PARENTHESIS}" =~ m/^<+>$/, q{Match } ); ok( "\N{RIGHT PARENTHESIS}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{RIGHT PARENTHESIS}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{RIGHT PARENTHESIS}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{RIGHT PARENTHESIS}" !~ m/^<+<-ClosePunctuation>>$/, q{Don't match internally inverted } ); ok( "\x{98D0}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{98D0}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{98D0}" =~ m/^<+<-ClosePunctuation>>$/, q{Match unrelated internally inverted } ); ok( "\x{98D0}\N{RIGHT PARENTHESIS}" =~ m/<+>/, q{Match unanchored } ); # Pi InitialPunctuation ok( "\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}" =~ m/^<+>$/, q{Match (InitialPunctuation)} ); ok( "\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}" =~ m/^<[A]+>$/, q{Match compound (InitialPunctuation)} ); ok( "\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}" !~ m/^<->$/, q{Don't match externally inverted (InitialPunctuation)} ); ok( "\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}" !~ m/^<[A]->$/, q{Don't match compound inverted (InitialPunctuation)} ); ok( "\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}" !~ m/^<+<-Pi>>$/, q{Don't match internally inverted (InitialPunctuation)} ); ok( "\x{D76F}" !~ m/^<+>$/, q{Don't match unrelated (InitialPunctuation)} ); ok( "\x{D76F}" =~ m/^<->$/, q{Match unrelated externally inverted (InitialPunctuation)} ); ok( "\x{D76F}" =~ m/^<+<-Pi>>$/, q{Match unrelated internally inverted (InitialPunctuation)} ); ok( "\N{EXCLAMATION MARK}" !~ m/^<+>$/, q{Don't match related (InitialPunctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<+<-Pi>>$/, q{Match related internally inverted (InitialPunctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<->$/, q{Match related externally inverted (InitialPunctuation)} ); ok( "\x{D76F}\N{EXCLAMATION MARK}\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}" =~ m/<+>/, q{Match unanchored (InitialPunctuation)} ); ok( "\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}" =~ m/^<+>$/, q{Match } ); ok( "\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}" !~ m/^<+<-InitialPunctuation>>$/, q{Don't match internally inverted } ); ok( "\x{C96E}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{C96E}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{C96E}" =~ m/^<+<-InitialPunctuation>>$/, q{Match unrelated internally inverted } ); ok( "\x{C96E}\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}" =~ m/<+>/, q{Match unanchored } ); # Pf FinalPunctuation ok( "\N{RIGHT SINGLE QUOTATION MARK}" =~ m/^<+>$/, q{Match (FinalPunctuation)} ); ok( "\N{RIGHT SINGLE QUOTATION MARK}" =~ m/^<[A]+>$/, q{Match compound (FinalPunctuation)} ); ok( "\N{RIGHT SINGLE QUOTATION MARK}" !~ m/^<->$/, q{Don't match externally inverted (FinalPunctuation)} ); ok( "\N{RIGHT SINGLE QUOTATION MARK}" !~ m/^<[A]->$/, q{Don't match compound inverted (FinalPunctuation)} ); ok( "\N{RIGHT SINGLE QUOTATION MARK}" !~ m/^<+<-Pf>>$/, q{Don't match internally inverted (FinalPunctuation)} ); ok( "\x{0515}" !~ m/^<+>$/, q{Don't match unrelated (FinalPunctuation)} ); ok( "\x{0515}" =~ m/^<->$/, q{Match unrelated externally inverted (FinalPunctuation)} ); ok( "\x{0515}" =~ m/^<+<-Pf>>$/, q{Match unrelated internally inverted (FinalPunctuation)} ); ok( "\N{ARMENIAN APOSTROPHE}" !~ m/^<+>$/, q{Don't match related (FinalPunctuation)} ); ok( "\N{ARMENIAN APOSTROPHE}" =~ m/^<+<-Pf>>$/, q{Match related internally inverted (FinalPunctuation)} ); ok( "\N{ARMENIAN APOSTROPHE}" =~ m/^<->$/, q{Match related externally inverted (FinalPunctuation)} ); ok( "\x{0515}\N{ARMENIAN APOSTROPHE}\N{RIGHT SINGLE QUOTATION MARK}" =~ m/<+>/, q{Match unanchored (FinalPunctuation)} ); ok( "\N{RIGHT SINGLE QUOTATION MARK}" =~ m/^<+>$/, q{Match } ); ok( "\N{RIGHT SINGLE QUOTATION MARK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{RIGHT SINGLE QUOTATION MARK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{RIGHT SINGLE QUOTATION MARK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{RIGHT SINGLE QUOTATION MARK}" !~ m/^<+<-FinalPunctuation>>$/, q{Don't match internally inverted } ); ok( "\N{MODIFIER LETTER PRIME}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{MODIFIER LETTER PRIME}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{MODIFIER LETTER PRIME}" =~ m/^<+<-FinalPunctuation>>$/, q{Match unrelated internally inverted } ); ok( "\N{MODIFIER LETTER PRIME}\N{RIGHT SINGLE QUOTATION MARK}" =~ m/<+>/, q{Match unanchored } ); # Po OtherPunctuation ok( "\N{EXCLAMATION MARK}" =~ m/^<+>$/, q{Match (OtherPunctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<[A]+>$/, q{Match compound (OtherPunctuation)} ); ok( "\N{EXCLAMATION MARK}" !~ m/^<->$/, q{Don't match externally inverted (OtherPunctuation)} ); ok( "\N{EXCLAMATION MARK}" !~ m/^<[A]->$/, q{Don't match compound inverted (OtherPunctuation)} ); ok( "\N{EXCLAMATION MARK}" !~ m/^<+<-Po>>$/, q{Don't match internally inverted (OtherPunctuation)} ); ok( "\x{A586}" !~ m/^<+>$/, q{Don't match unrelated (OtherPunctuation)} ); ok( "\x{A586}" =~ m/^<->$/, q{Match unrelated externally inverted (OtherPunctuation)} ); ok( "\x{A586}" =~ m/^<+<-Po>>$/, q{Match unrelated internally inverted (OtherPunctuation)} ); ok( "\N{LEFT PARENTHESIS}" !~ m/^<+>$/, q{Don't match related (OtherPunctuation)} ); ok( "\N{LEFT PARENTHESIS}" =~ m/^<+<-Po>>$/, q{Match related internally inverted (OtherPunctuation)} ); ok( "\N{LEFT PARENTHESIS}" =~ m/^<->$/, q{Match related externally inverted (OtherPunctuation)} ); ok( "\x{A586}\N{LEFT PARENTHESIS}\N{EXCLAMATION MARK}" =~ m/<+>/, q{Match unanchored (OtherPunctuation)} ); ok( "\N{EXCLAMATION MARK}" =~ m/^<+>$/, q{Match } ); ok( "\N{EXCLAMATION MARK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{EXCLAMATION MARK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{EXCLAMATION MARK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{EXCLAMATION MARK}" !~ m/^<+<-OtherPunctuation>>$/, q{Don't match internally inverted } ); ok( "\x{5FBD}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{5FBD}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{5FBD}" =~ m/^<+<-OtherPunctuation>>$/, q{Match unrelated internally inverted } ); ok( "\x{5FBD}\N{EXCLAMATION MARK}" =~ m/<+>/, q{Match unanchored } ); # S Symbol ok( "\N{GUJARATI RUPEE SIGN}" =~ m/^<+>$/, q{Match (Symbol)} ); ok( "\N{GUJARATI RUPEE SIGN}" =~ m/^<[A]+>$/, q{Match compound (Symbol)} ); ok( "\N{GUJARATI RUPEE SIGN}" !~ m/^<->$/, q{Don't match externally inverted (Symbol)} ); ok( "\N{GUJARATI RUPEE SIGN}" !~ m/^<[A]->$/, q{Don't match compound inverted (Symbol)} ); ok( "\N{GUJARATI RUPEE SIGN}" !~ m/^<+<-S>>$/, q{Don't match internally inverted (Symbol)} ); ok( "\N{GURMUKHI SIGN ADAK BINDI}" !~ m/^<+>$/, q{Don't match unrelated (Symbol)} ); ok( "\N{GURMUKHI SIGN ADAK BINDI}" =~ m/^<->$/, q{Match unrelated externally inverted (Symbol)} ); ok( "\N{GURMUKHI SIGN ADAK BINDI}" =~ m/^<+<-S>>$/, q{Match unrelated internally inverted (Symbol)} ); ok( "\N{GURMUKHI SIGN ADAK BINDI}\N{GUJARATI RUPEE SIGN}" =~ m/<+>/, q{Match unanchored (Symbol)} ); ok( "\N{LIMBU SIGN LOO}" =~ m/^<+>$/, q{Match } ); ok( "\N{LIMBU SIGN LOO}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LIMBU SIGN LOO}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LIMBU SIGN LOO}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LIMBU SIGN LOO}" !~ m/^<+<-Symbol>>$/, q{Don't match internally inverted } ); ok( "\x{192C}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{192C}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{192C}" =~ m/^<+<-Symbol>>$/, q{Match unrelated internally inverted } ); ok( "\x{192C}\N{LIMBU SIGN LOO}" =~ m/<+>/, q{Match unanchored } ); # Sm MathSymbol ok( "\N{PLUS SIGN}" =~ m/^<+>$/, q{Match (MathSymbol)} ); ok( "\N{PLUS SIGN}" =~ m/^<[A]+>$/, q{Match compound (MathSymbol)} ); ok( "\N{PLUS SIGN}" !~ m/^<->$/, q{Don't match externally inverted (MathSymbol)} ); ok( "\N{PLUS SIGN}" !~ m/^<[A]->$/, q{Don't match compound inverted (MathSymbol)} ); ok( "\N{PLUS SIGN}" !~ m/^<+<-Sm>>$/, q{Don't match internally inverted (MathSymbol)} ); ok( "\x{769B}" !~ m/^<+>$/, q{Don't match unrelated (MathSymbol)} ); ok( "\x{769B}" =~ m/^<->$/, q{Match unrelated externally inverted (MathSymbol)} ); ok( "\x{769B}" =~ m/^<+<-Sm>>$/, q{Match unrelated internally inverted (MathSymbol)} ); ok( "\N{YI RADICAL QOT}" !~ m/^<+>$/, q{Don't match related (MathSymbol)} ); ok( "\N{YI RADICAL QOT}" =~ m/^<+<-Sm>>$/, q{Match related internally inverted (MathSymbol)} ); ok( "\N{YI RADICAL QOT}" =~ m/^<->$/, q{Match related externally inverted (MathSymbol)} ); ok( "\x{769B}\N{YI RADICAL QOT}\N{PLUS SIGN}" =~ m/<+>/, q{Match unanchored (MathSymbol)} ); ok( "\N{FRACTION SLASH}" =~ m/^<+>$/, q{Match } ); ok( "\N{FRACTION SLASH}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{FRACTION SLASH}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{FRACTION SLASH}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{FRACTION SLASH}" !~ m/^<+<-MathSymbol>>$/, q{Don't match internally inverted } ); ok( "\N{GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI}" =~ m/^<+<-MathSymbol>>$/, q{Match unrelated internally inverted } ); ok( "\N{COMBINING LEFT HARPOON ABOVE}" !~ m/^<+>$/, q{Don't match related } ); ok( "\N{COMBINING LEFT HARPOON ABOVE}" =~ m/^<+<-MathSymbol>>$/, q{Match related internally inverted } ); ok( "\N{COMBINING LEFT HARPOON ABOVE}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\N{GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI}\N{COMBINING LEFT HARPOON ABOVE}\N{FRACTION SLASH}" =~ m/<+>/, q{Match unanchored } ); # Sc CurrencySymbol ok( "\N{DOLLAR SIGN}" =~ m/^<+>$/, q{Match (CurrencySymbol)} ); ok( "\N{DOLLAR SIGN}" =~ m/^<[A]+>$/, q{Match compound (CurrencySymbol)} ); ok( "\N{DOLLAR SIGN}" !~ m/^<->$/, q{Don't match externally inverted (CurrencySymbol)} ); ok( "\N{DOLLAR SIGN}" !~ m/^<[A]->$/, q{Don't match compound inverted (CurrencySymbol)} ); ok( "\N{DOLLAR SIGN}" !~ m/^<+<-Sc>>$/, q{Don't match internally inverted (CurrencySymbol)} ); ok( "\x{B6B4}" !~ m/^<+>$/, q{Don't match unrelated (CurrencySymbol)} ); ok( "\x{B6B4}" =~ m/^<->$/, q{Match unrelated externally inverted (CurrencySymbol)} ); ok( "\x{B6B4}" =~ m/^<+<-Sc>>$/, q{Match unrelated internally inverted (CurrencySymbol)} ); ok( "\N{PLUS SIGN}" !~ m/^<+>$/, q{Don't match related (CurrencySymbol)} ); ok( "\N{PLUS SIGN}" =~ m/^<+<-Sc>>$/, q{Match related internally inverted (CurrencySymbol)} ); ok( "\N{PLUS SIGN}" =~ m/^<->$/, q{Match related externally inverted (CurrencySymbol)} ); ok( "\x{B6B4}\N{PLUS SIGN}\N{DOLLAR SIGN}" =~ m/<+>/, q{Match unanchored (CurrencySymbol)} ); ok( "\N{EURO-CURRENCY SIGN}" =~ m/^<+>$/, q{Match } ); ok( "\N{EURO-CURRENCY SIGN}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{EURO-CURRENCY SIGN}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{EURO-CURRENCY SIGN}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{EURO-CURRENCY SIGN}" !~ m/^<+<-CurrencySymbol>>$/, q{Don't match internally inverted } ); ok( "\x{1CD3}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{1CD3}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{1CD3}" =~ m/^<+<-CurrencySymbol>>$/, q{Match unrelated internally inverted } ); ok( "\x{1CD3}\N{EURO-CURRENCY SIGN}" =~ m/<+>/, q{Match unanchored } ); # Sk ModifierSymbol ok( "\N{CIRCUMFLEX ACCENT}" =~ m/^<+>$/, q{Match (ModifierSymbol)} ); ok( "\N{CIRCUMFLEX ACCENT}" =~ m/^<[A]+>$/, q{Match compound (ModifierSymbol)} ); ok( "\N{CIRCUMFLEX ACCENT}" !~ m/^<->$/, q{Don't match externally inverted (ModifierSymbol)} ); ok( "\N{CIRCUMFLEX ACCENT}" !~ m/^<[A]->$/, q{Don't match compound inverted (ModifierSymbol)} ); ok( "\N{CIRCUMFLEX ACCENT}" !~ m/^<+<-Sk>>$/, q{Don't match internally inverted (ModifierSymbol)} ); ok( "\x{68FA}" !~ m/^<+>$/, q{Don't match unrelated (ModifierSymbol)} ); ok( "\x{68FA}" =~ m/^<->$/, q{Match unrelated externally inverted (ModifierSymbol)} ); ok( "\x{68FA}" =~ m/^<+<-Sk>>$/, q{Match unrelated internally inverted (ModifierSymbol)} ); ok( "\N{YI RADICAL QOT}" !~ m/^<+>$/, q{Don't match related (ModifierSymbol)} ); ok( "\N{YI RADICAL QOT}" =~ m/^<+<-Sk>>$/, q{Match related internally inverted (ModifierSymbol)} ); ok( "\N{YI RADICAL QOT}" =~ m/^<->$/, q{Match related externally inverted (ModifierSymbol)} ); ok( "\x{68FA}\N{YI RADICAL QOT}\N{CIRCUMFLEX ACCENT}" =~ m/<+>/, q{Match unanchored (ModifierSymbol)} ); ok( "\N{CIRCUMFLEX ACCENT}" =~ m/^<+>$/, q{Match } ); ok( "\N{CIRCUMFLEX ACCENT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{CIRCUMFLEX ACCENT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{CIRCUMFLEX ACCENT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{CIRCUMFLEX ACCENT}" !~ m/^<+<-ModifierSymbol>>$/, q{Don't match internally inverted } ); ok( "\x{69E7}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{69E7}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{69E7}" =~ m/^<+<-ModifierSymbol>>$/, q{Match unrelated internally inverted } ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<+>$/, q{Don't match related } ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<+<-ModifierSymbol>>$/, q{Match related internally inverted } ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{69E7}\N{COMBINING GRAVE ACCENT}\N{CIRCUMFLEX ACCENT}" =~ m/<+>/, q{Match unanchored } ); # So OtherSymbol ok( "\N{YI RADICAL QOT}" =~ m/^<+>$/, q{Match (OtherSymbol)} ); ok( "\N{YI RADICAL QOT}" =~ m/^<[A]+>$/, q{Match compound (OtherSymbol)} ); ok( "\N{YI RADICAL QOT}" !~ m/^<->$/, q{Don't match externally inverted (OtherSymbol)} ); ok( "\N{YI RADICAL QOT}" !~ m/^<[A]->$/, q{Don't match compound inverted (OtherSymbol)} ); ok( "\N{YI RADICAL QOT}" !~ m/^<+<-So>>$/, q{Don't match internally inverted (OtherSymbol)} ); ok( "\x{8C90}" !~ m/^<+>$/, q{Don't match unrelated (OtherSymbol)} ); ok( "\x{8C90}" =~ m/^<->$/, q{Match unrelated externally inverted (OtherSymbol)} ); ok( "\x{8C90}" =~ m/^<+<-So>>$/, q{Match unrelated internally inverted (OtherSymbol)} ); ok( "\N{DOLLAR SIGN}" !~ m/^<+>$/, q{Don't match related (OtherSymbol)} ); ok( "\N{DOLLAR SIGN}" =~ m/^<+<-So>>$/, q{Match related internally inverted (OtherSymbol)} ); ok( "\N{DOLLAR SIGN}" =~ m/^<->$/, q{Match related externally inverted (OtherSymbol)} ); ok( "\x{8C90}\N{DOLLAR SIGN}\N{YI RADICAL QOT}" =~ m/<+>/, q{Match unanchored (OtherSymbol)} ); ok( "\N{YI RADICAL QOT}" =~ m/^<+>$/, q{Match } ); ok( "\N{YI RADICAL QOT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{YI RADICAL QOT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{YI RADICAL QOT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{YI RADICAL QOT}" !~ m/^<+<-OtherSymbol>>$/, q{Don't match internally inverted } ); ok( "\x{95A7}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{95A7}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{95A7}" =~ m/^<+<-OtherSymbol>>$/, q{Match unrelated internally inverted } ); ok( "\x{95A7}\N{YI RADICAL QOT}" =~ m/<+>/, q{Match unanchored } ); # Z Separator ok( "\N{SPACE}" =~ m/^<+>$/, q{Match (Separator)} ); ok( "\N{SPACE}" =~ m/^<[A]+>$/, q{Match compound (Separator)} ); ok( "\N{SPACE}" !~ m/^<->$/, q{Don't match externally inverted (Separator)} ); ok( "\N{SPACE}" !~ m/^<[A]->$/, q{Don't match compound inverted (Separator)} ); ok( "\N{SPACE}" !~ m/^<+<-Z>>$/, q{Don't match internally inverted (Separator)} ); ok( "\x{D222}" !~ m/^<+>$/, q{Don't match unrelated (Separator)} ); ok( "\x{D222}" =~ m/^<->$/, q{Match unrelated externally inverted (Separator)} ); ok( "\x{D222}" =~ m/^<+<-Z>>$/, q{Match unrelated internally inverted (Separator)} ); ok( "\x{D222}\N{SPACE}" =~ m/<+>/, q{Match unanchored (Separator)} ); ok( "\N{SPACE}" =~ m/^<+>$/, q{Match } ); ok( "\N{SPACE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{SPACE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{SPACE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{SPACE}" !~ m/^<+<-Separator>>$/, q{Don't match internally inverted } ); ok( "\x{D7B7}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{D7B7}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{D7B7}" =~ m/^<+<-Separator>>$/, q{Match unrelated internally inverted } ); ok( "\N{DOLLAR SIGN}" !~ m/^<+>$/, q{Don't match related } ); ok( "\N{DOLLAR SIGN}" =~ m/^<+<-Separator>>$/, q{Match related internally inverted } ); ok( "\N{DOLLAR SIGN}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{D7B7}\N{DOLLAR SIGN}\N{SPACE}" =~ m/<+>/, q{Match unanchored } ); # Zs SpaceSeparator ok( "\N{SPACE}" =~ m/^<+>$/, q{Match (SpaceSeparator)} ); ok( "\N{SPACE}" =~ m/^<[A]+>$/, q{Match compound (SpaceSeparator)} ); ok( "\N{SPACE}" !~ m/^<->$/, q{Don't match externally inverted (SpaceSeparator)} ); ok( "\N{SPACE}" !~ m/^<[A]->$/, q{Don't match compound inverted (SpaceSeparator)} ); ok( "\N{SPACE}" !~ m/^<+<-Zs>>$/, q{Don't match internally inverted (SpaceSeparator)} ); ok( "\x{5918}" !~ m/^<+>$/, q{Don't match unrelated (SpaceSeparator)} ); ok( "\x{5918}" =~ m/^<->$/, q{Match unrelated externally inverted (SpaceSeparator)} ); ok( "\x{5918}" =~ m/^<+<-Zs>>$/, q{Match unrelated internally inverted (SpaceSeparator)} ); ok( "\N{LINE SEPARATOR}" !~ m/^<+>$/, q{Don't match related (SpaceSeparator)} ); ok( "\N{LINE SEPARATOR}" =~ m/^<+<-Zs>>$/, q{Match related internally inverted (SpaceSeparator)} ); ok( "\N{LINE SEPARATOR}" =~ m/^<->$/, q{Match related externally inverted (SpaceSeparator)} ); ok( "\x{5918}\N{LINE SEPARATOR}\N{SPACE}" =~ m/<+>/, q{Match unanchored (SpaceSeparator)} ); ok( "\N{SPACE}" =~ m/^<+>$/, q{Match } ); ok( "\N{SPACE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{SPACE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{SPACE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{SPACE}" !~ m/^<+<-SpaceSeparator>>$/, q{Don't match internally inverted } ); ok( "\x{3704}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{3704}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{3704}" =~ m/^<+<-SpaceSeparator>>$/, q{Match unrelated internally inverted } ); ok( "\N{HEXAGRAM FOR THE CREATIVE HEAVEN}" !~ m/^<+>$/, q{Don't match related } ); ok( "\N{HEXAGRAM FOR THE CREATIVE HEAVEN}" =~ m/^<+<-SpaceSeparator>>$/, q{Match related internally inverted } ); ok( "\N{HEXAGRAM FOR THE CREATIVE HEAVEN}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{3704}\N{HEXAGRAM FOR THE CREATIVE HEAVEN}\N{SPACE}" =~ m/<+>/, q{Match unanchored } ); # Zl LineSeparator ok( "\N{LINE SEPARATOR}" =~ m/^<+>$/, q{Match (LineSeparator)} ); ok( "\N{LINE SEPARATOR}" =~ m/^<[A]+>$/, q{Match compound (LineSeparator)} ); ok( "\N{LINE SEPARATOR}" !~ m/^<->$/, q{Don't match externally inverted (LineSeparator)} ); ok( "\N{LINE SEPARATOR}" !~ m/^<[A]->$/, q{Don't match compound inverted (LineSeparator)} ); ok( "\N{LINE SEPARATOR}" !~ m/^<+<-Zl>>$/, q{Don't match internally inverted (LineSeparator)} ); ok( "\x{ADAD}" !~ m/^<+>$/, q{Don't match unrelated (LineSeparator)} ); ok( "\x{ADAD}" =~ m/^<->$/, q{Match unrelated externally inverted (LineSeparator)} ); ok( "\x{ADAD}" =~ m/^<+<-Zl>>$/, q{Match unrelated internally inverted (LineSeparator)} ); ok( "\N{SPACE}" !~ m/^<+>$/, q{Don't match related (LineSeparator)} ); ok( "\N{SPACE}" =~ m/^<+<-Zl>>$/, q{Match related internally inverted (LineSeparator)} ); ok( "\N{SPACE}" =~ m/^<->$/, q{Match related externally inverted (LineSeparator)} ); ok( "\x{ADAD}\N{SPACE}\N{LINE SEPARATOR}" =~ m/<+>/, q{Match unanchored (LineSeparator)} ); ok( "\N{LINE SEPARATOR}" =~ m/^<+>$/, q{Match } ); ok( "\N{LINE SEPARATOR}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LINE SEPARATOR}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LINE SEPARATOR}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LINE SEPARATOR}" !~ m/^<+<-LineSeparator>>$/, q{Don't match internally inverted } ); ok( "\x{C5E7}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{C5E7}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{C5E7}" =~ m/^<+<-LineSeparator>>$/, q{Match unrelated internally inverted } ); ok( "\x{C5E7}" !~ m/^<+>$/, q{Don't match related } ); ok( "\x{C5E7}" =~ m/^<+<-LineSeparator>>$/, q{Match related internally inverted } ); ok( "\x{C5E7}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{C5E7}\x{C5E7}\N{LINE SEPARATOR}" =~ m/<+>/, q{Match unanchored } ); # Zp ParagraphSeparator ok( "\N{PARAGRAPH SEPARATOR}" =~ m/^<+>$/, q{Match (ParagraphSeparator)} ); ok( "\N{PARAGRAPH SEPARATOR}" =~ m/^<[A]+>$/, q{Match compound (ParagraphSeparator)} ); ok( "\N{PARAGRAPH SEPARATOR}" !~ m/^<->$/, q{Don't match externally inverted (ParagraphSeparator)} ); ok( "\N{PARAGRAPH SEPARATOR}" !~ m/^<[A]->$/, q{Don't match compound inverted (ParagraphSeparator)} ); ok( "\N{PARAGRAPH SEPARATOR}" !~ m/^<+<-Zp>>$/, q{Don't match internally inverted (ParagraphSeparator)} ); ok( "\N{KHMER SYMBOL LEK ATTAK PRAM-BUON}" !~ m/^<+>$/, q{Don't match unrelated (ParagraphSeparator)} ); ok( "\N{KHMER SYMBOL LEK ATTAK PRAM-BUON}" =~ m/^<->$/, q{Match unrelated externally inverted (ParagraphSeparator)} ); ok( "\N{KHMER SYMBOL LEK ATTAK PRAM-BUON}" =~ m/^<+<-Zp>>$/, q{Match unrelated internally inverted (ParagraphSeparator)} ); ok( "\N{MONGOLIAN VOWEL SEPARATOR}" !~ m/^<+>$/, q{Don't match related (ParagraphSeparator)} ); ok( "\N{MONGOLIAN VOWEL SEPARATOR}" =~ m/^<+<-Zp>>$/, q{Match related internally inverted (ParagraphSeparator)} ); ok( "\N{MONGOLIAN VOWEL SEPARATOR}" =~ m/^<->$/, q{Match related externally inverted (ParagraphSeparator)} ); ok( "\N{KHMER SYMBOL LEK ATTAK PRAM-BUON}\N{MONGOLIAN VOWEL SEPARATOR}\N{PARAGRAPH SEPARATOR}" =~ m/<+>/, q{Match unanchored (ParagraphSeparator)} ); ok( "\N{PARAGRAPH SEPARATOR}" =~ m/^<+>$/, q{Match } ); ok( "\N{PARAGRAPH SEPARATOR}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{PARAGRAPH SEPARATOR}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{PARAGRAPH SEPARATOR}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{PARAGRAPH SEPARATOR}" !~ m/^<+<-ParagraphSeparator>>$/, q{Don't match internally inverted } ); ok( "\N{HIRAGANA LETTER KA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{HIRAGANA LETTER KA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{HIRAGANA LETTER KA}" =~ m/^<+<-ParagraphSeparator>>$/, q{Match unrelated internally inverted } ); ok( "\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" !~ m/^<+>$/, q{Don't match related } ); ok( "\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" =~ m/^<+<-ParagraphSeparator>>$/, q{Match related internally inverted } ); ok( "\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\N{HIRAGANA LETTER KA}\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}\N{PARAGRAPH SEPARATOR}" =~ m/<+>/, q{Match unanchored } ); # C Other ok( "\x{9FA6}" =~ m/^<+>$/, q{Match (Other)} ); ok( "\x{9FA6}" =~ m/^<[A]+>$/, q{Match compound (Other)} ); ok( "\x{9FA6}" !~ m/^<->$/, q{Don't match externally inverted (Other)} ); ok( "\x{9FA6}" !~ m/^<[A]->$/, q{Don't match compound inverted (Other)} ); ok( "\x{9FA6}" !~ m/^<+<-C>>$/, q{Don't match internally inverted (Other)} ); ok( "\x{56E6}" !~ m/^<+>$/, q{Don't match unrelated (Other)} ); ok( "\x{56E6}" =~ m/^<->$/, q{Match unrelated externally inverted (Other)} ); ok( "\x{56E6}" =~ m/^<+<-C>>$/, q{Match unrelated internally inverted (Other)} ); ok( "\x{56E6}\x{9FA6}" =~ m/<+>/, q{Match unanchored (Other)} ); ok( "\x{0EAC}" =~ m/^<+>$/, q{Match } ); ok( "\x{0EAC}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0EAC}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0EAC}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0EAC}" !~ m/^<+<-Other>>$/, q{Don't match internally inverted } ); ok( "\N{LAO LETTER HO SUNG}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{LAO LETTER HO SUNG}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{LAO LETTER HO SUNG}" =~ m/^<+<-Other>>$/, q{Match unrelated internally inverted } ); ok( "\N{LAO LETTER HO SUNG}\x{0EAC}" =~ m/<+>/, q{Match unanchored } ); # Cc Control ok( "\N{NULL}" =~ m/^<+>$/, q{Match (Control)} ); ok( "\N{NULL}" =~ m/^<[A]+>$/, q{Match compound (Control)} ); ok( "\N{NULL}" !~ m/^<->$/, q{Don't match externally inverted (Control)} ); ok( "\N{NULL}" !~ m/^<[A]->$/, q{Don't match compound inverted (Control)} ); ok( "\N{NULL}" !~ m/^<+<-Cc>>$/, q{Don't match internally inverted (Control)} ); ok( "\N{OGONEK}" !~ m/^<+>$/, q{Don't match unrelated (Control)} ); ok( "\N{OGONEK}" =~ m/^<->$/, q{Match unrelated externally inverted (Control)} ); ok( "\N{OGONEK}" =~ m/^<+<-Cc>>$/, q{Match unrelated internally inverted (Control)} ); ok( "\x{0358}" !~ m/^<+>$/, q{Don't match related (Control)} ); ok( "\x{0358}" =~ m/^<+<-Cc>>$/, q{Match related internally inverted (Control)} ); ok( "\x{0358}" =~ m/^<->$/, q{Match related externally inverted (Control)} ); ok( "\N{OGONEK}\x{0358}\N{NULL}" =~ m/<+>/, q{Match unanchored (Control)} ); ok( "\N{NULL}" =~ m/^<+>$/, q{Match } ); ok( "\N{NULL}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{NULL}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{NULL}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{NULL}" !~ m/^<+<-Control>>$/, q{Don't match internally inverted } ); ok( "\x{4A20}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{4A20}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{4A20}" =~ m/^<+<-Control>>$/, q{Match unrelated internally inverted } ); ok( "\x{4DB6}" !~ m/^<+>$/, q{Don't match related } ); ok( "\x{4DB6}" =~ m/^<+<-Control>>$/, q{Match related internally inverted } ); ok( "\x{4DB6}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{4A20}\x{4DB6}\N{NULL}" =~ m/<+>/, q{Match unanchored } ); # Cf Format ok( "\N{SOFT HYPHEN}" =~ m/^<+>$/, q{Match (Format)} ); ok( "\N{SOFT HYPHEN}" =~ m/^<[A]+>$/, q{Match compound (Format)} ); ok( "\N{SOFT HYPHEN}" !~ m/^<->$/, q{Don't match externally inverted (Format)} ); ok( "\N{SOFT HYPHEN}" !~ m/^<[A]->$/, q{Don't match compound inverted (Format)} ); ok( "\N{SOFT HYPHEN}" !~ m/^<+<-Cf>>$/, q{Don't match internally inverted (Format)} ); ok( "\x{AECE}" !~ m/^<+>$/, q{Don't match unrelated (Format)} ); ok( "\x{AECE}" =~ m/^<->$/, q{Match unrelated externally inverted (Format)} ); ok( "\x{AECE}" =~ m/^<+<-Cf>>$/, q{Match unrelated internally inverted (Format)} ); ok( "\x{D7A4}" !~ m/^<+>$/, q{Don't match related (Format)} ); ok( "\x{D7A4}" =~ m/^<+<-Cf>>$/, q{Match related internally inverted (Format)} ); ok( "\x{D7A4}" =~ m/^<->$/, q{Match related externally inverted (Format)} ); ok( "\x{AECE}\x{D7A4}\N{SOFT HYPHEN}" =~ m/<+>/, q{Match unanchored (Format)} ); ok( "\N{SOFT HYPHEN}" =~ m/^<+>$/, q{Match } ); ok( "\N{SOFT HYPHEN}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{SOFT HYPHEN}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{SOFT HYPHEN}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{SOFT HYPHEN}" !~ m/^<+<-Format>>$/, q{Don't match internally inverted } ); ok( "\x{5382}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{5382}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{5382}" =~ m/^<+<-Format>>$/, q{Match unrelated internally inverted } ); ok( "\x{5382}\N{SOFT HYPHEN}" =~ m/<+>/, q{Match unanchored } ); # BidiL # Left-to-Right ok( "\N{YI SYLLABLE IT}" =~ m/^<+>$/, q{Match (Left-to-Right)} ); ok( "\N{YI SYLLABLE IT}" =~ m/^<[A]+>$/, q{Match compound (Left-to-Right)} ); ok( "\N{YI SYLLABLE IT}" !~ m/^<->$/, q{Don't match externally inverted (Left-to-Right)} ); ok( "\N{YI SYLLABLE IT}" !~ m/^<[A]->$/, q{Don't match compound inverted (Left-to-Right)} ); ok( "\N{YI SYLLABLE IT}" !~ m/^<+<-BidiL>>$/, q{Don't match internally inverted (Left-to-Right)} ); ok( "\x{5BF5}" !~ m/^<+>$/, q{Don't match unrelated (Left-to-Right)} ); ok( "\x{5BF5}" =~ m/^<->$/, q{Match unrelated externally inverted (Left-to-Right)} ); ok( "\x{5BF5}" =~ m/^<+<-BidiL>>$/, q{Match unrelated internally inverted (Left-to-Right)} ); ok( "\x{5BF5}\N{YI SYLLABLE IT}" =~ m/<+>/, q{Match unanchored (Left-to-Right)} ); # BidiEN # European Number ok( "\N{DIGIT ZERO}" =~ m/^<+>$/, q{Match (European Number)} ); ok( "\N{DIGIT ZERO}" =~ m/^<[A]+>$/, q{Match compound (European Number)} ); ok( "\N{DIGIT ZERO}" !~ m/^<->$/, q{Don't match externally inverted (European Number)} ); ok( "\N{DIGIT ZERO}" !~ m/^<[A]->$/, q{Don't match compound inverted (European Number)} ); ok( "\N{DIGIT ZERO}" !~ m/^<+<-BidiEN>>$/, q{Don't match internally inverted (European Number)} ); ok( "\x{5596}" !~ m/^<+>$/, q{Don't match unrelated (European Number)} ); ok( "\x{5596}" =~ m/^<->$/, q{Match unrelated externally inverted (European Number)} ); ok( "\x{5596}" =~ m/^<+<-BidiEN>>$/, q{Match unrelated internally inverted (European Number)} ); ok( "\x{5596}\N{DIGIT ZERO}" =~ m/<+>/, q{Match unanchored (European Number)} ); # BidiES # European Number Separator ok( "\N{SOLIDUS}" =~ m/^<+>$/, q{Match (European Number Separator)} ); ok( "\N{SOLIDUS}" =~ m/^<[A]+>$/, q{Match compound (European Number Separator)} ); ok( "\N{SOLIDUS}" !~ m/^<->$/, q{Don't match externally inverted (European Number Separator)} ); ok( "\N{SOLIDUS}" !~ m/^<[A]->$/, q{Don't match compound inverted (European Number Separator)} ); ok( "\N{SOLIDUS}" !~ m/^<+<-BidiES>>$/, q{Don't match internally inverted (European Number Separator)} ); ok( "\x{85D3}" !~ m/^<+>$/, q{Don't match unrelated (European Number Separator)} ); ok( "\x{85D3}" =~ m/^<->$/, q{Match unrelated externally inverted (European Number Separator)} ); ok( "\x{85D3}" =~ m/^<+<-BidiES>>$/, q{Match unrelated internally inverted (European Number Separator)} ); ok( "\x{85D3}\N{SOLIDUS}" =~ m/<+>/, q{Match unanchored (European Number Separator)} ); # BidiET # European Number Terminator ok( "\N{NUMBER SIGN}" =~ m/^<+>$/, q{Match (European Number Terminator)} ); ok( "\N{NUMBER SIGN}" =~ m/^<[A]+>$/, q{Match compound (European Number Terminator)} ); ok( "\N{NUMBER SIGN}" !~ m/^<->$/, q{Don't match externally inverted (European Number Terminator)} ); ok( "\N{NUMBER SIGN}" !~ m/^<[A]->$/, q{Don't match compound inverted (European Number Terminator)} ); ok( "\N{NUMBER SIGN}" !~ m/^<+<-BidiET>>$/, q{Don't match internally inverted (European Number Terminator)} ); ok( "\x{9AFC}" !~ m/^<+>$/, q{Don't match unrelated (European Number Terminator)} ); ok( "\x{9AFC}" =~ m/^<->$/, q{Match unrelated externally inverted (European Number Terminator)} ); ok( "\x{9AFC}" =~ m/^<+<-BidiET>>$/, q{Match unrelated internally inverted (European Number Terminator)} ); ok( "\x{9AFC}\N{NUMBER SIGN}" =~ m/<+>/, q{Match unanchored (European Number Terminator)} ); # BidiWS # Whitespace ok( "\N{FORM FEED (FF)}" =~ m/^<+>$/, q{Match (Whitespace)} ); ok( "\N{FORM FEED (FF)}" =~ m/^<[A]+>$/, q{Match compound (Whitespace)} ); ok( "\N{FORM FEED (FF)}" !~ m/^<->$/, q{Don't match externally inverted (Whitespace)} ); ok( "\N{FORM FEED (FF)}" !~ m/^<[A]->$/, q{Don't match compound inverted (Whitespace)} ); ok( "\N{FORM FEED (FF)}" !~ m/^<+<-BidiWS>>$/, q{Don't match internally inverted (Whitespace)} ); ok( "\x{4441}" !~ m/^<+>$/, q{Don't match unrelated (Whitespace)} ); ok( "\x{4441}" =~ m/^<->$/, q{Match unrelated externally inverted (Whitespace)} ); ok( "\x{4441}" =~ m/^<+<-BidiWS>>$/, q{Match unrelated internally inverted (Whitespace)} ); ok( "\x{4441}\N{FORM FEED (FF)}" =~ m/<+>/, q{Match unanchored (Whitespace)} ); # Arabic ok( "\N{ARABIC LETTER HAMZA}" =~ m/^<+>$/, q{Match } ); ok( "\N{ARABIC LETTER HAMZA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{ARABIC LETTER HAMZA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{ARABIC LETTER HAMZA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{ARABIC LETTER HAMZA}" !~ m/^<+<-Arabic>>$/, q{Don't match internally inverted } ); ok( "\N{YI SYLLABLE RYRX}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{YI SYLLABLE RYRX}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{YI SYLLABLE RYRX}" =~ m/^<+<-Arabic>>$/, q{Match unrelated internally inverted } ); ok( "\N{YI SYLLABLE RYRX}\N{ARABIC LETTER HAMZA}" =~ m/<+>/, q{Match unanchored } ); # Armenian ok( "\N{ARMENIAN CAPITAL LETTER AYB}" =~ m/^<+>$/, q{Match } ); ok( "\N{ARMENIAN CAPITAL LETTER AYB}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{ARMENIAN CAPITAL LETTER AYB}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{ARMENIAN CAPITAL LETTER AYB}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{ARMENIAN CAPITAL LETTER AYB}" !~ m/^<+<-Armenian>>$/, q{Don't match internally inverted } ); ok( "\x{B2ED}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{B2ED}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{B2ED}" =~ m/^<+<-Armenian>>$/, q{Match unrelated internally inverted } ); ok( "\x{B2ED}\N{ARMENIAN CAPITAL LETTER AYB}" =~ m/<+>/, q{Match unanchored } ); # Bengali ok( "\N{BENGALI SIGN CANDRABINDU}" =~ m/^<+>$/, q{Match } ); ok( "\N{BENGALI SIGN CANDRABINDU}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{BENGALI SIGN CANDRABINDU}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{BENGALI SIGN CANDRABINDU}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{BENGALI SIGN CANDRABINDU}" !~ m/^<+<-Bengali>>$/, q{Don't match internally inverted } ); ok( "\x{4AFD}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{4AFD}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{4AFD}" =~ m/^<+<-Bengali>>$/, q{Match unrelated internally inverted } ); ok( "\x{4AFD}\N{BENGALI SIGN CANDRABINDU}" =~ m/<+>/, q{Match unanchored } ); # Bopomofo ok( "\N{BOPOMOFO LETTER B}" =~ m/^<+>$/, q{Match } ); ok( "\N{BOPOMOFO LETTER B}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{BOPOMOFO LETTER B}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{BOPOMOFO LETTER B}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{BOPOMOFO LETTER B}" !~ m/^<+<-Bopomofo>>$/, q{Don't match internally inverted } ); ok( "\x{8369}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{8369}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{8369}" =~ m/^<+<-Bopomofo>>$/, q{Match unrelated internally inverted } ); ok( "\x{8369}\N{BOPOMOFO LETTER B}" =~ m/<+>/, q{Match unanchored } ); # Buhid ok( "\N{BUHID LETTER A}" =~ m/^<+>$/, q{Match } ); ok( "\N{BUHID LETTER A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{BUHID LETTER A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{BUHID LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{BUHID LETTER A}" !~ m/^<+<-Buhid>>$/, q{Don't match internally inverted } ); ok( "\x{877F}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{877F}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{877F}" =~ m/^<+<-Buhid>>$/, q{Match unrelated internally inverted } ); ok( "\x{877F}\N{BUHID LETTER A}" =~ m/<+>/, q{Match unanchored } ); # CanadianAboriginal ok( "\N{CANADIAN SYLLABICS E}" =~ m/^<+>$/, q{Match } ); ok( "\N{CANADIAN SYLLABICS E}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{CANADIAN SYLLABICS E}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{CANADIAN SYLLABICS E}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{CANADIAN SYLLABICS E}" !~ m/^<+<-CanadianAboriginal>>$/, q{Don't match internally inverted } ); ok( "\x{3A42}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{3A42}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{3A42}" =~ m/^<+<-CanadianAboriginal>>$/, q{Match unrelated internally inverted } ); ok( "\x{4DB6}" !~ m/^<+>$/, q{Don't match related } ); ok( "\x{4DB6}" =~ m/^<+<-CanadianAboriginal>>$/, q{Match related internally inverted } ); ok( "\x{4DB6}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{3A42}\x{4DB6}\N{CANADIAN SYLLABICS E}" =~ m/<+>/, q{Match unanchored } ); # Cherokee ok( "\N{CHEROKEE LETTER A}" =~ m/^<+>$/, q{Match } ); ok( "\N{CHEROKEE LETTER A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{CHEROKEE LETTER A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{CHEROKEE LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{CHEROKEE LETTER A}" !~ m/^<+<-Cherokee>>$/, q{Don't match internally inverted } ); ok( "\x{A9EF}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{A9EF}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{A9EF}" =~ m/^<+<-Cherokee>>$/, q{Match unrelated internally inverted } ); ok( "\x{A9EF}" !~ m/^<+>$/, q{Don't match related } ); ok( "\x{A9EF}" =~ m/^<+<-Cherokee>>$/, q{Match related internally inverted } ); ok( "\x{A9EF}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{A9EF}\x{A9EF}\N{CHEROKEE LETTER A}" =~ m/<+>/, q{Match unanchored } ); # Cyrillic ok( "\N{CYRILLIC LETTER SMALL CAPITAL EL}" =~ m/^<+>$/, q{Match } ); ok( "\N{CYRILLIC LETTER SMALL CAPITAL EL}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{CYRILLIC LETTER SMALL CAPITAL EL}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{CYRILLIC LETTER SMALL CAPITAL EL}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{CYRILLIC LETTER SMALL CAPITAL EL}" !~ m/^<+<-Cyrillic>>$/, q{Don't match internally inverted } ); ok( "\x{07EF}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{07EF}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{07EF}" =~ m/^<+<-Cyrillic>>$/, q{Match unrelated internally inverted } ); ok( "\x{07EF}" !~ m/^<+>$/, q{Don't match related } ); ok( "\x{07EF}" =~ m/^<+<-Cyrillic>>$/, q{Match related internally inverted } ); ok( "\x{07EF}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{07EF}\x{07EF}\N{CYRILLIC LETTER SMALL CAPITAL EL}" =~ m/<+>/, q{Match unanchored } ); # Deseret ok( "\x{65BD}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{65BD}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{65BD}" =~ m/^<+<-Deseret>>$/, q{Match unrelated internally inverted } ); # Devanagari ok( "\N{DEVANAGARI SIGN CANDRABINDU}" =~ m/^<+>$/, q{Match } ); ok( "\N{DEVANAGARI SIGN CANDRABINDU}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{DEVANAGARI SIGN CANDRABINDU}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{DEVANAGARI SIGN CANDRABINDU}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{DEVANAGARI SIGN CANDRABINDU}" !~ m/^<+<-Devanagari>>$/, q{Don't match internally inverted } ); ok( "\x{653B}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{653B}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{653B}" =~ m/^<+<-Devanagari>>$/, q{Match unrelated internally inverted } ); ok( "\x{653B}\N{DEVANAGARI SIGN CANDRABINDU}" =~ m/<+>/, q{Match unanchored } ); # Ethiopic ok( "\N{ETHIOPIC SYLLABLE HA}" =~ m/^<+>$/, q{Match } ); ok( "\N{ETHIOPIC SYLLABLE HA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{ETHIOPIC SYLLABLE HA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{ETHIOPIC SYLLABLE HA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{ETHIOPIC SYLLABLE HA}" !~ m/^<+<-Ethiopic>>$/, q{Don't match internally inverted } ); ok( "\x{482C}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{482C}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{482C}" =~ m/^<+<-Ethiopic>>$/, q{Match unrelated internally inverted } ); ok( "\x{482C}\N{ETHIOPIC SYLLABLE HA}" =~ m/<+>/, q{Match unanchored } ); # Georgian ok( "\N{GEORGIAN CAPITAL LETTER AN}" =~ m/^<+>$/, q{Match } ); ok( "\N{GEORGIAN CAPITAL LETTER AN}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{GEORGIAN CAPITAL LETTER AN}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{GEORGIAN CAPITAL LETTER AN}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{GEORGIAN CAPITAL LETTER AN}" !~ m/^<+<-Georgian>>$/, q{Don't match internally inverted } ); ok( "\x{9BE5}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{9BE5}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{9BE5}" =~ m/^<+<-Georgian>>$/, q{Match unrelated internally inverted } ); ok( "\x{9BE5}\N{GEORGIAN CAPITAL LETTER AN}" =~ m/<+>/, q{Match unanchored } ); # Gothic ok( "\x{4ED2}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{4ED2}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{4ED2}" =~ m/^<+<-Gothic>>$/, q{Match unrelated internally inverted } ); # Greek ok( "\N{MICRO SIGN}" =~ m/^<+>$/, q{Match } ); ok( "\N{MICRO SIGN}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{MICRO SIGN}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{MICRO SIGN}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{MICRO SIGN}" !~ m/^<+<-Greek>>$/, q{Don't match internally inverted } ); ok( "\x{D486}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{D486}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{D486}" =~ m/^<+<-Greek>>$/, q{Match unrelated internally inverted } ); ok( "\x{D486}\N{MICRO SIGN}" =~ m/<+>/, q{Match unanchored } ); # Gujarati ok( "\N{GUJARATI SIGN CANDRABINDU}" =~ m/^<+>$/, q{Match } ); ok( "\N{GUJARATI SIGN CANDRABINDU}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{GUJARATI SIGN CANDRABINDU}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{GUJARATI SIGN CANDRABINDU}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{GUJARATI SIGN CANDRABINDU}" !~ m/^<+<-Gujarati>>$/, q{Don't match internally inverted } ); ok( "\x{B3F3}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{B3F3}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{B3F3}" =~ m/^<+<-Gujarati>>$/, q{Match unrelated internally inverted } ); ok( "\x{B3F3}\N{GUJARATI SIGN CANDRABINDU}" =~ m/<+>/, q{Match unanchored } ); # Gurmukhi ok( "\N{GURMUKHI SIGN BINDI}" =~ m/^<+>$/, q{Match } ); ok( "\N{GURMUKHI SIGN BINDI}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{GURMUKHI SIGN BINDI}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{GURMUKHI SIGN BINDI}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{GURMUKHI SIGN BINDI}" !~ m/^<+<-Gurmukhi>>$/, q{Don't match internally inverted } ); ok( "\x{6469}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{6469}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{6469}" =~ m/^<+<-Gurmukhi>>$/, q{Match unrelated internally inverted } ); ok( "\x{6469}\N{GURMUKHI SIGN BINDI}" =~ m/<+>/, q{Match unanchored } ); # Han ok( "\x{9DB5}" =~ m/^<+>$/, q{Match } ); ok( "\x{9DB5}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{9DB5}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{9DB5}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{9DB5}" !~ m/^<+<-Han>>$/, q{Don't match internally inverted } ); ok( "\x{9FA6}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{9FA6}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{9FA6}" =~ m/^<+<-Han>>$/, q{Match unrelated internally inverted } ); ok( "\x{9FA6}\x{9DB5}" =~ m/<+>/, q{Match unanchored } ); # Hangul ok( "\x{AC00}" =~ m/^<+>$/, q{Match } ); ok( "\x{AC00}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{AC00}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{AC00}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{AC00}" !~ m/^<+<-Hangul>>$/, q{Don't match internally inverted } ); ok( "\x{9E09}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{9E09}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{9E09}" =~ m/^<+<-Hangul>>$/, q{Match unrelated internally inverted } ); ok( "\x{9E09}\x{AC00}" =~ m/<+>/, q{Match unanchored } ); # Hanunoo ok( "\N{HANUNOO LETTER A}" =~ m/^<+>$/, q{Match } ); ok( "\N{HANUNOO LETTER A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{HANUNOO LETTER A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{HANUNOO LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{HANUNOO LETTER A}" !~ m/^<+<-Hanunoo>>$/, q{Don't match internally inverted } ); ok( "\x{580B}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{580B}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{580B}" =~ m/^<+<-Hanunoo>>$/, q{Match unrelated internally inverted } ); ok( "\x{580B}\N{HANUNOO LETTER A}" =~ m/<+>/, q{Match unanchored } ); # Hebrew ok( "\N{HEBREW LETTER ALEF}" =~ m/^<+>$/, q{Match } ); ok( "\N{HEBREW LETTER ALEF}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{HEBREW LETTER ALEF}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{HEBREW LETTER ALEF}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{HEBREW LETTER ALEF}" !~ m/^<+<-Hebrew>>$/, q{Don't match internally inverted } ); ok( "\x{62B4}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{62B4}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{62B4}" =~ m/^<+<-Hebrew>>$/, q{Match unrelated internally inverted } ); ok( "\x{62B4}\N{HEBREW LETTER ALEF}" =~ m/<+>/, q{Match unanchored } ); # Hiragana ok( "\N{HIRAGANA LETTER SMALL A}" =~ m/^<+>$/, q{Match } ); ok( "\N{HIRAGANA LETTER SMALL A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{HIRAGANA LETTER SMALL A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{HIRAGANA LETTER SMALL A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{HIRAGANA LETTER SMALL A}" !~ m/^<+<-Hiragana>>$/, q{Don't match internally inverted } ); ok( "\x{9504}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{9504}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{9504}" =~ m/^<+<-Hiragana>>$/, q{Match unrelated internally inverted } ); ok( "\x{9504}\N{HIRAGANA LETTER SMALL A}" =~ m/<+>/, q{Match unanchored } ); # Inherited ok( "\N{MONGOLIAN FREE VARIATION SELECTOR ONE}" =~ m/^<+>$/, q{Match } ); ok( "\N{MONGOLIAN FREE VARIATION SELECTOR ONE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{MONGOLIAN FREE VARIATION SELECTOR ONE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{MONGOLIAN FREE VARIATION SELECTOR ONE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{MONGOLIAN FREE VARIATION SELECTOR ONE}" !~ m/^<+<-Inherited>>$/, q{Don't match internally inverted } ); ok( "\N{TAMIL LETTER RRA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{TAMIL LETTER RRA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{TAMIL LETTER RRA}" =~ m/^<+<-Inherited>>$/, q{Match unrelated internally inverted } ); ok( "\N{TAMIL LETTER RRA}\N{MONGOLIAN FREE VARIATION SELECTOR ONE}" =~ m/<+>/, q{Match unanchored } ); # Kannada ok( "\N{KANNADA SIGN ANUSVARA}" =~ m/^<+>$/, q{Match } ); ok( "\N{KANNADA SIGN ANUSVARA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{KANNADA SIGN ANUSVARA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{KANNADA SIGN ANUSVARA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{KANNADA SIGN ANUSVARA}" !~ m/^<+<-Kannada>>$/, q{Don't match internally inverted } ); ok( "\N{BLACK RIGHT-POINTING SMALL TRIANGLE}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{BLACK RIGHT-POINTING SMALL TRIANGLE}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{BLACK RIGHT-POINTING SMALL TRIANGLE}" =~ m/^<+<-Kannada>>$/, q{Match unrelated internally inverted } ); ok( "\N{BLACK RIGHT-POINTING SMALL TRIANGLE}\N{KANNADA SIGN ANUSVARA}" =~ m/<+>/, q{Match unanchored } ); # Katakana ok( "\N{KATAKANA LETTER SMALL A}" =~ m/^<+>$/, q{Match } ); ok( "\N{KATAKANA LETTER SMALL A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{KATAKANA LETTER SMALL A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{KATAKANA LETTER SMALL A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{KATAKANA LETTER SMALL A}" !~ m/^<+<-Katakana>>$/, q{Don't match internally inverted } ); ok( "\x{40DB}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{40DB}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{40DB}" =~ m/^<+<-Katakana>>$/, q{Match unrelated internally inverted } ); ok( "\x{40DB}\N{KATAKANA LETTER SMALL A}" =~ m/<+>/, q{Match unanchored } ); # Khmer ok( "\N{KHMER LETTER KA}" =~ m/^<+>$/, q{Match } ); ok( "\N{KHMER LETTER KA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{KHMER LETTER KA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{KHMER LETTER KA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{KHMER LETTER KA}" !~ m/^<+<-Khmer>>$/, q{Don't match internally inverted } ); ok( "\x{AC3E}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{AC3E}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{AC3E}" =~ m/^<+<-Khmer>>$/, q{Match unrelated internally inverted } ); ok( "\x{AC3E}\N{KHMER LETTER KA}" =~ m/<+>/, q{Match unanchored } ); # Lao ok( "\N{LAO LETTER KO}" =~ m/^<+>$/, q{Match } ); ok( "\N{LAO LETTER KO}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LAO LETTER KO}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LAO LETTER KO}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LAO LETTER KO}" !~ m/^<+<-Lao>>$/, q{Don't match internally inverted } ); ok( "\N{MODIFIER LETTER UNASPIRATED}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{MODIFIER LETTER UNASPIRATED}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{MODIFIER LETTER UNASPIRATED}" =~ m/^<+<-Lao>>$/, q{Match unrelated internally inverted } ); ok( "\N{MODIFIER LETTER DOUBLE APOSTROPHE}" !~ m/^<+>$/, q{Don't match related } ); ok( "\N{MODIFIER LETTER DOUBLE APOSTROPHE}" =~ m/^<+<-Lao>>$/, q{Match related internally inverted } ); ok( "\N{MODIFIER LETTER DOUBLE APOSTROPHE}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\N{MODIFIER LETTER UNASPIRATED}\N{MODIFIER LETTER DOUBLE APOSTROPHE}\N{LAO LETTER KO}" =~ m/<+>/, q{Match unanchored } ); # Latin ok( "\N{LATIN CAPITAL LETTER A}" =~ m/^<+>$/, q{Match } ); ok( "\N{LATIN CAPITAL LETTER A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LATIN CAPITAL LETTER A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LATIN CAPITAL LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LATIN CAPITAL LETTER A}" !~ m/^<+<-Latin>>$/, q{Don't match internally inverted } ); ok( "\x{6B4C}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{6B4C}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{6B4C}" =~ m/^<+<-Latin>>$/, q{Match unrelated internally inverted } ); ok( "\x{6B4C}" !~ m/^<+>$/, q{Don't match related } ); ok( "\x{6B4C}" =~ m/^<+<-Latin>>$/, q{Match related internally inverted } ); ok( "\x{6B4C}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{6B4C}\x{6B4C}\N{LATIN CAPITAL LETTER A}" =~ m/<+>/, q{Match unanchored } ); # Malayalam ok( "\N{MALAYALAM LETTER TA}" =~ m/^<+>$/, q{Match } ); ok( "\N{MALAYALAM LETTER TA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{MALAYALAM LETTER TA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{MALAYALAM LETTER TA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{MALAYALAM LETTER TA}" !~ m/^<+<-Malayalam>>$/, q{Don't match internally inverted } ); ok( "\x{0D29}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{0D29}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{0D29}" =~ m/^<+<-Malayalam>>$/, q{Match unrelated internally inverted } ); ok( "\N{SINHALA SIGN ANUSVARAYA}" !~ m/^<+>$/, q{Don't match related } ); ok( "\N{SINHALA SIGN ANUSVARAYA}" =~ m/^<+<-Malayalam>>$/, q{Match related internally inverted } ); ok( "\N{SINHALA SIGN ANUSVARAYA}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{0D29}\N{SINHALA SIGN ANUSVARAYA}\N{MALAYALAM LETTER TA}" =~ m/<+>/, q{Match unanchored } ); # Mongolian ok( "\N{MONGOLIAN DIGIT ZERO}" =~ m/^<+>$/, q{Match } ); ok( "\N{MONGOLIAN DIGIT ZERO}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{MONGOLIAN DIGIT ZERO}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{MONGOLIAN DIGIT ZERO}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{MONGOLIAN DIGIT ZERO}" !~ m/^<+<-Mongolian>>$/, q{Don't match internally inverted } ); ok( "\x{70C0}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{70C0}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{70C0}" =~ m/^<+<-Mongolian>>$/, q{Match unrelated internally inverted } ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<+>$/, q{Don't match related } ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<+<-Mongolian>>$/, q{Match related internally inverted } ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{70C0}\N{COMBINING GRAVE ACCENT}\N{MONGOLIAN DIGIT ZERO}" =~ m/<+>/, q{Match unanchored } ); # Myanmar ok( "\N{MYANMAR LETTER KA}" =~ m/^<+>$/, q{Match } ); ok( "\N{MYANMAR LETTER KA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{MYANMAR LETTER KA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{MYANMAR LETTER KA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{MYANMAR LETTER KA}" !~ m/^<+<-Myanmar>>$/, q{Don't match internally inverted } ); ok( "\x{3CE3}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{3CE3}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{3CE3}" =~ m/^<+<-Myanmar>>$/, q{Match unrelated internally inverted } ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<+>$/, q{Don't match related } ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<+<-Myanmar>>$/, q{Match related internally inverted } ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{3CE3}\N{COMBINING GRAVE ACCENT}\N{MYANMAR LETTER KA}" =~ m/<+>/, q{Match unanchored } ); # Ogham ok( "\N{OGHAM LETTER BEITH}" =~ m/^<+>$/, q{Match } ); ok( "\N{OGHAM LETTER BEITH}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{OGHAM LETTER BEITH}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{OGHAM LETTER BEITH}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{OGHAM LETTER BEITH}" !~ m/^<+<-Ogham>>$/, q{Don't match internally inverted } ); ok( "\x{077B}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{077B}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{077B}" =~ m/^<+<-Ogham>>$/, q{Match unrelated internally inverted } ); ok( "\x{077B}\N{OGHAM LETTER BEITH}" =~ m/<+>/, q{Match unanchored } ); # OldItalic ok( "\x{562B}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{562B}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{562B}" =~ m/^<+<-OldItalic>>$/, q{Match unrelated internally inverted } ); # Oriya ok( "\N{ORIYA SIGN CANDRABINDU}" =~ m/^<+>$/, q{Match } ); ok( "\N{ORIYA SIGN CANDRABINDU}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{ORIYA SIGN CANDRABINDU}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{ORIYA SIGN CANDRABINDU}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{ORIYA SIGN CANDRABINDU}" !~ m/^<+<-Oriya>>$/, q{Don't match internally inverted } ); ok( "\x{3CE7}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{3CE7}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{3CE7}" =~ m/^<+<-Oriya>>$/, q{Match unrelated internally inverted } ); ok( "\x{3CE7}\N{ORIYA SIGN CANDRABINDU}" =~ m/<+>/, q{Match unanchored } ); # Runic ok( "\N{RUNIC LETTER FEHU FEOH FE F}" =~ m/^<+>$/, q{Match } ); ok( "\N{RUNIC LETTER FEHU FEOH FE F}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{RUNIC LETTER FEHU FEOH FE F}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{RUNIC LETTER FEHU FEOH FE F}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{RUNIC LETTER FEHU FEOH FE F}" !~ m/^<+<-Runic>>$/, q{Don't match internally inverted } ); ok( "\N{BLACK HEART SUIT}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{BLACK HEART SUIT}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{BLACK HEART SUIT}" =~ m/^<+<-Runic>>$/, q{Match unrelated internally inverted } ); ok( "\N{BLACK HEART SUIT}\N{RUNIC LETTER FEHU FEOH FE F}" =~ m/<+>/, q{Match unanchored } ); # Sinhala ok( "\N{SINHALA SIGN ANUSVARAYA}" =~ m/^<+>$/, q{Match } ); ok( "\N{SINHALA SIGN ANUSVARAYA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{SINHALA SIGN ANUSVARAYA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{SINHALA SIGN ANUSVARAYA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{SINHALA SIGN ANUSVARAYA}" !~ m/^<+<-Sinhala>>$/, q{Don't match internally inverted } ); ok( "\N{MYANMAR VOWEL SIGN II}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{MYANMAR VOWEL SIGN II}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{MYANMAR VOWEL SIGN II}" =~ m/^<+<-Sinhala>>$/, q{Match unrelated internally inverted } ); ok( "\N{KHMER CURRENCY SYMBOL RIEL}" !~ m/^<+>$/, q{Don't match related } ); ok( "\N{KHMER CURRENCY SYMBOL RIEL}" =~ m/^<+<-Sinhala>>$/, q{Match related internally inverted } ); ok( "\N{KHMER CURRENCY SYMBOL RIEL}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\N{MYANMAR VOWEL SIGN II}\N{KHMER CURRENCY SYMBOL RIEL}\N{SINHALA SIGN ANUSVARAYA}" =~ m/<+>/, q{Match unanchored } ); # Syriac ok( "\N{SYRIAC LETTER ALAPH}" =~ m/^<+>$/, q{Match } ); ok( "\N{SYRIAC LETTER ALAPH}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{SYRIAC LETTER ALAPH}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{SYRIAC LETTER ALAPH}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{SYRIAC LETTER ALAPH}" !~ m/^<+<-Syriac>>$/, q{Don't match internally inverted } ); ok( "\x{7BAA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{7BAA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{7BAA}" =~ m/^<+<-Syriac>>$/, q{Match unrelated internally inverted } ); ok( "\N{YI RADICAL QOT}" !~ m/^<+>$/, q{Don't match related } ); ok( "\N{YI RADICAL QOT}" =~ m/^<+<-Syriac>>$/, q{Match related internally inverted } ); ok( "\N{YI RADICAL QOT}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{7BAA}\N{YI RADICAL QOT}\N{SYRIAC LETTER ALAPH}" =~ m/<+>/, q{Match unanchored } ); # Tagalog ok( "\N{TAGALOG LETTER A}" =~ m/^<+>$/, q{Match } ); ok( "\N{TAGALOG LETTER A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{TAGALOG LETTER A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{TAGALOG LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{TAGALOG LETTER A}" !~ m/^<+<-Tagalog>>$/, q{Don't match internally inverted } ); ok( "\x{50F2}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{50F2}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{50F2}" =~ m/^<+<-Tagalog>>$/, q{Match unrelated internally inverted } ); ok( "\x{50F2}\N{TAGALOG LETTER A}" =~ m/<+>/, q{Match unanchored } ); # Tagbanwa ok( "\N{TAGBANWA LETTER A}" =~ m/^<+>$/, q{Match } ); ok( "\N{TAGBANWA LETTER A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{TAGBANWA LETTER A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{TAGBANWA LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{TAGBANWA LETTER A}" !~ m/^<+<-Tagbanwa>>$/, q{Don't match internally inverted } ); ok( "\x{8843}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{8843}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{8843}" =~ m/^<+<-Tagbanwa>>$/, q{Match unrelated internally inverted } ); ok( "\x{8843}\N{TAGBANWA LETTER A}" =~ m/<+>/, q{Match unanchored } ); # Tamil ok( "\N{TAMIL SIGN ANUSVARA}" =~ m/^<+>$/, q{Match } ); ok( "\N{TAMIL SIGN ANUSVARA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{TAMIL SIGN ANUSVARA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{TAMIL SIGN ANUSVARA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{TAMIL SIGN ANUSVARA}" !~ m/^<+<-Tamil>>$/, q{Don't match internally inverted } ); ok( "\x{76C0}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{76C0}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{76C0}" =~ m/^<+<-Tamil>>$/, q{Match unrelated internally inverted } ); ok( "\x{76C0}\N{TAMIL SIGN ANUSVARA}" =~ m/<+>/, q{Match unanchored } ); # Telugu ok( "\N{TELUGU SIGN CANDRABINDU}" =~ m/^<+>$/, q{Match } ); ok( "\N{TELUGU SIGN CANDRABINDU}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{TELUGU SIGN CANDRABINDU}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{TELUGU SIGN CANDRABINDU}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{TELUGU SIGN CANDRABINDU}" !~ m/^<+<-Telugu>>$/, q{Don't match internally inverted } ); ok( "\x{60BD}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{60BD}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{60BD}" =~ m/^<+<-Telugu>>$/, q{Match unrelated internally inverted } ); ok( "\x{60BD}\N{TELUGU SIGN CANDRABINDU}" =~ m/<+>/, q{Match unanchored } ); # Thaana ok( "\N{THAANA LETTER HAA}" =~ m/^<+>$/, q{Match } ); ok( "\N{THAANA LETTER HAA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{THAANA LETTER HAA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{THAANA LETTER HAA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{THAANA LETTER HAA}" !~ m/^<+<-Thaana>>$/, q{Don't match internally inverted } ); ok( "\x{2E74}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{2E74}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{2E74}" =~ m/^<+<-Thaana>>$/, q{Match unrelated internally inverted } ); ok( "\x{2E74}\N{THAANA LETTER HAA}" =~ m/<+>/, q{Match unanchored } ); # Thai ok( "\N{THAI CHARACTER KO KAI}" =~ m/^<+>$/, q{Match } ); ok( "\N{THAI CHARACTER KO KAI}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{THAI CHARACTER KO KAI}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{THAI CHARACTER KO KAI}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{THAI CHARACTER KO KAI}" !~ m/^<+<-Thai>>$/, q{Don't match internally inverted } ); ok( "\x{A929}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{A929}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{A929}" =~ m/^<+<-Thai>>$/, q{Match unrelated internally inverted } ); ok( "\x{A929}\N{THAI CHARACTER KO KAI}" =~ m/<+>/, q{Match unanchored } ); # Tibetan ok( "\N{TIBETAN SYLLABLE OM}" =~ m/^<+>$/, q{Match } ); ok( "\N{TIBETAN SYLLABLE OM}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{TIBETAN SYLLABLE OM}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{TIBETAN SYLLABLE OM}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{TIBETAN SYLLABLE OM}" !~ m/^<+<-Tibetan>>$/, q{Don't match internally inverted } ); ok( "\x{19C9}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{19C9}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{19C9}" =~ m/^<+<-Tibetan>>$/, q{Match unrelated internally inverted } ); ok( "\x{19C9}\N{TIBETAN SYLLABLE OM}" =~ m/<+>/, q{Match unanchored } ); # Yi ok( "\N{YI SYLLABLE IT}" =~ m/^<+>$/, q{Match } ); ok( "\N{YI SYLLABLE IT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{YI SYLLABLE IT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{YI SYLLABLE IT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{YI SYLLABLE IT}" !~ m/^<+<-Yi>>$/, q{Don't match internally inverted } ); ok( "\x{3A38}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{3A38}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{3A38}" =~ m/^<+<-Yi>>$/, q{Match unrelated internally inverted } ); ok( "\x{3A38}\N{YI SYLLABLE IT}" =~ m/<+>/, q{Match unanchored } ); # ASCIIHexDigit ok( "\N{DIGIT ZERO}" =~ m/^<+>$/, q{Match } ); ok( "\N{DIGIT ZERO}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{DIGIT ZERO}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{DIGIT ZERO}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{DIGIT ZERO}" !~ m/^<+<-ASCIIHexDigit>>$/, q{Don't match internally inverted } ); ok( "\x{55D7}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{55D7}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{55D7}" =~ m/^<+<-ASCIIHexDigit>>$/, q{Match unrelated internally inverted } ); ok( "\x{55D7}\N{DIGIT ZERO}" =~ m/<+>/, q{Match unanchored } ); # Dash ok( "\N{HYPHEN-MINUS}" =~ m/^<+>$/, q{Match } ); ok( "\N{HYPHEN-MINUS}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{HYPHEN-MINUS}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{HYPHEN-MINUS}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{HYPHEN-MINUS}" !~ m/^<+<-Dash>>$/, q{Don't match internally inverted } ); ok( "\x{4C7F}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{4C7F}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{4C7F}" =~ m/^<+<-Dash>>$/, q{Match unrelated internally inverted } ); ok( "\x{4C7F}\N{HYPHEN-MINUS}" =~ m/<+>/, q{Match unanchored } ); # Diacritic ok( "\N{CIRCUMFLEX ACCENT}" =~ m/^<+>$/, q{Match } ); ok( "\N{CIRCUMFLEX ACCENT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{CIRCUMFLEX ACCENT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{CIRCUMFLEX ACCENT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{CIRCUMFLEX ACCENT}" !~ m/^<+<-Diacritic>>$/, q{Don't match internally inverted } ); ok( "\x{398E}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{398E}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{398E}" =~ m/^<+<-Diacritic>>$/, q{Match unrelated internally inverted } ); ok( "\x{398E}\N{CIRCUMFLEX ACCENT}" =~ m/<+>/, q{Match unanchored } ); # Extender ok( "\N{MIDDLE DOT}" =~ m/^<+>$/, q{Match } ); ok( "\N{MIDDLE DOT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{MIDDLE DOT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{MIDDLE DOT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{MIDDLE DOT}" !~ m/^<+<-Extender>>$/, q{Don't match internally inverted } ); ok( "\x{3F66}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{3F66}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{3F66}" =~ m/^<+<-Extender>>$/, q{Match unrelated internally inverted } ); ok( "\x{3F66}\N{MIDDLE DOT}" =~ m/<+>/, q{Match unanchored } ); # GraphemeLink ok( "\N{COMBINING GRAPHEME JOINER}" =~ m/^<+>$/, q{Match } ); ok( "\N{COMBINING GRAPHEME JOINER}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{COMBINING GRAPHEME JOINER}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{COMBINING GRAPHEME JOINER}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{COMBINING GRAPHEME JOINER}" !~ m/^<+<-GraphemeLink>>$/, q{Don't match internally inverted } ); ok( "\x{34DA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{34DA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{34DA}" =~ m/^<+<-GraphemeLink>>$/, q{Match unrelated internally inverted } ); ok( "\x{34DA}\N{COMBINING GRAPHEME JOINER}" =~ m/<+>/, q{Match unanchored } ); # HexDigit ok( "\N{DIGIT ZERO}" =~ m/^<+>$/, q{Match } ); ok( "\N{DIGIT ZERO}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{DIGIT ZERO}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{DIGIT ZERO}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{DIGIT ZERO}" !~ m/^<+<-HexDigit>>$/, q{Don't match internally inverted } ); ok( "\x{D446}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{D446}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{D446}" =~ m/^<+<-HexDigit>>$/, q{Match unrelated internally inverted } ); ok( "\x{D446}\N{DIGIT ZERO}" =~ m/<+>/, q{Match unanchored } ); # Hyphen ok( "\N{HYPHEN-MINUS}" =~ m/^<+>$/, q{Match } ); ok( "\N{HYPHEN-MINUS}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{HYPHEN-MINUS}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{HYPHEN-MINUS}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{HYPHEN-MINUS}" !~ m/^<+<-Hyphen>>$/, q{Don't match internally inverted } ); ok( "\N{YI SYLLABLE WOX}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{YI SYLLABLE WOX}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{YI SYLLABLE WOX}" =~ m/^<+<-Hyphen>>$/, q{Match unrelated internally inverted } ); ok( "\N{YI SYLLABLE WOX}\N{HYPHEN-MINUS}" =~ m/<+>/, q{Match unanchored } ); # Ideographic ok( "\N{IDEOGRAPHIC CLOSING MARK}" =~ m/^<+>$/, q{Match } ); ok( "\N{IDEOGRAPHIC CLOSING MARK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{IDEOGRAPHIC CLOSING MARK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{IDEOGRAPHIC CLOSING MARK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{IDEOGRAPHIC CLOSING MARK}" !~ m/^<+<-Ideographic>>$/, q{Don't match internally inverted } ); ok( "\x{CB86}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{CB86}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{CB86}" =~ m/^<+<-Ideographic>>$/, q{Match unrelated internally inverted } ); ok( "\x{CB86}\N{IDEOGRAPHIC CLOSING MARK}" =~ m/<+>/, q{Match unanchored } ); # IDSBinaryOperator ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT}" =~ m/^<+>$/, q{Match } ); ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT}" !~ m/^<+<-IDSBinaryOperator>>$/, q{Don't match internally inverted } ); ok( "\x{54A0}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{54A0}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{54A0}" =~ m/^<+<-IDSBinaryOperator>>$/, q{Match unrelated internally inverted } ); ok( "\x{54A0}\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT}" =~ m/<+>/, q{Match unanchored } ); # IDSTrinaryOperator ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT}" =~ m/^<+>$/, q{Match } ); ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT}" !~ m/^<+<-IDSTrinaryOperator>>$/, q{Don't match internally inverted } ); ok( "\x{4900}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{4900}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{4900}" =~ m/^<+<-IDSTrinaryOperator>>$/, q{Match unrelated internally inverted } ); ok( "\x{4900}\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT}" =~ m/<+>/, q{Match unanchored } ); # JoinControl ok( "\N{ZERO WIDTH NON-JOINER}" =~ m/^<+>$/, q{Match } ); ok( "\N{ZERO WIDTH NON-JOINER}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{ZERO WIDTH NON-JOINER}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{ZERO WIDTH NON-JOINER}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{ZERO WIDTH NON-JOINER}" !~ m/^<+<-JoinControl>>$/, q{Don't match internally inverted } ); ok( "\N{CYRILLIC CAPITAL LETTER OT}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{CYRILLIC CAPITAL LETTER OT}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{CYRILLIC CAPITAL LETTER OT}" =~ m/^<+<-JoinControl>>$/, q{Match unrelated internally inverted } ); ok( "\N{CYRILLIC CAPITAL LETTER OT}\N{ZERO WIDTH NON-JOINER}" =~ m/<+>/, q{Match unanchored } ); # LogicalOrderException ok( "\N{THAI CHARACTER SARA E}" =~ m/^<+>$/, q{Match } ); ok( "\N{THAI CHARACTER SARA E}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{THAI CHARACTER SARA E}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{THAI CHARACTER SARA E}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{THAI CHARACTER SARA E}" !~ m/^<+<-LogicalOrderException>>$/, q{Don't match internally inverted } ); ok( "\x{88D2}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{88D2}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{88D2}" =~ m/^<+<-LogicalOrderException>>$/, q{Match unrelated internally inverted } ); ok( "\x{88D2}" !~ m/^<+>$/, q{Don't match related } ); ok( "\x{88D2}" =~ m/^<+<-LogicalOrderException>>$/, q{Match related internally inverted } ); ok( "\x{88D2}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\x{88D2}\x{88D2}\N{THAI CHARACTER SARA E}" =~ m/<+>/, q{Match unanchored } ); # NoncharacterCodePoint ok( "\N{CIRCLED HANGUL NIEUN A}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{CIRCLED HANGUL NIEUN A}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{CIRCLED HANGUL NIEUN A}" =~ m/^<+<-NoncharacterCodePoint>>$/, q{Match unrelated internally inverted } ); ok( "\N{CIRCLED IDEOGRAPH ONE}" !~ m/^<+>$/, q{Don't match related } ); ok( "\N{CIRCLED IDEOGRAPH ONE}" =~ m/^<+<-NoncharacterCodePoint>>$/, q{Match related internally inverted } ); ok( "\N{CIRCLED IDEOGRAPH ONE}" =~ m/^<->$/, q{Match related externally inverted } ); # OtherAlphabetic ok( "\N{COMBINING GREEK YPOGEGRAMMENI}" =~ m/^<+>$/, q{Match } ); ok( "\N{COMBINING GREEK YPOGEGRAMMENI}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{COMBINING GREEK YPOGEGRAMMENI}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{COMBINING GREEK YPOGEGRAMMENI}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{COMBINING GREEK YPOGEGRAMMENI}" !~ m/^<+<-OtherAlphabetic>>$/, q{Don't match internally inverted } ); ok( "\x{7B02}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{7B02}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{7B02}" =~ m/^<+<-OtherAlphabetic>>$/, q{Match unrelated internally inverted } ); ok( "\x{7B02}\N{COMBINING GREEK YPOGEGRAMMENI}" =~ m/<+>/, q{Match unanchored } ); # OtherDefaultIgnorableCodePoint ok( "\N{COMBINING GRAPHEME JOINER}" =~ m/^<+>$/, q{Match } ); ok( "\N{COMBINING GRAPHEME JOINER}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{COMBINING GRAPHEME JOINER}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{COMBINING GRAPHEME JOINER}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{COMBINING GRAPHEME JOINER}" !~ m/^<+<-OtherDefaultIgnorableCodePoint>>$/, q{Don't match internally inverted } ); ok( "\x{42DA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{42DA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{42DA}" =~ m/^<+<-OtherDefaultIgnorableCodePoint>>$/, q{Match unrelated internally inverted } ); ok( "\x{42DA}\N{COMBINING GRAPHEME JOINER}" =~ m/<+>/, q{Match unanchored } ); # OtherGraphemeExtend ok( "\N{BENGALI VOWEL SIGN AA}" =~ m/^<+>$/, q{Match } ); ok( "\N{BENGALI VOWEL SIGN AA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{BENGALI VOWEL SIGN AA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{BENGALI VOWEL SIGN AA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{BENGALI VOWEL SIGN AA}" !~ m/^<+<-OtherGraphemeExtend>>$/, q{Don't match internally inverted } ); ok( "\N{TAI LE LETTER KHA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{TAI LE LETTER KHA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{TAI LE LETTER KHA}" =~ m/^<+<-OtherGraphemeExtend>>$/, q{Match unrelated internally inverted } ); ok( "\N{TAI LE LETTER KHA}\N{BENGALI VOWEL SIGN AA}" =~ m/<+>/, q{Match unanchored } ); # OtherLowercase ok( "\N{MODIFIER LETTER SMALL H}" =~ m/^<+>$/, q{Match } ); ok( "\N{MODIFIER LETTER SMALL H}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{MODIFIER LETTER SMALL H}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{MODIFIER LETTER SMALL H}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{MODIFIER LETTER SMALL H}" !~ m/^<+<-OtherLowercase>>$/, q{Don't match internally inverted } ); ok( "\x{8153}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{8153}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{8153}" =~ m/^<+<-OtherLowercase>>$/, q{Match unrelated internally inverted } ); ok( "\x{8153}\N{MODIFIER LETTER SMALL H}" =~ m/<+>/, q{Match unanchored } ); # OtherMath ok( "\N{LEFT PARENTHESIS}" =~ m/^<+>$/, q{Match } ); ok( "\N{LEFT PARENTHESIS}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LEFT PARENTHESIS}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LEFT PARENTHESIS}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LEFT PARENTHESIS}" !~ m/^<+<-OtherMath>>$/, q{Don't match internally inverted } ); ok( "\x{6D2F}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{6D2F}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{6D2F}" =~ m/^<+<-OtherMath>>$/, q{Match unrelated internally inverted } ); ok( "\x{6D2F}\N{LEFT PARENTHESIS}" =~ m/<+>/, q{Match unanchored } ); # OtherUppercase ok( "\N{ROMAN NUMERAL ONE}" =~ m/^<+>$/, q{Match } ); ok( "\N{ROMAN NUMERAL ONE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{ROMAN NUMERAL ONE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{ROMAN NUMERAL ONE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{ROMAN NUMERAL ONE}" !~ m/^<+<-OtherUppercase>>$/, q{Don't match internally inverted } ); ok( "\x{A746}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{A746}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{A746}" =~ m/^<+<-OtherUppercase>>$/, q{Match unrelated internally inverted } ); ok( "\x{A746}\N{ROMAN NUMERAL ONE}" =~ m/<+>/, q{Match unanchored } ); # QuotationMark ok( "\N{LEFT SINGLE QUOTATION MARK}" =~ m/^<+>$/, q{Match } ); ok( "\N{LEFT SINGLE QUOTATION MARK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LEFT SINGLE QUOTATION MARK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LEFT SINGLE QUOTATION MARK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LEFT SINGLE QUOTATION MARK}" !~ m/^<+<-QuotationMark>>$/, q{Don't match internally inverted } ); ok( "\N{GURMUKHI VOWEL SIGN AI}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{GURMUKHI VOWEL SIGN AI}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{GURMUKHI VOWEL SIGN AI}" =~ m/^<+<-QuotationMark>>$/, q{Match unrelated internally inverted } ); ok( "\N{GURMUKHI VOWEL SIGN AI}\N{LEFT SINGLE QUOTATION MARK}" =~ m/<+>/, q{Match unanchored } ); # Radical ok( "\N{CJK RADICAL REPEAT}" =~ m/^<+>$/, q{Match } ); ok( "\N{CJK RADICAL REPEAT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{CJK RADICAL REPEAT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{CJK RADICAL REPEAT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{CJK RADICAL REPEAT}" !~ m/^<+<-Radical>>$/, q{Don't match internally inverted } ); ok( "\N{RUNIC LETTER ETH}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{RUNIC LETTER ETH}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{RUNIC LETTER ETH}" =~ m/^<+<-Radical>>$/, q{Match unrelated internally inverted } ); ok( "\N{RUNIC LETTER ETH}\N{CJK RADICAL REPEAT}" =~ m/<+>/, q{Match unanchored } ); # SoftDotted ok( "\N{LATIN SMALL LETTER I WITH TILDE BELOW}" =~ m/^<+>$/, q{Match } ); ok( "\N{LATIN SMALL LETTER I WITH TILDE BELOW}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LATIN SMALL LETTER I WITH TILDE BELOW}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LATIN SMALL LETTER I WITH TILDE BELOW}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LATIN SMALL LETTER I WITH TILDE BELOW}" !~ m/^<+<-SoftDotted>>$/, q{Don't match internally inverted } ); ok( "\N{LATIN CAPITAL LETTER B WITH DOT ABOVE}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{LATIN CAPITAL LETTER B WITH DOT ABOVE}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{LATIN CAPITAL LETTER B WITH DOT ABOVE}" =~ m/^<+<-SoftDotted>>$/, q{Match unrelated internally inverted } ); ok( "\N{GREEK KORONIS}" !~ m/^<+>$/, q{Don't match related } ); ok( "\N{GREEK KORONIS}" =~ m/^<+<-SoftDotted>>$/, q{Match related internally inverted } ); ok( "\N{GREEK KORONIS}" =~ m/^<->$/, q{Match related externally inverted } ); ok( "\N{LATIN CAPITAL LETTER B WITH DOT ABOVE}\N{GREEK KORONIS}\N{LATIN SMALL LETTER I WITH TILDE BELOW}" =~ m/<+>/, q{Match unanchored } ); # TerminalPunctuation ok( "\N{EXCLAMATION MARK}" =~ m/^<+>$/, q{Match } ); ok( "\N{EXCLAMATION MARK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{EXCLAMATION MARK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{EXCLAMATION MARK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{EXCLAMATION MARK}" !~ m/^<+<-TerminalPunctuation>>$/, q{Don't match internally inverted } ); ok( "\x{B43A}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{B43A}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{B43A}" =~ m/^<+<-TerminalPunctuation>>$/, q{Match unrelated internally inverted } ); ok( "\x{B43A}\N{EXCLAMATION MARK}" =~ m/<+>/, q{Match unanchored } ); # UnifiedIdeograph ok( "\x{88D8}" =~ m/^<+>$/, q{Match } ); ok( "\x{88D8}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{88D8}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{88D8}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{88D8}" !~ m/^<+<-UnifiedIdeograph>>$/, q{Don't match internally inverted } ); ok( "\x{9FA6}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{9FA6}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{9FA6}" =~ m/^<+<-UnifiedIdeograph>>$/, q{Match unrelated internally inverted } ); ok( "\x{9FA6}\x{88D8}" =~ m/<+>/, q{Match unanchored } ); # WhiteSpace ok( "\N{CHARACTER TABULATION}" =~ m/^<+>$/, q{Match } ); ok( "\N{CHARACTER TABULATION}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{CHARACTER TABULATION}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{CHARACTER TABULATION}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{CHARACTER TABULATION}" !~ m/^<+<-WhiteSpace>>$/, q{Don't match internally inverted } ); ok( "\x{4345}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{4345}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{4345}" =~ m/^<+<-WhiteSpace>>$/, q{Match unrelated internally inverted } ); ok( "\x{4345}\N{CHARACTER TABULATION}" =~ m/<+>/, q{Match unanchored } ); # Alphabetic # Lu + Ll + Lt + Lm + Lo + OtherAlphabetic ok( "\x{3816}" =~ m/^<+>$/, q{Match (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); ok( "\x{3816}" =~ m/^<[A]+>$/, q{Match compound (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); ok( "\x{3816}" !~ m/^<->$/, q{Don't match externally inverted (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); ok( "\x{3816}" !~ m/^<[A]->$/, q{Don't match compound inverted (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); ok( "\x{3816}" !~ m/^<+<-Alphabetic>>$/, q{Don't match internally inverted (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); ok( "\x{4DB6}" !~ m/^<+>$/, q{Don't match unrelated (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); ok( "\x{4DB6}" =~ m/^<->$/, q{Match unrelated externally inverted (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); ok( "\x{4DB6}" =~ m/^<+<-Alphabetic>>$/, q{Match unrelated internally inverted (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); ok( "\x{4DB6}\x{3816}" =~ m/<+>/, q{Match unanchored (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); # Lowercase # Ll + OtherLowercase ok( "\N{LATIN LETTER SMALL CAPITAL A}" =~ m/^<+>$/, q{Match (Ll + OtherLowercase)} ); ok( "\N{LATIN LETTER SMALL CAPITAL A}" =~ m/^<[A]+>$/, q{Match compound (Ll + OtherLowercase)} ); ok( "\N{LATIN LETTER SMALL CAPITAL A}" !~ m/^<->$/, q{Don't match externally inverted (Ll + OtherLowercase)} ); ok( "\N{LATIN LETTER SMALL CAPITAL A}" !~ m/^<[A]->$/, q{Don't match compound inverted (Ll + OtherLowercase)} ); ok( "\N{LATIN LETTER SMALL CAPITAL A}" !~ m/^<+<-Lowercase>>$/, q{Don't match internally inverted (Ll + OtherLowercase)} ); ok( "\x{0D3D}" !~ m/^<+>$/, q{Don't match unrelated (Ll + OtherLowercase)} ); ok( "\x{0D3D}" =~ m/^<->$/, q{Match unrelated externally inverted (Ll + OtherLowercase)} ); ok( "\x{0D3D}" =~ m/^<+<-Lowercase>>$/, q{Match unrelated internally inverted (Ll + OtherLowercase)} ); ok( "\N{MALAYALAM LETTER VOCALIC RR}" !~ m/^<+>$/, q{Don't match related (Ll + OtherLowercase)} ); ok( "\N{MALAYALAM LETTER VOCALIC RR}" =~ m/^<+<-Lowercase>>$/, q{Match related internally inverted (Ll + OtherLowercase)} ); ok( "\N{MALAYALAM LETTER VOCALIC RR}" =~ m/^<->$/, q{Match related externally inverted (Ll + OtherLowercase)} ); ok( "\x{0D3D}\N{MALAYALAM LETTER VOCALIC RR}\N{LATIN LETTER SMALL CAPITAL A}" =~ m/<+>/, q{Match unanchored (Ll + OtherLowercase)} ); # Uppercase # Lu + OtherUppercase ok( "\N{LATIN CAPITAL LETTER A}" =~ m/^<+>$/, q{Match (Lu + OtherUppercase)} ); ok( "\N{LATIN CAPITAL LETTER A}" =~ m/^<[A]+>$/, q{Match compound (Lu + OtherUppercase)} ); ok( "\N{LATIN CAPITAL LETTER A}" !~ m/^<->$/, q{Don't match externally inverted (Lu + OtherUppercase)} ); ok( "\N{LATIN CAPITAL LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted (Lu + OtherUppercase)} ); ok( "\N{LATIN CAPITAL LETTER A}" !~ m/^<+<-Uppercase>>$/, q{Don't match internally inverted (Lu + OtherUppercase)} ); ok( "\x{C107}" !~ m/^<+>$/, q{Don't match unrelated (Lu + OtherUppercase)} ); ok( "\x{C107}" =~ m/^<->$/, q{Match unrelated externally inverted (Lu + OtherUppercase)} ); ok( "\x{C107}" =~ m/^<+<-Uppercase>>$/, q{Match unrelated internally inverted (Lu + OtherUppercase)} ); ok( "\x{C107}\N{LATIN CAPITAL LETTER A}" =~ m/<+>/, q{Match unanchored (Lu + OtherUppercase)} ); # Math # Sm + OtherMath ok( "\N{LEFT PARENTHESIS}" =~ m/^<+>$/, q{Match (Sm + OtherMath)} ); ok( "\N{LEFT PARENTHESIS}" =~ m/^<[A]+>$/, q{Match compound (Sm + OtherMath)} ); ok( "\N{LEFT PARENTHESIS}" !~ m/^<->$/, q{Don't match externally inverted (Sm + OtherMath)} ); ok( "\N{LEFT PARENTHESIS}" !~ m/^<[A]->$/, q{Don't match compound inverted (Sm + OtherMath)} ); ok( "\N{LEFT PARENTHESIS}" !~ m/^<+<-Math>>$/, q{Don't match internally inverted (Sm + OtherMath)} ); ok( "\x{D73F}" !~ m/^<+>$/, q{Don't match unrelated (Sm + OtherMath)} ); ok( "\x{D73F}" =~ m/^<->$/, q{Match unrelated externally inverted (Sm + OtherMath)} ); ok( "\x{D73F}" =~ m/^<+<-Math>>$/, q{Match unrelated internally inverted (Sm + OtherMath)} ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<+>$/, q{Don't match related (Sm + OtherMath)} ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<+<-Math>>$/, q{Match related internally inverted (Sm + OtherMath)} ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<->$/, q{Match related externally inverted (Sm + OtherMath)} ); ok( "\x{D73F}\N{COMBINING GRAVE ACCENT}\N{LEFT PARENTHESIS}" =~ m/<+>/, q{Match unanchored (Sm + OtherMath)} ); # ID_Start # Lu + Ll + Lt + Lm + Lo + Nl ok( "\x{4E5B}" =~ m/^<+>$/, q{Match (Lu + Ll + Lt + Lm + Lo + Nl)} ); ok( "\x{4E5B}" =~ m/^<[A]+>$/, q{Match compound (Lu + Ll + Lt + Lm + Lo + Nl)} ); ok( "\x{4E5B}" !~ m/^<->$/, q{Don't match externally inverted (Lu + Ll + Lt + Lm + Lo + Nl)} ); ok( "\x{4E5B}" !~ m/^<[A]->$/, q{Don't match compound inverted (Lu + Ll + Lt + Lm + Lo + Nl)} ); ok( "\x{4E5B}" !~ m/^<+<-ID_Start>>$/, q{Don't match internally inverted (Lu + Ll + Lt + Lm + Lo + Nl)} ); ok( "\x{9FA6}" !~ m/^<+>$/, q{Don't match unrelated (Lu + Ll + Lt + Lm + Lo + Nl)} ); ok( "\x{9FA6}" =~ m/^<->$/, q{Match unrelated externally inverted (Lu + Ll + Lt + Lm + Lo + Nl)} ); ok( "\x{9FA6}" =~ m/^<+<-ID_Start>>$/, q{Match unrelated internally inverted (Lu + Ll + Lt + Lm + Lo + Nl)} ); ok( "\x{9FA6}\x{4E5B}" =~ m/<+>/, q{Match unanchored (Lu + Ll + Lt + Lm + Lo + Nl)} ); # ID_Continue # ID_Start + Mn + Mc + Nd + Pc ok( "\N{IDEOGRAPHIC ITERATION MARK}" =~ m/^<+>$/, q{Match (ID_Start + Mn + Mc + Nd + Pc)} ); ok( "\N{IDEOGRAPHIC ITERATION MARK}" =~ m/^<[A]+>$/, q{Match compound (ID_Start + Mn + Mc + Nd + Pc)} ); ok( "\N{IDEOGRAPHIC ITERATION MARK}" !~ m/^<->$/, q{Don't match externally inverted (ID_Start + Mn + Mc + Nd + Pc)} ); ok( "\N{IDEOGRAPHIC ITERATION MARK}" !~ m/^<[A]->$/, q{Don't match compound inverted (ID_Start + Mn + Mc + Nd + Pc)} ); ok( "\N{IDEOGRAPHIC ITERATION MARK}" !~ m/^<+<-ID_Continue>>$/, q{Don't match internally inverted (ID_Start + Mn + Mc + Nd + Pc)} ); ok( "\N{APL FUNCTIONAL SYMBOL UP TACK JOT}" !~ m/^<+>$/, q{Don't match unrelated (ID_Start + Mn + Mc + Nd + Pc)} ); ok( "\N{APL FUNCTIONAL SYMBOL UP TACK JOT}" =~ m/^<->$/, q{Match unrelated externally inverted (ID_Start + Mn + Mc + Nd + Pc)} ); ok( "\N{APL FUNCTIONAL SYMBOL UP TACK JOT}" =~ m/^<+<-ID_Continue>>$/, q{Match unrelated internally inverted (ID_Start + Mn + Mc + Nd + Pc)} ); ok( "\N{APL FUNCTIONAL SYMBOL UP TACK JOT}\N{IDEOGRAPHIC ITERATION MARK}" =~ m/<+>/, q{Match unanchored (ID_Start + Mn + Mc + Nd + Pc)} ); # Any # Any character ok( "\N{SYRIAC LETTER TAW}" =~ m/^<+>$/, q{Match (Any character)} ); ok( "\N{SYRIAC LETTER TAW}" =~ m/^<[A]+>$/, q{Match compound (Any character)} ); ok( "\N{SYRIAC LETTER TAW}" !~ m/^<->$/, q{Don't match externally inverted (Any character)} ); ok( "\N{SYRIAC LETTER TAW}" !~ m/^<[A]->$/, q{Don't match compound inverted (Any character)} ); ok( "\N{SYRIAC LETTER TAW}" !~ m/^<+<-Any>>$/, q{Don't match internally inverted (Any character)} ); ok( "\N{SYRIAC LETTER TAW}" =~ m/<+>/, q{Match unanchored (Any character)} ); # Assigned # Any non-Cn character (i.e. synonym for \P{Cn}) ok( "\x{AC00}" =~ m/^<+>$/, q{Match (Any non-Cn character (i.e. synonym for \P{Cn}))} ); ok( "\x{AC00}" =~ m/^<[A]+>$/, q{Match compound (Any non-Cn character (i.e. synonym for \P{Cn}))} ); ok( "\x{AC00}" !~ m/^<->$/, q{Don't match externally inverted (Any non-Cn character (i.e. synonym for \P{Cn}))} ); ok( "\x{AC00}" !~ m/^<[A]->$/, q{Don't match compound inverted (Any non-Cn character (i.e. synonym for \P{Cn}))} ); ok( "\x{AC00}" !~ m/^<+<-Assigned>>$/, q{Don't match internally inverted (Any non-Cn character (i.e. synonym for \P{Cn}))} ); ok( "\x{AB08}" !~ m/^<+>$/, q{Don't match unrelated (Any non-Cn character (i.e. synonym for \P{Cn}))} ); ok( "\x{AB08}" =~ m/^<->$/, q{Match unrelated externally inverted (Any non-Cn character (i.e. synonym for \P{Cn}))} ); ok( "\x{AB08}" =~ m/^<+<-Assigned>>$/, q{Match unrelated internally inverted (Any non-Cn character (i.e. synonym for \P{Cn}))} ); ok( "\x{AB08}\x{AC00}" =~ m/<+>/, q{Match unanchored (Any non-Cn character (i.e. synonym for \P{Cn}))} ); # Unassigned # Synonym for \p{Cn} ok( "\x{1738}" =~ m/^<+>$/, q{Match (Synonym for \p{Cn})} ); ok( "\x{1738}" =~ m/^<[A]+>$/, q{Match compound (Synonym for \p{Cn})} ); ok( "\x{1738}" !~ m/^<->$/, q{Don't match externally inverted (Synonym for \p{Cn})} ); ok( "\x{1738}" !~ m/^<[A]->$/, q{Don't match compound inverted (Synonym for \p{Cn})} ); ok( "\x{1738}" !~ m/^<+<-Unassigned>>$/, q{Don't match internally inverted (Synonym for \p{Cn})} ); ok( "\N{BUHID LETTER A}" !~ m/^<+>$/, q{Don't match unrelated (Synonym for \p{Cn})} ); ok( "\N{BUHID LETTER A}" =~ m/^<->$/, q{Match unrelated externally inverted (Synonym for \p{Cn})} ); ok( "\N{BUHID LETTER A}" =~ m/^<+<-Unassigned>>$/, q{Match unrelated internally inverted (Synonym for \p{Cn})} ); ok( "\N{BUHID LETTER A}\x{1738}" =~ m/<+>/, q{Match unanchored (Synonym for \p{Cn})} ); # Common # Codepoint not explicitly assigned to a script ok( "\N{LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE}" =~ m/^<+>$/, q{Match (Codepoint not explicitly assigned to a script)} ); ok( "\N{LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE}" =~ m/^<[A]+>$/, q{Match compound (Codepoint not explicitly assigned to a script)} ); ok( "\N{LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE}" !~ m/^<->$/, q{Don't match externally inverted (Codepoint not explicitly assigned to a script)} ); ok( "\N{LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE}" !~ m/^<[A]->$/, q{Don't match compound inverted (Codepoint not explicitly assigned to a script)} ); ok( "\N{LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE}" !~ m/^<+<-Common>>$/, q{Don't match internally inverted (Codepoint not explicitly assigned to a script)} ); ok( "\N{CJK RADICAL REPEAT}" !~ m/^<+>$/, q{Don't match unrelated (Codepoint not explicitly assigned to a script)} ); ok( "\N{CJK RADICAL REPEAT}" =~ m/^<->$/, q{Match unrelated externally inverted (Codepoint not explicitly assigned to a script)} ); ok( "\N{CJK RADICAL REPEAT}" =~ m/^<+<-Common>>$/, q{Match unrelated internally inverted (Codepoint not explicitly assigned to a script)} ); ok( "\N{ARABIC END OF AYAH}" !~ m/^<+>$/, q{Don't match related (Codepoint not explicitly assigned to a script)} ); ok( "\N{ARABIC END OF AYAH}" =~ m/^<+<-Common>>$/, q{Match related internally inverted (Codepoint not explicitly assigned to a script)} ); ok( "\N{ARABIC END OF AYAH}" =~ m/^<->$/, q{Match related externally inverted (Codepoint not explicitly assigned to a script)} ); ok( "\N{CJK RADICAL REPEAT}\N{ARABIC END OF AYAH}\N{LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE}" =~ m/<+>/, q{Match unanchored (Codepoint not explicitly assigned to a script)} ); # InAlphabeticPresentationForms ok( "\x{5A81}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{5A81}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{5A81}" =~ m/^<+<-InAlphabeticPresentationForms>>$/, q{Match unrelated internally inverted } ); # InArabic ok( "\N{ARABIC NUMBER SIGN}" =~ m/^<+>$/, q{Match } ); ok( "\N{ARABIC NUMBER SIGN}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{ARABIC NUMBER SIGN}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{ARABIC NUMBER SIGN}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{ARABIC NUMBER SIGN}" !~ m/^<+<-InArabic>>$/, q{Don't match internally inverted } ); ok( "\x{8D16}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{8D16}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{8D16}" =~ m/^<+<-InArabic>>$/, q{Match unrelated internally inverted } ); ok( "\x{8D16}\N{ARABIC NUMBER SIGN}" =~ m/<+>/, q{Match unanchored } ); # InArabicPresentationFormsA ok( "\x{C775}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{C775}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{C775}" =~ m/^<+<-InArabicPresentationFormsA>>$/, q{Match unrelated internally inverted } ); # InArabicPresentationFormsB ok( "\x{B2EA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{B2EA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{B2EA}" =~ m/^<+<-InArabicPresentationFormsB>>$/, q{Match unrelated internally inverted } ); # InArmenian ok( "\x{0530}" =~ m/^<+>$/, q{Match } ); ok( "\x{0530}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0530}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0530}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0530}" !~ m/^<+<-InArmenian>>$/, q{Don't match internally inverted } ); ok( "\N{ETHIOPIC SYLLABLE QHWAA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{ETHIOPIC SYLLABLE QHWAA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{ETHIOPIC SYLLABLE QHWAA}" =~ m/^<+<-InArmenian>>$/, q{Match unrelated internally inverted } ); ok( "\N{ETHIOPIC SYLLABLE QHWAA}\x{0530}" =~ m/<+>/, q{Match unanchored } ); # InArrows ok( "\N{LEFTWARDS ARROW}" =~ m/^<+>$/, q{Match } ); ok( "\N{LEFTWARDS ARROW}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LEFTWARDS ARROW}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LEFTWARDS ARROW}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LEFTWARDS ARROW}" !~ m/^<+<-InArrows>>$/, q{Don't match internally inverted } ); ok( "\x{74FA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{74FA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{74FA}" =~ m/^<+<-InArrows>>$/, q{Match unrelated internally inverted } ); ok( "\x{74FA}\N{LEFTWARDS ARROW}" =~ m/<+>/, q{Match unanchored } ); # InBasicLatin ok( "\N{NULL}" =~ m/^<+>$/, q{Match } ); ok( "\N{NULL}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{NULL}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{NULL}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{NULL}" !~ m/^<+<-InBasicLatin>>$/, q{Don't match internally inverted } ); ok( "\x{ADFF}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{ADFF}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{ADFF}" =~ m/^<+<-InBasicLatin>>$/, q{Match unrelated internally inverted } ); ok( "\x{ADFF}\N{NULL}" =~ m/<+>/, q{Match unanchored } ); # InBengali ok( "\x{0980}" =~ m/^<+>$/, q{Match } ); ok( "\x{0980}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0980}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0980}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0980}" !~ m/^<+<-InBengali>>$/, q{Don't match internally inverted } ); ok( "\x{3409}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{3409}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{3409}" =~ m/^<+<-InBengali>>$/, q{Match unrelated internally inverted } ); ok( "\x{3409}\x{0980}" =~ m/<+>/, q{Match unanchored } ); # InBlockElements ok( "\N{UPPER HALF BLOCK}" =~ m/^<+>$/, q{Match } ); ok( "\N{UPPER HALF BLOCK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{UPPER HALF BLOCK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{UPPER HALF BLOCK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{UPPER HALF BLOCK}" !~ m/^<+<-InBlockElements>>$/, q{Don't match internally inverted } ); ok( "\x{77B1}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{77B1}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{77B1}" =~ m/^<+<-InBlockElements>>$/, q{Match unrelated internally inverted } ); ok( "\x{77B1}\N{UPPER HALF BLOCK}" =~ m/<+>/, q{Match unanchored } ); # InBopomofo ok( "\x{3100}" =~ m/^<+>$/, q{Match } ); ok( "\x{3100}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{3100}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{3100}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{3100}" !~ m/^<+<-InBopomofo>>$/, q{Don't match internally inverted } ); ok( "\x{701E}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{701E}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{701E}" =~ m/^<+<-InBopomofo>>$/, q{Match unrelated internally inverted } ); ok( "\x{701E}\x{3100}" =~ m/<+>/, q{Match unanchored } ); # InBopomofoExtended ok( "\N{BOPOMOFO LETTER BU}" =~ m/^<+>$/, q{Match } ); ok( "\N{BOPOMOFO LETTER BU}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{BOPOMOFO LETTER BU}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{BOPOMOFO LETTER BU}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{BOPOMOFO LETTER BU}" !~ m/^<+<-InBopomofoExtended>>$/, q{Don't match internally inverted } ); ok( "\N{YI SYLLABLE TIE}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{YI SYLLABLE TIE}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{YI SYLLABLE TIE}" =~ m/^<+<-InBopomofoExtended>>$/, q{Match unrelated internally inverted } ); ok( "\N{YI SYLLABLE TIE}\N{BOPOMOFO LETTER BU}" =~ m/<+>/, q{Match unanchored } ); # InBoxDrawing ok( "\N{BOX DRAWINGS LIGHT HORIZONTAL}" =~ m/^<+>$/, q{Match } ); ok( "\N{BOX DRAWINGS LIGHT HORIZONTAL}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{BOX DRAWINGS LIGHT HORIZONTAL}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{BOX DRAWINGS LIGHT HORIZONTAL}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{BOX DRAWINGS LIGHT HORIZONTAL}" !~ m/^<+<-InBoxDrawing>>$/, q{Don't match internally inverted } ); ok( "\x{D2FB}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{D2FB}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{D2FB}" =~ m/^<+<-InBoxDrawing>>$/, q{Match unrelated internally inverted } ); ok( "\x{D2FB}\N{BOX DRAWINGS LIGHT HORIZONTAL}" =~ m/<+>/, q{Match unanchored } ); # InBraillePatterns ok( "\N{BRAILLE PATTERN BLANK}" =~ m/^<+>$/, q{Match } ); ok( "\N{BRAILLE PATTERN BLANK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{BRAILLE PATTERN BLANK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{BRAILLE PATTERN BLANK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{BRAILLE PATTERN BLANK}" !~ m/^<+<-InBraillePatterns>>$/, q{Don't match internally inverted } ); ok( "\x{4FE4}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{4FE4}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{4FE4}" =~ m/^<+<-InBraillePatterns>>$/, q{Match unrelated internally inverted } ); ok( "\x{4FE4}\N{BRAILLE PATTERN BLANK}" =~ m/<+>/, q{Match unanchored } ); # InBuhid ok( "\N{BUHID LETTER A}" =~ m/^<+>$/, q{Match } ); ok( "\N{BUHID LETTER A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{BUHID LETTER A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{BUHID LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{BUHID LETTER A}" !~ m/^<+<-InBuhid>>$/, q{Don't match internally inverted } ); ok( "\x{996F}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{996F}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{996F}" =~ m/^<+<-InBuhid>>$/, q{Match unrelated internally inverted } ); ok( "\x{996F}\N{BUHID LETTER A}" =~ m/<+>/, q{Match unanchored } ); # InByzantineMusicalSymbols ok( "\x{802A}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{802A}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{802A}" =~ m/^<+<-InByzantineMusicalSymbols>>$/, q{Match unrelated internally inverted } ); # InCJKCompatibility ok( "\N{SQUARE APAATO}" =~ m/^<+>$/, q{Match } ); ok( "\N{SQUARE APAATO}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{SQUARE APAATO}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{SQUARE APAATO}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{SQUARE APAATO}" !~ m/^<+<-InCJKCompatibility>>$/, q{Don't match internally inverted } ); ok( "\x{2B99}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{2B99}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{2B99}" =~ m/^<+<-InCJKCompatibility>>$/, q{Match unrelated internally inverted } ); ok( "\x{2B99}\N{SQUARE APAATO}" =~ m/<+>/, q{Match unanchored } ); # InCJKCompatibilityForms ok( "\x{342B}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{342B}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{342B}" =~ m/^<+<-InCJKCompatibilityForms>>$/, q{Match unrelated internally inverted } ); # InCJKCompatibilityIdeographs ok( "\N{BLACK SQUARE}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{BLACK SQUARE}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{BLACK SQUARE}" =~ m/^<+<-InCJKCompatibilityIdeographs>>$/, q{Match unrelated internally inverted } ); # InCJKCompatibilityIdeographsSupplement ok( "\x{A90E}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{A90E}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{A90E}" =~ m/^<+<-InCJKCompatibilityIdeographsSupplement>>$/, q{Match unrelated internally inverted } ); # InCJKRadicalsSupplement ok( "\N{CJK RADICAL REPEAT}" =~ m/^<+>$/, q{Match } ); ok( "\N{CJK RADICAL REPEAT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{CJK RADICAL REPEAT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{CJK RADICAL REPEAT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{CJK RADICAL REPEAT}" !~ m/^<+<-InCJKRadicalsSupplement>>$/, q{Don't match internally inverted } ); ok( "\x{563B}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{563B}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{563B}" =~ m/^<+<-InCJKRadicalsSupplement>>$/, q{Match unrelated internally inverted } ); ok( "\x{563B}\N{CJK RADICAL REPEAT}" =~ m/<+>/, q{Match unanchored } ); # InCJKSymbolsAndPunctuation ok( "\N{IDEOGRAPHIC SPACE}" =~ m/^<+>$/, q{Match } ); ok( "\N{IDEOGRAPHIC SPACE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{IDEOGRAPHIC SPACE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{IDEOGRAPHIC SPACE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{IDEOGRAPHIC SPACE}" !~ m/^<+<-InCJKSymbolsAndPunctuation>>$/, q{Don't match internally inverted } ); ok( "\x{3BE6}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{3BE6}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{3BE6}" =~ m/^<+<-InCJKSymbolsAndPunctuation>>$/, q{Match unrelated internally inverted } ); ok( "\x{3BE6}\N{IDEOGRAPHIC SPACE}" =~ m/<+>/, q{Match unanchored } ); # InCJKUnifiedIdeographs ok( "\x{4E00}" =~ m/^<+>$/, q{Match } ); ok( "\x{4E00}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{4E00}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{4E00}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{4E00}" !~ m/^<+<-InCJKUnifiedIdeographs>>$/, q{Don't match internally inverted } ); ok( "\x{436E}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{436E}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{436E}" =~ m/^<+<-InCJKUnifiedIdeographs>>$/, q{Match unrelated internally inverted } ); ok( "\x{436E}\x{4E00}" =~ m/<+>/, q{Match unanchored } ); # InCJKUnifiedIdeographsExtensionA ok( "\x{4993}" =~ m/^<+>$/, q{Match } ); ok( "\x{4993}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{4993}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{4993}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{4993}" !~ m/^<+<-InCJKUnifiedIdeographsExtensionA>>$/, q{Don't match internally inverted } ); ok( "\N{HEXAGRAM FOR THE CREATIVE HEAVEN}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{HEXAGRAM FOR THE CREATIVE HEAVEN}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{HEXAGRAM FOR THE CREATIVE HEAVEN}" =~ m/^<+<-InCJKUnifiedIdeographsExtensionA>>$/, q{Match unrelated internally inverted } ); ok( "\N{HEXAGRAM FOR THE CREATIVE HEAVEN}\x{4993}" =~ m/<+>/, q{Match unanchored } ); # InCJKUnifiedIdeographsExtensionB ok( "\x{3E5A}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{3E5A}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{3E5A}" =~ m/^<+<-InCJKUnifiedIdeographsExtensionB>>$/, q{Match unrelated internally inverted } ); # InCherokee ok( "\N{CHEROKEE LETTER A}" =~ m/^<+>$/, q{Match } ); ok( "\N{CHEROKEE LETTER A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{CHEROKEE LETTER A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{CHEROKEE LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{CHEROKEE LETTER A}" !~ m/^<+<-InCherokee>>$/, q{Don't match internally inverted } ); ok( "\x{B311}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{B311}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{B311}" =~ m/^<+<-InCherokee>>$/, q{Match unrelated internally inverted } ); ok( "\x{B311}\N{CHEROKEE LETTER A}" =~ m/<+>/, q{Match unanchored } ); # InCombiningDiacriticalMarks ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<+>$/, q{Match } ); ok( "\N{COMBINING GRAVE ACCENT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{COMBINING GRAVE ACCENT}" !~ m/^<+<-InCombiningDiacriticalMarks>>$/, q{Don't match internally inverted } ); ok( "\x{81B8}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{81B8}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{81B8}" =~ m/^<+<-InCombiningDiacriticalMarks>>$/, q{Match unrelated internally inverted } ); ok( "\x{81B8}\N{COMBINING GRAVE ACCENT}" =~ m/<+>/, q{Match unanchored } ); # InCombiningDiacriticalMarksforSymbols ok( "\N{COMBINING LEFT HARPOON ABOVE}" =~ m/^<+>$/, q{Match } ); ok( "\N{COMBINING LEFT HARPOON ABOVE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{COMBINING LEFT HARPOON ABOVE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{COMBINING LEFT HARPOON ABOVE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{COMBINING LEFT HARPOON ABOVE}" !~ m/^<+<-InCombiningDiacriticalMarksforSymbols>>$/, q{Don't match internally inverted } ); ok( "\N{YI SYLLABLE NZOX}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{YI SYLLABLE NZOX}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{YI SYLLABLE NZOX}" =~ m/^<+<-InCombiningDiacriticalMarksforSymbols>>$/, q{Match unrelated internally inverted } ); ok( "\N{YI SYLLABLE NZOX}\N{COMBINING LEFT HARPOON ABOVE}" =~ m/<+>/, q{Match unanchored } ); # InCombiningHalfMarks ok( "\x{7140}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{7140}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{7140}" =~ m/^<+<-InCombiningHalfMarks>>$/, q{Match unrelated internally inverted } ); # InControlPictures ok( "\N{SYMBOL FOR NULL}" =~ m/^<+>$/, q{Match } ); ok( "\N{SYMBOL FOR NULL}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{SYMBOL FOR NULL}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{SYMBOL FOR NULL}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{SYMBOL FOR NULL}" !~ m/^<+<-InControlPictures>>$/, q{Don't match internally inverted } ); ok( "\x{CBBF}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{CBBF}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{CBBF}" =~ m/^<+<-InControlPictures>>$/, q{Match unrelated internally inverted } ); ok( "\x{CBBF}\N{SYMBOL FOR NULL}" =~ m/<+>/, q{Match unanchored } ); # InCurrencySymbols ok( "\N{EURO-CURRENCY SIGN}" =~ m/^<+>$/, q{Match } ); ok( "\N{EURO-CURRENCY SIGN}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{EURO-CURRENCY SIGN}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{EURO-CURRENCY SIGN}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{EURO-CURRENCY SIGN}" !~ m/^<+<-InCurrencySymbols>>$/, q{Don't match internally inverted } ); ok( "\x{D040}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{D040}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{D040}" =~ m/^<+<-InCurrencySymbols>>$/, q{Match unrelated internally inverted } ); ok( "\x{D040}\N{EURO-CURRENCY SIGN}" =~ m/<+>/, q{Match unanchored } ); # InCyrillic ok( "\N{CYRILLIC CAPITAL LETTER IE WITH GRAVE}" =~ m/^<+>$/, q{Match } ); ok( "\N{CYRILLIC CAPITAL LETTER IE WITH GRAVE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{CYRILLIC CAPITAL LETTER IE WITH GRAVE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{CYRILLIC CAPITAL LETTER IE WITH GRAVE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{CYRILLIC CAPITAL LETTER IE WITH GRAVE}" !~ m/^<+<-InCyrillic>>$/, q{Don't match internally inverted } ); ok( "\x{9C58}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{9C58}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{9C58}" =~ m/^<+<-InCyrillic>>$/, q{Match unrelated internally inverted } ); ok( "\x{9C58}\N{CYRILLIC CAPITAL LETTER IE WITH GRAVE}" =~ m/<+>/, q{Match unanchored } ); # InCyrillicSupplementary ok( "\N{CYRILLIC CAPITAL LETTER KOMI DE}" =~ m/^<+>$/, q{Match } ); ok( "\N{CYRILLIC CAPITAL LETTER KOMI DE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{CYRILLIC CAPITAL LETTER KOMI DE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{CYRILLIC CAPITAL LETTER KOMI DE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{CYRILLIC CAPITAL LETTER KOMI DE}" !~ m/^<+<-InCyrillicSupplementary>>$/, q{Don't match internally inverted } ); ok( "\x{857A}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{857A}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{857A}" =~ m/^<+<-InCyrillicSupplementary>>$/, q{Match unrelated internally inverted } ); ok( "\x{857A}\N{CYRILLIC CAPITAL LETTER KOMI DE}" =~ m/<+>/, q{Match unanchored } ); # InDeseret ok( "\N{LATIN SMALL LETTER I WITH DOUBLE GRAVE}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{LATIN SMALL LETTER I WITH DOUBLE GRAVE}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{LATIN SMALL LETTER I WITH DOUBLE GRAVE}" =~ m/^<+<-InDeseret>>$/, q{Match unrelated internally inverted } ); # InDevanagari ok( "\x{0900}" =~ m/^<+>$/, q{Match } ); ok( "\x{0900}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0900}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0900}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0900}" !~ m/^<+<-InDevanagari>>$/, q{Don't match internally inverted } ); ok( "\x{3837}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{3837}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{3837}" =~ m/^<+<-InDevanagari>>$/, q{Match unrelated internally inverted } ); ok( "\x{3837}\x{0900}" =~ m/<+>/, q{Match unanchored } ); # InDingbats ok( "\x{2700}" =~ m/^<+>$/, q{Match } ); ok( "\x{2700}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{2700}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{2700}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{2700}" !~ m/^<+<-InDingbats>>$/, q{Don't match internally inverted } ); ok( "\x{C9CC}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{C9CC}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{C9CC}" =~ m/^<+<-InDingbats>>$/, q{Match unrelated internally inverted } ); ok( "\x{C9CC}\x{2700}" =~ m/<+>/, q{Match unanchored } ); # InEnclosedAlphanumerics ok( "\N{CIRCLED DIGIT ONE}" =~ m/^<+>$/, q{Match } ); ok( "\N{CIRCLED DIGIT ONE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{CIRCLED DIGIT ONE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{CIRCLED DIGIT ONE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{CIRCLED DIGIT ONE}" !~ m/^<+<-InEnclosedAlphanumerics>>$/, q{Don't match internally inverted } ); ok( "\x{CCB8}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{CCB8}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{CCB8}" =~ m/^<+<-InEnclosedAlphanumerics>>$/, q{Match unrelated internally inverted } ); ok( "\x{CCB8}\N{CIRCLED DIGIT ONE}" =~ m/<+>/, q{Match unanchored } ); # InEnclosedCJKLettersAndMonths ok( "\N{PARENTHESIZED HANGUL KIYEOK}" =~ m/^<+>$/, q{Match } ); ok( "\N{PARENTHESIZED HANGUL KIYEOK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{PARENTHESIZED HANGUL KIYEOK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{PARENTHESIZED HANGUL KIYEOK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{PARENTHESIZED HANGUL KIYEOK}" !~ m/^<+<-InEnclosedCJKLettersAndMonths>>$/, q{Don't match internally inverted } ); ok( "\x{8883}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{8883}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{8883}" =~ m/^<+<-InEnclosedCJKLettersAndMonths>>$/, q{Match unrelated internally inverted } ); ok( "\x{8883}\N{PARENTHESIZED HANGUL KIYEOK}" =~ m/<+>/, q{Match unanchored } ); # InEthiopic ok( "\N{ETHIOPIC SYLLABLE HA}" =~ m/^<+>$/, q{Match } ); ok( "\N{ETHIOPIC SYLLABLE HA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{ETHIOPIC SYLLABLE HA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{ETHIOPIC SYLLABLE HA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{ETHIOPIC SYLLABLE HA}" !~ m/^<+<-InEthiopic>>$/, q{Don't match internally inverted } ); ok( "\N{MALAYALAM DIGIT NINE}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{MALAYALAM DIGIT NINE}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{MALAYALAM DIGIT NINE}" =~ m/^<+<-InEthiopic>>$/, q{Match unrelated internally inverted } ); ok( "\N{MALAYALAM DIGIT NINE}\N{ETHIOPIC SYLLABLE HA}" =~ m/<+>/, q{Match unanchored } ); # InGeneralPunctuation ok( "\N{EN QUAD}" =~ m/^<+>$/, q{Match } ); ok( "\N{EN QUAD}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{EN QUAD}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{EN QUAD}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{EN QUAD}" !~ m/^<+<-InGeneralPunctuation>>$/, q{Don't match internally inverted } ); ok( "\x{BBC9}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{BBC9}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{BBC9}" =~ m/^<+<-InGeneralPunctuation>>$/, q{Match unrelated internally inverted } ); ok( "\x{BBC9}\N{EN QUAD}" =~ m/<+>/, q{Match unanchored } ); # InGeometricShapes ok( "\N{BLACK SQUARE}" =~ m/^<+>$/, q{Match } ); ok( "\N{BLACK SQUARE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{BLACK SQUARE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{BLACK SQUARE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{BLACK SQUARE}" !~ m/^<+<-InGeometricShapes>>$/, q{Don't match internally inverted } ); ok( "\x{C58A}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{C58A}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{C58A}" =~ m/^<+<-InGeometricShapes>>$/, q{Match unrelated internally inverted } ); ok( "\x{C58A}\N{BLACK SQUARE}" =~ m/<+>/, q{Match unanchored } ); # InGeorgian ok( "\N{GEORGIAN CAPITAL LETTER AN}" =~ m/^<+>$/, q{Match } ); ok( "\N{GEORGIAN CAPITAL LETTER AN}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{GEORGIAN CAPITAL LETTER AN}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{GEORGIAN CAPITAL LETTER AN}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{GEORGIAN CAPITAL LETTER AN}" !~ m/^<+<-InGeorgian>>$/, q{Don't match internally inverted } ); ok( "\N{ARMENIAN CAPITAL LETTER BEN}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{ARMENIAN CAPITAL LETTER BEN}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{ARMENIAN CAPITAL LETTER BEN}" =~ m/^<+<-InGeorgian>>$/, q{Match unrelated internally inverted } ); ok( "\N{ARMENIAN CAPITAL LETTER BEN}\N{GEORGIAN CAPITAL LETTER AN}" =~ m/<+>/, q{Match unanchored } ); # InGothic ok( "\x{1A5A}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{1A5A}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{1A5A}" =~ m/^<+<-InGothic>>$/, q{Match unrelated internally inverted } ); # InGreekExtended ok( "\N{GREEK SMALL LETTER ALPHA WITH PSILI}" =~ m/^<+>$/, q{Match } ); ok( "\N{GREEK SMALL LETTER ALPHA WITH PSILI}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{GREEK SMALL LETTER ALPHA WITH PSILI}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{GREEK SMALL LETTER ALPHA WITH PSILI}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{GREEK SMALL LETTER ALPHA WITH PSILI}" !~ m/^<+<-InGreekExtended>>$/, q{Don't match internally inverted } ); ok( "\x{39F3}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{39F3}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{39F3}" =~ m/^<+<-InGreekExtended>>$/, q{Match unrelated internally inverted } ); ok( "\x{39F3}\N{GREEK SMALL LETTER ALPHA WITH PSILI}" =~ m/<+>/, q{Match unanchored } ); # InGreekAndCoptic ok( "\x{0370}" =~ m/^<+>$/, q{Match } ); ok( "\x{0370}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0370}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0370}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0370}" !~ m/^<+<-InGreekAndCoptic>>$/, q{Don't match internally inverted } ); ok( "\x{8CFE}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{8CFE}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{8CFE}" =~ m/^<+<-InGreekAndCoptic>>$/, q{Match unrelated internally inverted } ); ok( "\x{8CFE}\x{0370}" =~ m/<+>/, q{Match unanchored } ); # InGujarati ok( "\x{0A80}" =~ m/^<+>$/, q{Match } ); ok( "\x{0A80}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0A80}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0A80}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0A80}" !~ m/^<+<-InGujarati>>$/, q{Don't match internally inverted } ); ok( "\x{B022}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{B022}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{B022}" =~ m/^<+<-InGujarati>>$/, q{Match unrelated internally inverted } ); ok( "\x{B022}\x{0A80}" =~ m/<+>/, q{Match unanchored } ); # InGurmukhi ok( "\x{0A00}" =~ m/^<+>$/, q{Match } ); ok( "\x{0A00}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0A00}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0A00}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0A00}" !~ m/^<+<-InGurmukhi>>$/, q{Don't match internally inverted } ); ok( "\x{8FC3}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{8FC3}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{8FC3}" =~ m/^<+<-InGurmukhi>>$/, q{Match unrelated internally inverted } ); ok( "\x{8FC3}\x{0A00}" =~ m/<+>/, q{Match unanchored } ); # InHalfwidthAndFullwidthForms ok( "\x{36A3}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{36A3}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{36A3}" =~ m/^<+<-InHalfwidthAndFullwidthForms>>$/, q{Match unrelated internally inverted } ); # InHangulCompatibilityJamo ok( "\x{3130}" =~ m/^<+>$/, q{Match } ); ok( "\x{3130}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{3130}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{3130}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{3130}" !~ m/^<+<-InHangulCompatibilityJamo>>$/, q{Don't match internally inverted } ); ok( "\x{BAF0}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{BAF0}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{BAF0}" =~ m/^<+<-InHangulCompatibilityJamo>>$/, q{Match unrelated internally inverted } ); ok( "\x{BAF0}\x{3130}" =~ m/<+>/, q{Match unanchored } ); # InHangulJamo ok( "\N{HANGUL CHOSEONG KIYEOK}" =~ m/^<+>$/, q{Match } ); ok( "\N{HANGUL CHOSEONG KIYEOK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{HANGUL CHOSEONG KIYEOK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{HANGUL CHOSEONG KIYEOK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{HANGUL CHOSEONG KIYEOK}" !~ m/^<+<-InHangulJamo>>$/, q{Don't match internally inverted } ); ok( "\x{4EB3}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{4EB3}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{4EB3}" =~ m/^<+<-InHangulJamo>>$/, q{Match unrelated internally inverted } ); ok( "\x{4EB3}\N{HANGUL CHOSEONG KIYEOK}" =~ m/<+>/, q{Match unanchored } ); # InHangulSyllables ok( "\x{AC00}" =~ m/^<+>$/, q{Match } ); ok( "\x{AC00}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{AC00}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{AC00}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{AC00}" !~ m/^<+<-InHangulSyllables>>$/, q{Don't match internally inverted } ); ok( "\x{7D7E}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{7D7E}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{7D7E}" =~ m/^<+<-InHangulSyllables>>$/, q{Match unrelated internally inverted } ); ok( "\x{7D7E}\x{AC00}" =~ m/<+>/, q{Match unanchored } ); # InHanunoo ok( "\N{HANUNOO LETTER A}" =~ m/^<+>$/, q{Match } ); ok( "\N{HANUNOO LETTER A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{HANUNOO LETTER A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{HANUNOO LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{HANUNOO LETTER A}" !~ m/^<+<-InHanunoo>>$/, q{Don't match internally inverted } ); ok( "\x{BD8A}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{BD8A}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{BD8A}" =~ m/^<+<-InHanunoo>>$/, q{Match unrelated internally inverted } ); ok( "\x{BD8A}\N{HANUNOO LETTER A}" =~ m/<+>/, q{Match unanchored } ); # InHebrew ok( "\x{0590}" =~ m/^<+>$/, q{Match } ); ok( "\x{0590}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0590}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0590}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0590}" !~ m/^<+<-InHebrew>>$/, q{Don't match internally inverted } ); ok( "\x{7EB3}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{7EB3}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{7EB3}" =~ m/^<+<-InHebrew>>$/, q{Match unrelated internally inverted } ); ok( "\x{7EB3}\x{0590}" =~ m/<+>/, q{Match unanchored } ); # InHighPrivateUseSurrogates ok( "\x{9EC6}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{9EC6}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{9EC6}" =~ m/^<+<-InHighPrivateUseSurrogates>>$/, q{Match unrelated internally inverted } ); # InHighSurrogates ok( "\x{BC8F}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{BC8F}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{BC8F}" =~ m/^<+<-InHighSurrogates>>$/, q{Match unrelated internally inverted } ); # InHiragana ok( "\x{3040}" =~ m/^<+>$/, q{Match } ); ok( "\x{3040}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{3040}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{3040}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{3040}" !~ m/^<+<-InHiragana>>$/, q{Don't match internally inverted } ); ok( "\N{ARABIC SIGN ALAYHE ASSALLAM}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{ARABIC SIGN ALAYHE ASSALLAM}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{ARABIC SIGN ALAYHE ASSALLAM}" =~ m/^<+<-InHiragana>>$/, q{Match unrelated internally inverted } ); ok( "\N{ARABIC SIGN ALAYHE ASSALLAM}\x{3040}" =~ m/<+>/, q{Match unanchored } ); # InIPAExtensions ok( "\N{LATIN SMALL LETTER TURNED A}" =~ m/^<+>$/, q{Match } ); ok( "\N{LATIN SMALL LETTER TURNED A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LATIN SMALL LETTER TURNED A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LATIN SMALL LETTER TURNED A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LATIN SMALL LETTER TURNED A}" !~ m/^<+<-InIPAExtensions>>$/, q{Don't match internally inverted } ); ok( "\x{0DFC}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{0DFC}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{0DFC}" =~ m/^<+<-InIPAExtensions>>$/, q{Match unrelated internally inverted } ); ok( "\x{0DFC}\N{LATIN SMALL LETTER TURNED A}" =~ m/<+>/, q{Match unanchored } ); # InIdeographicDescriptionCharacters ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT}" =~ m/^<+>$/, q{Match } ); ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT}" !~ m/^<+<-InIdeographicDescriptionCharacters>>$/, q{Don't match internally inverted } ); ok( "\N{LATIN CAPITAL LETTER AE}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{LATIN CAPITAL LETTER AE}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{LATIN CAPITAL LETTER AE}" =~ m/^<+<-InIdeographicDescriptionCharacters>>$/, q{Match unrelated internally inverted } ); ok( "\N{LATIN CAPITAL LETTER AE}\N{IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT}" =~ m/<+>/, q{Match unanchored } ); # InKanbun ok( "\N{IDEOGRAPHIC ANNOTATION LINKING MARK}" =~ m/^<+>$/, q{Match } ); ok( "\N{IDEOGRAPHIC ANNOTATION LINKING MARK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{IDEOGRAPHIC ANNOTATION LINKING MARK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{IDEOGRAPHIC ANNOTATION LINKING MARK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{IDEOGRAPHIC ANNOTATION LINKING MARK}" !~ m/^<+<-InKanbun>>$/, q{Don't match internally inverted } ); ok( "\x{93AB}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{93AB}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{93AB}" =~ m/^<+<-InKanbun>>$/, q{Match unrelated internally inverted } ); ok( "\x{93AB}\N{IDEOGRAPHIC ANNOTATION LINKING MARK}" =~ m/<+>/, q{Match unanchored } ); # InKangxiRadicals ok( "\N{KANGXI RADICAL ONE}" =~ m/^<+>$/, q{Match } ); ok( "\N{KANGXI RADICAL ONE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{KANGXI RADICAL ONE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{KANGXI RADICAL ONE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{KANGXI RADICAL ONE}" !~ m/^<+<-InKangxiRadicals>>$/, q{Don't match internally inverted } ); ok( "\x{363D}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{363D}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{363D}" =~ m/^<+<-InKangxiRadicals>>$/, q{Match unrelated internally inverted } ); ok( "\x{363D}\N{KANGXI RADICAL ONE}" =~ m/<+>/, q{Match unanchored } ); # InKannada ok( "\x{0C80}" =~ m/^<+>$/, q{Match } ); ok( "\x{0C80}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0C80}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0C80}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0C80}" !~ m/^<+<-InKannada>>$/, q{Don't match internally inverted } ); ok( "\x{9093}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{9093}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{9093}" =~ m/^<+<-InKannada>>$/, q{Match unrelated internally inverted } ); ok( "\x{9093}\x{0C80}" =~ m/<+>/, q{Match unanchored } ); # InKatakana ok( "\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" =~ m/^<+>$/, q{Match } ); ok( "\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" !~ m/^<+<-InKatakana>>$/, q{Don't match internally inverted } ); ok( "\x{75DA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{75DA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{75DA}" =~ m/^<+<-InKatakana>>$/, q{Match unrelated internally inverted } ); ok( "\x{75DA}\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" =~ m/<+>/, q{Match unanchored } ); # InKatakanaPhoneticExtensions ok( "\N{KATAKANA LETTER SMALL KU}" =~ m/^<+>$/, q{Match } ); ok( "\N{KATAKANA LETTER SMALL KU}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{KATAKANA LETTER SMALL KU}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{KATAKANA LETTER SMALL KU}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{KATAKANA LETTER SMALL KU}" !~ m/^<+<-InKatakanaPhoneticExtensions>>$/, q{Don't match internally inverted } ); ok( "\N{GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA}" =~ m/^<+<-InKatakanaPhoneticExtensions>>$/, q{Match unrelated internally inverted } ); ok( "\N{GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA}\N{KATAKANA LETTER SMALL KU}" =~ m/<+>/, q{Match unanchored } ); # InKhmer ok( "\N{KHMER LETTER KA}" =~ m/^<+>$/, q{Match } ); ok( "\N{KHMER LETTER KA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{KHMER LETTER KA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{KHMER LETTER KA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{KHMER LETTER KA}" !~ m/^<+<-InKhmer>>$/, q{Don't match internally inverted } ); ok( "\x{508C}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{508C}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{508C}" =~ m/^<+<-InKhmer>>$/, q{Match unrelated internally inverted } ); ok( "\x{508C}\N{KHMER LETTER KA}" =~ m/<+>/, q{Match unanchored } ); # InLao ok( "\x{0E80}" =~ m/^<+>$/, q{Match } ); ok( "\x{0E80}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0E80}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0E80}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0E80}" !~ m/^<+<-InLao>>$/, q{Don't match internally inverted } ); ok( "\N{PARENTHESIZED IDEOGRAPH CONGRATULATION}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{PARENTHESIZED IDEOGRAPH CONGRATULATION}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{PARENTHESIZED IDEOGRAPH CONGRATULATION}" =~ m/^<+<-InLao>>$/, q{Match unrelated internally inverted } ); ok( "\N{PARENTHESIZED IDEOGRAPH CONGRATULATION}\x{0E80}" =~ m/<+>/, q{Match unanchored } ); # InLatin1Supplement ok( "\x{0080}" =~ m/^<+>$/, q{Match } ); ok( "\x{0080}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0080}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0080}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0080}" !~ m/^<+<-InLatin1Supplement>>$/, q{Don't match internally inverted } ); ok( "\x{3A43}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{3A43}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{3A43}" =~ m/^<+<-InLatin1Supplement>>$/, q{Match unrelated internally inverted } ); ok( "\x{3A43}\x{0080}" =~ m/<+>/, q{Match unanchored } ); # InLatinExtendedA ok( "\N{LATIN CAPITAL LETTER A WITH MACRON}" =~ m/^<+>$/, q{Match } ); ok( "\N{LATIN CAPITAL LETTER A WITH MACRON}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LATIN CAPITAL LETTER A WITH MACRON}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LATIN CAPITAL LETTER A WITH MACRON}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LATIN CAPITAL LETTER A WITH MACRON}" !~ m/^<+<-InLatinExtendedA>>$/, q{Don't match internally inverted } ); ok( "\N{ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS}" =~ m/^<+<-InLatinExtendedA>>$/, q{Match unrelated internally inverted } ); ok( "\N{ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS}\N{LATIN CAPITAL LETTER A WITH MACRON}" =~ m/<+>/, q{Match unanchored } ); # InLatinExtendedAdditional ok( "\N{LATIN CAPITAL LETTER A WITH RING BELOW}" =~ m/^<+>$/, q{Match } ); ok( "\N{LATIN CAPITAL LETTER A WITH RING BELOW}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LATIN CAPITAL LETTER A WITH RING BELOW}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LATIN CAPITAL LETTER A WITH RING BELOW}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LATIN CAPITAL LETTER A WITH RING BELOW}" !~ m/^<+<-InLatinExtendedAdditional>>$/, q{Don't match internally inverted } ); ok( "\x{36E7}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{36E7}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{36E7}" =~ m/^<+<-InLatinExtendedAdditional>>$/, q{Match unrelated internally inverted } ); ok( "\x{36E7}\N{LATIN CAPITAL LETTER A WITH RING BELOW}" =~ m/<+>/, q{Match unanchored } ); # InLatinExtendedB ok( "\N{LATIN SMALL LETTER B WITH STROKE}" =~ m/^<+>$/, q{Match } ); ok( "\N{LATIN SMALL LETTER B WITH STROKE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{LATIN SMALL LETTER B WITH STROKE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{LATIN SMALL LETTER B WITH STROKE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{LATIN SMALL LETTER B WITH STROKE}" !~ m/^<+<-InLatinExtendedB>>$/, q{Don't match internally inverted } ); ok( "\x{877E}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{877E}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{877E}" =~ m/^<+<-InLatinExtendedB>>$/, q{Match unrelated internally inverted } ); ok( "\x{877E}\N{LATIN SMALL LETTER B WITH STROKE}" =~ m/<+>/, q{Match unanchored } ); # InLetterlikeSymbols ok( "\N{ACCOUNT OF}" =~ m/^<+>$/, q{Match } ); ok( "\N{ACCOUNT OF}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{ACCOUNT OF}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{ACCOUNT OF}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{ACCOUNT OF}" !~ m/^<+<-InLetterlikeSymbols>>$/, q{Don't match internally inverted } ); ok( "\N{CIRCLED IDEOGRAPH TWO}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{CIRCLED IDEOGRAPH TWO}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{CIRCLED IDEOGRAPH TWO}" =~ m/^<+<-InLetterlikeSymbols>>$/, q{Match unrelated internally inverted } ); ok( "\N{CIRCLED IDEOGRAPH TWO}\N{ACCOUNT OF}" =~ m/<+>/, q{Match unanchored } ); # InLowSurrogates ok( "\x{B611}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{B611}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{B611}" =~ m/^<+<-InLowSurrogates>>$/, q{Match unrelated internally inverted } ); # InMalayalam ok( "\x{0D00}" =~ m/^<+>$/, q{Match } ); ok( "\x{0D00}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0D00}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0D00}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0D00}" !~ m/^<+<-InMalayalam>>$/, q{Don't match internally inverted } ); ok( "\x{C011}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{C011}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{C011}" =~ m/^<+<-InMalayalam>>$/, q{Match unrelated internally inverted } ); ok( "\x{C011}\x{0D00}" =~ m/<+>/, q{Match unanchored } ); # InMathematicalAlphanumericSymbols ok( "\x{73FA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{73FA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{73FA}" =~ m/^<+<-InMathematicalAlphanumericSymbols>>$/, q{Match unrelated internally inverted } ); # InMathematicalOperators ok( "\N{FOR ALL}" =~ m/^<+>$/, q{Match } ); ok( "\N{FOR ALL}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{FOR ALL}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{FOR ALL}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{FOR ALL}" !~ m/^<+<-InMathematicalOperators>>$/, q{Don't match internally inverted } ); ok( "\x{B389}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{B389}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{B389}" =~ m/^<+<-InMathematicalOperators>>$/, q{Match unrelated internally inverted } ); ok( "\x{B389}\N{FOR ALL}" =~ m/<+>/, q{Match unanchored } ); # InMiscellaneousMathematicalSymbolsA ok( "\x{27C0}" =~ m/^<+>$/, q{Match } ); ok( "\x{27C0}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{27C0}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{27C0}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{27C0}" !~ m/^<+<-InMiscellaneousMathematicalSymbolsA>>$/, q{Don't match internally inverted } ); ok( "\x{AAB2}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{AAB2}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{AAB2}" =~ m/^<+<-InMiscellaneousMathematicalSymbolsA>>$/, q{Match unrelated internally inverted } ); ok( "\x{AAB2}\x{27C0}" =~ m/<+>/, q{Match unanchored } ); # InMiscellaneousMathematicalSymbolsB ok( "\N{TRIPLE VERTICAL BAR DELIMITER}" =~ m/^<+>$/, q{Match } ); ok( "\N{TRIPLE VERTICAL BAR DELIMITER}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{TRIPLE VERTICAL BAR DELIMITER}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{TRIPLE VERTICAL BAR DELIMITER}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{TRIPLE VERTICAL BAR DELIMITER}" !~ m/^<+<-InMiscellaneousMathematicalSymbolsB>>$/, q{Don't match internally inverted } ); ok( "\x{5793}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{5793}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{5793}" =~ m/^<+<-InMiscellaneousMathematicalSymbolsB>>$/, q{Match unrelated internally inverted } ); ok( "\x{5793}\N{TRIPLE VERTICAL BAR DELIMITER}" =~ m/<+>/, q{Match unanchored } ); # InMiscellaneousSymbols ok( "\N{BLACK SUN WITH RAYS}" =~ m/^<+>$/, q{Match } ); ok( "\N{BLACK SUN WITH RAYS}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{BLACK SUN WITH RAYS}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{BLACK SUN WITH RAYS}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{BLACK SUN WITH RAYS}" !~ m/^<+<-InMiscellaneousSymbols>>$/, q{Don't match internally inverted } ); ok( "\x{39D9}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{39D9}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{39D9}" =~ m/^<+<-InMiscellaneousSymbols>>$/, q{Match unrelated internally inverted } ); ok( "\x{39D9}\N{BLACK SUN WITH RAYS}" =~ m/<+>/, q{Match unanchored } ); # InMiscellaneousTechnical ok( "\N{DIAMETER SIGN}" =~ m/^<+>$/, q{Match } ); ok( "\N{DIAMETER SIGN}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{DIAMETER SIGN}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{DIAMETER SIGN}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{DIAMETER SIGN}" !~ m/^<+<-InMiscellaneousTechnical>>$/, q{Don't match internally inverted } ); ok( "\x{528A}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{528A}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{528A}" =~ m/^<+<-InMiscellaneousTechnical>>$/, q{Match unrelated internally inverted } ); ok( "\x{528A}\N{DIAMETER SIGN}" =~ m/<+>/, q{Match unanchored } ); # InMongolian ok( "\N{MONGOLIAN BIRGA}" =~ m/^<+>$/, q{Match } ); ok( "\N{MONGOLIAN BIRGA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{MONGOLIAN BIRGA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{MONGOLIAN BIRGA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{MONGOLIAN BIRGA}" !~ m/^<+<-InMongolian>>$/, q{Don't match internally inverted } ); ok( "\x{3985}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{3985}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{3985}" =~ m/^<+<-InMongolian>>$/, q{Match unrelated internally inverted } ); ok( "\x{3985}\N{MONGOLIAN BIRGA}" =~ m/<+>/, q{Match unanchored } ); # InMusicalSymbols ok( "\x{7A59}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{7A59}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{7A59}" =~ m/^<+<-InMusicalSymbols>>$/, q{Match unrelated internally inverted } ); # InMyanmar ok( "\N{MYANMAR LETTER KA}" =~ m/^<+>$/, q{Match } ); ok( "\N{MYANMAR LETTER KA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{MYANMAR LETTER KA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{MYANMAR LETTER KA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{MYANMAR LETTER KA}" !~ m/^<+<-InMyanmar>>$/, q{Don't match internally inverted } ); ok( "\x{5698}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{5698}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{5698}" =~ m/^<+<-InMyanmar>>$/, q{Match unrelated internally inverted } ); ok( "\x{5698}\N{MYANMAR LETTER KA}" =~ m/<+>/, q{Match unanchored } ); # InNumberForms ok( "\x{2150}" =~ m/^<+>$/, q{Match } ); ok( "\x{2150}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{2150}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{2150}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{2150}" !~ m/^<+<-InNumberForms>>$/, q{Don't match internally inverted } ); ok( "\x{C41B}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{C41B}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{C41B}" =~ m/^<+<-InNumberForms>>$/, q{Match unrelated internally inverted } ); ok( "\x{C41B}\x{2150}" =~ m/<+>/, q{Match unanchored } ); # InOgham ok( "\N{OGHAM SPACE MARK}" =~ m/^<+>$/, q{Match } ); ok( "\N{OGHAM SPACE MARK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{OGHAM SPACE MARK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{OGHAM SPACE MARK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{OGHAM SPACE MARK}" !~ m/^<+<-InOgham>>$/, q{Don't match internally inverted } ); ok( "\x{2C8C}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{2C8C}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{2C8C}" =~ m/^<+<-InOgham>>$/, q{Match unrelated internally inverted } ); ok( "\x{2C8C}\N{OGHAM SPACE MARK}" =~ m/<+>/, q{Match unanchored } ); # InOldItalic ok( "\N{YI SYLLABLE MGAT}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{YI SYLLABLE MGAT}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{YI SYLLABLE MGAT}" =~ m/^<+<-InOldItalic>>$/, q{Match unrelated internally inverted } ); # InOpticalCharacterRecognition ok( "\N{OCR HOOK}" =~ m/^<+>$/, q{Match } ); ok( "\N{OCR HOOK}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{OCR HOOK}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{OCR HOOK}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{OCR HOOK}" !~ m/^<+<-InOpticalCharacterRecognition>>$/, q{Don't match internally inverted } ); ok( "\x{CB83}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{CB83}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{CB83}" =~ m/^<+<-InOpticalCharacterRecognition>>$/, q{Match unrelated internally inverted } ); ok( "\x{CB83}\N{OCR HOOK}" =~ m/<+>/, q{Match unanchored } ); # InOriya ok( "\x{0B00}" =~ m/^<+>$/, q{Match } ); ok( "\x{0B00}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0B00}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0B00}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0B00}" !~ m/^<+<-InOriya>>$/, q{Don't match internally inverted } ); ok( "\x{6CE7}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{6CE7}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{6CE7}" =~ m/^<+<-InOriya>>$/, q{Match unrelated internally inverted } ); ok( "\x{6CE7}\x{0B00}" =~ m/<+>/, q{Match unanchored } ); # InPrivateUseArea ok( "\x{7662}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{7662}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{7662}" =~ m/^<+<-InPrivateUseArea>>$/, q{Match unrelated internally inverted } ); # InRunic ok( "\N{RUNIC LETTER FEHU FEOH FE F}" =~ m/^<+>$/, q{Match } ); ok( "\N{RUNIC LETTER FEHU FEOH FE F}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{RUNIC LETTER FEHU FEOH FE F}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{RUNIC LETTER FEHU FEOH FE F}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{RUNIC LETTER FEHU FEOH FE F}" !~ m/^<+<-InRunic>>$/, q{Don't match internally inverted } ); ok( "\x{47A1}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{47A1}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{47A1}" =~ m/^<+<-InRunic>>$/, q{Match unrelated internally inverted } ); ok( "\x{47A1}\N{RUNIC LETTER FEHU FEOH FE F}" =~ m/<+>/, q{Match unanchored } ); # InSinhala ok( "\x{0D80}" =~ m/^<+>$/, q{Match } ); ok( "\x{0D80}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0D80}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0D80}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0D80}" !~ m/^<+<-InSinhala>>$/, q{Don't match internally inverted } ); ok( "\x{1C39}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{1C39}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{1C39}" =~ m/^<+<-InSinhala>>$/, q{Match unrelated internally inverted } ); ok( "\x{1C39}\x{0D80}" =~ m/<+>/, q{Match unanchored } ); # InSmallFormVariants ok( "\N{YI SYLLABLE FAP}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{YI SYLLABLE FAP}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{YI SYLLABLE FAP}" =~ m/^<+<-InSmallFormVariants>>$/, q{Match unrelated internally inverted } ); # InSpacingModifierLetters ok( "\N{MODIFIER LETTER SMALL H}" =~ m/^<+>$/, q{Match } ); ok( "\N{MODIFIER LETTER SMALL H}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{MODIFIER LETTER SMALL H}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{MODIFIER LETTER SMALL H}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{MODIFIER LETTER SMALL H}" !~ m/^<+<-InSpacingModifierLetters>>$/, q{Don't match internally inverted } ); ok( "\x{08E8}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{08E8}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{08E8}" =~ m/^<+<-InSpacingModifierLetters>>$/, q{Match unrelated internally inverted } ); ok( "\x{08E8}\N{MODIFIER LETTER SMALL H}" =~ m/<+>/, q{Match unanchored } ); # InSpecials ok( "\x{0C7E}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{0C7E}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{0C7E}" =~ m/^<+<-InSpecials>>$/, q{Match unrelated internally inverted } ); # InSuperscriptsAndSubscripts ok( "\N{SUPERSCRIPT ZERO}" =~ m/^<+>$/, q{Match } ); ok( "\N{SUPERSCRIPT ZERO}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{SUPERSCRIPT ZERO}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{SUPERSCRIPT ZERO}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{SUPERSCRIPT ZERO}" !~ m/^<+<-InSuperscriptsAndSubscripts>>$/, q{Don't match internally inverted } ); ok( "\x{D378}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{D378}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{D378}" =~ m/^<+<-InSuperscriptsAndSubscripts>>$/, q{Match unrelated internally inverted } ); ok( "\x{D378}\N{SUPERSCRIPT ZERO}" =~ m/<+>/, q{Match unanchored } ); # InSupplementalArrowsA ok( "\N{UPWARDS QUADRUPLE ARROW}" =~ m/^<+>$/, q{Match } ); ok( "\N{UPWARDS QUADRUPLE ARROW}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{UPWARDS QUADRUPLE ARROW}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{UPWARDS QUADRUPLE ARROW}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{UPWARDS QUADRUPLE ARROW}" !~ m/^<+<-InSupplementalArrowsA>>$/, q{Don't match internally inverted } ); ok( "\N{LIMBU DIGIT SEVEN}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{LIMBU DIGIT SEVEN}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{LIMBU DIGIT SEVEN}" =~ m/^<+<-InSupplementalArrowsA>>$/, q{Match unrelated internally inverted } ); ok( "\N{LIMBU DIGIT SEVEN}\N{UPWARDS QUADRUPLE ARROW}" =~ m/<+>/, q{Match unanchored } ); # InSupplementalArrowsB ok( "\N{RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE}" =~ m/^<+>$/, q{Match } ); ok( "\N{RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE}" !~ m/^<+<-InSupplementalArrowsB>>$/, q{Don't match internally inverted } ); ok( "\x{1D7D}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{1D7D}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{1D7D}" =~ m/^<+<-InSupplementalArrowsB>>$/, q{Match unrelated internally inverted } ); ok( "\x{1D7D}\N{RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE}" =~ m/<+>/, q{Match unanchored } ); # InSupplementalMathematicalOperators ok( "\N{N-ARY CIRCLED DOT OPERATOR}" =~ m/^<+>$/, q{Match } ); ok( "\N{N-ARY CIRCLED DOT OPERATOR}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{N-ARY CIRCLED DOT OPERATOR}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{N-ARY CIRCLED DOT OPERATOR}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{N-ARY CIRCLED DOT OPERATOR}" !~ m/^<+<-InSupplementalMathematicalOperators>>$/, q{Don't match internally inverted } ); ok( "\N{YI SYLLABLE TAX}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{YI SYLLABLE TAX}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{YI SYLLABLE TAX}" =~ m/^<+<-InSupplementalMathematicalOperators>>$/, q{Match unrelated internally inverted } ); ok( "\N{YI SYLLABLE TAX}\N{N-ARY CIRCLED DOT OPERATOR}" =~ m/<+>/, q{Match unanchored } ); # InSupplementaryPrivateUseAreaA ok( "\N{TIBETAN LETTER PHA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{TIBETAN LETTER PHA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{TIBETAN LETTER PHA}" =~ m/^<+<-InSupplementaryPrivateUseAreaA>>$/, q{Match unrelated internally inverted } ); # InSupplementaryPrivateUseAreaB ok( "\x{7E65}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{7E65}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{7E65}" =~ m/^<+<-InSupplementaryPrivateUseAreaB>>$/, q{Match unrelated internally inverted } ); # InSyriac ok( "\N{SYRIAC END OF PARAGRAPH}" =~ m/^<+>$/, q{Match } ); ok( "\N{SYRIAC END OF PARAGRAPH}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{SYRIAC END OF PARAGRAPH}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{SYRIAC END OF PARAGRAPH}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{SYRIAC END OF PARAGRAPH}" !~ m/^<+<-InSyriac>>$/, q{Don't match internally inverted } ); ok( "\x{CA1C}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{CA1C}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{CA1C}" =~ m/^<+<-InSyriac>>$/, q{Match unrelated internally inverted } ); ok( "\x{CA1C}\N{SYRIAC END OF PARAGRAPH}" =~ m/<+>/, q{Match unanchored } ); # InTagalog ok( "\N{TAGALOG LETTER A}" =~ m/^<+>$/, q{Match } ); ok( "\N{TAGALOG LETTER A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{TAGALOG LETTER A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{TAGALOG LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{TAGALOG LETTER A}" !~ m/^<+<-InTagalog>>$/, q{Don't match internally inverted } ); ok( "\x{D49E}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{D49E}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{D49E}" =~ m/^<+<-InTagalog>>$/, q{Match unrelated internally inverted } ); ok( "\x{D49E}\N{TAGALOG LETTER A}" =~ m/<+>/, q{Match unanchored } ); # InTagbanwa ok( "\N{TAGBANWA LETTER A}" =~ m/^<+>$/, q{Match } ); ok( "\N{TAGBANWA LETTER A}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{TAGBANWA LETTER A}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{TAGBANWA LETTER A}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{TAGBANWA LETTER A}" !~ m/^<+<-InTagbanwa>>$/, q{Don't match internally inverted } ); ok( "\x{AFAA}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{AFAA}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{AFAA}" =~ m/^<+<-InTagbanwa>>$/, q{Match unrelated internally inverted } ); ok( "\x{AFAA}\N{TAGBANWA LETTER A}" =~ m/<+>/, q{Match unanchored } ); # InTags ok( "\x{CA38}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{CA38}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{CA38}" =~ m/^<+<-InTags>>$/, q{Match unrelated internally inverted } ); # InTamil ok( "\x{0B80}" =~ m/^<+>$/, q{Match } ); ok( "\x{0B80}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0B80}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0B80}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0B80}" !~ m/^<+<-InTamil>>$/, q{Don't match internally inverted } ); ok( "\x{D44B}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{D44B}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{D44B}" =~ m/^<+<-InTamil>>$/, q{Match unrelated internally inverted } ); ok( "\x{D44B}\x{0B80}" =~ m/<+>/, q{Match unanchored } ); # InTelugu ok( "\x{0C00}" =~ m/^<+>$/, q{Match } ); ok( "\x{0C00}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0C00}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0C00}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0C00}" !~ m/^<+<-InTelugu>>$/, q{Don't match internally inverted } ); ok( "\x{D3E7}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{D3E7}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{D3E7}" =~ m/^<+<-InTelugu>>$/, q{Match unrelated internally inverted } ); ok( "\x{D3E7}\x{0C00}" =~ m/<+>/, q{Match unanchored } ); # InThaana ok( "\N{THAANA LETTER HAA}" =~ m/^<+>$/, q{Match } ); ok( "\N{THAANA LETTER HAA}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{THAANA LETTER HAA}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{THAANA LETTER HAA}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{THAANA LETTER HAA}" !~ m/^<+<-InThaana>>$/, q{Don't match internally inverted } ); ok( "\N{YI SYLLABLE QIT}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{YI SYLLABLE QIT}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{YI SYLLABLE QIT}" =~ m/^<+<-InThaana>>$/, q{Match unrelated internally inverted } ); ok( "\N{YI SYLLABLE QIT}\N{THAANA LETTER HAA}" =~ m/<+>/, q{Match unanchored } ); # InThai ok( "\x{0E00}" =~ m/^<+>$/, q{Match } ); ok( "\x{0E00}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{0E00}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{0E00}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{0E00}" !~ m/^<+<-InThai>>$/, q{Don't match internally inverted } ); ok( "\x{BCED}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{BCED}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{BCED}" =~ m/^<+<-InThai>>$/, q{Match unrelated internally inverted } ); ok( "\x{BCED}\x{0E00}" =~ m/<+>/, q{Match unanchored } ); # InTibetan ok( "\N{TIBETAN SYLLABLE OM}" =~ m/^<+>$/, q{Match } ); ok( "\N{TIBETAN SYLLABLE OM}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{TIBETAN SYLLABLE OM}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{TIBETAN SYLLABLE OM}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{TIBETAN SYLLABLE OM}" !~ m/^<+<-InTibetan>>$/, q{Don't match internally inverted } ); ok( "\N{ARABIC SIGN SINDHI AMPERSAND}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{ARABIC SIGN SINDHI AMPERSAND}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{ARABIC SIGN SINDHI AMPERSAND}" =~ m/^<+<-InTibetan>>$/, q{Match unrelated internally inverted } ); ok( "\N{ARABIC SIGN SINDHI AMPERSAND}\N{TIBETAN SYLLABLE OM}" =~ m/<+>/, q{Match unanchored } ); # InUnifiedCanadianAboriginalSyllabics ok( "\x{1400}" =~ m/^<+>$/, q{Match } ); ok( "\x{1400}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\x{1400}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\x{1400}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\x{1400}" !~ m/^<+<-InUnifiedCanadianAboriginalSyllabics>>$/, q{Don't match internally inverted } ); ok( "\x{49D8}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{49D8}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{49D8}" =~ m/^<+<-InUnifiedCanadianAboriginalSyllabics>>$/, q{Match unrelated internally inverted } ); ok( "\x{49D8}\x{1400}" =~ m/<+>/, q{Match unanchored } ); # InVariationSelectors ok( "\x{5307}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{5307}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{5307}" =~ m/^<+<-InVariationSelectors>>$/, q{Match unrelated internally inverted } ); # InYiRadicals ok( "\N{YI RADICAL QOT}" =~ m/^<+>$/, q{Match } ); ok( "\N{YI RADICAL QOT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{YI RADICAL QOT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{YI RADICAL QOT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{YI RADICAL QOT}" !~ m/^<+<-InYiRadicals>>$/, q{Don't match internally inverted } ); ok( "\x{7CAD}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\x{7CAD}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\x{7CAD}" =~ m/^<+<-InYiRadicals>>$/, q{Match unrelated internally inverted } ); ok( "\x{7CAD}\N{YI RADICAL QOT}" =~ m/<+>/, q{Match unanchored } ); # InYiSyllables ok( "\N{YI SYLLABLE IT}" =~ m/^<+>$/, q{Match } ); ok( "\N{YI SYLLABLE IT}" =~ m/^<[A]+>$/, q{Match compound } ); ok( "\N{YI SYLLABLE IT}" !~ m/^<->$/, q{Don't match externally inverted } ); ok( "\N{YI SYLLABLE IT}" !~ m/^<[A]->$/, q{Don't match compound inverted } ); ok( "\N{YI SYLLABLE IT}" !~ m/^<+<-InYiSyllables>>$/, q{Don't match internally inverted } ); ok( "\N{BRAILLE PATTERN DOTS-1578}" !~ m/^<+>$/, q{Don't match unrelated } ); ok( "\N{BRAILLE PATTERN DOTS-1578}" =~ m/^<->$/, q{Match unrelated externally inverted } ); ok( "\N{BRAILLE PATTERN DOTS-1578}" =~ m/^<+<-InYiSyllables>>$/, q{Match unrelated internally inverted } ); ok( "\N{BRAILLE PATTERN DOTS-1578}\N{YI SYLLABLE IT}" =~ m/<+>/, q{Match unanchored } );