use v6-alpha; use Test; =pod This file was originally derived from the perl5 CPAN module Perl6::Rules, version 0.3 (12 Apr 2004), file t/propcharset_slow_to_compile.t. =cut plan 2349; if !eval('("a" ~~ /a/)') { skip_rest "skipped tests - rules support appears to be missing"; } else { force_todo(1..2,7..11,16..20,25..26,28..32,37..41,46..47,49..53,58..59,61..65,70..71,73..77,82..86,91..92,94..98,103..107,112..113,115..119,124..128,133..134,136..140,145..149,154..158,163..164,166..170,175..179,184..185,187..191,196..200,205..206,208..212,217..221,226..230,235..239,244..245,247..251,256..260,265..266,268..272,277..278,280..284,289..290,292..296,301..305,310..314,319..323,328..329,331..335,340..344,349..350,352..356,361..365,370..371,373..377,382..386,391..392,394..398,403..407,412..413,415..419,424..428,433..434,436..440,445..449,454..455,457..461,466..470,475..479,484..488,493..494,496..500,505..506,508..512,517..518,520..524,529..533,538..539,541..545,550..551,553..557,562..563,565..569,574..578,583..587,592..593,595..599,604..605,607..611,616..617,619..623,628..629,631..635,640..641,643..647,652..653,655..659,664..665,667..671,676..680,685..689,694..695,697..701,706..707,709..713,718..719,721..725,730..734,739..743,748..752,757..761,766..770,775..779,784..788,793..797,802..806,811..815,820..824,829..830,832..836,841..842,844..848,853..854,856..858,860..863,868..872,877..881,886..888,890..893,898..902,907..911,916..920,925..929,934..938,943..947,952..956,961..965,970..974,979..983,988..992,997..1001,1006..1007,1009..1013,1018..1019,1021..1025,1030..1031,1033..1037,1042..1043,1045..1049,1054..1055,1057..1061,1066..1068,1070..1073,1078..1082,1087..1091,1096..1097,1099..1103,1108..1109,1111..1115,1120..1124,1129..1133,1138..1142,1147..1151,1156..1160,1165..1169,1174..1178,1183..1187,1192..1196,1201..1205,1210..1214,1219..1223,1228..1232,1237..1241,1246..1250,1255..1259,1264..1268,1273..1277,1282..1286,1291..1292,1294..1296,1298..1299,1301..1304,1309..1313,1318..1322,1327..1331,1336..1340,1345..1349,1354..1358,1363..1367,1372..1376,1381..1382,1384..1388,1393..1397,1402..1406,1411..1415,1420..1424,1429..1430,1432..1436,1441..1445,1450..1451,1453..1457,1462..1466,1471..1475,1479..1481,1486..1490,1495..1499,1504..1505,1507..1509,1511..1514,1519..1521,1523..1524,1526..1529,1534..1538,1543..1547,1552..1556,1561..1565,1570..1574,1579..1583,1588..1592,1597..1601,1606..1610,1615..1617,1619..1622,1627..1629,1631..1632,1634..1635,1637..1640,1645..1649,1654..1658,1663..1667,1672..1674,1676..1679,1684..1688,1693..1697,1702..1704,1706..1709,1714..1718,1723..1727,1732..1736,1741..1743,1745..1748,1753..1757,1762..1766,1771..1775,1780..1784,1789..1793,1798..1802,1807..1811,1816..1818,1820..1823,1828..1832,1837..1841,1846..1850,1855..1857,1859..1862,1867..1871,1876..1880,1885..1889,1894..1898,1903..1905,1907..1908,1910..1913,1918..1922,1927..1931,1936..1940,1945..1949,1954..1958,1963..1967,1972..1976,1981..1985,1990..1994,1999..2003,2008..2012,2017..2021,2026..2030,2035..2039,2044..2046,2048..2051,2056..2058,2060..2063,2068..2072,2077..2081,2086..2090,2095..2099,2104..2108,2113..2115,2117..2120,2125..2129,2134..2138,2143..2145,2147..2150,2155..2159,2164..2166,2168..2171,2176..2180,2185..2187,2189..2192,2197..2199,2201..2204,2209..2213,2218..2222,2227..2231,2236..2238,2240..2241,2243..2246,2251..2255,2260..2264,2269..2271,2273..2276,2281..2285,2290..2294,2299..2303,2308..2312,2317..2321,2326..2328,2330..2333,2338..2342,2347..2349); # Unicode property character sets are :todo. # L Letter ok("\x[45CD]" ~~ m/^<+isL>$/, q{Match (Letter)} ); ok("\x[45CD]" ~~ m/^<[A]+isL>$/, q{Match compound (Letter)} ); ok(!( "\x[45CD]" ~~ m/^.$/ ), q{Don't match externally inverted (Letter)} ); ok(!( "\x[45CD]" ~~ m/^<[A]-isL>$/ ), q{Don't match compound inverted (Letter)} ); ok(!( "\x[45CD]" ~~ m/^<-isL>$/ ), q{Don't match internally inverted (Letter)} ); ok(!( "\x[4DB6]" ~~ m/^<+isL>$/ ), q{Don't match unrelated (Letter)} ); ok("\x[4DB6]" ~~ m/^.$/, q{Match unrelated externally inverted (Letter)} ); ok("\x[4DB6]" ~~ m/^<-isL>$/, q{Match unrelated internally inverted (Letter)} ); ok("\x[4DB6]\x[45CD]" ~~ m/<+isL>/, q{Match unanchored (Letter)} ); ok("\c[HANGUL LETTER SIOS-PIEUP]" ~~ m/^<+isLetter>$/, q{Match } ); ok("\c[HANGUL LETTER SIOS-PIEUP]" ~~ m/^<[A]+isLetter>$/, q{Match compound } ); ok(!( "\c[HANGUL LETTER SIOS-PIEUP]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[HANGUL LETTER SIOS-PIEUP]" ~~ m/^<[A]-isLetter>$/ ), q{Don't match compound inverted } ); ok(!( "\c[HANGUL LETTER SIOS-PIEUP]" ~~ m/^<-isLetter>$/ ), q{Don't match internally inverted } ); ok(!( "\x[318F]" ~~ m/^<+isLetter>$/ ), q{Don't match unrelated } ); ok("\x[318F]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[318F]" ~~ m/^<-isLetter>$/, q{Match unrelated internally inverted } ); ok("\x[318F]\c[HANGUL LETTER SIOS-PIEUP]" ~~ m/<+isLetter>/, q{Match unanchored } ); # Lu UppercaseLetter ok("\c[LATIN CAPITAL LETTER A]" ~~ m/^<+isLu>$/, q{Match (UppercaseLetter)} ); ok("\c[LATIN CAPITAL LETTER A]" ~~ m/^<[A]+isLu>$/, q{Match compound (UppercaseLetter)} ); ok(!( "\c[LATIN CAPITAL LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted (UppercaseLetter)} ); ok(!( "\c[LATIN CAPITAL LETTER A]" ~~ m/^<[A]-isLu>$/ ), q{Don't match compound inverted (UppercaseLetter)} ); ok(!( "\c[LATIN CAPITAL LETTER A]" ~~ m/^<-isLu>$/ ), q{Don't match internally inverted (UppercaseLetter)} ); ok(!( "\x[5E52]" ~~ m/^<+isLu>$/ ), q{Don't match unrelated (UppercaseLetter)} ); ok("\x[5E52]" ~~ m/^.$/, q{Match unrelated externally inverted (UppercaseLetter)} ); ok("\x[5E52]" ~~ m/^<-isLu>$/, q{Match unrelated internally inverted (UppercaseLetter)} ); ok(!( "\x[5E52]" ~~ m/^<+isLu>$/ ), q{Don't match related (UppercaseLetter)} ); ok("\x[5E52]" ~~ m/^<-isLu>$/, q{Match related internally inverted (UppercaseLetter)} ); ok("\x[5E52]" ~~ m/^.$/, q{Match related externally inverted (UppercaseLetter)} ); ok("\x[5E52]\x[5E52]\c[LATIN CAPITAL LETTER A]" ~~ m/<+isLu>/, q{Match unanchored (UppercaseLetter)} ); ok("\c[LATIN CAPITAL LETTER A WITH RING BELOW]" ~~ m/^<+isUppercaseLetter>$/, q{Match } ); ok("\c[LATIN CAPITAL LETTER A WITH RING BELOW]" ~~ m/^<[A]+isUppercaseLetter>$/, q{Match compound } ); ok(!( "\c[LATIN CAPITAL LETTER A WITH RING BELOW]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LATIN CAPITAL LETTER A WITH RING BELOW]" ~~ m/^<[A]-isUppercaseLetter>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LATIN CAPITAL LETTER A WITH RING BELOW]" ~~ m/^<-isUppercaseLetter>$/ ), q{Don't match internally inverted } ); ok(!( "\x[1DB9]" ~~ m/^<+isUppercaseLetter>$/ ), q{Don't match unrelated } ); ok("\x[1DB9]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[1DB9]" ~~ m/^<-isUppercaseLetter>$/, q{Match unrelated internally inverted } ); ok("\x[1DB9]\c[LATIN CAPITAL LETTER A WITH RING BELOW]" ~~ m/<+isUppercaseLetter>/, q{Match unanchored } ); # Ll LowercaseLetter ok("\c[LATIN SMALL LETTER A]" ~~ m/^<+isLl>$/, q{Match (LowercaseLetter)} ); ok("\c[LATIN SMALL LETTER A]" ~~ m/^<[A]+isLl>$/, q{Match compound (LowercaseLetter)} ); ok(!( "\c[LATIN SMALL LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted (LowercaseLetter)} ); ok(!( "\c[LATIN SMALL LETTER A]" ~~ m/^<[A]-isLl>$/ ), q{Don't match compound inverted (LowercaseLetter)} ); ok(!( "\c[LATIN SMALL LETTER A]" ~~ m/^<-isLl>$/ ), q{Don't match internally inverted (LowercaseLetter)} ); ok(!( "\x[83AD]" ~~ m/^<+isLl>$/ ), q{Don't match unrelated (LowercaseLetter)} ); ok("\x[83AD]" ~~ m/^.$/, q{Match unrelated externally inverted (LowercaseLetter)} ); ok("\x[83AD]" ~~ m/^<-isLl>$/, q{Match unrelated internally inverted (LowercaseLetter)} ); ok(!( "\x[83AD]" ~~ m/^<+isLl>$/ ), q{Don't match related (LowercaseLetter)} ); ok("\x[83AD]" ~~ m/^<-isLl>$/, q{Match related internally inverted (LowercaseLetter)} ); ok("\x[83AD]" ~~ m/^.$/, q{Match related externally inverted (LowercaseLetter)} ); ok("\x[83AD]\x[83AD]\c[LATIN SMALL LETTER A]" ~~ m/<+isLl>/, q{Match unanchored (LowercaseLetter)} ); ok("\c[LATIN SMALL LETTER A]" ~~ m/^<+isLowercaseLetter>$/, q{Match } ); ok("\c[LATIN SMALL LETTER A]" ~~ m/^<[A]+isLowercaseLetter>$/, q{Match compound } ); ok(!( "\c[LATIN SMALL LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LATIN SMALL LETTER A]" ~~ m/^<[A]-isLowercaseLetter>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LATIN SMALL LETTER A]" ~~ m/^<-isLowercaseLetter>$/ ), q{Don't match internally inverted } ); ok(!( "\x[A9A8]" ~~ m/^<+isLowercaseLetter>$/ ), q{Don't match unrelated } ); ok("\x[A9A8]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[A9A8]" ~~ m/^<-isLowercaseLetter>$/, q{Match unrelated internally inverted } ); ok(!( "\x[AC00]" ~~ m/^<+isLowercaseLetter>$/ ), q{Don't match related } ); ok("\x[AC00]" ~~ m/^<-isLowercaseLetter>$/, q{Match related internally inverted } ); ok("\x[AC00]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[A9A8]\x[AC00]\c[LATIN SMALL LETTER A]" ~~ m/<+isLowercaseLetter>/, q{Match unanchored } ); # Lt TitlecaseLetter ok("\c[LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]" ~~ m/^<+isLt>$/, q{Match (TitlecaseLetter)} ); ok("\c[LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]" ~~ m/^<[A]+isLt>$/, q{Match compound (TitlecaseLetter)} ); ok(!( "\c[LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]" ~~ m/^.$/ ), q{Don't match externally inverted (TitlecaseLetter)} ); ok(!( "\c[LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]" ~~ m/^<[A]-isLt>$/ ), q{Don't match compound inverted (TitlecaseLetter)} ); ok(!( "\c[LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]" ~~ m/^<-isLt>$/ ), q{Don't match internally inverted (TitlecaseLetter)} ); ok(!( "\x[D187]" ~~ m/^<+isLt>$/ ), q{Don't match unrelated (TitlecaseLetter)} ); ok("\x[D187]" ~~ m/^.$/, q{Match unrelated externally inverted (TitlecaseLetter)} ); ok("\x[D187]" ~~ m/^<-isLt>$/, q{Match unrelated internally inverted (TitlecaseLetter)} ); ok(!( "\x[D187]" ~~ m/^<+isLt>$/ ), q{Don't match related (TitlecaseLetter)} ); ok("\x[D187]" ~~ m/^<-isLt>$/, q{Match related internally inverted (TitlecaseLetter)} ); ok("\x[D187]" ~~ m/^.$/, q{Match related externally inverted (TitlecaseLetter)} ); ok("\x[D187]\x[D187]\c[LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]" ~~ m/<+isLt>/, q{Match unanchored (TitlecaseLetter)} ); ok("\c[LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]" ~~ m/^<+isTitlecaseLetter>$/, q{Match } ); ok("\c[LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]" ~~ m/^<[A]+isTitlecaseLetter>$/, q{Match compound } ); ok(!( "\c[LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]" ~~ m/^<[A]-isTitlecaseLetter>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]" ~~ m/^<-isTitlecaseLetter>$/ ), q{Don't match internally inverted } ); ok(!( "\x[C2A9]" ~~ m/^<+isTitlecaseLetter>$/ ), q{Don't match unrelated } ); ok("\x[C2A9]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[C2A9]" ~~ m/^<-isTitlecaseLetter>$/, q{Match unrelated internally inverted } ); ok("\x[C2A9]\c[LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]" ~~ m/<+isTitlecaseLetter>/, q{Match unanchored } ); # Lm ModifierLetter ok("\c[MODIFIER LETTER SMALL H]" ~~ m/^<+isLm>$/, q{Match (ModifierLetter)} ); ok("\c[MODIFIER LETTER SMALL H]" ~~ m/^<[A]+isLm>$/, q{Match compound (ModifierLetter)} ); ok(!( "\c[MODIFIER LETTER SMALL H]" ~~ m/^.$/ ), q{Don't match externally inverted (ModifierLetter)} ); ok(!( "\c[MODIFIER LETTER SMALL H]" ~~ m/^<[A]-isLm>$/ ), q{Don't match compound inverted (ModifierLetter)} ); ok(!( "\c[MODIFIER LETTER SMALL H]" ~~ m/^<-isLm>$/ ), q{Don't match internally inverted (ModifierLetter)} ); ok(!( "\x[8C34]" ~~ m/^<+isLm>$/ ), q{Don't match unrelated (ModifierLetter)} ); ok("\x[8C34]" ~~ m/^.$/, q{Match unrelated externally inverted (ModifierLetter)} ); ok("\x[8C34]" ~~ m/^<-isLm>$/, q{Match unrelated internally inverted (ModifierLetter)} ); ok(!( "\x[8C34]" ~~ m/^<+isLm>$/ ), q{Don't match related (ModifierLetter)} ); ok("\x[8C34]" ~~ m/^<-isLm>$/, q{Match related internally inverted (ModifierLetter)} ); ok("\x[8C34]" ~~ m/^.$/, q{Match related externally inverted (ModifierLetter)} ); ok("\x[8C34]\x[8C34]\c[MODIFIER LETTER SMALL H]" ~~ m/<+isLm>/, q{Match unanchored (ModifierLetter)} ); ok("\c[MODIFIER LETTER SMALL H]" ~~ m/^<+isModifierLetter>$/, q{Match } ); ok("\c[MODIFIER LETTER SMALL H]" ~~ m/^<[A]+isModifierLetter>$/, q{Match compound } ); ok(!( "\c[MODIFIER LETTER SMALL H]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[MODIFIER LETTER SMALL H]" ~~ m/^<[A]-isModifierLetter>$/ ), q{Don't match compound inverted } ); ok(!( "\c[MODIFIER LETTER SMALL H]" ~~ m/^<-isModifierLetter>$/ ), q{Don't match internally inverted } ); ok(!( "\c[YI SYLLABLE NZAX]" ~~ m/^<+isModifierLetter>$/ ), q{Don't match unrelated } ); ok("\c[YI SYLLABLE NZAX]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[YI SYLLABLE NZAX]" ~~ m/^<-isModifierLetter>$/, q{Match unrelated internally inverted } ); ok("\c[YI SYLLABLE NZAX]\c[MODIFIER LETTER SMALL H]" ~~ m/<+isModifierLetter>/, q{Match unanchored } ); # Lo OtherLetter ok("\x[8CC9]" ~~ m/^<+isLo>$/, q{Match (OtherLetter)} ); ok("\x[8CC9]" ~~ m/^<[A]+isLo>$/, q{Match compound (OtherLetter)} ); ok(!( "\x[8CC9]" ~~ m/^.$/ ), q{Don't match externally inverted (OtherLetter)} ); ok(!( "\x[8CC9]" ~~ m/^<[A]-isLo>$/ ), q{Don't match compound inverted (OtherLetter)} ); ok(!( "\x[8CC9]" ~~ m/^<-isLo>$/ ), q{Don't match internally inverted (OtherLetter)} ); ok(!( "\x[9FA6]" ~~ m/^<+isLo>$/ ), q{Don't match unrelated (OtherLetter)} ); ok("\x[9FA6]" ~~ m/^.$/, q{Match unrelated externally inverted (OtherLetter)} ); ok("\x[9FA6]" ~~ m/^<-isLo>$/, q{Match unrelated internally inverted (OtherLetter)} ); ok(!( "\c[LATIN CAPITAL LETTER A]" ~~ m/^<+isLo>$/ ), q{Don't match related (OtherLetter)} ); ok("\c[LATIN CAPITAL LETTER A]" ~~ m/^<-isLo>$/, q{Match related internally inverted (OtherLetter)} ); ok("\c[LATIN CAPITAL LETTER A]" ~~ m/^.$/, q{Match related externally inverted (OtherLetter)} ); ok("\x[9FA6]\c[LATIN CAPITAL LETTER A]\x[8CC9]" ~~ m/<+isLo>/, q{Match unanchored (OtherLetter)} ); ok("\x[BC7D]" ~~ m/^<+isOtherLetter>$/, q{Match } ); ok("\x[BC7D]" ~~ m/^<[A]+isOtherLetter>$/, q{Match compound } ); ok(!( "\x[BC7D]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[BC7D]" ~~ m/^<[A]-isOtherLetter>$/ ), q{Don't match compound inverted } ); ok(!( "\x[BC7D]" ~~ m/^<-isOtherLetter>$/ ), q{Don't match internally inverted } ); ok(!( "\x[D7A4]" ~~ m/^<+isOtherLetter>$/ ), q{Don't match unrelated } ); ok("\x[D7A4]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[D7A4]" ~~ m/^<-isOtherLetter>$/, q{Match unrelated internally inverted } ); ok("\x[D7A4]\x[BC7D]" ~~ m/<+isOtherLetter>/, q{Match unanchored } ); # Lr # Alias for "Ll", "Lu", and "Lt". ok("\c[LATIN CAPITAL LETTER A]" ~~ m/^<+isLr>$/, q{Match (Alias for "Ll", "Lu", and "Lt".)} ); ok("\c[LATIN CAPITAL LETTER A]" ~~ m/^<[A]+isLr>$/, q{Match compound (Alias for "Ll", "Lu", and "Lt".)} ); ok(!( "\c[LATIN CAPITAL LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted (Alias for "Ll", "Lu", and "Lt".)} ); ok(!( "\c[LATIN CAPITAL LETTER A]" ~~ m/^<[A]-isLr>$/ ), q{Don't match compound inverted (Alias for "Ll", "Lu", and "Lt".)} ); ok(!( "\c[LATIN CAPITAL LETTER A]" ~~ m/^<-isLr>$/ ), q{Don't match internally inverted (Alias for "Ll", "Lu", and "Lt".)} ); ok(!( "\x[CD29]" ~~ m/^<+isLr>$/ ), 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/^<-isLr>$/, q{Match unrelated internally inverted (Alias for "Ll", "Lu", and "Lt".)} ); ok(!( "\x[CD29]" ~~ m/^<+isLr>$/ ), q{Don't match related (Alias for "Ll", "Lu", and "Lt".)} ); ok("\x[CD29]" ~~ m/^<-isLr>$/, 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]\c[LATIN CAPITAL LETTER A]" ~~ m/<+isLr>/, q{Match unanchored (Alias for "Ll", "Lu", and "Lt".)} ); # M Mark ok("\c[TAGALOG VOWEL SIGN I]" ~~ m/^<+isM>$/, q{Match (Mark)} ); ok("\c[TAGALOG VOWEL SIGN I]" ~~ m/^<[A]+isM>$/, q{Match compound (Mark)} ); ok(!( "\c[TAGALOG VOWEL SIGN I]" ~~ m/^.$/ ), q{Don't match externally inverted (Mark)} ); ok(!( "\c[TAGALOG VOWEL SIGN I]" ~~ m/^<[A]-isM>$/ ), q{Don't match compound inverted (Mark)} ); ok(!( "\c[TAGALOG VOWEL SIGN I]" ~~ m/^<-isM>$/ ), q{Don't match internally inverted (Mark)} ); ok(!( "\c[CANADIAN SYLLABICS KAAI]" ~~ m/^<+isM>$/ ), q{Don't match unrelated (Mark)} ); ok("\c[CANADIAN SYLLABICS KAAI]" ~~ m/^.$/, q{Match unrelated externally inverted (Mark)} ); ok("\c[CANADIAN SYLLABICS KAAI]" ~~ m/^<-isM>$/, q{Match unrelated internally inverted (Mark)} ); ok("\c[CANADIAN SYLLABICS KAAI]\c[TAGALOG VOWEL SIGN I]" ~~ m/<+isM>/, q{Match unanchored (Mark)} ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^<+isMark>$/, q{Match } ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^<[A]+isMark>$/, q{Match compound } ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^<[A]-isMark>$/ ), q{Don't match compound inverted } ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^<-isMark>$/ ), q{Don't match internally inverted } ); ok(!( "\x[4BF0]" ~~ m/^<+isMark>$/ ), q{Don't match unrelated } ); ok("\x[4BF0]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[4BF0]" ~~ m/^<-isMark>$/, q{Match unrelated internally inverted } ); ok("\x[4BF0]\c[COMBINING GRAVE ACCENT]" ~~ m/<+isMark>/, q{Match unanchored } ); # Mn NonspacingMark ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^<+isMn>$/, q{Match (NonspacingMark)} ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^<[A]+isMn>$/, q{Match compound (NonspacingMark)} ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^.$/ ), q{Don't match externally inverted (NonspacingMark)} ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^<[A]-isMn>$/ ), q{Don't match compound inverted (NonspacingMark)} ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^<-isMn>$/ ), q{Don't match internally inverted (NonspacingMark)} ); ok(!( "\x[CF2C]" ~~ m/^<+isMn>$/ ), q{Don't match unrelated (NonspacingMark)} ); ok("\x[CF2C]" ~~ m/^.$/, q{Match unrelated externally inverted (NonspacingMark)} ); ok("\x[CF2C]" ~~ m/^<-isMn>$/, q{Match unrelated internally inverted (NonspacingMark)} ); ok(!( "\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/^<+isMn>$/ ), q{Don't match related (NonspacingMark)} ); ok("\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/^<-isMn>$/, q{Match related internally inverted (NonspacingMark)} ); ok("\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/^.$/, q{Match related externally inverted (NonspacingMark)} ); ok("\x[CF2C]\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]\c[COMBINING GRAVE ACCENT]" ~~ m/<+isMn>/, q{Match unanchored (NonspacingMark)} ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^<+isNonspacingMark>$/, q{Match } ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^<[A]+isNonspacingMark>$/, q{Match compound } ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^<[A]-isNonspacingMark>$/ ), q{Don't match compound inverted } ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^<-isNonspacingMark>$/ ), q{Don't match internally inverted } ); ok(!( "\x[B617]" ~~ m/^<+isNonspacingMark>$/ ), q{Don't match unrelated } ); ok("\x[B617]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[B617]" ~~ m/^<-isNonspacingMark>$/, q{Match unrelated internally inverted } ); ok("\x[B617]\c[COMBINING GRAVE ACCENT]" ~~ m/<+isNonspacingMark>/, q{Match unanchored } ); # Mc SpacingMark ok("\c[DEVANAGARI SIGN VISARGA]" ~~ m/^<+isMc>$/, q{Match (SpacingMark)} ); ok("\c[DEVANAGARI SIGN VISARGA]" ~~ m/^<[A]+isMc>$/, q{Match compound (SpacingMark)} ); ok(!( "\c[DEVANAGARI SIGN VISARGA]" ~~ m/^.$/ ), q{Don't match externally inverted (SpacingMark)} ); ok(!( "\c[DEVANAGARI SIGN VISARGA]" ~~ m/^<[A]-isMc>$/ ), q{Don't match compound inverted (SpacingMark)} ); ok(!( "\c[DEVANAGARI SIGN VISARGA]" ~~ m/^<-isMc>$/ ), q{Don't match internally inverted (SpacingMark)} ); ok(!( "\c[BALLOT BOX WITH CHECK]" ~~ m/^<+isMc>$/ ), q{Don't match unrelated (SpacingMark)} ); ok("\c[BALLOT BOX WITH CHECK]" ~~ m/^.$/, q{Match unrelated externally inverted (SpacingMark)} ); ok("\c[BALLOT BOX WITH CHECK]" ~~ m/^<-isMc>$/, q{Match unrelated internally inverted (SpacingMark)} ); ok(!( "\c[IDEOGRAPHIC LEVEL TONE MARK]" ~~ m/^<+isMc>$/ ), q{Don't match related (SpacingMark)} ); ok("\c[IDEOGRAPHIC LEVEL TONE MARK]" ~~ m/^<-isMc>$/, q{Match related internally inverted (SpacingMark)} ); ok("\c[IDEOGRAPHIC LEVEL TONE MARK]" ~~ m/^.$/, q{Match related externally inverted (SpacingMark)} ); ok("\c[BALLOT BOX WITH CHECK]\c[IDEOGRAPHIC LEVEL TONE MARK]\c[DEVANAGARI SIGN VISARGA]" ~~ m/<+isMc>/, q{Match unanchored (SpacingMark)} ); ok("\c[MALAYALAM SIGN ANUSVARA]" ~~ m/^<+isSpacingMark>$/, q{Match } ); ok("\c[MALAYALAM SIGN ANUSVARA]" ~~ m/^<[A]+isSpacingMark>$/, q{Match compound } ); ok(!( "\c[MALAYALAM SIGN ANUSVARA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[MALAYALAM SIGN ANUSVARA]" ~~ m/^<[A]-isSpacingMark>$/ ), q{Don't match compound inverted } ); ok(!( "\c[MALAYALAM SIGN ANUSVARA]" ~~ m/^<-isSpacingMark>$/ ), q{Don't match internally inverted } ); ok(!( "\c[KANNADA LETTER VOCALIC LL]" ~~ m/^<+isSpacingMark>$/ ), q{Don't match unrelated } ); ok("\c[KANNADA LETTER VOCALIC LL]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[KANNADA LETTER VOCALIC LL]" ~~ m/^<-isSpacingMark>$/, q{Match unrelated internally inverted } ); ok("\c[KANNADA LETTER VOCALIC LL]\c[MALAYALAM SIGN ANUSVARA]" ~~ m/<+isSpacingMark>/, q{Match unanchored } ); # Me EnclosingMark ok("\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/^<+isMe>$/, q{Match (EnclosingMark)} ); ok("\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/^<[A]+isMe>$/, q{Match compound (EnclosingMark)} ); ok(!( "\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/^.$/ ), q{Don't match externally inverted (EnclosingMark)} ); ok(!( "\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/^<[A]-isMe>$/ ), q{Don't match compound inverted (EnclosingMark)} ); ok(!( "\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/^<-isMe>$/ ), q{Don't match internally inverted (EnclosingMark)} ); ok(!( "\x[C680]" ~~ m/^<+isMe>$/ ), q{Don't match unrelated (EnclosingMark)} ); ok("\x[C680]" ~~ m/^.$/, q{Match unrelated externally inverted (EnclosingMark)} ); ok("\x[C680]" ~~ m/^<-isMe>$/, q{Match unrelated internally inverted (EnclosingMark)} ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^<+isMe>$/ ), q{Don't match related (EnclosingMark)} ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^<-isMe>$/, q{Match related internally inverted (EnclosingMark)} ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^.$/, q{Match related externally inverted (EnclosingMark)} ); ok("\x[C680]\c[COMBINING GRAVE ACCENT]\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/<+isMe>/, q{Match unanchored (EnclosingMark)} ); ok("\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/^<+isEnclosingMark>$/, q{Match } ); ok("\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/^<[A]+isEnclosingMark>$/, q{Match compound } ); ok(!( "\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/^<[A]-isEnclosingMark>$/ ), q{Don't match compound inverted } ); ok(!( "\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/^<-isEnclosingMark>$/ ), q{Don't match internally inverted } ); ok(!( "\x[911E]" ~~ m/^<+isEnclosingMark>$/ ), q{Don't match unrelated } ); ok("\x[911E]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[911E]" ~~ m/^<-isEnclosingMark>$/, q{Match unrelated internally inverted } ); ok("\x[911E]\c[COMBINING CYRILLIC HUNDRED THOUSANDS SIGN]" ~~ m/<+isEnclosingMark>/, q{Match unanchored } ); # N Number ok("\c[DIGIT ZERO]" ~~ m/^<+isN>$/, q{Match (Number)} ); ok("\c[DIGIT ZERO]" ~~ m/^<[A]+isN>$/, q{Match compound (Number)} ); ok(!( "\c[DIGIT ZERO]" ~~ m/^.$/ ), q{Don't match externally inverted (Number)} ); ok(!( "\c[DIGIT ZERO]" ~~ m/^<[A]-isN>$/ ), q{Don't match compound inverted (Number)} ); ok(!( "\c[DIGIT ZERO]" ~~ m/^<-isN>$/ ), q{Don't match internally inverted (Number)} ); ok(!( "\x[3BA3]" ~~ m/^<+isN>$/ ), q{Don't match unrelated (Number)} ); ok("\x[3BA3]" ~~ m/^.$/, q{Match unrelated externally inverted (Number)} ); ok("\x[3BA3]" ~~ m/^<-isN>$/, q{Match unrelated internally inverted (Number)} ); ok("\x[3BA3]\c[DIGIT ZERO]" ~~ m/<+isN>/, q{Match unanchored (Number)} ); ok("\c[DIGIT ZERO]" ~~ m/^<+isNumber>$/, q{Match } ); ok("\c[DIGIT ZERO]" ~~ m/^<[A]+isNumber>$/, q{Match compound } ); ok(!( "\c[DIGIT ZERO]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[DIGIT ZERO]" ~~ m/^<[A]-isNumber>$/ ), q{Don't match compound inverted } ); ok(!( "\c[DIGIT ZERO]" ~~ m/^<-isNumber>$/ ), q{Don't match internally inverted } ); ok(!( "\x[37D0]" ~~ m/^<+isNumber>$/ ), q{Don't match unrelated } ); ok("\x[37D0]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[37D0]" ~~ m/^<-isNumber>$/, q{Match unrelated internally inverted } ); ok("\x[37D0]\c[DIGIT ZERO]" ~~ m/<+isNumber>/, q{Match unanchored } ); # Nd DecimalNumber ok("\c[DIGIT ZERO]" ~~ m/^<+isNd>$/, q{Match (DecimalNumber)} ); ok("\c[DIGIT ZERO]" ~~ m/^<[A]+isNd>$/, q{Match compound (DecimalNumber)} ); ok(!( "\c[DIGIT ZERO]" ~~ m/^.$/ ), q{Don't match externally inverted (DecimalNumber)} ); ok(!( "\c[DIGIT ZERO]" ~~ m/^<[A]-isNd>$/ ), q{Don't match compound inverted (DecimalNumber)} ); ok(!( "\c[DIGIT ZERO]" ~~ m/^<-isNd>$/ ), q{Don't match internally inverted (DecimalNumber)} ); ok(!( "\x[8536]" ~~ m/^<+isNd>$/ ), q{Don't match unrelated (DecimalNumber)} ); ok("\x[8536]" ~~ m/^.$/, q{Match unrelated externally inverted (DecimalNumber)} ); ok("\x[8536]" ~~ m/^<-isNd>$/, q{Match unrelated internally inverted (DecimalNumber)} ); ok(!( "\c[SUPERSCRIPT TWO]" ~~ m/^<+isNd>$/ ), q{Don't match related (DecimalNumber)} ); ok("\c[SUPERSCRIPT TWO]" ~~ m/^<-isNd>$/, q{Match related internally inverted (DecimalNumber)} ); ok("\c[SUPERSCRIPT TWO]" ~~ m/^.$/, q{Match related externally inverted (DecimalNumber)} ); ok("\x[8536]\c[SUPERSCRIPT TWO]\c[DIGIT ZERO]" ~~ m/<+isNd>/, q{Match unanchored (DecimalNumber)} ); ok("\c[KHMER DIGIT ZERO]" ~~ m/^<+isDecimalNumber>$/, q{Match } ); ok("\c[KHMER DIGIT ZERO]" ~~ m/^<[A]+isDecimalNumber>$/, q{Match compound } ); ok(!( "\c[KHMER DIGIT ZERO]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[KHMER DIGIT ZERO]" ~~ m/^<[A]-isDecimalNumber>$/ ), q{Don't match compound inverted } ); ok(!( "\c[KHMER DIGIT ZERO]" ~~ m/^<-isDecimalNumber>$/ ), q{Don't match internally inverted } ); ok(!( "\c[CANADIAN SYLLABICS NWE]" ~~ m/^<+isDecimalNumber>$/ ), q{Don't match unrelated } ); ok("\c[CANADIAN SYLLABICS NWE]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[CANADIAN SYLLABICS NWE]" ~~ m/^<-isDecimalNumber>$/, q{Match unrelated internally inverted } ); ok("\c[CANADIAN SYLLABICS NWE]\c[KHMER DIGIT ZERO]" ~~ m/<+isDecimalNumber>/, q{Match unanchored } ); # Nl LetterNumber ok("\c[ROMAN NUMERAL ONE]" ~~ m/^<+isNl>$/, q{Match (LetterNumber)} ); ok("\c[ROMAN NUMERAL ONE]" ~~ m/^<[A]+isNl>$/, q{Match compound (LetterNumber)} ); ok(!( "\c[ROMAN NUMERAL ONE]" ~~ m/^.$/ ), q{Don't match externally inverted (LetterNumber)} ); ok(!( "\c[ROMAN NUMERAL ONE]" ~~ m/^<[A]-isNl>$/ ), q{Don't match compound inverted (LetterNumber)} ); ok(!( "\c[ROMAN NUMERAL ONE]" ~~ m/^<-isNl>$/ ), q{Don't match internally inverted (LetterNumber)} ); ok(!( "\x[1B95]" ~~ m/^<+isNl>$/ ), q{Don't match unrelated (LetterNumber)} ); ok("\x[1B95]" ~~ m/^.$/, q{Match unrelated externally inverted (LetterNumber)} ); ok("\x[1B95]" ~~ m/^<-isNl>$/, q{Match unrelated internally inverted (LetterNumber)} ); ok(!( "\c[SUPERSCRIPT ZERO]" ~~ m/^<+isNl>$/ ), q{Don't match related (LetterNumber)} ); ok("\c[SUPERSCRIPT ZERO]" ~~ m/^<-isNl>$/, q{Match related internally inverted (LetterNumber)} ); ok("\c[SUPERSCRIPT ZERO]" ~~ m/^.$/, q{Match related externally inverted (LetterNumber)} ); ok("\x[1B95]\c[SUPERSCRIPT ZERO]\c[ROMAN NUMERAL ONE]" ~~ m/<+isNl>/, q{Match unanchored (LetterNumber)} ); ok("\c[RUNIC ARLAUG SYMBOL]" ~~ m/^<+isLetterNumber>$/, q{Match } ); ok("\c[RUNIC ARLAUG SYMBOL]" ~~ m/^<[A]+isLetterNumber>$/, q{Match compound } ); ok(!( "\c[RUNIC ARLAUG SYMBOL]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[RUNIC ARLAUG SYMBOL]" ~~ m/^<[A]-isLetterNumber>$/ ), q{Don't match compound inverted } ); ok(!( "\c[RUNIC ARLAUG SYMBOL]" ~~ m/^<-isLetterNumber>$/ ), q{Don't match internally inverted } ); ok(!( "\x[9B4F]" ~~ m/^<+isLetterNumber>$/ ), q{Don't match unrelated } ); ok("\x[9B4F]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[9B4F]" ~~ m/^<-isLetterNumber>$/, q{Match unrelated internally inverted } ); ok(!( "\x[9B4F]" ~~ m/^<+isLetterNumber>$/ ), q{Don't match related } ); ok("\x[9B4F]" ~~ m/^<-isLetterNumber>$/, q{Match related internally inverted } ); ok("\x[9B4F]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[9B4F]\x[9B4F]\c[RUNIC ARLAUG SYMBOL]" ~~ m/<+isLetterNumber>/, q{Match unanchored } ); # No OtherNumber ok("\c[SUPERSCRIPT TWO]" ~~ m/^<+isNo>$/, q{Match (OtherNumber)} ); ok("\c[SUPERSCRIPT TWO]" ~~ m/^<[A]+isNo>$/, q{Match compound (OtherNumber)} ); ok(!( "\c[SUPERSCRIPT TWO]" ~~ m/^.$/ ), q{Don't match externally inverted (OtherNumber)} ); ok(!( "\c[SUPERSCRIPT TWO]" ~~ m/^<[A]-isNo>$/ ), q{Don't match compound inverted (OtherNumber)} ); ok(!( "\c[SUPERSCRIPT TWO]" ~~ m/^<-isNo>$/ ), q{Don't match internally inverted (OtherNumber)} ); ok(!( "\x[8F9A]" ~~ m/^<+isNo>$/ ), q{Don't match unrelated (OtherNumber)} ); ok("\x[8F9A]" ~~ m/^.$/, q{Match unrelated externally inverted (OtherNumber)} ); ok("\x[8F9A]" ~~ m/^<-isNo>$/, q{Match unrelated internally inverted (OtherNumber)} ); ok(!( "\c[DIGIT ZERO]" ~~ m/^<+isNo>$/ ), q{Don't match related (OtherNumber)} ); ok("\c[DIGIT ZERO]" ~~ m/^<-isNo>$/, q{Match related internally inverted (OtherNumber)} ); ok("\c[DIGIT ZERO]" ~~ m/^.$/, q{Match related externally inverted (OtherNumber)} ); ok("\x[8F9A]\c[DIGIT ZERO]\c[SUPERSCRIPT TWO]" ~~ m/<+isNo>/, q{Match unanchored (OtherNumber)} ); ok("\c[BENGALI CURRENCY NUMERATOR ONE]" ~~ m/^<+isOtherNumber>$/, q{Match } ); ok("\c[BENGALI CURRENCY NUMERATOR ONE]" ~~ m/^<[A]+isOtherNumber>$/, q{Match compound } ); ok(!( "\c[BENGALI CURRENCY NUMERATOR ONE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[BENGALI CURRENCY NUMERATOR ONE]" ~~ m/^<[A]-isOtherNumber>$/ ), q{Don't match compound inverted } ); ok(!( "\c[BENGALI CURRENCY NUMERATOR ONE]" ~~ m/^<-isOtherNumber>$/ ), q{Don't match internally inverted } ); ok(!( "\x[0522]" ~~ m/^<+isOtherNumber>$/ ), q{Don't match unrelated } ); ok("\x[0522]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[0522]" ~~ m/^<-isOtherNumber>$/, q{Match unrelated internally inverted } ); ok("\x[0522]\c[BENGALI CURRENCY NUMERATOR ONE]" ~~ m/<+isOtherNumber>/, q{Match unanchored } ); # P Punctuation ok("\c[EXCLAMATION MARK]" ~~ m/^<+isP>$/, q{Match (Punctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^<[A]+isP>$/, q{Match compound (Punctuation)} ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^.$/ ), q{Don't match externally inverted (Punctuation)} ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<[A]-isP>$/ ), q{Don't match compound inverted (Punctuation)} ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<-isP>$/ ), q{Don't match internally inverted (Punctuation)} ); ok(!( "\x[3753]" ~~ m/^<+isP>$/ ), q{Don't match unrelated (Punctuation)} ); ok("\x[3753]" ~~ m/^.$/, q{Match unrelated externally inverted (Punctuation)} ); ok("\x[3753]" ~~ m/^<-isP>$/, q{Match unrelated internally inverted (Punctuation)} ); ok("\x[3753]\c[EXCLAMATION MARK]" ~~ m/<+isP>/, q{Match unanchored (Punctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^<+isPunctuation>$/, q{Match } ); ok("\c[EXCLAMATION MARK]" ~~ m/^<[A]+isPunctuation>$/, q{Match compound } ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<[A]-isPunctuation>$/ ), q{Don't match compound inverted } ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<-isPunctuation>$/ ), q{Don't match internally inverted } ); ok(!( "\x[9C5E]" ~~ m/^<+isPunctuation>$/ ), q{Don't match unrelated } ); ok("\x[9C5E]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[9C5E]" ~~ m/^<-isPunctuation>$/, q{Match unrelated internally inverted } ); ok("\x[9C5E]\c[EXCLAMATION MARK]" ~~ m/<+isPunctuation>/, q{Match unanchored } ); # Pc ConnectorPunctuation ok("\c[LOW LINE]" ~~ m/^<+isPc>$/, q{Match (ConnectorPunctuation)} ); ok("\c[LOW LINE]" ~~ m/^<[A]+isPc>$/, q{Match compound (ConnectorPunctuation)} ); ok(!( "\c[LOW LINE]" ~~ m/^.$/ ), q{Don't match externally inverted (ConnectorPunctuation)} ); ok(!( "\c[LOW LINE]" ~~ m/^<[A]-isPc>$/ ), q{Don't match compound inverted (ConnectorPunctuation)} ); ok(!( "\c[LOW LINE]" ~~ m/^<-isPc>$/ ), q{Don't match internally inverted (ConnectorPunctuation)} ); ok(!( "\x[B2C9]" ~~ m/^<+isPc>$/ ), q{Don't match unrelated (ConnectorPunctuation)} ); ok("\x[B2C9]" ~~ m/^.$/, q{Match unrelated externally inverted (ConnectorPunctuation)} ); ok("\x[B2C9]" ~~ m/^<-isPc>$/, q{Match unrelated internally inverted (ConnectorPunctuation)} ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<+isPc>$/ ), q{Don't match related (ConnectorPunctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^<-isPc>$/, q{Match related internally inverted (ConnectorPunctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^.$/, q{Match related externally inverted (ConnectorPunctuation)} ); ok("\x[B2C9]\c[EXCLAMATION MARK]\c[LOW LINE]" ~~ m/<+isPc>/, q{Match unanchored (ConnectorPunctuation)} ); ok("\c[LOW LINE]" ~~ m/^<+isConnectorPunctuation>$/, q{Match } ); ok("\c[LOW LINE]" ~~ m/^<[A]+isConnectorPunctuation>$/, q{Match compound } ); ok(!( "\c[LOW LINE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LOW LINE]" ~~ m/^<[A]-isConnectorPunctuation>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LOW LINE]" ~~ m/^<-isConnectorPunctuation>$/ ), q{Don't match internally inverted } ); ok(!( "\x[AEFC]" ~~ m/^<+isConnectorPunctuation>$/ ), q{Don't match unrelated } ); ok("\x[AEFC]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[AEFC]" ~~ m/^<-isConnectorPunctuation>$/, q{Match unrelated internally inverted } ); ok("\x[AEFC]\c[LOW LINE]" ~~ m/<+isConnectorPunctuation>/, q{Match unanchored } ); # Pd DashPunctuation ok("\c[HYPHEN-MINUS]" ~~ m/^<+isPd>$/, q{Match (DashPunctuation)} ); ok("\c[HYPHEN-MINUS]" ~~ m/^<[A]+isPd>$/, q{Match compound (DashPunctuation)} ); ok(!( "\c[HYPHEN-MINUS]" ~~ m/^.$/ ), q{Don't match externally inverted (DashPunctuation)} ); ok(!( "\c[HYPHEN-MINUS]" ~~ m/^<[A]-isPd>$/ ), q{Don't match compound inverted (DashPunctuation)} ); ok(!( "\c[HYPHEN-MINUS]" ~~ m/^<-isPd>$/ ), q{Don't match internally inverted (DashPunctuation)} ); ok(!( "\x[86C8]" ~~ m/^<+isPd>$/ ), q{Don't match unrelated (DashPunctuation)} ); ok("\x[86C8]" ~~ m/^.$/, q{Match unrelated externally inverted (DashPunctuation)} ); ok("\x[86C8]" ~~ m/^<-isPd>$/, q{Match unrelated internally inverted (DashPunctuation)} ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<+isPd>$/ ), q{Don't match related (DashPunctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^<-isPd>$/, q{Match related internally inverted (DashPunctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^.$/, q{Match related externally inverted (DashPunctuation)} ); ok("\x[86C8]\c[EXCLAMATION MARK]\c[HYPHEN-MINUS]" ~~ m/<+isPd>/, q{Match unanchored (DashPunctuation)} ); ok("\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/^<+isDashPunctuation>$/, q{Match } ); ok("\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/^<[A]+isDashPunctuation>$/, q{Match compound } ); ok(!( "\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/^<[A]-isDashPunctuation>$/ ), q{Don't match compound inverted } ); ok(!( "\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/^<-isDashPunctuation>$/ ), q{Don't match internally inverted } ); ok(!( "\c[HIRAGANA LETTER NI]" ~~ m/^<+isDashPunctuation>$/ ), q{Don't match unrelated } ); ok("\c[HIRAGANA LETTER NI]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[HIRAGANA LETTER NI]" ~~ m/^<-isDashPunctuation>$/, q{Match unrelated internally inverted } ); ok("\c[HIRAGANA LETTER NI]\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/<+isDashPunctuation>/, q{Match unanchored } ); # Ps OpenPunctuation ok("\c[LEFT PARENTHESIS]" ~~ m/^<+isPs>$/, q{Match (OpenPunctuation)} ); ok("\c[LEFT PARENTHESIS]" ~~ m/^<[A]+isPs>$/, q{Match compound (OpenPunctuation)} ); ok(!( "\c[LEFT PARENTHESIS]" ~~ m/^.$/ ), q{Don't match externally inverted (OpenPunctuation)} ); ok(!( "\c[LEFT PARENTHESIS]" ~~ m/^<[A]-isPs>$/ ), q{Don't match compound inverted (OpenPunctuation)} ); ok(!( "\c[LEFT PARENTHESIS]" ~~ m/^<-isPs>$/ ), q{Don't match internally inverted (OpenPunctuation)} ); ok(!( "\x[B601]" ~~ m/^<+isPs>$/ ), q{Don't match unrelated (OpenPunctuation)} ); ok("\x[B601]" ~~ m/^.$/, q{Match unrelated externally inverted (OpenPunctuation)} ); ok("\x[B601]" ~~ m/^<-isPs>$/, q{Match unrelated internally inverted (OpenPunctuation)} ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<+isPs>$/ ), q{Don't match related (OpenPunctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^<-isPs>$/, q{Match related internally inverted (OpenPunctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^.$/, q{Match related externally inverted (OpenPunctuation)} ); ok("\x[B601]\c[EXCLAMATION MARK]\c[LEFT PARENTHESIS]" ~~ m/<+isPs>/, q{Match unanchored (OpenPunctuation)} ); ok("\c[LEFT PARENTHESIS]" ~~ m/^<+isOpenPunctuation>$/, q{Match } ); ok("\c[LEFT PARENTHESIS]" ~~ m/^<[A]+isOpenPunctuation>$/, q{Match compound } ); ok(!( "\c[LEFT PARENTHESIS]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LEFT PARENTHESIS]" ~~ m/^<[A]-isOpenPunctuation>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LEFT PARENTHESIS]" ~~ m/^<-isOpenPunctuation>$/ ), q{Don't match internally inverted } ); ok(!( "\x[89C1]" ~~ m/^<+isOpenPunctuation>$/ ), q{Don't match unrelated } ); ok("\x[89C1]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[89C1]" ~~ m/^<-isOpenPunctuation>$/, q{Match unrelated internally inverted } ); ok("\x[89C1]\c[LEFT PARENTHESIS]" ~~ m/<+isOpenPunctuation>/, q{Match unanchored } ); # Pe ClosePunctuation ok("\c[RIGHT PARENTHESIS]" ~~ m/^<+isPe>$/, q{Match (ClosePunctuation)} ); ok("\c[RIGHT PARENTHESIS]" ~~ m/^<[A]+isPe>$/, q{Match compound (ClosePunctuation)} ); ok(!( "\c[RIGHT PARENTHESIS]" ~~ m/^.$/ ), q{Don't match externally inverted (ClosePunctuation)} ); ok(!( "\c[RIGHT PARENTHESIS]" ~~ m/^<[A]-isPe>$/ ), q{Don't match compound inverted (ClosePunctuation)} ); ok(!( "\c[RIGHT PARENTHESIS]" ~~ m/^<-isPe>$/ ), q{Don't match internally inverted (ClosePunctuation)} ); ok(!( "\x[5561]" ~~ m/^<+isPe>$/ ), q{Don't match unrelated (ClosePunctuation)} ); ok("\x[5561]" ~~ m/^.$/, q{Match unrelated externally inverted (ClosePunctuation)} ); ok("\x[5561]" ~~ m/^<-isPe>$/, q{Match unrelated internally inverted (ClosePunctuation)} ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<+isPe>$/ ), q{Don't match related (ClosePunctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^<-isPe>$/, q{Match related internally inverted (ClosePunctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^.$/, q{Match related externally inverted (ClosePunctuation)} ); ok("\x[5561]\c[EXCLAMATION MARK]\c[RIGHT PARENTHESIS]" ~~ m/<+isPe>/, q{Match unanchored (ClosePunctuation)} ); ok("\c[RIGHT PARENTHESIS]" ~~ m/^<+isClosePunctuation>$/, q{Match } ); ok("\c[RIGHT PARENTHESIS]" ~~ m/^<[A]+isClosePunctuation>$/, q{Match compound } ); ok(!( "\c[RIGHT PARENTHESIS]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[RIGHT PARENTHESIS]" ~~ m/^<[A]-isClosePunctuation>$/ ), q{Don't match compound inverted } ); ok(!( "\c[RIGHT PARENTHESIS]" ~~ m/^<-isClosePunctuation>$/ ), q{Don't match internally inverted } ); ok(!( "\x[98D0]" ~~ m/^<+isClosePunctuation>$/ ), q{Don't match unrelated } ); ok("\x[98D0]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[98D0]" ~~ m/^<-isClosePunctuation>$/, q{Match unrelated internally inverted } ); ok("\x[98D0]\c[RIGHT PARENTHESIS]" ~~ m/<+isClosePunctuation>/, q{Match unanchored } ); # Pi InitialPunctuation ok("\c[LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]" ~~ m/^<+isPi>$/, q{Match (InitialPunctuation)} ); ok("\c[LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]" ~~ m/^<[A]+isPi>$/, q{Match compound (InitialPunctuation)} ); ok(!( "\c[LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]" ~~ m/^.$/ ), q{Don't match externally inverted (InitialPunctuation)} ); ok(!( "\c[LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]" ~~ m/^<[A]-isPi>$/ ), q{Don't match compound inverted (InitialPunctuation)} ); ok(!( "\c[LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]" ~~ m/^<-isPi>$/ ), q{Don't match internally inverted (InitialPunctuation)} ); ok(!( "\x[D76F]" ~~ m/^<+isPi>$/ ), q{Don't match unrelated (InitialPunctuation)} ); ok("\x[D76F]" ~~ m/^.$/, q{Match unrelated externally inverted (InitialPunctuation)} ); ok("\x[D76F]" ~~ m/^<-isPi>$/, q{Match unrelated internally inverted (InitialPunctuation)} ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<+isPi>$/ ), q{Don't match related (InitialPunctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^<-isPi>$/, q{Match related internally inverted (InitialPunctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^.$/, q{Match related externally inverted (InitialPunctuation)} ); ok("\x[D76F]\c[EXCLAMATION MARK]\c[LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]" ~~ m/<+isPi>/, q{Match unanchored (InitialPunctuation)} ); ok("\c[LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]" ~~ m/^<+isInitialPunctuation>$/, q{Match } ); ok("\c[LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]" ~~ m/^<[A]+isInitialPunctuation>$/, q{Match compound } ); ok(!( "\c[LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]" ~~ m/^<[A]-isInitialPunctuation>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]" ~~ m/^<-isInitialPunctuation>$/ ), q{Don't match internally inverted } ); ok(!( "\x[C96E]" ~~ m/^<+isInitialPunctuation>$/ ), q{Don't match unrelated } ); ok("\x[C96E]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[C96E]" ~~ m/^<-isInitialPunctuation>$/, q{Match unrelated internally inverted } ); ok("\x[C96E]\c[LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]" ~~ m/<+isInitialPunctuation>/, q{Match unanchored } ); # Pf FinalPunctuation ok("\c[RIGHT SINGLE QUOTATION MARK]" ~~ m/^<+isPf>$/, q{Match (FinalPunctuation)} ); ok("\c[RIGHT SINGLE QUOTATION MARK]" ~~ m/^<[A]+isPf>$/, q{Match compound (FinalPunctuation)} ); ok(!( "\c[RIGHT SINGLE QUOTATION MARK]" ~~ m/^.$/ ), q{Don't match externally inverted (FinalPunctuation)} ); ok(!( "\c[RIGHT SINGLE QUOTATION MARK]" ~~ m/^<[A]-isPf>$/ ), q{Don't match compound inverted (FinalPunctuation)} ); ok(!( "\c[RIGHT SINGLE QUOTATION MARK]" ~~ m/^<-isPf>$/ ), q{Don't match internally inverted (FinalPunctuation)} ); ok(!( "\x[0515]" ~~ m/^<+isPf>$/ ), q{Don't match unrelated (FinalPunctuation)} ); ok("\x[0515]" ~~ m/^.$/, q{Match unrelated externally inverted (FinalPunctuation)} ); ok("\x[0515]" ~~ m/^<-isPf>$/, q{Match unrelated internally inverted (FinalPunctuation)} ); ok(!( "\c[ARMENIAN APOSTROPHE]" ~~ m/^<+isPf>$/ ), q{Don't match related (FinalPunctuation)} ); ok("\c[ARMENIAN APOSTROPHE]" ~~ m/^<-isPf>$/, q{Match related internally inverted (FinalPunctuation)} ); ok("\c[ARMENIAN APOSTROPHE]" ~~ m/^.$/, q{Match related externally inverted (FinalPunctuation)} ); ok("\x[0515]\c[ARMENIAN APOSTROPHE]\c[RIGHT SINGLE QUOTATION MARK]" ~~ m/<+isPf>/, q{Match unanchored (FinalPunctuation)} ); ok("\c[RIGHT SINGLE QUOTATION MARK]" ~~ m/^<+isFinalPunctuation>$/, q{Match } ); ok("\c[RIGHT SINGLE QUOTATION MARK]" ~~ m/^<[A]+isFinalPunctuation>$/, q{Match compound } ); ok(!( "\c[RIGHT SINGLE QUOTATION MARK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[RIGHT SINGLE QUOTATION MARK]" ~~ m/^<[A]-isFinalPunctuation>$/ ), q{Don't match compound inverted } ); ok(!( "\c[RIGHT SINGLE QUOTATION MARK]" ~~ m/^<-isFinalPunctuation>$/ ), q{Don't match internally inverted } ); ok(!( "\c[MODIFIER LETTER PRIME]" ~~ m/^<+isFinalPunctuation>$/ ), q{Don't match unrelated } ); ok("\c[MODIFIER LETTER PRIME]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[MODIFIER LETTER PRIME]" ~~ m/^<-isFinalPunctuation>$/, q{Match unrelated internally inverted } ); ok("\c[MODIFIER LETTER PRIME]\c[RIGHT SINGLE QUOTATION MARK]" ~~ m/<+isFinalPunctuation>/, q{Match unanchored } ); # Po OtherPunctuation ok("\c[EXCLAMATION MARK]" ~~ m/^<+isPo>$/, q{Match (OtherPunctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^<[A]+isPo>$/, q{Match compound (OtherPunctuation)} ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^.$/ ), q{Don't match externally inverted (OtherPunctuation)} ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<[A]-isPo>$/ ), q{Don't match compound inverted (OtherPunctuation)} ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<-isPo>$/ ), q{Don't match internally inverted (OtherPunctuation)} ); ok(!( "\x[A586]" ~~ m/^<+isPo>$/ ), q{Don't match unrelated (OtherPunctuation)} ); ok("\x[A586]" ~~ m/^.$/, q{Match unrelated externally inverted (OtherPunctuation)} ); ok("\x[A586]" ~~ m/^<-isPo>$/, q{Match unrelated internally inverted (OtherPunctuation)} ); ok(!( "\c[LEFT PARENTHESIS]" ~~ m/^<+isPo>$/ ), q{Don't match related (OtherPunctuation)} ); ok("\c[LEFT PARENTHESIS]" ~~ m/^<-isPo>$/, q{Match related internally inverted (OtherPunctuation)} ); ok("\c[LEFT PARENTHESIS]" ~~ m/^.$/, q{Match related externally inverted (OtherPunctuation)} ); ok("\x[A586]\c[LEFT PARENTHESIS]\c[EXCLAMATION MARK]" ~~ m/<+isPo>/, q{Match unanchored (OtherPunctuation)} ); ok("\c[EXCLAMATION MARK]" ~~ m/^<+isOtherPunctuation>$/, q{Match } ); ok("\c[EXCLAMATION MARK]" ~~ m/^<[A]+isOtherPunctuation>$/, q{Match compound } ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<[A]-isOtherPunctuation>$/ ), q{Don't match compound inverted } ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<-isOtherPunctuation>$/ ), q{Don't match internally inverted } ); ok(!( "\x[5FBD]" ~~ m/^<+isOtherPunctuation>$/ ), q{Don't match unrelated } ); ok("\x[5FBD]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[5FBD]" ~~ m/^<-isOtherPunctuation>$/, q{Match unrelated internally inverted } ); ok("\x[5FBD]\c[EXCLAMATION MARK]" ~~ m/<+isOtherPunctuation>/, q{Match unanchored } ); # S Symbol ok("\c[GUJARATI RUPEE SIGN]" ~~ m/^<+isS>$/, q{Match (Symbol)} ); ok("\c[GUJARATI RUPEE SIGN]" ~~ m/^<[A]+isS>$/, q{Match compound (Symbol)} ); ok(!( "\c[GUJARATI RUPEE SIGN]" ~~ m/^.$/ ), q{Don't match externally inverted (Symbol)} ); ok(!( "\c[GUJARATI RUPEE SIGN]" ~~ m/^<[A]-isS>$/ ), q{Don't match compound inverted (Symbol)} ); ok(!( "\c[GUJARATI RUPEE SIGN]" ~~ m/^<-isS>$/ ), q{Don't match internally inverted (Symbol)} ); ok(!( "\c[GURMUKHI SIGN ADAK BINDI]" ~~ m/^<+isS>$/ ), q{Don't match unrelated (Symbol)} ); ok("\c[GURMUKHI SIGN ADAK BINDI]" ~~ m/^.$/, q{Match unrelated externally inverted (Symbol)} ); ok("\c[GURMUKHI SIGN ADAK BINDI]" ~~ m/^<-isS>$/, q{Match unrelated internally inverted (Symbol)} ); ok("\c[GURMUKHI SIGN ADAK BINDI]\c[GUJARATI RUPEE SIGN]" ~~ m/<+isS>/, q{Match unanchored (Symbol)} ); ok("\c[LIMBU SIGN LOO]" ~~ m/^<+isSymbol>$/, q{Match } ); ok("\c[LIMBU SIGN LOO]" ~~ m/^<[A]+isSymbol>$/, q{Match compound } ); ok(!( "\c[LIMBU SIGN LOO]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LIMBU SIGN LOO]" ~~ m/^<[A]-isSymbol>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LIMBU SIGN LOO]" ~~ m/^<-isSymbol>$/ ), q{Don't match internally inverted } ); ok(!( "\x[192C]" ~~ m/^<+isSymbol>$/ ), q{Don't match unrelated } ); ok("\x[192C]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[192C]" ~~ m/^<-isSymbol>$/, q{Match unrelated internally inverted } ); ok("\x[192C]\c[LIMBU SIGN LOO]" ~~ m/<+isSymbol>/, q{Match unanchored } ); # Sm MathSymbol ok("\c[PLUS SIGN]" ~~ m/^<+isSm>$/, q{Match (MathSymbol)} ); ok("\c[PLUS SIGN]" ~~ m/^<[A]+isSm>$/, q{Match compound (MathSymbol)} ); ok(!( "\c[PLUS SIGN]" ~~ m/^.$/ ), q{Don't match externally inverted (MathSymbol)} ); ok(!( "\c[PLUS SIGN]" ~~ m/^<[A]-isSm>$/ ), q{Don't match compound inverted (MathSymbol)} ); ok(!( "\c[PLUS SIGN]" ~~ m/^<-isSm>$/ ), q{Don't match internally inverted (MathSymbol)} ); ok(!( "\x[769B]" ~~ m/^<+isSm>$/ ), q{Don't match unrelated (MathSymbol)} ); ok("\x[769B]" ~~ m/^.$/, q{Match unrelated externally inverted (MathSymbol)} ); ok("\x[769B]" ~~ m/^<-isSm>$/, q{Match unrelated internally inverted (MathSymbol)} ); ok(!( "\c[YI RADICAL QOT]" ~~ m/^<+isSm>$/ ), q{Don't match related (MathSymbol)} ); ok("\c[YI RADICAL QOT]" ~~ m/^<-isSm>$/, q{Match related internally inverted (MathSymbol)} ); ok("\c[YI RADICAL QOT]" ~~ m/^.$/, q{Match related externally inverted (MathSymbol)} ); ok("\x[769B]\c[YI RADICAL QOT]\c[PLUS SIGN]" ~~ m/<+isSm>/, q{Match unanchored (MathSymbol)} ); ok("\c[FRACTION SLASH]" ~~ m/^<+isMathSymbol>$/, q{Match } ); ok("\c[FRACTION SLASH]" ~~ m/^<[A]+isMathSymbol>$/, q{Match compound } ); ok(!( "\c[FRACTION SLASH]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[FRACTION SLASH]" ~~ m/^<[A]-isMathSymbol>$/ ), q{Don't match compound inverted } ); ok(!( "\c[FRACTION SLASH]" ~~ m/^<-isMathSymbol>$/ ), q{Don't match internally inverted } ); ok(!( "\c[GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI]" ~~ m/^<+isMathSymbol>$/ ), q{Don't match unrelated } ); ok("\c[GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI]" ~~ m/^<-isMathSymbol>$/, q{Match unrelated internally inverted } ); ok(!( "\c[COMBINING LEFT HARPOON ABOVE]" ~~ m/^<+isMathSymbol>$/ ), q{Don't match related } ); ok("\c[COMBINING LEFT HARPOON ABOVE]" ~~ m/^<-isMathSymbol>$/, q{Match related internally inverted } ); ok("\c[COMBINING LEFT HARPOON ABOVE]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\c[GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI]\c[COMBINING LEFT HARPOON ABOVE]\c[FRACTION SLASH]" ~~ m/<+isMathSymbol>/, q{Match unanchored } ); # Sc CurrencySymbol ok("\c[DOLLAR SIGN]" ~~ m/^<+isSc>$/, q{Match (CurrencySymbol)} ); ok("\c[DOLLAR SIGN]" ~~ m/^<[A]+isSc>$/, q{Match compound (CurrencySymbol)} ); ok(!( "\c[DOLLAR SIGN]" ~~ m/^.$/ ), q{Don't match externally inverted (CurrencySymbol)} ); ok(!( "\c[DOLLAR SIGN]" ~~ m/^<[A]-isSc>$/ ), q{Don't match compound inverted (CurrencySymbol)} ); ok(!( "\c[DOLLAR SIGN]" ~~ m/^<-isSc>$/ ), q{Don't match internally inverted (CurrencySymbol)} ); ok(!( "\x[B6B4]" ~~ m/^<+isSc>$/ ), q{Don't match unrelated (CurrencySymbol)} ); ok("\x[B6B4]" ~~ m/^.$/, q{Match unrelated externally inverted (CurrencySymbol)} ); ok("\x[B6B4]" ~~ m/^<-isSc>$/, q{Match unrelated internally inverted (CurrencySymbol)} ); ok(!( "\c[PLUS SIGN]" ~~ m/^<+isSc>$/ ), q{Don't match related (CurrencySymbol)} ); ok("\c[PLUS SIGN]" ~~ m/^<-isSc>$/, q{Match related internally inverted (CurrencySymbol)} ); ok("\c[PLUS SIGN]" ~~ m/^.$/, q{Match related externally inverted (CurrencySymbol)} ); ok("\x[B6B4]\c[PLUS SIGN]\c[DOLLAR SIGN]" ~~ m/<+isSc>/, q{Match unanchored (CurrencySymbol)} ); ok("\c[EURO-CURRENCY SIGN]" ~~ m/^<+isCurrencySymbol>$/, q{Match } ); ok("\c[EURO-CURRENCY SIGN]" ~~ m/^<[A]+isCurrencySymbol>$/, q{Match compound } ); ok(!( "\c[EURO-CURRENCY SIGN]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[EURO-CURRENCY SIGN]" ~~ m/^<[A]-isCurrencySymbol>$/ ), q{Don't match compound inverted } ); ok(!( "\c[EURO-CURRENCY SIGN]" ~~ m/^<-isCurrencySymbol>$/ ), q{Don't match internally inverted } ); ok(!( "\x[1CD3]" ~~ m/^<+isCurrencySymbol>$/ ), q{Don't match unrelated } ); ok("\x[1CD3]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[1CD3]" ~~ m/^<-isCurrencySymbol>$/, q{Match unrelated internally inverted } ); ok("\x[1CD3]\c[EURO-CURRENCY SIGN]" ~~ m/<+isCurrencySymbol>/, q{Match unanchored } ); # Sk ModifierSymbol ok("\c[CIRCUMFLEX ACCENT]" ~~ m/^<+isSk>$/, q{Match (ModifierSymbol)} ); ok("\c[CIRCUMFLEX ACCENT]" ~~ m/^<[A]+isSk>$/, q{Match compound (ModifierSymbol)} ); ok(!( "\c[CIRCUMFLEX ACCENT]" ~~ m/^.$/ ), q{Don't match externally inverted (ModifierSymbol)} ); ok(!( "\c[CIRCUMFLEX ACCENT]" ~~ m/^<[A]-isSk>$/ ), q{Don't match compound inverted (ModifierSymbol)} ); ok(!( "\c[CIRCUMFLEX ACCENT]" ~~ m/^<-isSk>$/ ), q{Don't match internally inverted (ModifierSymbol)} ); ok(!( "\x[68FA]" ~~ m/^<+isSk>$/ ), q{Don't match unrelated (ModifierSymbol)} ); ok("\x[68FA]" ~~ m/^.$/, q{Match unrelated externally inverted (ModifierSymbol)} ); ok("\x[68FA]" ~~ m/^<-isSk>$/, q{Match unrelated internally inverted (ModifierSymbol)} ); ok(!( "\c[YI RADICAL QOT]" ~~ m/^<+isSk>$/ ), q{Don't match related (ModifierSymbol)} ); ok("\c[YI RADICAL QOT]" ~~ m/^<-isSk>$/, q{Match related internally inverted (ModifierSymbol)} ); ok("\c[YI RADICAL QOT]" ~~ m/^.$/, q{Match related externally inverted (ModifierSymbol)} ); ok("\x[68FA]\c[YI RADICAL QOT]\c[CIRCUMFLEX ACCENT]" ~~ m/<+isSk>/, q{Match unanchored (ModifierSymbol)} ); ok("\c[CIRCUMFLEX ACCENT]" ~~ m/^<+isModifierSymbol>$/, q{Match } ); ok("\c[CIRCUMFLEX ACCENT]" ~~ m/^<[A]+isModifierSymbol>$/, q{Match compound } ); ok(!( "\c[CIRCUMFLEX ACCENT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[CIRCUMFLEX ACCENT]" ~~ m/^<[A]-isModifierSymbol>$/ ), q{Don't match compound inverted } ); ok(!( "\c[CIRCUMFLEX ACCENT]" ~~ m/^<-isModifierSymbol>$/ ), q{Don't match internally inverted } ); ok(!( "\x[69E7]" ~~ m/^<+isModifierSymbol>$/ ), q{Don't match unrelated } ); ok("\x[69E7]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[69E7]" ~~ m/^<-isModifierSymbol>$/, q{Match unrelated internally inverted } ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^<+isModifierSymbol>$/ ), q{Don't match related } ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^<-isModifierSymbol>$/, q{Match related internally inverted } ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[69E7]\c[COMBINING GRAVE ACCENT]\c[CIRCUMFLEX ACCENT]" ~~ m/<+isModifierSymbol>/, q{Match unanchored } ); # So OtherSymbol ok("\c[YI RADICAL QOT]" ~~ m/^<+isSo>$/, q{Match (OtherSymbol)} ); ok("\c[YI RADICAL QOT]" ~~ m/^<[A]+isSo>$/, q{Match compound (OtherSymbol)} ); ok(!( "\c[YI RADICAL QOT]" ~~ m/^.$/ ), q{Don't match externally inverted (OtherSymbol)} ); ok(!( "\c[YI RADICAL QOT]" ~~ m/^<[A]-isSo>$/ ), q{Don't match compound inverted (OtherSymbol)} ); ok(!( "\c[YI RADICAL QOT]" ~~ m/^<-isSo>$/ ), q{Don't match internally inverted (OtherSymbol)} ); ok(!( "\x[8C90]" ~~ m/^<+isSo>$/ ), q{Don't match unrelated (OtherSymbol)} ); ok("\x[8C90]" ~~ m/^.$/, q{Match unrelated externally inverted (OtherSymbol)} ); ok("\x[8C90]" ~~ m/^<-isSo>$/, q{Match unrelated internally inverted (OtherSymbol)} ); ok(!( "\c[DOLLAR SIGN]" ~~ m/^<+isSo>$/ ), q{Don't match related (OtherSymbol)} ); ok("\c[DOLLAR SIGN]" ~~ m/^<-isSo>$/, q{Match related internally inverted (OtherSymbol)} ); ok("\c[DOLLAR SIGN]" ~~ m/^.$/, q{Match related externally inverted (OtherSymbol)} ); ok("\x[8C90]\c[DOLLAR SIGN]\c[YI RADICAL QOT]" ~~ m/<+isSo>/, q{Match unanchored (OtherSymbol)} ); ok("\c[YI RADICAL QOT]" ~~ m/^<+isOtherSymbol>$/, q{Match } ); ok("\c[YI RADICAL QOT]" ~~ m/^<[A]+isOtherSymbol>$/, q{Match compound } ); ok(!( "\c[YI RADICAL QOT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[YI RADICAL QOT]" ~~ m/^<[A]-isOtherSymbol>$/ ), q{Don't match compound inverted } ); ok(!( "\c[YI RADICAL QOT]" ~~ m/^<-isOtherSymbol>$/ ), q{Don't match internally inverted } ); ok(!( "\x[95A7]" ~~ m/^<+isOtherSymbol>$/ ), q{Don't match unrelated } ); ok("\x[95A7]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[95A7]" ~~ m/^<-isOtherSymbol>$/, q{Match unrelated internally inverted } ); ok("\x[95A7]\c[YI RADICAL QOT]" ~~ m/<+isOtherSymbol>/, q{Match unanchored } ); # Z Separator ok("\c[SPACE]" ~~ m/^<+isZ>$/, q{Match (Separator)} ); ok("\c[SPACE]" ~~ m/^<[A]+isZ>$/, q{Match compound (Separator)} ); ok(!( "\c[SPACE]" ~~ m/^.$/ ), q{Don't match externally inverted (Separator)} ); ok(!( "\c[SPACE]" ~~ m/^<[A]-isZ>$/ ), q{Don't match compound inverted (Separator)} ); ok(!( "\c[SPACE]" ~~ m/^<-isZ>$/ ), q{Don't match internally inverted (Separator)} ); ok(!( "\x[D222]" ~~ m/^<+isZ>$/ ), q{Don't match unrelated (Separator)} ); ok("\x[D222]" ~~ m/^.$/, q{Match unrelated externally inverted (Separator)} ); ok("\x[D222]" ~~ m/^<-isZ>$/, q{Match unrelated internally inverted (Separator)} ); ok("\x[D222]\c[SPACE]" ~~ m/<+isZ>/, q{Match unanchored (Separator)} ); ok("\c[SPACE]" ~~ m/^<+isSeparator>$/, q{Match } ); ok("\c[SPACE]" ~~ m/^<[A]+isSeparator>$/, q{Match compound } ); ok(!( "\c[SPACE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[SPACE]" ~~ m/^<[A]-isSeparator>$/ ), q{Don't match compound inverted } ); ok(!( "\c[SPACE]" ~~ m/^<-isSeparator>$/ ), q{Don't match internally inverted } ); ok(!( "\x[D7B7]" ~~ m/^<+isSeparator>$/ ), q{Don't match unrelated } ); ok("\x[D7B7]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[D7B7]" ~~ m/^<-isSeparator>$/, q{Match unrelated internally inverted } ); ok(!( "\c[DOLLAR SIGN]" ~~ m/^<+isSeparator>$/ ), q{Don't match related } ); ok("\c[DOLLAR SIGN]" ~~ m/^<-isSeparator>$/, q{Match related internally inverted } ); ok("\c[DOLLAR SIGN]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[D7B7]\c[DOLLAR SIGN]\c[SPACE]" ~~ m/<+isSeparator>/, q{Match unanchored } ); # Zs SpaceSeparator ok("\c[SPACE]" ~~ m/^<+isZs>$/, q{Match (SpaceSeparator)} ); ok("\c[SPACE]" ~~ m/^<[A]+isZs>$/, q{Match compound (SpaceSeparator)} ); ok(!( "\c[SPACE]" ~~ m/^.$/ ), q{Don't match externally inverted (SpaceSeparator)} ); ok(!( "\c[SPACE]" ~~ m/^<[A]-isZs>$/ ), q{Don't match compound inverted (SpaceSeparator)} ); ok(!( "\c[SPACE]" ~~ m/^<-isZs>$/ ), q{Don't match internally inverted (SpaceSeparator)} ); ok(!( "\x[5918]" ~~ m/^<+isZs>$/ ), q{Don't match unrelated (SpaceSeparator)} ); ok("\x[5918]" ~~ m/^.$/, q{Match unrelated externally inverted (SpaceSeparator)} ); ok("\x[5918]" ~~ m/^<-isZs>$/, q{Match unrelated internally inverted (SpaceSeparator)} ); ok(!( "\c[LINE SEPARATOR]" ~~ m/^<+isZs>$/ ), q{Don't match related (SpaceSeparator)} ); ok("\c[LINE SEPARATOR]" ~~ m/^<-isZs>$/, q{Match related internally inverted (SpaceSeparator)} ); ok("\c[LINE SEPARATOR]" ~~ m/^.$/, q{Match related externally inverted (SpaceSeparator)} ); ok("\x[5918]\c[LINE SEPARATOR]\c[SPACE]" ~~ m/<+isZs>/, q{Match unanchored (SpaceSeparator)} ); ok("\c[SPACE]" ~~ m/^<+isSpaceSeparator>$/, q{Match } ); ok("\c[SPACE]" ~~ m/^<[A]+isSpaceSeparator>$/, q{Match compound } ); ok(!( "\c[SPACE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[SPACE]" ~~ m/^<[A]-isSpaceSeparator>$/ ), q{Don't match compound inverted } ); ok(!( "\c[SPACE]" ~~ m/^<-isSpaceSeparator>$/ ), q{Don't match internally inverted } ); ok(!( "\x[3704]" ~~ m/^<+isSpaceSeparator>$/ ), q{Don't match unrelated } ); ok("\x[3704]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[3704]" ~~ m/^<-isSpaceSeparator>$/, q{Match unrelated internally inverted } ); ok(!( "\c[HEXAGRAM FOR THE CREATIVE HEAVEN]" ~~ m/^<+isSpaceSeparator>$/ ), q{Don't match related } ); ok("\c[HEXAGRAM FOR THE CREATIVE HEAVEN]" ~~ m/^<-isSpaceSeparator>$/, q{Match related internally inverted } ); ok("\c[HEXAGRAM FOR THE CREATIVE HEAVEN]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[3704]\c[HEXAGRAM FOR THE CREATIVE HEAVEN]\c[SPACE]" ~~ m/<+isSpaceSeparator>/, q{Match unanchored } ); # Zl LineSeparator ok("\c[LINE SEPARATOR]" ~~ m/^<+isZl>$/, q{Match (LineSeparator)} ); ok("\c[LINE SEPARATOR]" ~~ m/^<[A]+isZl>$/, q{Match compound (LineSeparator)} ); ok(!( "\c[LINE SEPARATOR]" ~~ m/^.$/ ), q{Don't match externally inverted (LineSeparator)} ); ok(!( "\c[LINE SEPARATOR]" ~~ m/^<[A]-isZl>$/ ), q{Don't match compound inverted (LineSeparator)} ); ok(!( "\c[LINE SEPARATOR]" ~~ m/^<-isZl>$/ ), q{Don't match internally inverted (LineSeparator)} ); ok(!( "\x[ADAD]" ~~ m/^<+isZl>$/ ), q{Don't match unrelated (LineSeparator)} ); ok("\x[ADAD]" ~~ m/^.$/, q{Match unrelated externally inverted (LineSeparator)} ); ok("\x[ADAD]" ~~ m/^<-isZl>$/, q{Match unrelated internally inverted (LineSeparator)} ); ok(!( "\c[SPACE]" ~~ m/^<+isZl>$/ ), q{Don't match related (LineSeparator)} ); ok("\c[SPACE]" ~~ m/^<-isZl>$/, q{Match related internally inverted (LineSeparator)} ); ok("\c[SPACE]" ~~ m/^.$/, q{Match related externally inverted (LineSeparator)} ); ok("\x[ADAD]\c[SPACE]\c[LINE SEPARATOR]" ~~ m/<+isZl>/, q{Match unanchored (LineSeparator)} ); ok("\c[LINE SEPARATOR]" ~~ m/^<+isLineSeparator>$/, q{Match } ); ok("\c[LINE SEPARATOR]" ~~ m/^<[A]+isLineSeparator>$/, q{Match compound } ); ok(!( "\c[LINE SEPARATOR]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LINE SEPARATOR]" ~~ m/^<[A]-isLineSeparator>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LINE SEPARATOR]" ~~ m/^<-isLineSeparator>$/ ), q{Don't match internally inverted } ); ok(!( "\x[C5E7]" ~~ m/^<+isLineSeparator>$/ ), q{Don't match unrelated } ); ok("\x[C5E7]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[C5E7]" ~~ m/^<-isLineSeparator>$/, q{Match unrelated internally inverted } ); ok(!( "\x[C5E7]" ~~ m/^<+isLineSeparator>$/ ), q{Don't match related } ); ok("\x[C5E7]" ~~ m/^<-isLineSeparator>$/, q{Match related internally inverted } ); ok("\x[C5E7]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[C5E7]\x[C5E7]\c[LINE SEPARATOR]" ~~ m/<+isLineSeparator>/, q{Match unanchored } ); # Zp ParagraphSeparator ok("\c[PARAGRAPH SEPARATOR]" ~~ m/^<+isZp>$/, q{Match (ParagraphSeparator)} ); ok("\c[PARAGRAPH SEPARATOR]" ~~ m/^<[A]+isZp>$/, q{Match compound (ParagraphSeparator)} ); ok(!( "\c[PARAGRAPH SEPARATOR]" ~~ m/^.$/ ), q{Don't match externally inverted (ParagraphSeparator)} ); ok(!( "\c[PARAGRAPH SEPARATOR]" ~~ m/^<[A]-isZp>$/ ), q{Don't match compound inverted (ParagraphSeparator)} ); ok(!( "\c[PARAGRAPH SEPARATOR]" ~~ m/^<-isZp>$/ ), q{Don't match internally inverted (ParagraphSeparator)} ); ok(!( "\c[KHMER SYMBOL LEK ATTAK PRAM-BUON]" ~~ m/^<+isZp>$/ ), q{Don't match unrelated (ParagraphSeparator)} ); ok("\c[KHMER SYMBOL LEK ATTAK PRAM-BUON]" ~~ m/^.$/, q{Match unrelated externally inverted (ParagraphSeparator)} ); ok("\c[KHMER SYMBOL LEK ATTAK PRAM-BUON]" ~~ m/^<-isZp>$/, q{Match unrelated internally inverted (ParagraphSeparator)} ); ok(!( "\c[MONGOLIAN VOWEL SEPARATOR]" ~~ m/^<+isZp>$/ ), q{Don't match related (ParagraphSeparator)} ); ok("\c[MONGOLIAN VOWEL SEPARATOR]" ~~ m/^<-isZp>$/, q{Match related internally inverted (ParagraphSeparator)} ); ok("\c[MONGOLIAN VOWEL SEPARATOR]" ~~ m/^.$/, q{Match related externally inverted (ParagraphSeparator)} ); ok("\c[KHMER SYMBOL LEK ATTAK PRAM-BUON]\c[MONGOLIAN VOWEL SEPARATOR]\c[PARAGRAPH SEPARATOR]" ~~ m/<+isZp>/, q{Match unanchored (ParagraphSeparator)} ); ok("\c[PARAGRAPH SEPARATOR]" ~~ m/^<+isParagraphSeparator>$/, q{Match } ); ok("\c[PARAGRAPH SEPARATOR]" ~~ m/^<[A]+isParagraphSeparator>$/, q{Match compound } ); ok(!( "\c[PARAGRAPH SEPARATOR]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[PARAGRAPH SEPARATOR]" ~~ m/^<[A]-isParagraphSeparator>$/ ), q{Don't match compound inverted } ); ok(!( "\c[PARAGRAPH SEPARATOR]" ~~ m/^<-isParagraphSeparator>$/ ), q{Don't match internally inverted } ); ok(!( "\c[HIRAGANA LETTER KA]" ~~ m/^<+isParagraphSeparator>$/ ), q{Don't match unrelated } ); ok("\c[HIRAGANA LETTER KA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[HIRAGANA LETTER KA]" ~~ m/^<-isParagraphSeparator>$/, q{Match unrelated internally inverted } ); ok(!( "\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/^<+isParagraphSeparator>$/ ), q{Don't match related } ); ok("\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/^<-isParagraphSeparator>$/, q{Match related internally inverted } ); ok("\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\c[HIRAGANA LETTER KA]\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]\c[PARAGRAPH SEPARATOR]" ~~ m/<+isParagraphSeparator>/, q{Match unanchored } ); # C Other ok("\x[9FA6]" ~~ m/^<+isC>$/, q{Match (Other)} ); ok("\x[9FA6]" ~~ m/^<[A]+isC>$/, q{Match compound (Other)} ); ok(!( "\x[9FA6]" ~~ m/^.$/ ), q{Don't match externally inverted (Other)} ); ok(!( "\x[9FA6]" ~~ m/^<[A]-isC>$/ ), q{Don't match compound inverted (Other)} ); ok(!( "\x[9FA6]" ~~ m/^<-isC>$/ ), q{Don't match internally inverted (Other)} ); ok(!( "\x[56E6]" ~~ m/^<+isC>$/ ), q{Don't match unrelated (Other)} ); ok("\x[56E6]" ~~ m/^.$/, q{Match unrelated externally inverted (Other)} ); ok("\x[56E6]" ~~ m/^<-isC>$/, q{Match unrelated internally inverted (Other)} ); ok("\x[56E6]\x[9FA6]" ~~ m/<+isC>/, q{Match unanchored (Other)} ); ok("\x[0EAC]" ~~ m/^<+isOther>$/, q{Match } ); ok("\x[0EAC]" ~~ m/^<[A]+isOther>$/, q{Match compound } ); ok(!( "\x[0EAC]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0EAC]" ~~ m/^<[A]-isOther>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0EAC]" ~~ m/^<-isOther>$/ ), q{Don't match internally inverted } ); ok(!( "\c[LAO LETTER HO SUNG]" ~~ m/^<+isOther>$/ ), q{Don't match unrelated } ); ok("\c[LAO LETTER HO SUNG]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[LAO LETTER HO SUNG]" ~~ m/^<-isOther>$/, q{Match unrelated internally inverted } ); ok("\c[LAO LETTER HO SUNG]\x[0EAC]" ~~ m/<+isOther>/, q{Match unanchored } ); # Cc Control ok("\c[NULL]" ~~ m/^<+isCc>$/, q{Match (Control)} ); ok("\c[NULL]" ~~ m/^<[A]+isCc>$/, q{Match compound (Control)} ); ok(!( "\c[NULL]" ~~ m/^.$/ ), q{Don't match externally inverted (Control)} ); ok(!( "\c[NULL]" ~~ m/^<[A]-isCc>$/ ), q{Don't match compound inverted (Control)} ); ok(!( "\c[NULL]" ~~ m/^<-isCc>$/ ), q{Don't match internally inverted (Control)} ); ok(!( "\c[OGONEK]" ~~ m/^<+isCc>$/ ), q{Don't match unrelated (Control)} ); ok("\c[OGONEK]" ~~ m/^.$/, q{Match unrelated externally inverted (Control)} ); ok("\c[OGONEK]" ~~ m/^<-isCc>$/, q{Match unrelated internally inverted (Control)} ); ok(!( "\x[0358]" ~~ m/^<+isCc>$/ ), q{Don't match related (Control)} ); ok("\x[0358]" ~~ m/^<-isCc>$/, q{Match related internally inverted (Control)} ); ok("\x[0358]" ~~ m/^.$/, q{Match related externally inverted (Control)} ); ok("\c[OGONEK]\x[0358]\c[NULL]" ~~ m/<+isCc>/, q{Match unanchored (Control)} ); ok("\c[NULL]" ~~ m/^<+isControl>$/, q{Match } ); ok("\c[NULL]" ~~ m/^<[A]+isControl>$/, q{Match compound } ); ok(!( "\c[NULL]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[NULL]" ~~ m/^<[A]-isControl>$/ ), q{Don't match compound inverted } ); ok(!( "\c[NULL]" ~~ m/^<-isControl>$/ ), q{Don't match internally inverted } ); ok(!( "\x[4A20]" ~~ m/^<+isControl>$/ ), q{Don't match unrelated } ); ok("\x[4A20]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[4A20]" ~~ m/^<-isControl>$/, q{Match unrelated internally inverted } ); ok(!( "\x[4DB6]" ~~ m/^<+isControl>$/ ), q{Don't match related } ); ok("\x[4DB6]" ~~ m/^<-isControl>$/, q{Match related internally inverted } ); ok("\x[4DB6]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[4A20]\x[4DB6]\c[NULL]" ~~ m/<+isControl>/, q{Match unanchored } ); # Cf Format ok("\c[SOFT HYPHEN]" ~~ m/^<+isCf>$/, q{Match (Format)} ); ok("\c[SOFT HYPHEN]" ~~ m/^<[A]+isCf>$/, q{Match compound (Format)} ); ok(!( "\c[SOFT HYPHEN]" ~~ m/^.$/ ), q{Don't match externally inverted (Format)} ); ok(!( "\c[SOFT HYPHEN]" ~~ m/^<[A]-isCf>$/ ), q{Don't match compound inverted (Format)} ); ok(!( "\c[SOFT HYPHEN]" ~~ m/^<-isCf>$/ ), q{Don't match internally inverted (Format)} ); ok(!( "\x[AECE]" ~~ m/^<+isCf>$/ ), q{Don't match unrelated (Format)} ); ok("\x[AECE]" ~~ m/^.$/, q{Match unrelated externally inverted (Format)} ); ok("\x[AECE]" ~~ m/^<-isCf>$/, q{Match unrelated internally inverted (Format)} ); ok(!( "\x[D7A4]" ~~ m/^<+isCf>$/ ), q{Don't match related (Format)} ); ok("\x[D7A4]" ~~ m/^<-isCf>$/, q{Match related internally inverted (Format)} ); ok("\x[D7A4]" ~~ m/^.$/, q{Match related externally inverted (Format)} ); ok("\x[AECE]\x[D7A4]\c[SOFT HYPHEN]" ~~ m/<+isCf>/, q{Match unanchored (Format)} ); ok("\c[SOFT HYPHEN]" ~~ m/^<+isFormat>$/, q{Match } ); ok("\c[SOFT HYPHEN]" ~~ m/^<[A]+isFormat>$/, q{Match compound } ); ok(!( "\c[SOFT HYPHEN]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[SOFT HYPHEN]" ~~ m/^<[A]-isFormat>$/ ), q{Don't match compound inverted } ); ok(!( "\c[SOFT HYPHEN]" ~~ m/^<-isFormat>$/ ), q{Don't match internally inverted } ); ok(!( "\x[5382]" ~~ m/^<+isFormat>$/ ), q{Don't match unrelated } ); ok("\x[5382]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[5382]" ~~ m/^<-isFormat>$/, q{Match unrelated internally inverted } ); ok("\x[5382]\c[SOFT HYPHEN]" ~~ m/<+isFormat>/, q{Match unanchored } ); # BidiL # Left-to-Right ok("\c[YI SYLLABLE IT]" ~~ m/^<+isBidiL>$/, q{Match (Left-to-Right)} ); ok("\c[YI SYLLABLE IT]" ~~ m/^<[A]+isBidiL>$/, q{Match compound (Left-to-Right)} ); ok(!( "\c[YI SYLLABLE IT]" ~~ m/^.$/ ), q{Don't match externally inverted (Left-to-Right)} ); ok(!( "\c[YI SYLLABLE IT]" ~~ m/^<[A]-isBidiL>$/ ), q{Don't match compound inverted (Left-to-Right)} ); ok(!( "\c[YI SYLLABLE IT]" ~~ m/^<-isBidiL>$/ ), q{Don't match internally inverted (Left-to-Right)} ); ok(!( "\x[5BF5]" ~~ m/^<+isBidiL>$/ ), q{Don't match unrelated (Left-to-Right)} ); ok("\x[5BF5]" ~~ m/^.$/, q{Match unrelated externally inverted (Left-to-Right)} ); ok("\x[5BF5]" ~~ m/^<-isBidiL>$/, q{Match unrelated internally inverted (Left-to-Right)} ); ok("\x[5BF5]\c[YI SYLLABLE IT]" ~~ m/<+isBidiL>/, q{Match unanchored (Left-to-Right)} ); # BidiEN # European Number ok("\c[DIGIT ZERO]" ~~ m/^<+isBidiEN>$/, q{Match (European Number)} ); ok("\c[DIGIT ZERO]" ~~ m/^<[A]+isBidiEN>$/, q{Match compound (European Number)} ); ok(!( "\c[DIGIT ZERO]" ~~ m/^.$/ ), q{Don't match externally inverted (European Number)} ); ok(!( "\c[DIGIT ZERO]" ~~ m/^<[A]-isBidiEN>$/ ), q{Don't match compound inverted (European Number)} ); ok(!( "\c[DIGIT ZERO]" ~~ m/^<-isBidiEN>$/ ), q{Don't match internally inverted (European Number)} ); ok(!( "\x[5596]" ~~ m/^<+isBidiEN>$/ ), q{Don't match unrelated (European Number)} ); ok("\x[5596]" ~~ m/^.$/, q{Match unrelated externally inverted (European Number)} ); ok("\x[5596]" ~~ m/^<-isBidiEN>$/, q{Match unrelated internally inverted (European Number)} ); ok("\x[5596]\c[DIGIT ZERO]" ~~ m/<+isBidiEN>/, q{Match unanchored (European Number)} ); # BidiES # European Number Separator ok("\c[SOLIDUS]" ~~ m/^<+isBidiES>$/, q{Match (European Number Separator)} ); ok("\c[SOLIDUS]" ~~ m/^<[A]+isBidiES>$/, q{Match compound (European Number Separator)} ); ok(!( "\c[SOLIDUS]" ~~ m/^.$/ ), q{Don't match externally inverted (European Number Separator)} ); ok(!( "\c[SOLIDUS]" ~~ m/^<[A]-isBidiES>$/ ), q{Don't match compound inverted (European Number Separator)} ); ok(!( "\c[SOLIDUS]" ~~ m/^<-isBidiES>$/ ), q{Don't match internally inverted (European Number Separator)} ); ok(!( "\x[85D3]" ~~ m/^<+isBidiES>$/ ), q{Don't match unrelated (European Number Separator)} ); ok("\x[85D3]" ~~ m/^.$/, q{Match unrelated externally inverted (European Number Separator)} ); ok("\x[85D3]" ~~ m/^<-isBidiES>$/, q{Match unrelated internally inverted (European Number Separator)} ); ok("\x[85D3]\c[SOLIDUS]" ~~ m/<+isBidiES>/, q{Match unanchored (European Number Separator)} ); # BidiET # European Number Terminator ok("\c[NUMBER SIGN]" ~~ m/^<+isBidiET>$/, q{Match (European Number Terminator)} ); ok("\c[NUMBER SIGN]" ~~ m/^<[A]+isBidiET>$/, q{Match compound (European Number Terminator)} ); ok(!( "\c[NUMBER SIGN]" ~~ m/^.$/ ), q{Don't match externally inverted (European Number Terminator)} ); ok(!( "\c[NUMBER SIGN]" ~~ m/^<[A]-isBidiET>$/ ), q{Don't match compound inverted (European Number Terminator)} ); ok(!( "\c[NUMBER SIGN]" ~~ m/^<-isBidiET>$/ ), q{Don't match internally inverted (European Number Terminator)} ); ok(!( "\x[9AFC]" ~~ m/^<+isBidiET>$/ ), q{Don't match unrelated (European Number Terminator)} ); ok("\x[9AFC]" ~~ m/^.$/, q{Match unrelated externally inverted (European Number Terminator)} ); ok("\x[9AFC]" ~~ m/^<-isBidiET>$/, q{Match unrelated internally inverted (European Number Terminator)} ); ok("\x[9AFC]\c[NUMBER SIGN]" ~~ m/<+isBidiET>/, q{Match unanchored (European Number Terminator)} ); # BidiWS # Whitespace ok("\c[FORM FEED (FF)]" ~~ m/^<+isBidiWS>$/, q{Match (Whitespace)} ); ok("\c[FORM FEED (FF)]" ~~ m/^<[A]+isBidiWS>$/, q{Match compound (Whitespace)} ); ok(!( "\c[FORM FEED (FF)]" ~~ m/^.$/ ), q{Don't match externally inverted (Whitespace)} ); ok(!( "\c[FORM FEED (FF)]" ~~ m/^<[A]-isBidiWS>$/ ), q{Don't match compound inverted (Whitespace)} ); ok(!( "\c[FORM FEED (FF)]" ~~ m/^<-isBidiWS>$/ ), q{Don't match internally inverted (Whitespace)} ); ok(!( "\x[4441]" ~~ m/^<+isBidiWS>$/ ), q{Don't match unrelated (Whitespace)} ); ok("\x[4441]" ~~ m/^.$/, q{Match unrelated externally inverted (Whitespace)} ); ok("\x[4441]" ~~ m/^<-isBidiWS>$/, q{Match unrelated internally inverted (Whitespace)} ); ok("\x[4441]\c[FORM FEED (FF)]" ~~ m/<+isBidiWS>/, q{Match unanchored (Whitespace)} ); # Arabic ok("\c[ARABIC LETTER HAMZA]" ~~ m/^<+isArabic>$/, q{Match } ); ok("\c[ARABIC LETTER HAMZA]" ~~ m/^<[A]+isArabic>$/, q{Match compound } ); ok(!( "\c[ARABIC LETTER HAMZA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[ARABIC LETTER HAMZA]" ~~ m/^<[A]-isArabic>$/ ), q{Don't match compound inverted } ); ok(!( "\c[ARABIC LETTER HAMZA]" ~~ m/^<-isArabic>$/ ), q{Don't match internally inverted } ); ok(!( "\c[YI SYLLABLE RYRX]" ~~ m/^<+isArabic>$/ ), q{Don't match unrelated } ); ok("\c[YI SYLLABLE RYRX]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[YI SYLLABLE RYRX]" ~~ m/^<-isArabic>$/, q{Match unrelated internally inverted } ); ok("\c[YI SYLLABLE RYRX]\c[ARABIC LETTER HAMZA]" ~~ m/<+isArabic>/, q{Match unanchored } ); # Armenian ok("\c[ARMENIAN CAPITAL LETTER AYB]" ~~ m/^<+isArmenian>$/, q{Match } ); ok("\c[ARMENIAN CAPITAL LETTER AYB]" ~~ m/^<[A]+isArmenian>$/, q{Match compound } ); ok(!( "\c[ARMENIAN CAPITAL LETTER AYB]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[ARMENIAN CAPITAL LETTER AYB]" ~~ m/^<[A]-isArmenian>$/ ), q{Don't match compound inverted } ); ok(!( "\c[ARMENIAN CAPITAL LETTER AYB]" ~~ m/^<-isArmenian>$/ ), q{Don't match internally inverted } ); ok(!( "\x[B2ED]" ~~ m/^<+isArmenian>$/ ), q{Don't match unrelated } ); ok("\x[B2ED]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[B2ED]" ~~ m/^<-isArmenian>$/, q{Match unrelated internally inverted } ); ok("\x[B2ED]\c[ARMENIAN CAPITAL LETTER AYB]" ~~ m/<+isArmenian>/, q{Match unanchored } ); # Bengali ok("\c[BENGALI SIGN CANDRABINDU]" ~~ m/^<+isBengali>$/, q{Match } ); ok("\c[BENGALI SIGN CANDRABINDU]" ~~ m/^<[A]+isBengali>$/, q{Match compound } ); ok(!( "\c[BENGALI SIGN CANDRABINDU]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[BENGALI SIGN CANDRABINDU]" ~~ m/^<[A]-isBengali>$/ ), q{Don't match compound inverted } ); ok(!( "\c[BENGALI SIGN CANDRABINDU]" ~~ m/^<-isBengali>$/ ), q{Don't match internally inverted } ); ok(!( "\x[4AFD]" ~~ m/^<+isBengali>$/ ), q{Don't match unrelated } ); ok("\x[4AFD]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[4AFD]" ~~ m/^<-isBengali>$/, q{Match unrelated internally inverted } ); ok("\x[4AFD]\c[BENGALI SIGN CANDRABINDU]" ~~ m/<+isBengali>/, q{Match unanchored } ); # Bopomofo ok("\c[BOPOMOFO LETTER B]" ~~ m/^<+isBopomofo>$/, q{Match } ); ok("\c[BOPOMOFO LETTER B]" ~~ m/^<[A]+isBopomofo>$/, q{Match compound } ); ok(!( "\c[BOPOMOFO LETTER B]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[BOPOMOFO LETTER B]" ~~ m/^<[A]-isBopomofo>$/ ), q{Don't match compound inverted } ); ok(!( "\c[BOPOMOFO LETTER B]" ~~ m/^<-isBopomofo>$/ ), q{Don't match internally inverted } ); ok(!( "\x[8369]" ~~ m/^<+isBopomofo>$/ ), q{Don't match unrelated } ); ok("\x[8369]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[8369]" ~~ m/^<-isBopomofo>$/, q{Match unrelated internally inverted } ); ok("\x[8369]\c[BOPOMOFO LETTER B]" ~~ m/<+isBopomofo>/, q{Match unanchored } ); # Buhid ok("\c[BUHID LETTER A]" ~~ m/^<+isBuhid>$/, q{Match } ); ok("\c[BUHID LETTER A]" ~~ m/^<[A]+isBuhid>$/, q{Match compound } ); ok(!( "\c[BUHID LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[BUHID LETTER A]" ~~ m/^<[A]-isBuhid>$/ ), q{Don't match compound inverted } ); ok(!( "\c[BUHID LETTER A]" ~~ m/^<-isBuhid>$/ ), q{Don't match internally inverted } ); ok(!( "\x[877F]" ~~ m/^<+isBuhid>$/ ), q{Don't match unrelated } ); ok("\x[877F]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[877F]" ~~ m/^<-isBuhid>$/, q{Match unrelated internally inverted } ); ok("\x[877F]\c[BUHID LETTER A]" ~~ m/<+isBuhid>/, q{Match unanchored } ); # CanadianAboriginal ok("\c[CANADIAN SYLLABICS E]" ~~ m/^<+isCanadianAboriginal>$/, q{Match } ); ok("\c[CANADIAN SYLLABICS E]" ~~ m/^<[A]+isCanadianAboriginal>$/, q{Match compound } ); ok(!( "\c[CANADIAN SYLLABICS E]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[CANADIAN SYLLABICS E]" ~~ m/^<[A]-isCanadianAboriginal>$/ ), q{Don't match compound inverted } ); ok(!( "\c[CANADIAN SYLLABICS E]" ~~ m/^<-isCanadianAboriginal>$/ ), q{Don't match internally inverted } ); ok(!( "\x[3A42]" ~~ m/^<+isCanadianAboriginal>$/ ), q{Don't match unrelated } ); ok("\x[3A42]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[3A42]" ~~ m/^<-isCanadianAboriginal>$/, q{Match unrelated internally inverted } ); ok(!( "\x[4DB6]" ~~ m/^<+isCanadianAboriginal>$/ ), q{Don't match related } ); ok("\x[4DB6]" ~~ m/^<-isCanadianAboriginal>$/, q{Match related internally inverted } ); ok("\x[4DB6]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[3A42]\x[4DB6]\c[CANADIAN SYLLABICS E]" ~~ m/<+isCanadianAboriginal>/, q{Match unanchored } ); # Cherokee ok("\c[CHEROKEE LETTER A]" ~~ m/^<+isCherokee>$/, q{Match } ); ok("\c[CHEROKEE LETTER A]" ~~ m/^<[A]+isCherokee>$/, q{Match compound } ); ok(!( "\c[CHEROKEE LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[CHEROKEE LETTER A]" ~~ m/^<[A]-isCherokee>$/ ), q{Don't match compound inverted } ); ok(!( "\c[CHEROKEE LETTER A]" ~~ m/^<-isCherokee>$/ ), q{Don't match internally inverted } ); ok(!( "\x[A9EF]" ~~ m/^<+isCherokee>$/ ), q{Don't match unrelated } ); ok("\x[A9EF]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[A9EF]" ~~ m/^<-isCherokee>$/, q{Match unrelated internally inverted } ); ok(!( "\x[A9EF]" ~~ m/^<+isCherokee>$/ ), q{Don't match related } ); ok("\x[A9EF]" ~~ m/^<-isCherokee>$/, q{Match related internally inverted } ); ok("\x[A9EF]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[A9EF]\x[A9EF]\c[CHEROKEE LETTER A]" ~~ m/<+isCherokee>/, q{Match unanchored } ); # Cyrillic ok("\c[CYRILLIC LETTER SMALL CAPITAL EL]" ~~ m/^<+isCyrillic>$/, q{Match } ); ok("\c[CYRILLIC LETTER SMALL CAPITAL EL]" ~~ m/^<[A]+isCyrillic>$/, q{Match compound } ); ok(!( "\c[CYRILLIC LETTER SMALL CAPITAL EL]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[CYRILLIC LETTER SMALL CAPITAL EL]" ~~ m/^<[A]-isCyrillic>$/ ), q{Don't match compound inverted } ); ok(!( "\c[CYRILLIC LETTER SMALL CAPITAL EL]" ~~ m/^<-isCyrillic>$/ ), q{Don't match internally inverted } ); ok(!( "\x[07EF]" ~~ m/^<+isCyrillic>$/ ), q{Don't match unrelated } ); ok("\x[07EF]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[07EF]" ~~ m/^<-isCyrillic>$/, q{Match unrelated internally inverted } ); ok(!( "\x[07EF]" ~~ m/^<+isCyrillic>$/ ), q{Don't match related } ); ok("\x[07EF]" ~~ m/^<-isCyrillic>$/, q{Match related internally inverted } ); ok("\x[07EF]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[07EF]\x[07EF]\c[CYRILLIC LETTER SMALL CAPITAL EL]" ~~ m/<+isCyrillic>/, q{Match unanchored } ); # Deseret ok(!( "\x[65BD]" ~~ m/^<+isDeseret>$/ ), q{Don't match unrelated } ); ok("\x[65BD]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[65BD]" ~~ m/^<-isDeseret>$/, q{Match unrelated internally inverted } ); # Devanagari ok("\c[DEVANAGARI SIGN CANDRABINDU]" ~~ m/^<+isDevanagari>$/, q{Match } ); ok("\c[DEVANAGARI SIGN CANDRABINDU]" ~~ m/^<[A]+isDevanagari>$/, q{Match compound } ); ok(!( "\c[DEVANAGARI SIGN CANDRABINDU]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[DEVANAGARI SIGN CANDRABINDU]" ~~ m/^<[A]-isDevanagari>$/ ), q{Don't match compound inverted } ); ok(!( "\c[DEVANAGARI SIGN CANDRABINDU]" ~~ m/^<-isDevanagari>$/ ), q{Don't match internally inverted } ); ok(!( "\x[653B]" ~~ m/^<+isDevanagari>$/ ), q{Don't match unrelated } ); ok("\x[653B]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[653B]" ~~ m/^<-isDevanagari>$/, q{Match unrelated internally inverted } ); ok("\x[653B]\c[DEVANAGARI SIGN CANDRABINDU]" ~~ m/<+isDevanagari>/, q{Match unanchored } ); # Ethiopic ok("\c[ETHIOPIC SYLLABLE HA]" ~~ m/^<+isEthiopic>$/, q{Match } ); ok("\c[ETHIOPIC SYLLABLE HA]" ~~ m/^<[A]+isEthiopic>$/, q{Match compound } ); ok(!( "\c[ETHIOPIC SYLLABLE HA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[ETHIOPIC SYLLABLE HA]" ~~ m/^<[A]-isEthiopic>$/ ), q{Don't match compound inverted } ); ok(!( "\c[ETHIOPIC SYLLABLE HA]" ~~ m/^<-isEthiopic>$/ ), q{Don't match internally inverted } ); ok(!( "\x[482C]" ~~ m/^<+isEthiopic>$/ ), q{Don't match unrelated } ); ok("\x[482C]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[482C]" ~~ m/^<-isEthiopic>$/, q{Match unrelated internally inverted } ); ok("\x[482C]\c[ETHIOPIC SYLLABLE HA]" ~~ m/<+isEthiopic>/, q{Match unanchored } ); # Georgian ok("\c[GEORGIAN CAPITAL LETTER AN]" ~~ m/^<+isGeorgian>$/, q{Match } ); ok("\c[GEORGIAN CAPITAL LETTER AN]" ~~ m/^<[A]+isGeorgian>$/, q{Match compound } ); ok(!( "\c[GEORGIAN CAPITAL LETTER AN]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[GEORGIAN CAPITAL LETTER AN]" ~~ m/^<[A]-isGeorgian>$/ ), q{Don't match compound inverted } ); ok(!( "\c[GEORGIAN CAPITAL LETTER AN]" ~~ m/^<-isGeorgian>$/ ), q{Don't match internally inverted } ); ok(!( "\x[9BE5]" ~~ m/^<+isGeorgian>$/ ), q{Don't match unrelated } ); ok("\x[9BE5]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[9BE5]" ~~ m/^<-isGeorgian>$/, q{Match unrelated internally inverted } ); ok("\x[9BE5]\c[GEORGIAN CAPITAL LETTER AN]" ~~ m/<+isGeorgian>/, q{Match unanchored } ); # Gothic ok(!( "\x[4ED2]" ~~ m/^<+isGothic>$/ ), q{Don't match unrelated } ); ok("\x[4ED2]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[4ED2]" ~~ m/^<-isGothic>$/, q{Match unrelated internally inverted } ); # Greek ok("\c[MICRO SIGN]" ~~ m/^<+isGreek>$/, q{Match } ); ok("\c[MICRO SIGN]" ~~ m/^<[A]+isGreek>$/, q{Match compound } ); ok(!( "\c[MICRO SIGN]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[MICRO SIGN]" ~~ m/^<[A]-isGreek>$/ ), q{Don't match compound inverted } ); ok(!( "\c[MICRO SIGN]" ~~ m/^<-isGreek>$/ ), q{Don't match internally inverted } ); ok(!( "\x[D486]" ~~ m/^<+isGreek>$/ ), q{Don't match unrelated } ); ok("\x[D486]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[D486]" ~~ m/^<-isGreek>$/, q{Match unrelated internally inverted } ); ok("\x[D486]\c[MICRO SIGN]" ~~ m/<+isGreek>/, q{Match unanchored } ); # Gujarati ok("\c[GUJARATI SIGN CANDRABINDU]" ~~ m/^<+isGujarati>$/, q{Match } ); ok("\c[GUJARATI SIGN CANDRABINDU]" ~~ m/^<[A]+isGujarati>$/, q{Match compound } ); ok(!( "\c[GUJARATI SIGN CANDRABINDU]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[GUJARATI SIGN CANDRABINDU]" ~~ m/^<[A]-isGujarati>$/ ), q{Don't match compound inverted } ); ok(!( "\c[GUJARATI SIGN CANDRABINDU]" ~~ m/^<-isGujarati>$/ ), q{Don't match internally inverted } ); ok(!( "\x[B3F3]" ~~ m/^<+isGujarati>$/ ), q{Don't match unrelated } ); ok("\x[B3F3]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[B3F3]" ~~ m/^<-isGujarati>$/, q{Match unrelated internally inverted } ); ok("\x[B3F3]\c[GUJARATI SIGN CANDRABINDU]" ~~ m/<+isGujarati>/, q{Match unanchored } ); # Gurmukhi ok("\c[GURMUKHI SIGN BINDI]" ~~ m/^<+isGurmukhi>$/, q{Match } ); ok("\c[GURMUKHI SIGN BINDI]" ~~ m/^<[A]+isGurmukhi>$/, q{Match compound } ); ok(!( "\c[GURMUKHI SIGN BINDI]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[GURMUKHI SIGN BINDI]" ~~ m/^<[A]-isGurmukhi>$/ ), q{Don't match compound inverted } ); ok(!( "\c[GURMUKHI SIGN BINDI]" ~~ m/^<-isGurmukhi>$/ ), q{Don't match internally inverted } ); ok(!( "\x[6469]" ~~ m/^<+isGurmukhi>$/ ), q{Don't match unrelated } ); ok("\x[6469]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[6469]" ~~ m/^<-isGurmukhi>$/, q{Match unrelated internally inverted } ); ok("\x[6469]\c[GURMUKHI SIGN BINDI]" ~~ m/<+isGurmukhi>/, q{Match unanchored } ); # Han ok("\x[9DB5]" ~~ m/^<+isHan>$/, q{Match } ); ok("\x[9DB5]" ~~ m/^<[A]+isHan>$/, q{Match compound } ); ok(!( "\x[9DB5]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[9DB5]" ~~ m/^<[A]-isHan>$/ ), q{Don't match compound inverted } ); ok(!( "\x[9DB5]" ~~ m/^<-isHan>$/ ), q{Don't match internally inverted } ); ok(!( "\x[9FA6]" ~~ m/^<+isHan>$/ ), q{Don't match unrelated } ); ok("\x[9FA6]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[9FA6]" ~~ m/^<-isHan>$/, q{Match unrelated internally inverted } ); ok("\x[9FA6]\x[9DB5]" ~~ m/<+isHan>/, q{Match unanchored } ); # Hangul ok("\x[AC00]" ~~ m/^<+isHangul>$/, q{Match } ); ok("\x[AC00]" ~~ m/^<[A]+isHangul>$/, q{Match compound } ); ok(!( "\x[AC00]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[AC00]" ~~ m/^<[A]-isHangul>$/ ), q{Don't match compound inverted } ); ok(!( "\x[AC00]" ~~ m/^<-isHangul>$/ ), q{Don't match internally inverted } ); ok(!( "\x[9E09]" ~~ m/^<+isHangul>$/ ), q{Don't match unrelated } ); ok("\x[9E09]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[9E09]" ~~ m/^<-isHangul>$/, q{Match unrelated internally inverted } ); ok("\x[9E09]\x[AC00]" ~~ m/<+isHangul>/, q{Match unanchored } ); # Hanunoo ok("\c[HANUNOO LETTER A]" ~~ m/^<+isHanunoo>$/, q{Match } ); ok("\c[HANUNOO LETTER A]" ~~ m/^<[A]+isHanunoo>$/, q{Match compound } ); ok(!( "\c[HANUNOO LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[HANUNOO LETTER A]" ~~ m/^<[A]-isHanunoo>$/ ), q{Don't match compound inverted } ); ok(!( "\c[HANUNOO LETTER A]" ~~ m/^<-isHanunoo>$/ ), q{Don't match internally inverted } ); ok(!( "\x[580B]" ~~ m/^<+isHanunoo>$/ ), q{Don't match unrelated } ); ok("\x[580B]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[580B]" ~~ m/^<-isHanunoo>$/, q{Match unrelated internally inverted } ); ok("\x[580B]\c[HANUNOO LETTER A]" ~~ m/<+isHanunoo>/, q{Match unanchored } ); # Hebrew ok("\c[HEBREW LETTER ALEF]" ~~ m/^<+isHebrew>$/, q{Match } ); ok("\c[HEBREW LETTER ALEF]" ~~ m/^<[A]+isHebrew>$/, q{Match compound } ); ok(!( "\c[HEBREW LETTER ALEF]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[HEBREW LETTER ALEF]" ~~ m/^<[A]-isHebrew>$/ ), q{Don't match compound inverted } ); ok(!( "\c[HEBREW LETTER ALEF]" ~~ m/^<-isHebrew>$/ ), q{Don't match internally inverted } ); ok(!( "\x[62B4]" ~~ m/^<+isHebrew>$/ ), q{Don't match unrelated } ); ok("\x[62B4]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[62B4]" ~~ m/^<-isHebrew>$/, q{Match unrelated internally inverted } ); ok("\x[62B4]\c[HEBREW LETTER ALEF]" ~~ m/<+isHebrew>/, q{Match unanchored } ); # Hiragana ok("\c[HIRAGANA LETTER SMALL A]" ~~ m/^<+isHiragana>$/, q{Match } ); ok("\c[HIRAGANA LETTER SMALL A]" ~~ m/^<[A]+isHiragana>$/, q{Match compound } ); ok(!( "\c[HIRAGANA LETTER SMALL A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[HIRAGANA LETTER SMALL A]" ~~ m/^<[A]-isHiragana>$/ ), q{Don't match compound inverted } ); ok(!( "\c[HIRAGANA LETTER SMALL A]" ~~ m/^<-isHiragana>$/ ), q{Don't match internally inverted } ); ok(!( "\x[9504]" ~~ m/^<+isHiragana>$/ ), q{Don't match unrelated } ); ok("\x[9504]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[9504]" ~~ m/^<-isHiragana>$/, q{Match unrelated internally inverted } ); ok("\x[9504]\c[HIRAGANA LETTER SMALL A]" ~~ m/<+isHiragana>/, q{Match unanchored } ); # Inherited ok("\c[MONGOLIAN FREE VARIATION SELECTOR ONE]" ~~ m/^<+isInherited>$/, q{Match } ); ok("\c[MONGOLIAN FREE VARIATION SELECTOR ONE]" ~~ m/^<[A]+isInherited>$/, q{Match compound } ); ok(!( "\c[MONGOLIAN FREE VARIATION SELECTOR ONE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[MONGOLIAN FREE VARIATION SELECTOR ONE]" ~~ m/^<[A]-isInherited>$/ ), q{Don't match compound inverted } ); ok(!( "\c[MONGOLIAN FREE VARIATION SELECTOR ONE]" ~~ m/^<-isInherited>$/ ), q{Don't match internally inverted } ); ok(!( "\c[TAMIL LETTER RRA]" ~~ m/^<+isInherited>$/ ), q{Don't match unrelated } ); ok("\c[TAMIL LETTER RRA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[TAMIL LETTER RRA]" ~~ m/^<-isInherited>$/, q{Match unrelated internally inverted } ); ok("\c[TAMIL LETTER RRA]\c[MONGOLIAN FREE VARIATION SELECTOR ONE]" ~~ m/<+isInherited>/, q{Match unanchored } ); # Kannada ok("\c[KANNADA SIGN ANUSVARA]" ~~ m/^<+isKannada>$/, q{Match } ); ok("\c[KANNADA SIGN ANUSVARA]" ~~ m/^<[A]+isKannada>$/, q{Match compound } ); ok(!( "\c[KANNADA SIGN ANUSVARA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[KANNADA SIGN ANUSVARA]" ~~ m/^<[A]-isKannada>$/ ), q{Don't match compound inverted } ); ok(!( "\c[KANNADA SIGN ANUSVARA]" ~~ m/^<-isKannada>$/ ), q{Don't match internally inverted } ); ok(!( "\c[BLACK RIGHT-POINTING SMALL TRIANGLE]" ~~ m/^<+isKannada>$/ ), q{Don't match unrelated } ); ok("\c[BLACK RIGHT-POINTING SMALL TRIANGLE]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[BLACK RIGHT-POINTING SMALL TRIANGLE]" ~~ m/^<-isKannada>$/, q{Match unrelated internally inverted } ); ok("\c[BLACK RIGHT-POINTING SMALL TRIANGLE]\c[KANNADA SIGN ANUSVARA]" ~~ m/<+isKannada>/, q{Match unanchored } ); # Katakana ok("\c[KATAKANA LETTER SMALL A]" ~~ m/^<+isKatakana>$/, q{Match } ); ok("\c[KATAKANA LETTER SMALL A]" ~~ m/^<[A]+isKatakana>$/, q{Match compound } ); ok(!( "\c[KATAKANA LETTER SMALL A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[KATAKANA LETTER SMALL A]" ~~ m/^<[A]-isKatakana>$/ ), q{Don't match compound inverted } ); ok(!( "\c[KATAKANA LETTER SMALL A]" ~~ m/^<-isKatakana>$/ ), q{Don't match internally inverted } ); ok(!( "\x[40DB]" ~~ m/^<+isKatakana>$/ ), q{Don't match unrelated } ); ok("\x[40DB]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[40DB]" ~~ m/^<-isKatakana>$/, q{Match unrelated internally inverted } ); ok("\x[40DB]\c[KATAKANA LETTER SMALL A]" ~~ m/<+isKatakana>/, q{Match unanchored } ); # Khmer ok("\c[KHMER LETTER KA]" ~~ m/^<+isKhmer>$/, q{Match } ); ok("\c[KHMER LETTER KA]" ~~ m/^<[A]+isKhmer>$/, q{Match compound } ); ok(!( "\c[KHMER LETTER KA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[KHMER LETTER KA]" ~~ m/^<[A]-isKhmer>$/ ), q{Don't match compound inverted } ); ok(!( "\c[KHMER LETTER KA]" ~~ m/^<-isKhmer>$/ ), q{Don't match internally inverted } ); ok(!( "\x[AC3E]" ~~ m/^<+isKhmer>$/ ), q{Don't match unrelated } ); ok("\x[AC3E]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[AC3E]" ~~ m/^<-isKhmer>$/, q{Match unrelated internally inverted } ); ok("\x[AC3E]\c[KHMER LETTER KA]" ~~ m/<+isKhmer>/, q{Match unanchored } ); # Lao ok("\c[LAO LETTER KO]" ~~ m/^<+isLao>$/, q{Match } ); ok("\c[LAO LETTER KO]" ~~ m/^<[A]+isLao>$/, q{Match compound } ); ok(!( "\c[LAO LETTER KO]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LAO LETTER KO]" ~~ m/^<[A]-isLao>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LAO LETTER KO]" ~~ m/^<-isLao>$/ ), q{Don't match internally inverted } ); ok(!( "\c[MODIFIER LETTER UNASPIRATED]" ~~ m/^<+isLao>$/ ), q{Don't match unrelated } ); ok("\c[MODIFIER LETTER UNASPIRATED]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[MODIFIER LETTER UNASPIRATED]" ~~ m/^<-isLao>$/, q{Match unrelated internally inverted } ); ok(!( "\c[MODIFIER LETTER DOUBLE APOSTROPHE]" ~~ m/^<+isLao>$/ ), q{Don't match related } ); ok("\c[MODIFIER LETTER DOUBLE APOSTROPHE]" ~~ m/^<-isLao>$/, q{Match related internally inverted } ); ok("\c[MODIFIER LETTER DOUBLE APOSTROPHE]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\c[MODIFIER LETTER UNASPIRATED]\c[MODIFIER LETTER DOUBLE APOSTROPHE]\c[LAO LETTER KO]" ~~ m/<+isLao>/, q{Match unanchored } ); # Latin ok("\c[LATIN CAPITAL LETTER A]" ~~ m/^<+isLatin>$/, q{Match } ); ok("\c[LATIN CAPITAL LETTER A]" ~~ m/^<[A]+isLatin>$/, q{Match compound } ); ok(!( "\c[LATIN CAPITAL LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LATIN CAPITAL LETTER A]" ~~ m/^<[A]-isLatin>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LATIN CAPITAL LETTER A]" ~~ m/^<-isLatin>$/ ), q{Don't match internally inverted } ); ok(!( "\x[6B4C]" ~~ m/^<+isLatin>$/ ), q{Don't match unrelated } ); ok("\x[6B4C]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[6B4C]" ~~ m/^<-isLatin>$/, q{Match unrelated internally inverted } ); ok(!( "\x[6B4C]" ~~ m/^<+isLatin>$/ ), q{Don't match related } ); ok("\x[6B4C]" ~~ m/^<-isLatin>$/, q{Match related internally inverted } ); ok("\x[6B4C]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[6B4C]\x[6B4C]\c[LATIN CAPITAL LETTER A]" ~~ m/<+isLatin>/, q{Match unanchored } ); # Malayalam ok("\c[MALAYALAM LETTER TA]" ~~ m/^<+isMalayalam>$/, q{Match } ); ok("\c[MALAYALAM LETTER TA]" ~~ m/^<[A]+isMalayalam>$/, q{Match compound } ); ok(!( "\c[MALAYALAM LETTER TA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[MALAYALAM LETTER TA]" ~~ m/^<[A]-isMalayalam>$/ ), q{Don't match compound inverted } ); ok(!( "\c[MALAYALAM LETTER TA]" ~~ m/^<-isMalayalam>$/ ), q{Don't match internally inverted } ); ok(!( "\x[0D29]" ~~ m/^<+isMalayalam>$/ ), q{Don't match unrelated } ); ok("\x[0D29]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[0D29]" ~~ m/^<-isMalayalam>$/, q{Match unrelated internally inverted } ); ok(!( "\c[SINHALA SIGN ANUSVARAYA]" ~~ m/^<+isMalayalam>$/ ), q{Don't match related } ); ok("\c[SINHALA SIGN ANUSVARAYA]" ~~ m/^<-isMalayalam>$/, q{Match related internally inverted } ); ok("\c[SINHALA SIGN ANUSVARAYA]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[0D29]\c[SINHALA SIGN ANUSVARAYA]\c[MALAYALAM LETTER TA]" ~~ m/<+isMalayalam>/, q{Match unanchored } ); # Mongolian ok("\c[MONGOLIAN DIGIT ZERO]" ~~ m/^<+isMongolian>$/, q{Match } ); ok("\c[MONGOLIAN DIGIT ZERO]" ~~ m/^<[A]+isMongolian>$/, q{Match compound } ); ok(!( "\c[MONGOLIAN DIGIT ZERO]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[MONGOLIAN DIGIT ZERO]" ~~ m/^<[A]-isMongolian>$/ ), q{Don't match compound inverted } ); ok(!( "\c[MONGOLIAN DIGIT ZERO]" ~~ m/^<-isMongolian>$/ ), q{Don't match internally inverted } ); ok(!( "\x[70C0]" ~~ m/^<+isMongolian>$/ ), q{Don't match unrelated } ); ok("\x[70C0]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[70C0]" ~~ m/^<-isMongolian>$/, q{Match unrelated internally inverted } ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^<+isMongolian>$/ ), q{Don't match related } ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^<-isMongolian>$/, q{Match related internally inverted } ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[70C0]\c[COMBINING GRAVE ACCENT]\c[MONGOLIAN DIGIT ZERO]" ~~ m/<+isMongolian>/, q{Match unanchored } ); # Myanmar ok("\c[MYANMAR LETTER KA]" ~~ m/^<+isMyanmar>$/, q{Match } ); ok("\c[MYANMAR LETTER KA]" ~~ m/^<[A]+isMyanmar>$/, q{Match compound } ); ok(!( "\c[MYANMAR LETTER KA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[MYANMAR LETTER KA]" ~~ m/^<[A]-isMyanmar>$/ ), q{Don't match compound inverted } ); ok(!( "\c[MYANMAR LETTER KA]" ~~ m/^<-isMyanmar>$/ ), q{Don't match internally inverted } ); ok(!( "\x[3CE3]" ~~ m/^<+isMyanmar>$/ ), q{Don't match unrelated } ); ok("\x[3CE3]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[3CE3]" ~~ m/^<-isMyanmar>$/, q{Match unrelated internally inverted } ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^<+isMyanmar>$/ ), q{Don't match related } ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^<-isMyanmar>$/, q{Match related internally inverted } ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[3CE3]\c[COMBINING GRAVE ACCENT]\c[MYANMAR LETTER KA]" ~~ m/<+isMyanmar>/, q{Match unanchored } ); # Ogham ok("\c[OGHAM LETTER BEITH]" ~~ m/^<+isOgham>$/, q{Match } ); ok("\c[OGHAM LETTER BEITH]" ~~ m/^<[A]+isOgham>$/, q{Match compound } ); ok(!( "\c[OGHAM LETTER BEITH]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[OGHAM LETTER BEITH]" ~~ m/^<[A]-isOgham>$/ ), q{Don't match compound inverted } ); ok(!( "\c[OGHAM LETTER BEITH]" ~~ m/^<-isOgham>$/ ), q{Don't match internally inverted } ); ok(!( "\x[077B]" ~~ m/^<+isOgham>$/ ), q{Don't match unrelated } ); ok("\x[077B]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[077B]" ~~ m/^<-isOgham>$/, q{Match unrelated internally inverted } ); ok("\x[077B]\c[OGHAM LETTER BEITH]" ~~ m/<+isOgham>/, q{Match unanchored } ); # OldItalic ok(!( "\x[562B]" ~~ m/^<+isOldItalic>$/ ), q{Don't match unrelated } ); ok("\x[562B]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[562B]" ~~ m/^<-isOldItalic>$/, q{Match unrelated internally inverted } ); # Oriya ok("\c[ORIYA SIGN CANDRABINDU]" ~~ m/^<+isOriya>$/, q{Match } ); ok("\c[ORIYA SIGN CANDRABINDU]" ~~ m/^<[A]+isOriya>$/, q{Match compound } ); ok(!( "\c[ORIYA SIGN CANDRABINDU]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[ORIYA SIGN CANDRABINDU]" ~~ m/^<[A]-isOriya>$/ ), q{Don't match compound inverted } ); ok(!( "\c[ORIYA SIGN CANDRABINDU]" ~~ m/^<-isOriya>$/ ), q{Don't match internally inverted } ); ok(!( "\x[3CE7]" ~~ m/^<+isOriya>$/ ), q{Don't match unrelated } ); ok("\x[3CE7]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[3CE7]" ~~ m/^<-isOriya>$/, q{Match unrelated internally inverted } ); ok("\x[3CE7]\c[ORIYA SIGN CANDRABINDU]" ~~ m/<+isOriya>/, q{Match unanchored } ); # Runic ok("\c[RUNIC LETTER FEHU FEOH FE F]" ~~ m/^<+isRunic>$/, q{Match } ); ok("\c[RUNIC LETTER FEHU FEOH FE F]" ~~ m/^<[A]+isRunic>$/, q{Match compound } ); ok(!( "\c[RUNIC LETTER FEHU FEOH FE F]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[RUNIC LETTER FEHU FEOH FE F]" ~~ m/^<[A]-isRunic>$/ ), q{Don't match compound inverted } ); ok(!( "\c[RUNIC LETTER FEHU FEOH FE F]" ~~ m/^<-isRunic>$/ ), q{Don't match internally inverted } ); ok(!( "\c[BLACK HEART SUIT]" ~~ m/^<+isRunic>$/ ), q{Don't match unrelated } ); ok("\c[BLACK HEART SUIT]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[BLACK HEART SUIT]" ~~ m/^<-isRunic>$/, q{Match unrelated internally inverted } ); ok("\c[BLACK HEART SUIT]\c[RUNIC LETTER FEHU FEOH FE F]" ~~ m/<+isRunic>/, q{Match unanchored } ); # Sinhala ok("\c[SINHALA SIGN ANUSVARAYA]" ~~ m/^<+isSinhala>$/, q{Match } ); ok("\c[SINHALA SIGN ANUSVARAYA]" ~~ m/^<[A]+isSinhala>$/, q{Match compound } ); ok(!( "\c[SINHALA SIGN ANUSVARAYA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[SINHALA SIGN ANUSVARAYA]" ~~ m/^<[A]-isSinhala>$/ ), q{Don't match compound inverted } ); ok(!( "\c[SINHALA SIGN ANUSVARAYA]" ~~ m/^<-isSinhala>$/ ), q{Don't match internally inverted } ); ok(!( "\c[MYANMAR VOWEL SIGN II]" ~~ m/^<+isSinhala>$/ ), q{Don't match unrelated } ); ok("\c[MYANMAR VOWEL SIGN II]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[MYANMAR VOWEL SIGN II]" ~~ m/^<-isSinhala>$/, q{Match unrelated internally inverted } ); ok(!( "\c[KHMER CURRENCY SYMBOL RIEL]" ~~ m/^<+isSinhala>$/ ), q{Don't match related } ); ok("\c[KHMER CURRENCY SYMBOL RIEL]" ~~ m/^<-isSinhala>$/, q{Match related internally inverted } ); ok("\c[KHMER CURRENCY SYMBOL RIEL]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\c[MYANMAR VOWEL SIGN II]\c[KHMER CURRENCY SYMBOL RIEL]\c[SINHALA SIGN ANUSVARAYA]" ~~ m/<+isSinhala>/, q{Match unanchored } ); # Syriac ok("\c[SYRIAC LETTER ALAPH]" ~~ m/^<+isSyriac>$/, q{Match } ); ok("\c[SYRIAC LETTER ALAPH]" ~~ m/^<[A]+isSyriac>$/, q{Match compound } ); ok(!( "\c[SYRIAC LETTER ALAPH]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[SYRIAC LETTER ALAPH]" ~~ m/^<[A]-isSyriac>$/ ), q{Don't match compound inverted } ); ok(!( "\c[SYRIAC LETTER ALAPH]" ~~ m/^<-isSyriac>$/ ), q{Don't match internally inverted } ); ok(!( "\x[7BAA]" ~~ m/^<+isSyriac>$/ ), q{Don't match unrelated } ); ok("\x[7BAA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[7BAA]" ~~ m/^<-isSyriac>$/, q{Match unrelated internally inverted } ); ok(!( "\c[YI RADICAL QOT]" ~~ m/^<+isSyriac>$/ ), q{Don't match related } ); ok("\c[YI RADICAL QOT]" ~~ m/^<-isSyriac>$/, q{Match related internally inverted } ); ok("\c[YI RADICAL QOT]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[7BAA]\c[YI RADICAL QOT]\c[SYRIAC LETTER ALAPH]" ~~ m/<+isSyriac>/, q{Match unanchored } ); # Tagalog ok("\c[TAGALOG LETTER A]" ~~ m/^<+isTagalog>$/, q{Match } ); ok("\c[TAGALOG LETTER A]" ~~ m/^<[A]+isTagalog>$/, q{Match compound } ); ok(!( "\c[TAGALOG LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[TAGALOG LETTER A]" ~~ m/^<[A]-isTagalog>$/ ), q{Don't match compound inverted } ); ok(!( "\c[TAGALOG LETTER A]" ~~ m/^<-isTagalog>$/ ), q{Don't match internally inverted } ); ok(!( "\x[50F2]" ~~ m/^<+isTagalog>$/ ), q{Don't match unrelated } ); ok("\x[50F2]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[50F2]" ~~ m/^<-isTagalog>$/, q{Match unrelated internally inverted } ); ok("\x[50F2]\c[TAGALOG LETTER A]" ~~ m/<+isTagalog>/, q{Match unanchored } ); # Tagbanwa ok("\c[TAGBANWA LETTER A]" ~~ m/^<+isTagbanwa>$/, q{Match } ); ok("\c[TAGBANWA LETTER A]" ~~ m/^<[A]+isTagbanwa>$/, q{Match compound } ); ok(!( "\c[TAGBANWA LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[TAGBANWA LETTER A]" ~~ m/^<[A]-isTagbanwa>$/ ), q{Don't match compound inverted } ); ok(!( "\c[TAGBANWA LETTER A]" ~~ m/^<-isTagbanwa>$/ ), q{Don't match internally inverted } ); ok(!( "\x[8843]" ~~ m/^<+isTagbanwa>$/ ), q{Don't match unrelated } ); ok("\x[8843]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[8843]" ~~ m/^<-isTagbanwa>$/, q{Match unrelated internally inverted } ); ok("\x[8843]\c[TAGBANWA LETTER A]" ~~ m/<+isTagbanwa>/, q{Match unanchored } ); # Tamil ok("\c[TAMIL SIGN ANUSVARA]" ~~ m/^<+isTamil>$/, q{Match } ); ok("\c[TAMIL SIGN ANUSVARA]" ~~ m/^<[A]+isTamil>$/, q{Match compound } ); ok(!( "\c[TAMIL SIGN ANUSVARA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[TAMIL SIGN ANUSVARA]" ~~ m/^<[A]-isTamil>$/ ), q{Don't match compound inverted } ); ok(!( "\c[TAMIL SIGN ANUSVARA]" ~~ m/^<-isTamil>$/ ), q{Don't match internally inverted } ); ok(!( "\x[76C0]" ~~ m/^<+isTamil>$/ ), q{Don't match unrelated } ); ok("\x[76C0]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[76C0]" ~~ m/^<-isTamil>$/, q{Match unrelated internally inverted } ); ok("\x[76C0]\c[TAMIL SIGN ANUSVARA]" ~~ m/<+isTamil>/, q{Match unanchored } ); # Telugu ok("\c[TELUGU SIGN CANDRABINDU]" ~~ m/^<+isTelugu>$/, q{Match } ); ok("\c[TELUGU SIGN CANDRABINDU]" ~~ m/^<[A]+isTelugu>$/, q{Match compound } ); ok(!( "\c[TELUGU SIGN CANDRABINDU]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[TELUGU SIGN CANDRABINDU]" ~~ m/^<[A]-isTelugu>$/ ), q{Don't match compound inverted } ); ok(!( "\c[TELUGU SIGN CANDRABINDU]" ~~ m/^<-isTelugu>$/ ), q{Don't match internally inverted } ); ok(!( "\x[60BD]" ~~ m/^<+isTelugu>$/ ), q{Don't match unrelated } ); ok("\x[60BD]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[60BD]" ~~ m/^<-isTelugu>$/, q{Match unrelated internally inverted } ); ok("\x[60BD]\c[TELUGU SIGN CANDRABINDU]" ~~ m/<+isTelugu>/, q{Match unanchored } ); # Thaana ok("\c[THAANA LETTER HAA]" ~~ m/^<+isThaana>$/, q{Match } ); ok("\c[THAANA LETTER HAA]" ~~ m/^<[A]+isThaana>$/, q{Match compound } ); ok(!( "\c[THAANA LETTER HAA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[THAANA LETTER HAA]" ~~ m/^<[A]-isThaana>$/ ), q{Don't match compound inverted } ); ok(!( "\c[THAANA LETTER HAA]" ~~ m/^<-isThaana>$/ ), q{Don't match internally inverted } ); ok(!( "\x[2E74]" ~~ m/^<+isThaana>$/ ), q{Don't match unrelated } ); ok("\x[2E74]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[2E74]" ~~ m/^<-isThaana>$/, q{Match unrelated internally inverted } ); ok("\x[2E74]\c[THAANA LETTER HAA]" ~~ m/<+isThaana>/, q{Match unanchored } ); # Thai ok("\c[THAI CHARACTER KO KAI]" ~~ m/^<+isThai>$/, q{Match } ); ok("\c[THAI CHARACTER KO KAI]" ~~ m/^<[A]+isThai>$/, q{Match compound } ); ok(!( "\c[THAI CHARACTER KO KAI]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[THAI CHARACTER KO KAI]" ~~ m/^<[A]-isThai>$/ ), q{Don't match compound inverted } ); ok(!( "\c[THAI CHARACTER KO KAI]" ~~ m/^<-isThai>$/ ), q{Don't match internally inverted } ); ok(!( "\x[A929]" ~~ m/^<+isThai>$/ ), q{Don't match unrelated } ); ok("\x[A929]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[A929]" ~~ m/^<-isThai>$/, q{Match unrelated internally inverted } ); ok("\x[A929]\c[THAI CHARACTER KO KAI]" ~~ m/<+isThai>/, q{Match unanchored } ); # Tibetan ok("\c[TIBETAN SYLLABLE OM]" ~~ m/^<+isTibetan>$/, q{Match } ); ok("\c[TIBETAN SYLLABLE OM]" ~~ m/^<[A]+isTibetan>$/, q{Match compound } ); ok(!( "\c[TIBETAN SYLLABLE OM]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[TIBETAN SYLLABLE OM]" ~~ m/^<[A]-isTibetan>$/ ), q{Don't match compound inverted } ); ok(!( "\c[TIBETAN SYLLABLE OM]" ~~ m/^<-isTibetan>$/ ), q{Don't match internally inverted } ); ok(!( "\x[19C9]" ~~ m/^<+isTibetan>$/ ), q{Don't match unrelated } ); ok("\x[19C9]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[19C9]" ~~ m/^<-isTibetan>$/, q{Match unrelated internally inverted } ); ok("\x[19C9]\c[TIBETAN SYLLABLE OM]" ~~ m/<+isTibetan>/, q{Match unanchored } ); # Yi ok("\c[YI SYLLABLE IT]" ~~ m/^<+isYi>$/, q{Match } ); ok("\c[YI SYLLABLE IT]" ~~ m/^<[A]+isYi>$/, q{Match compound } ); ok(!( "\c[YI SYLLABLE IT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[YI SYLLABLE IT]" ~~ m/^<[A]-isYi>$/ ), q{Don't match compound inverted } ); ok(!( "\c[YI SYLLABLE IT]" ~~ m/^<-isYi>$/ ), q{Don't match internally inverted } ); ok(!( "\x[3A38]" ~~ m/^<+isYi>$/ ), q{Don't match unrelated } ); ok("\x[3A38]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[3A38]" ~~ m/^<-isYi>$/, q{Match unrelated internally inverted } ); ok("\x[3A38]\c[YI SYLLABLE IT]" ~~ m/<+isYi>/, q{Match unanchored } ); # ASCIIHexDigit ok("\c[DIGIT ZERO]" ~~ m/^<+isASCIIHexDigit>$/, q{Match } ); ok("\c[DIGIT ZERO]" ~~ m/^<[A]+isASCIIHexDigit>$/, q{Match compound } ); ok(!( "\c[DIGIT ZERO]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[DIGIT ZERO]" ~~ m/^<[A]-isASCIIHexDigit>$/ ), q{Don't match compound inverted } ); ok(!( "\c[DIGIT ZERO]" ~~ m/^<-isASCIIHexDigit>$/ ), q{Don't match internally inverted } ); ok(!( "\x[55D7]" ~~ m/^<+isASCIIHexDigit>$/ ), q{Don't match unrelated } ); ok("\x[55D7]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[55D7]" ~~ m/^<-isASCIIHexDigit>$/, q{Match unrelated internally inverted } ); ok("\x[55D7]\c[DIGIT ZERO]" ~~ m/<+isASCIIHexDigit>/, q{Match unanchored } ); # Dash ok("\c[HYPHEN-MINUS]" ~~ m/^<+isDash>$/, q{Match } ); ok("\c[HYPHEN-MINUS]" ~~ m/^<[A]+isDash>$/, q{Match compound } ); ok(!( "\c[HYPHEN-MINUS]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[HYPHEN-MINUS]" ~~ m/^<[A]-isDash>$/ ), q{Don't match compound inverted } ); ok(!( "\c[HYPHEN-MINUS]" ~~ m/^<-isDash>$/ ), q{Don't match internally inverted } ); ok(!( "\x[4C7F]" ~~ m/^<+isDash>$/ ), q{Don't match unrelated } ); ok("\x[4C7F]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[4C7F]" ~~ m/^<-isDash>$/, q{Match unrelated internally inverted } ); ok("\x[4C7F]\c[HYPHEN-MINUS]" ~~ m/<+isDash>/, q{Match unanchored } ); # Diacritic ok("\c[CIRCUMFLEX ACCENT]" ~~ m/^<+isDiacritic>$/, q{Match } ); ok("\c[CIRCUMFLEX ACCENT]" ~~ m/^<[A]+isDiacritic>$/, q{Match compound } ); ok(!( "\c[CIRCUMFLEX ACCENT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[CIRCUMFLEX ACCENT]" ~~ m/^<[A]-isDiacritic>$/ ), q{Don't match compound inverted } ); ok(!( "\c[CIRCUMFLEX ACCENT]" ~~ m/^<-isDiacritic>$/ ), q{Don't match internally inverted } ); ok(!( "\x[398E]" ~~ m/^<+isDiacritic>$/ ), q{Don't match unrelated } ); ok("\x[398E]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[398E]" ~~ m/^<-isDiacritic>$/, q{Match unrelated internally inverted } ); ok("\x[398E]\c[CIRCUMFLEX ACCENT]" ~~ m/<+isDiacritic>/, q{Match unanchored } ); # Extender ok("\c[MIDDLE DOT]" ~~ m/^<+isExtender>$/, q{Match } ); ok("\c[MIDDLE DOT]" ~~ m/^<[A]+isExtender>$/, q{Match compound } ); ok(!( "\c[MIDDLE DOT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[MIDDLE DOT]" ~~ m/^<[A]-isExtender>$/ ), q{Don't match compound inverted } ); ok(!( "\c[MIDDLE DOT]" ~~ m/^<-isExtender>$/ ), q{Don't match internally inverted } ); ok(!( "\x[3F66]" ~~ m/^<+isExtender>$/ ), q{Don't match unrelated } ); ok("\x[3F66]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[3F66]" ~~ m/^<-isExtender>$/, q{Match unrelated internally inverted } ); ok("\x[3F66]\c[MIDDLE DOT]" ~~ m/<+isExtender>/, q{Match unanchored } ); # GraphemeLink ok("\c[COMBINING GRAPHEME JOINER]" ~~ m/^<+isGraphemeLink>$/, q{Match } ); ok("\c[COMBINING GRAPHEME JOINER]" ~~ m/^<[A]+isGraphemeLink>$/, q{Match compound } ); ok(!( "\c[COMBINING GRAPHEME JOINER]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[COMBINING GRAPHEME JOINER]" ~~ m/^<[A]-isGraphemeLink>$/ ), q{Don't match compound inverted } ); ok(!( "\c[COMBINING GRAPHEME JOINER]" ~~ m/^<-isGraphemeLink>$/ ), q{Don't match internally inverted } ); ok(!( "\x[34DA]" ~~ m/^<+isGraphemeLink>$/ ), q{Don't match unrelated } ); ok("\x[34DA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[34DA]" ~~ m/^<-isGraphemeLink>$/, q{Match unrelated internally inverted } ); ok("\x[34DA]\c[COMBINING GRAPHEME JOINER]" ~~ m/<+isGraphemeLink>/, q{Match unanchored } ); # HexDigit ok("\c[DIGIT ZERO]" ~~ m/^<+isHexDigit>$/, q{Match } ); ok("\c[DIGIT ZERO]" ~~ m/^<[A]+isHexDigit>$/, q{Match compound } ); ok(!( "\c[DIGIT ZERO]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[DIGIT ZERO]" ~~ m/^<[A]-isHexDigit>$/ ), q{Don't match compound inverted } ); ok(!( "\c[DIGIT ZERO]" ~~ m/^<-isHexDigit>$/ ), q{Don't match internally inverted } ); ok(!( "\x[D446]" ~~ m/^<+isHexDigit>$/ ), q{Don't match unrelated } ); ok("\x[D446]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[D446]" ~~ m/^<-isHexDigit>$/, q{Match unrelated internally inverted } ); ok("\x[D446]\c[DIGIT ZERO]" ~~ m/<+isHexDigit>/, q{Match unanchored } ); # Hyphen ok("\c[HYPHEN-MINUS]" ~~ m/^<+isHyphen>$/, q{Match } ); ok("\c[HYPHEN-MINUS]" ~~ m/^<[A]+isHyphen>$/, q{Match compound } ); ok(!( "\c[HYPHEN-MINUS]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[HYPHEN-MINUS]" ~~ m/^<[A]-isHyphen>$/ ), q{Don't match compound inverted } ); ok(!( "\c[HYPHEN-MINUS]" ~~ m/^<-isHyphen>$/ ), q{Don't match internally inverted } ); ok(!( "\c[YI SYLLABLE WOX]" ~~ m/^<+isHyphen>$/ ), q{Don't match unrelated } ); ok("\c[YI SYLLABLE WOX]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[YI SYLLABLE WOX]" ~~ m/^<-isHyphen>$/, q{Match unrelated internally inverted } ); ok("\c[YI SYLLABLE WOX]\c[HYPHEN-MINUS]" ~~ m/<+isHyphen>/, q{Match unanchored } ); # Ideographic ok("\c[IDEOGRAPHIC CLOSING MARK]" ~~ m/^<+isIdeographic>$/, q{Match } ); ok("\c[IDEOGRAPHIC CLOSING MARK]" ~~ m/^<[A]+isIdeographic>$/, q{Match compound } ); ok(!( "\c[IDEOGRAPHIC CLOSING MARK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[IDEOGRAPHIC CLOSING MARK]" ~~ m/^<[A]-isIdeographic>$/ ), q{Don't match compound inverted } ); ok(!( "\c[IDEOGRAPHIC CLOSING MARK]" ~~ m/^<-isIdeographic>$/ ), q{Don't match internally inverted } ); ok(!( "\x[CB86]" ~~ m/^<+isIdeographic>$/ ), q{Don't match unrelated } ); ok("\x[CB86]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[CB86]" ~~ m/^<-isIdeographic>$/, q{Match unrelated internally inverted } ); ok("\x[CB86]\c[IDEOGRAPHIC CLOSING MARK]" ~~ m/<+isIdeographic>/, q{Match unanchored } ); # IDSBinaryOperator ok("\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT]" ~~ m/^<+isIDSBinaryOperator>$/, q{Match } ); ok("\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT]" ~~ m/^<[A]+isIDSBinaryOperator>$/, q{Match compound } ); ok(!( "\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT]" ~~ m/^<[A]-isIDSBinaryOperator>$/ ), q{Don't match compound inverted } ); ok(!( "\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT]" ~~ m/^<-isIDSBinaryOperator>$/ ), q{Don't match internally inverted } ); ok(!( "\x[54A0]" ~~ m/^<+isIDSBinaryOperator>$/ ), q{Don't match unrelated } ); ok("\x[54A0]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[54A0]" ~~ m/^<-isIDSBinaryOperator>$/, q{Match unrelated internally inverted } ); ok("\x[54A0]\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT]" ~~ m/<+isIDSBinaryOperator>/, q{Match unanchored } ); # IDSTrinaryOperator ok("\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT]" ~~ m/^<+isIDSTrinaryOperator>$/, q{Match } ); ok("\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT]" ~~ m/^<[A]+isIDSTrinaryOperator>$/, q{Match compound } ); ok(!( "\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT]" ~~ m/^<[A]-isIDSTrinaryOperator>$/ ), q{Don't match compound inverted } ); ok(!( "\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT]" ~~ m/^<-isIDSTrinaryOperator>$/ ), q{Don't match internally inverted } ); ok(!( "\x[4900]" ~~ m/^<+isIDSTrinaryOperator>$/ ), q{Don't match unrelated } ); ok("\x[4900]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[4900]" ~~ m/^<-isIDSTrinaryOperator>$/, q{Match unrelated internally inverted } ); ok("\x[4900]\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT]" ~~ m/<+isIDSTrinaryOperator>/, q{Match unanchored } ); # JoinControl ok("\c[ZERO WIDTH NON-JOINER]" ~~ m/^<+isJoinControl>$/, q{Match } ); ok("\c[ZERO WIDTH NON-JOINER]" ~~ m/^<[A]+isJoinControl>$/, q{Match compound } ); ok(!( "\c[ZERO WIDTH NON-JOINER]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[ZERO WIDTH NON-JOINER]" ~~ m/^<[A]-isJoinControl>$/ ), q{Don't match compound inverted } ); ok(!( "\c[ZERO WIDTH NON-JOINER]" ~~ m/^<-isJoinControl>$/ ), q{Don't match internally inverted } ); ok(!( "\c[CYRILLIC CAPITAL LETTER OT]" ~~ m/^<+isJoinControl>$/ ), q{Don't match unrelated } ); ok("\c[CYRILLIC CAPITAL LETTER OT]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[CYRILLIC CAPITAL LETTER OT]" ~~ m/^<-isJoinControl>$/, q{Match unrelated internally inverted } ); ok("\c[CYRILLIC CAPITAL LETTER OT]\c[ZERO WIDTH NON-JOINER]" ~~ m/<+isJoinControl>/, q{Match unanchored } ); # LogicalOrderException ok("\c[THAI CHARACTER SARA E]" ~~ m/^<+isLogicalOrderException>$/, q{Match } ); ok("\c[THAI CHARACTER SARA E]" ~~ m/^<[A]+isLogicalOrderException>$/, q{Match compound } ); ok(!( "\c[THAI CHARACTER SARA E]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[THAI CHARACTER SARA E]" ~~ m/^<[A]-isLogicalOrderException>$/ ), q{Don't match compound inverted } ); ok(!( "\c[THAI CHARACTER SARA E]" ~~ m/^<-isLogicalOrderException>$/ ), q{Don't match internally inverted } ); ok(!( "\x[88D2]" ~~ m/^<+isLogicalOrderException>$/ ), q{Don't match unrelated } ); ok("\x[88D2]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[88D2]" ~~ m/^<-isLogicalOrderException>$/, q{Match unrelated internally inverted } ); ok(!( "\x[88D2]" ~~ m/^<+isLogicalOrderException>$/ ), q{Don't match related } ); ok("\x[88D2]" ~~ m/^<-isLogicalOrderException>$/, q{Match related internally inverted } ); ok("\x[88D2]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\x[88D2]\x[88D2]\c[THAI CHARACTER SARA E]" ~~ m/<+isLogicalOrderException>/, q{Match unanchored } ); # NoncharacterCodePoint ok(!( "\c[CIRCLED HANGUL NIEUN A]" ~~ m/^<+isNoncharacterCodePoint>$/ ), q{Don't match unrelated } ); ok("\c[CIRCLED HANGUL NIEUN A]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[CIRCLED HANGUL NIEUN A]" ~~ m/^<-isNoncharacterCodePoint>$/, q{Match unrelated internally inverted } ); ok(!( "\c[CIRCLED IDEOGRAPH ONE]" ~~ m/^<+isNoncharacterCodePoint>$/ ), q{Don't match related } ); ok("\c[CIRCLED IDEOGRAPH ONE]" ~~ m/^<-isNoncharacterCodePoint>$/, q{Match related internally inverted } ); ok("\c[CIRCLED IDEOGRAPH ONE]" ~~ m/^.$/, q{Match related externally inverted } ); # OtherAlphabetic ok("\c[COMBINING GREEK YPOGEGRAMMENI]" ~~ m/^<+isOtherAlphabetic>$/, q{Match } ); ok("\c[COMBINING GREEK YPOGEGRAMMENI]" ~~ m/^<[A]+isOtherAlphabetic>$/, q{Match compound } ); ok(!( "\c[COMBINING GREEK YPOGEGRAMMENI]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[COMBINING GREEK YPOGEGRAMMENI]" ~~ m/^<[A]-isOtherAlphabetic>$/ ), q{Don't match compound inverted } ); ok(!( "\c[COMBINING GREEK YPOGEGRAMMENI]" ~~ m/^<-isOtherAlphabetic>$/ ), q{Don't match internally inverted } ); ok(!( "\x[7B02]" ~~ m/^<+isOtherAlphabetic>$/ ), q{Don't match unrelated } ); ok("\x[7B02]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[7B02]" ~~ m/^<-isOtherAlphabetic>$/, q{Match unrelated internally inverted } ); ok("\x[7B02]\c[COMBINING GREEK YPOGEGRAMMENI]" ~~ m/<+isOtherAlphabetic>/, q{Match unanchored } ); # OtherDefaultIgnorableCodePoint ok("\c[COMBINING GRAPHEME JOINER]" ~~ m/^<+isOtherDefaultIgnorableCodePoint>$/, q{Match } ); ok("\c[COMBINING GRAPHEME JOINER]" ~~ m/^<[A]+isOtherDefaultIgnorableCodePoint>$/, q{Match compound } ); ok(!( "\c[COMBINING GRAPHEME JOINER]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[COMBINING GRAPHEME JOINER]" ~~ m/^<[A]-isOtherDefaultIgnorableCodePoint>$/ ), q{Don't match compound inverted } ); ok(!( "\c[COMBINING GRAPHEME JOINER]" ~~ m/^<-isOtherDefaultIgnorableCodePoint>$/ ), q{Don't match internally inverted } ); ok(!( "\x[42DA]" ~~ m/^<+isOtherDefaultIgnorableCodePoint>$/ ), q{Don't match unrelated } ); ok("\x[42DA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[42DA]" ~~ m/^<-isOtherDefaultIgnorableCodePoint>$/, q{Match unrelated internally inverted } ); ok("\x[42DA]\c[COMBINING GRAPHEME JOINER]" ~~ m/<+isOtherDefaultIgnorableCodePoint>/, q{Match unanchored } ); # OtherGraphemeExtend ok("\c[BENGALI VOWEL SIGN AA]" ~~ m/^<+isOtherGraphemeExtend>$/, q{Match } ); ok("\c[BENGALI VOWEL SIGN AA]" ~~ m/^<[A]+isOtherGraphemeExtend>$/, q{Match compound } ); ok(!( "\c[BENGALI VOWEL SIGN AA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[BENGALI VOWEL SIGN AA]" ~~ m/^<[A]-isOtherGraphemeExtend>$/ ), q{Don't match compound inverted } ); ok(!( "\c[BENGALI VOWEL SIGN AA]" ~~ m/^<-isOtherGraphemeExtend>$/ ), q{Don't match internally inverted } ); ok(!( "\c[TAI LE LETTER KHA]" ~~ m/^<+isOtherGraphemeExtend>$/ ), q{Don't match unrelated } ); ok("\c[TAI LE LETTER KHA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[TAI LE LETTER KHA]" ~~ m/^<-isOtherGraphemeExtend>$/, q{Match unrelated internally inverted } ); ok("\c[TAI LE LETTER KHA]\c[BENGALI VOWEL SIGN AA]" ~~ m/<+isOtherGraphemeExtend>/, q{Match unanchored } ); # OtherLowercase ok("\c[MODIFIER LETTER SMALL H]" ~~ m/^<+isOtherLowercase>$/, q{Match } ); ok("\c[MODIFIER LETTER SMALL H]" ~~ m/^<[A]+isOtherLowercase>$/, q{Match compound } ); ok(!( "\c[MODIFIER LETTER SMALL H]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[MODIFIER LETTER SMALL H]" ~~ m/^<[A]-isOtherLowercase>$/ ), q{Don't match compound inverted } ); ok(!( "\c[MODIFIER LETTER SMALL H]" ~~ m/^<-isOtherLowercase>$/ ), q{Don't match internally inverted } ); ok(!( "\x[8153]" ~~ m/^<+isOtherLowercase>$/ ), q{Don't match unrelated } ); ok("\x[8153]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[8153]" ~~ m/^<-isOtherLowercase>$/, q{Match unrelated internally inverted } ); ok("\x[8153]\c[MODIFIER LETTER SMALL H]" ~~ m/<+isOtherLowercase>/, q{Match unanchored } ); # OtherMath ok("\c[LEFT PARENTHESIS]" ~~ m/^<+isOtherMath>$/, q{Match } ); ok("\c[LEFT PARENTHESIS]" ~~ m/^<[A]+isOtherMath>$/, q{Match compound } ); ok(!( "\c[LEFT PARENTHESIS]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LEFT PARENTHESIS]" ~~ m/^<[A]-isOtherMath>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LEFT PARENTHESIS]" ~~ m/^<-isOtherMath>$/ ), q{Don't match internally inverted } ); ok(!( "\x[6D2F]" ~~ m/^<+isOtherMath>$/ ), q{Don't match unrelated } ); ok("\x[6D2F]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[6D2F]" ~~ m/^<-isOtherMath>$/, q{Match unrelated internally inverted } ); ok("\x[6D2F]\c[LEFT PARENTHESIS]" ~~ m/<+isOtherMath>/, q{Match unanchored } ); # OtherUppercase ok("\c[ROMAN NUMERAL ONE]" ~~ m/^<+isOtherUppercase>$/, q{Match } ); ok("\c[ROMAN NUMERAL ONE]" ~~ m/^<[A]+isOtherUppercase>$/, q{Match compound } ); ok(!( "\c[ROMAN NUMERAL ONE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[ROMAN NUMERAL ONE]" ~~ m/^<[A]-isOtherUppercase>$/ ), q{Don't match compound inverted } ); ok(!( "\c[ROMAN NUMERAL ONE]" ~~ m/^<-isOtherUppercase>$/ ), q{Don't match internally inverted } ); ok(!( "\x[A746]" ~~ m/^<+isOtherUppercase>$/ ), q{Don't match unrelated } ); ok("\x[A746]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[A746]" ~~ m/^<-isOtherUppercase>$/, q{Match unrelated internally inverted } ); ok("\x[A746]\c[ROMAN NUMERAL ONE]" ~~ m/<+isOtherUppercase>/, q{Match unanchored } ); # QuotationMark ok("\c[LEFT SINGLE QUOTATION MARK]" ~~ m/^<+isQuotationMark>$/, q{Match } ); ok("\c[LEFT SINGLE QUOTATION MARK]" ~~ m/^<[A]+isQuotationMark>$/, q{Match compound } ); ok(!( "\c[LEFT SINGLE QUOTATION MARK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LEFT SINGLE QUOTATION MARK]" ~~ m/^<[A]-isQuotationMark>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LEFT SINGLE QUOTATION MARK]" ~~ m/^<-isQuotationMark>$/ ), q{Don't match internally inverted } ); ok(!( "\c[GURMUKHI VOWEL SIGN AI]" ~~ m/^<+isQuotationMark>$/ ), q{Don't match unrelated } ); ok("\c[GURMUKHI VOWEL SIGN AI]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[GURMUKHI VOWEL SIGN AI]" ~~ m/^<-isQuotationMark>$/, q{Match unrelated internally inverted } ); ok("\c[GURMUKHI VOWEL SIGN AI]\c[LEFT SINGLE QUOTATION MARK]" ~~ m/<+isQuotationMark>/, q{Match unanchored } ); # Radical ok("\c[CJK RADICAL REPEAT]" ~~ m/^<+isRadical>$/, q{Match } ); ok("\c[CJK RADICAL REPEAT]" ~~ m/^<[A]+isRadical>$/, q{Match compound } ); ok(!( "\c[CJK RADICAL REPEAT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[CJK RADICAL REPEAT]" ~~ m/^<[A]-isRadical>$/ ), q{Don't match compound inverted } ); ok(!( "\c[CJK RADICAL REPEAT]" ~~ m/^<-isRadical>$/ ), q{Don't match internally inverted } ); ok(!( "\c[RUNIC LETTER ETH]" ~~ m/^<+isRadical>$/ ), q{Don't match unrelated } ); ok("\c[RUNIC LETTER ETH]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[RUNIC LETTER ETH]" ~~ m/^<-isRadical>$/, q{Match unrelated internally inverted } ); ok("\c[RUNIC LETTER ETH]\c[CJK RADICAL REPEAT]" ~~ m/<+isRadical>/, q{Match unanchored } ); # SoftDotted ok("\c[LATIN SMALL LETTER I WITH TILDE BELOW]" ~~ m/^<+isSoftDotted>$/, q{Match } ); ok("\c[LATIN SMALL LETTER I WITH TILDE BELOW]" ~~ m/^<[A]+isSoftDotted>$/, q{Match compound } ); ok(!( "\c[LATIN SMALL LETTER I WITH TILDE BELOW]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LATIN SMALL LETTER I WITH TILDE BELOW]" ~~ m/^<[A]-isSoftDotted>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LATIN SMALL LETTER I WITH TILDE BELOW]" ~~ m/^<-isSoftDotted>$/ ), q{Don't match internally inverted } ); ok(!( "\c[LATIN CAPITAL LETTER B WITH DOT ABOVE]" ~~ m/^<+isSoftDotted>$/ ), q{Don't match unrelated } ); ok("\c[LATIN CAPITAL LETTER B WITH DOT ABOVE]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[LATIN CAPITAL LETTER B WITH DOT ABOVE]" ~~ m/^<-isSoftDotted>$/, q{Match unrelated internally inverted } ); ok(!( "\c[GREEK KORONIS]" ~~ m/^<+isSoftDotted>$/ ), q{Don't match related } ); ok("\c[GREEK KORONIS]" ~~ m/^<-isSoftDotted>$/, q{Match related internally inverted } ); ok("\c[GREEK KORONIS]" ~~ m/^.$/, q{Match related externally inverted } ); ok("\c[LATIN CAPITAL LETTER B WITH DOT ABOVE]\c[GREEK KORONIS]\c[LATIN SMALL LETTER I WITH TILDE BELOW]" ~~ m/<+isSoftDotted>/, q{Match unanchored } ); # TerminalPunctuation ok("\c[EXCLAMATION MARK]" ~~ m/^<+isTerminalPunctuation>$/, q{Match } ); ok("\c[EXCLAMATION MARK]" ~~ m/^<[A]+isTerminalPunctuation>$/, q{Match compound } ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<[A]-isTerminalPunctuation>$/ ), q{Don't match compound inverted } ); ok(!( "\c[EXCLAMATION MARK]" ~~ m/^<-isTerminalPunctuation>$/ ), q{Don't match internally inverted } ); ok(!( "\x[B43A]" ~~ m/^<+isTerminalPunctuation>$/ ), q{Don't match unrelated } ); ok("\x[B43A]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[B43A]" ~~ m/^<-isTerminalPunctuation>$/, q{Match unrelated internally inverted } ); ok("\x[B43A]\c[EXCLAMATION MARK]" ~~ m/<+isTerminalPunctuation>/, q{Match unanchored } ); # UnifiedIdeograph ok("\x[88D8]" ~~ m/^<+isUnifiedIdeograph>$/, q{Match } ); ok("\x[88D8]" ~~ m/^<[A]+isUnifiedIdeograph>$/, q{Match compound } ); ok(!( "\x[88D8]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[88D8]" ~~ m/^<[A]-isUnifiedIdeograph>$/ ), q{Don't match compound inverted } ); ok(!( "\x[88D8]" ~~ m/^<-isUnifiedIdeograph>$/ ), q{Don't match internally inverted } ); ok(!( "\x[9FA6]" ~~ m/^<+isUnifiedIdeograph>$/ ), q{Don't match unrelated } ); ok("\x[9FA6]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[9FA6]" ~~ m/^<-isUnifiedIdeograph>$/, q{Match unrelated internally inverted } ); ok("\x[9FA6]\x[88D8]" ~~ m/<+isUnifiedIdeograph>/, q{Match unanchored } ); # WhiteSpace ok("\c[CHARACTER TABULATION]" ~~ m/^<+isWhiteSpace>$/, q{Match } ); ok("\c[CHARACTER TABULATION]" ~~ m/^<[A]+isWhiteSpace>$/, q{Match compound } ); ok(!( "\c[CHARACTER TABULATION]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[CHARACTER TABULATION]" ~~ m/^<[A]-isWhiteSpace>$/ ), q{Don't match compound inverted } ); ok(!( "\c[CHARACTER TABULATION]" ~~ m/^<-isWhiteSpace>$/ ), q{Don't match internally inverted } ); ok(!( "\x[4345]" ~~ m/^<+isWhiteSpace>$/ ), q{Don't match unrelated } ); ok("\x[4345]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[4345]" ~~ m/^<-isWhiteSpace>$/, q{Match unrelated internally inverted } ); ok("\x[4345]\c[CHARACTER TABULATION]" ~~ m/<+isWhiteSpace>/, q{Match unanchored } ); # Alphabetic # Lu + Ll + Lt + Lm + Lo + OtherAlphabetic ok("\x[3816]" ~~ m/^<+isAlphabetic>$/, q{Match (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); ok("\x[3816]" ~~ m/^<[A]+isAlphabetic>$/, 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]-isAlphabetic>$/ ), q{Don't match compound inverted (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); ok(!( "\x[3816]" ~~ m/^<-isAlphabetic>$/ ), q{Don't match internally inverted (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); ok(!( "\x[4DB6]" ~~ m/^<+isAlphabetic>$/ ), 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/^<-isAlphabetic>$/, q{Match unrelated internally inverted (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); ok("\x[4DB6]\x[3816]" ~~ m/<+isAlphabetic>/, q{Match unanchored (Lu + Ll + Lt + Lm + Lo + OtherAlphabetic)} ); # Lowercase # Ll + OtherLowercase ok("\c[LATIN LETTER SMALL CAPITAL A]" ~~ m/^<+isLowercase>$/, q{Match (Ll + OtherLowercase)} ); ok("\c[LATIN LETTER SMALL CAPITAL A]" ~~ m/^<[A]+isLowercase>$/, q{Match compound (Ll + OtherLowercase)} ); ok(!( "\c[LATIN LETTER SMALL CAPITAL A]" ~~ m/^.$/ ), q{Don't match externally inverted (Ll + OtherLowercase)} ); ok(!( "\c[LATIN LETTER SMALL CAPITAL A]" ~~ m/^<[A]-isLowercase>$/ ), q{Don't match compound inverted (Ll + OtherLowercase)} ); ok(!( "\c[LATIN LETTER SMALL CAPITAL A]" ~~ m/^<-isLowercase>$/ ), q{Don't match internally inverted (Ll + OtherLowercase)} ); ok(!( "\x[0D3D]" ~~ m/^<+isLowercase>$/ ), q{Don't match unrelated (Ll + OtherLowercase)} ); ok("\x[0D3D]" ~~ m/^.$/, q{Match unrelated externally inverted (Ll + OtherLowercase)} ); ok("\x[0D3D]" ~~ m/^<-isLowercase>$/, q{Match unrelated internally inverted (Ll + OtherLowercase)} ); ok(!( "\c[MALAYALAM LETTER VOCALIC RR]" ~~ m/^<+isLowercase>$/ ), q{Don't match related (Ll + OtherLowercase)} ); ok("\c[MALAYALAM LETTER VOCALIC RR]" ~~ m/^<-isLowercase>$/, q{Match related internally inverted (Ll + OtherLowercase)} ); ok("\c[MALAYALAM LETTER VOCALIC RR]" ~~ m/^.$/, q{Match related externally inverted (Ll + OtherLowercase)} ); ok("\x[0D3D]\c[MALAYALAM LETTER VOCALIC RR]\c[LATIN LETTER SMALL CAPITAL A]" ~~ m/<+isLowercase>/, q{Match unanchored (Ll + OtherLowercase)} ); # Uppercase # Lu + OtherUppercase ok("\c[LATIN CAPITAL LETTER A]" ~~ m/^<+isUppercase>$/, q{Match (Lu + OtherUppercase)} ); ok("\c[LATIN CAPITAL LETTER A]" ~~ m/^<[A]+isUppercase>$/, q{Match compound (Lu + OtherUppercase)} ); ok(!( "\c[LATIN CAPITAL LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted (Lu + OtherUppercase)} ); ok(!( "\c[LATIN CAPITAL LETTER A]" ~~ m/^<[A]-isUppercase>$/ ), q{Don't match compound inverted (Lu + OtherUppercase)} ); ok(!( "\c[LATIN CAPITAL LETTER A]" ~~ m/^<-isUppercase>$/ ), q{Don't match internally inverted (Lu + OtherUppercase)} ); ok(!( "\x[C107]" ~~ m/^<+isUppercase>$/ ), q{Don't match unrelated (Lu + OtherUppercase)} ); ok("\x[C107]" ~~ m/^.$/, q{Match unrelated externally inverted (Lu + OtherUppercase)} ); ok("\x[C107]" ~~ m/^<-isUppercase>$/, q{Match unrelated internally inverted (Lu + OtherUppercase)} ); ok("\x[C107]\c[LATIN CAPITAL LETTER A]" ~~ m/<+isUppercase>/, q{Match unanchored (Lu + OtherUppercase)} ); # Math # Sm + OtherMath ok("\c[LEFT PARENTHESIS]" ~~ m/^<+isMath>$/, q{Match (Sm + OtherMath)} ); ok("\c[LEFT PARENTHESIS]" ~~ m/^<[A]+isMath>$/, q{Match compound (Sm + OtherMath)} ); ok(!( "\c[LEFT PARENTHESIS]" ~~ m/^.$/ ), q{Don't match externally inverted (Sm + OtherMath)} ); ok(!( "\c[LEFT PARENTHESIS]" ~~ m/^<[A]-isMath>$/ ), q{Don't match compound inverted (Sm + OtherMath)} ); ok(!( "\c[LEFT PARENTHESIS]" ~~ m/^<-isMath>$/ ), q{Don't match internally inverted (Sm + OtherMath)} ); ok(!( "\x[D73F]" ~~ m/^<+isMath>$/ ), q{Don't match unrelated (Sm + OtherMath)} ); ok("\x[D73F]" ~~ m/^.$/, q{Match unrelated externally inverted (Sm + OtherMath)} ); ok("\x[D73F]" ~~ m/^<-isMath>$/, q{Match unrelated internally inverted (Sm + OtherMath)} ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^<+isMath>$/ ), q{Don't match related (Sm + OtherMath)} ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^<-isMath>$/, q{Match related internally inverted (Sm + OtherMath)} ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^.$/, q{Match related externally inverted (Sm + OtherMath)} ); ok("\x[D73F]\c[COMBINING GRAVE ACCENT]\c[LEFT PARENTHESIS]" ~~ m/<+isMath>/, q{Match unanchored (Sm + OtherMath)} ); # ID_Start # Lu + Ll + Lt + Lm + Lo + Nl ok("\x[4E5B]" ~~ m/^<+isID_Start>$/, q{Match (Lu + Ll + Lt + Lm + Lo + Nl)} ); ok("\x[4E5B]" ~~ m/^<[A]+isID_Start>$/, 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]-isID_Start>$/ ), q{Don't match compound inverted (Lu + Ll + Lt + Lm + Lo + Nl)} ); ok(!( "\x[4E5B]" ~~ m/^<-isID_Start>$/ ), q{Don't match internally inverted (Lu + Ll + Lt + Lm + Lo + Nl)} ); ok(!( "\x[9FA6]" ~~ m/^<+isID_Start>$/ ), 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/^<-isID_Start>$/, q{Match unrelated internally inverted (Lu + Ll + Lt + Lm + Lo + Nl)} ); ok("\x[9FA6]\x[4E5B]" ~~ m/<+isID_Start>/, q{Match unanchored (Lu + Ll + Lt + Lm + Lo + Nl)} ); # ID_Continue # ID_Start + Mn + Mc + Nd + Pc ok("\c[IDEOGRAPHIC ITERATION MARK]" ~~ m/^<+isID_Continue>$/, q{Match (ID_Start + Mn + Mc + Nd + Pc)} ); ok("\c[IDEOGRAPHIC ITERATION MARK]" ~~ m/^<[A]+isID_Continue>$/, q{Match compound (ID_Start + Mn + Mc + Nd + Pc)} ); ok(!( "\c[IDEOGRAPHIC ITERATION MARK]" ~~ m/^.$/ ), q{Don't match externally inverted (ID_Start + Mn + Mc + Nd + Pc)} ); ok(!( "\c[IDEOGRAPHIC ITERATION MARK]" ~~ m/^<[A]-isID_Continue>$/ ), q{Don't match compound inverted (ID_Start + Mn + Mc + Nd + Pc)} ); ok(!( "\c[IDEOGRAPHIC ITERATION MARK]" ~~ m/^<-isID_Continue>$/ ), q{Don't match internally inverted (ID_Start + Mn + Mc + Nd + Pc)} ); ok(!( "\c[APL FUNCTIONAL SYMBOL UP TACK JOT]" ~~ m/^<+isID_Continue>$/ ), q{Don't match unrelated (ID_Start + Mn + Mc + Nd + Pc)} ); ok("\c[APL FUNCTIONAL SYMBOL UP TACK JOT]" ~~ m/^.$/, q{Match unrelated externally inverted (ID_Start + Mn + Mc + Nd + Pc)} ); ok("\c[APL FUNCTIONAL SYMBOL UP TACK JOT]" ~~ m/^<-isID_Continue>$/, q{Match unrelated internally inverted (ID_Start + Mn + Mc + Nd + Pc)} ); ok("\c[APL FUNCTIONAL SYMBOL UP TACK JOT]\c[IDEOGRAPHIC ITERATION MARK]" ~~ m/<+isID_Continue>/, q{Match unanchored (ID_Start + Mn + Mc + Nd + Pc)} ); # Any # Any character ok("\c[SYRIAC LETTER TAW]" ~~ m/^<+isAny>$/, q{Match (Any character)} ); ok("\c[SYRIAC LETTER TAW]" ~~ m/^<[A]+isAny>$/, q{Match compound (Any character)} ); ok(!( "\c[SYRIAC LETTER TAW]" ~~ m/^.$/ ), q{Don't match externally inverted (Any character)} ); ok(!( "\c[SYRIAC LETTER TAW]" ~~ m/^<[A]-isAny>$/ ), q{Don't match compound inverted (Any character)} ); ok(!( "\c[SYRIAC LETTER TAW]" ~~ m/^<-isAny>$/ ), q{Don't match internally inverted (Any character)} ); ok("\c[SYRIAC LETTER TAW]" ~~ m/<+isAny>/, q{Match unanchored (Any character)} ); # Assigned # Any non-Cn character (i.e. synonym for \P{Cn}) ok("\x[AC00]" ~~ m/^<+isAssigned>$/, q{Match (Any non-Cn character (i.e. synonym for \P{Cn}))} ); ok("\x[AC00]" ~~ m/^<[A]+isAssigned>$/, 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]-isAssigned>$/ ), q{Don't match compound inverted (Any non-Cn character (i.e. synonym for \P{Cn}))} ); ok(!( "\x[AC00]" ~~ m/^<-isAssigned>$/ ), q{Don't match internally inverted (Any non-Cn character (i.e. synonym for \P{Cn}))} ); ok(!( "\x[AB08]" ~~ m/^<+isAssigned>$/ ), 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/^<-isAssigned>$/, q{Match unrelated internally inverted (Any non-Cn character (i.e. synonym for \P{Cn}))} ); ok("\x[AB08]\x[AC00]" ~~ m/<+isAssigned>/, q{Match unanchored (Any non-Cn character (i.e. synonym for \P{Cn}))} ); # Unassigned # Synonym for \p{Cn} ok("\x[1738]" ~~ m/^<+isUnassigned>$/, q{Match (Synonym for \p{Cn})} ); ok("\x[1738]" ~~ m/^<[A]+isUnassigned>$/, 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]-isUnassigned>$/ ), q{Don't match compound inverted (Synonym for \p{Cn})} ); ok(!( "\x[1738]" ~~ m/^<-isUnassigned>$/ ), q{Don't match internally inverted (Synonym for \p{Cn})} ); ok(!( "\c[BUHID LETTER A]" ~~ m/^<+isUnassigned>$/ ), q{Don't match unrelated (Synonym for \p{Cn})} ); ok("\c[BUHID LETTER A]" ~~ m/^.$/, q{Match unrelated externally inverted (Synonym for \p{Cn})} ); ok("\c[BUHID LETTER A]" ~~ m/^<-isUnassigned>$/, q{Match unrelated internally inverted (Synonym for \p{Cn})} ); ok("\c[BUHID LETTER A]\x[1738]" ~~ m/<+isUnassigned>/, q{Match unanchored (Synonym for \p{Cn})} ); # Common # Codepoint not explicitly assigned to a script ok("\c[LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE]" ~~ m/^<+isCommon>$/, q{Match (Codepoint not explicitly assigned to a script)} ); ok("\c[LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE]" ~~ m/^<[A]+isCommon>$/, q{Match compound (Codepoint not explicitly assigned to a script)} ); ok(!( "\c[LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE]" ~~ m/^.$/ ), q{Don't match externally inverted (Codepoint not explicitly assigned to a script)} ); ok(!( "\c[LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE]" ~~ m/^<[A]-isCommon>$/ ), q{Don't match compound inverted (Codepoint not explicitly assigned to a script)} ); ok(!( "\c[LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE]" ~~ m/^<-isCommon>$/ ), q{Don't match internally inverted (Codepoint not explicitly assigned to a script)} ); ok(!( "\c[CJK RADICAL REPEAT]" ~~ m/^<+isCommon>$/ ), q{Don't match unrelated (Codepoint not explicitly assigned to a script)} ); ok("\c[CJK RADICAL REPEAT]" ~~ m/^.$/, q{Match unrelated externally inverted (Codepoint not explicitly assigned to a script)} ); ok("\c[CJK RADICAL REPEAT]" ~~ m/^<-isCommon>$/, q{Match unrelated internally inverted (Codepoint not explicitly assigned to a script)} ); ok(!( "\c[ARABIC END OF AYAH]" ~~ m/^<+isCommon>$/ ), q{Don't match related (Codepoint not explicitly assigned to a script)} ); ok("\c[ARABIC END OF AYAH]" ~~ m/^<-isCommon>$/, q{Match related internally inverted (Codepoint not explicitly assigned to a script)} ); ok("\c[ARABIC END OF AYAH]" ~~ m/^.$/, q{Match related externally inverted (Codepoint not explicitly assigned to a script)} ); ok("\c[CJK RADICAL REPEAT]\c[ARABIC END OF AYAH]\c[LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE]" ~~ m/<+isCommon>/, q{Match unanchored (Codepoint not explicitly assigned to a script)} ); # InAlphabeticPresentationForms ok(!( "\x[5A81]" ~~ m/^<+isInAlphabeticPresentationForms>$/ ), q{Don't match unrelated } ); ok("\x[5A81]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[5A81]" ~~ m/^<-isInAlphabeticPresentationForms>$/, q{Match unrelated internally inverted } ); # InArabic ok("\c[ARABIC NUMBER SIGN]" ~~ m/^<+isInArabic>$/, q{Match } ); ok("\c[ARABIC NUMBER SIGN]" ~~ m/^<[A]+isInArabic>$/, q{Match compound } ); ok(!( "\c[ARABIC NUMBER SIGN]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[ARABIC NUMBER SIGN]" ~~ m/^<[A]-isInArabic>$/ ), q{Don't match compound inverted } ); ok(!( "\c[ARABIC NUMBER SIGN]" ~~ m/^<-isInArabic>$/ ), q{Don't match internally inverted } ); ok(!( "\x[8D16]" ~~ m/^<+isInArabic>$/ ), q{Don't match unrelated } ); ok("\x[8D16]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[8D16]" ~~ m/^<-isInArabic>$/, q{Match unrelated internally inverted } ); ok("\x[8D16]\c[ARABIC NUMBER SIGN]" ~~ m/<+isInArabic>/, q{Match unanchored } ); # InArabicPresentationFormsA ok(!( "\x[C775]" ~~ m/^<+isInArabicPresentationFormsA>$/ ), q{Don't match unrelated } ); ok("\x[C775]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[C775]" ~~ m/^<-isInArabicPresentationFormsA>$/, q{Match unrelated internally inverted } ); # InArabicPresentationFormsB ok(!( "\x[B2EA]" ~~ m/^<+isInArabicPresentationFormsB>$/ ), q{Don't match unrelated } ); ok("\x[B2EA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[B2EA]" ~~ m/^<-isInArabicPresentationFormsB>$/, q{Match unrelated internally inverted } ); # InArmenian ok("\x[0530]" ~~ m/^<+isInArmenian>$/, q{Match } ); ok("\x[0530]" ~~ m/^<[A]+isInArmenian>$/, q{Match compound } ); ok(!( "\x[0530]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0530]" ~~ m/^<[A]-isInArmenian>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0530]" ~~ m/^<-isInArmenian>$/ ), q{Don't match internally inverted } ); ok(!( "\c[ETHIOPIC SYLLABLE QHWAA]" ~~ m/^<+isInArmenian>$/ ), q{Don't match unrelated } ); ok("\c[ETHIOPIC SYLLABLE QHWAA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[ETHIOPIC SYLLABLE QHWAA]" ~~ m/^<-isInArmenian>$/, q{Match unrelated internally inverted } ); ok("\c[ETHIOPIC SYLLABLE QHWAA]\x[0530]" ~~ m/<+isInArmenian>/, q{Match unanchored } ); # InArrows ok("\c[LEFTWARDS ARROW]" ~~ m/^<+isInArrows>$/, q{Match } ); ok("\c[LEFTWARDS ARROW]" ~~ m/^<[A]+isInArrows>$/, q{Match compound } ); ok(!( "\c[LEFTWARDS ARROW]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LEFTWARDS ARROW]" ~~ m/^<[A]-isInArrows>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LEFTWARDS ARROW]" ~~ m/^<-isInArrows>$/ ), q{Don't match internally inverted } ); ok(!( "\x[74FA]" ~~ m/^<+isInArrows>$/ ), q{Don't match unrelated } ); ok("\x[74FA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[74FA]" ~~ m/^<-isInArrows>$/, q{Match unrelated internally inverted } ); ok("\x[74FA]\c[LEFTWARDS ARROW]" ~~ m/<+isInArrows>/, q{Match unanchored } ); # InBasicLatin ok("\c[NULL]" ~~ m/^<+isInBasicLatin>$/, q{Match } ); ok("\c[NULL]" ~~ m/^<[A]+isInBasicLatin>$/, q{Match compound } ); ok(!( "\c[NULL]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[NULL]" ~~ m/^<[A]-isInBasicLatin>$/ ), q{Don't match compound inverted } ); ok(!( "\c[NULL]" ~~ m/^<-isInBasicLatin>$/ ), q{Don't match internally inverted } ); ok(!( "\x[ADFF]" ~~ m/^<+isInBasicLatin>$/ ), q{Don't match unrelated } ); ok("\x[ADFF]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[ADFF]" ~~ m/^<-isInBasicLatin>$/, q{Match unrelated internally inverted } ); ok("\x[ADFF]\c[NULL]" ~~ m/<+isInBasicLatin>/, q{Match unanchored } ); # InBengali ok("\x[0980]" ~~ m/^<+isInBengali>$/, q{Match } ); ok("\x[0980]" ~~ m/^<[A]+isInBengali>$/, q{Match compound } ); ok(!( "\x[0980]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0980]" ~~ m/^<[A]-isInBengali>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0980]" ~~ m/^<-isInBengali>$/ ), q{Don't match internally inverted } ); ok(!( "\x[3409]" ~~ m/^<+isInBengali>$/ ), q{Don't match unrelated } ); ok("\x[3409]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[3409]" ~~ m/^<-isInBengali>$/, q{Match unrelated internally inverted } ); ok("\x[3409]\x[0980]" ~~ m/<+isInBengali>/, q{Match unanchored } ); # InBlockElements ok("\c[UPPER HALF BLOCK]" ~~ m/^<+isInBlockElements>$/, q{Match } ); ok("\c[UPPER HALF BLOCK]" ~~ m/^<[A]+isInBlockElements>$/, q{Match compound } ); ok(!( "\c[UPPER HALF BLOCK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[UPPER HALF BLOCK]" ~~ m/^<[A]-isInBlockElements>$/ ), q{Don't match compound inverted } ); ok(!( "\c[UPPER HALF BLOCK]" ~~ m/^<-isInBlockElements>$/ ), q{Don't match internally inverted } ); ok(!( "\x[77B1]" ~~ m/^<+isInBlockElements>$/ ), q{Don't match unrelated } ); ok("\x[77B1]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[77B1]" ~~ m/^<-isInBlockElements>$/, q{Match unrelated internally inverted } ); ok("\x[77B1]\c[UPPER HALF BLOCK]" ~~ m/<+isInBlockElements>/, q{Match unanchored } ); # InBopomofo ok("\x[3100]" ~~ m/^<+isInBopomofo>$/, q{Match } ); ok("\x[3100]" ~~ m/^<[A]+isInBopomofo>$/, q{Match compound } ); ok(!( "\x[3100]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[3100]" ~~ m/^<[A]-isInBopomofo>$/ ), q{Don't match compound inverted } ); ok(!( "\x[3100]" ~~ m/^<-isInBopomofo>$/ ), q{Don't match internally inverted } ); ok(!( "\x[701E]" ~~ m/^<+isInBopomofo>$/ ), q{Don't match unrelated } ); ok("\x[701E]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[701E]" ~~ m/^<-isInBopomofo>$/, q{Match unrelated internally inverted } ); ok("\x[701E]\x[3100]" ~~ m/<+isInBopomofo>/, q{Match unanchored } ); # InBopomofoExtended ok("\c[BOPOMOFO LETTER BU]" ~~ m/^<+isInBopomofoExtended>$/, q{Match } ); ok("\c[BOPOMOFO LETTER BU]" ~~ m/^<[A]+isInBopomofoExtended>$/, q{Match compound } ); ok(!( "\c[BOPOMOFO LETTER BU]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[BOPOMOFO LETTER BU]" ~~ m/^<[A]-isInBopomofoExtended>$/ ), q{Don't match compound inverted } ); ok(!( "\c[BOPOMOFO LETTER BU]" ~~ m/^<-isInBopomofoExtended>$/ ), q{Don't match internally inverted } ); ok(!( "\c[YI SYLLABLE TIE]" ~~ m/^<+isInBopomofoExtended>$/ ), q{Don't match unrelated } ); ok("\c[YI SYLLABLE TIE]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[YI SYLLABLE TIE]" ~~ m/^<-isInBopomofoExtended>$/, q{Match unrelated internally inverted } ); ok("\c[YI SYLLABLE TIE]\c[BOPOMOFO LETTER BU]" ~~ m/<+isInBopomofoExtended>/, q{Match unanchored } ); # InBoxDrawing ok("\c[BOX DRAWINGS LIGHT HORIZONTAL]" ~~ m/^<+isInBoxDrawing>$/, q{Match } ); ok("\c[BOX DRAWINGS LIGHT HORIZONTAL]" ~~ m/^<[A]+isInBoxDrawing>$/, q{Match compound } ); ok(!( "\c[BOX DRAWINGS LIGHT HORIZONTAL]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[BOX DRAWINGS LIGHT HORIZONTAL]" ~~ m/^<[A]-isInBoxDrawing>$/ ), q{Don't match compound inverted } ); ok(!( "\c[BOX DRAWINGS LIGHT HORIZONTAL]" ~~ m/^<-isInBoxDrawing>$/ ), q{Don't match internally inverted } ); ok(!( "\x[D2FB]" ~~ m/^<+isInBoxDrawing>$/ ), q{Don't match unrelated } ); ok("\x[D2FB]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[D2FB]" ~~ m/^<-isInBoxDrawing>$/, q{Match unrelated internally inverted } ); ok("\x[D2FB]\c[BOX DRAWINGS LIGHT HORIZONTAL]" ~~ m/<+isInBoxDrawing>/, q{Match unanchored } ); # InBraillePatterns ok("\c[BRAILLE PATTERN BLANK]" ~~ m/^<+isInBraillePatterns>$/, q{Match } ); ok("\c[BRAILLE PATTERN BLANK]" ~~ m/^<[A]+isInBraillePatterns>$/, q{Match compound } ); ok(!( "\c[BRAILLE PATTERN BLANK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[BRAILLE PATTERN BLANK]" ~~ m/^<[A]-isInBraillePatterns>$/ ), q{Don't match compound inverted } ); ok(!( "\c[BRAILLE PATTERN BLANK]" ~~ m/^<-isInBraillePatterns>$/ ), q{Don't match internally inverted } ); ok(!( "\x[4FE4]" ~~ m/^<+isInBraillePatterns>$/ ), q{Don't match unrelated } ); ok("\x[4FE4]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[4FE4]" ~~ m/^<-isInBraillePatterns>$/, q{Match unrelated internally inverted } ); ok("\x[4FE4]\c[BRAILLE PATTERN BLANK]" ~~ m/<+isInBraillePatterns>/, q{Match unanchored } ); # InBuhid ok("\c[BUHID LETTER A]" ~~ m/^<+isInBuhid>$/, q{Match } ); ok("\c[BUHID LETTER A]" ~~ m/^<[A]+isInBuhid>$/, q{Match compound } ); ok(!( "\c[BUHID LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[BUHID LETTER A]" ~~ m/^<[A]-isInBuhid>$/ ), q{Don't match compound inverted } ); ok(!( "\c[BUHID LETTER A]" ~~ m/^<-isInBuhid>$/ ), q{Don't match internally inverted } ); ok(!( "\x[996F]" ~~ m/^<+isInBuhid>$/ ), q{Don't match unrelated } ); ok("\x[996F]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[996F]" ~~ m/^<-isInBuhid>$/, q{Match unrelated internally inverted } ); ok("\x[996F]\c[BUHID LETTER A]" ~~ m/<+isInBuhid>/, q{Match unanchored } ); # InByzantineMusicalSymbols ok(!( "\x[802A]" ~~ m/^<+isInByzantineMusicalSymbols>$/ ), q{Don't match unrelated } ); ok("\x[802A]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[802A]" ~~ m/^<-isInByzantineMusicalSymbols>$/, q{Match unrelated internally inverted } ); # InCJKCompatibility ok("\c[SQUARE APAATO]" ~~ m/^<+isInCJKCompatibility>$/, q{Match } ); ok("\c[SQUARE APAATO]" ~~ m/^<[A]+isInCJKCompatibility>$/, q{Match compound } ); ok(!( "\c[SQUARE APAATO]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[SQUARE APAATO]" ~~ m/^<[A]-isInCJKCompatibility>$/ ), q{Don't match compound inverted } ); ok(!( "\c[SQUARE APAATO]" ~~ m/^<-isInCJKCompatibility>$/ ), q{Don't match internally inverted } ); ok(!( "\x[2B99]" ~~ m/^<+isInCJKCompatibility>$/ ), q{Don't match unrelated } ); ok("\x[2B99]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[2B99]" ~~ m/^<-isInCJKCompatibility>$/, q{Match unrelated internally inverted } ); ok("\x[2B99]\c[SQUARE APAATO]" ~~ m/<+isInCJKCompatibility>/, q{Match unanchored } ); # InCJKCompatibilityForms ok(!( "\x[342B]" ~~ m/^<+isInCJKCompatibilityForms>$/ ), q{Don't match unrelated } ); ok("\x[342B]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[342B]" ~~ m/^<-isInCJKCompatibilityForms>$/, q{Match unrelated internally inverted } ); # InCJKCompatibilityIdeographs ok(!( "\c[BLACK SQUARE]" ~~ m/^<+isInCJKCompatibilityIdeographs>$/ ), q{Don't match unrelated } ); ok("\c[BLACK SQUARE]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[BLACK SQUARE]" ~~ m/^<-isInCJKCompatibilityIdeographs>$/, q{Match unrelated internally inverted } ); # InCJKCompatibilityIdeographsSupplement ok(!( "\x[A90E]" ~~ m/^<+isInCJKCompatibilityIdeographsSupplement>$/ ), q{Don't match unrelated } ); ok("\x[A90E]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[A90E]" ~~ m/^<-isInCJKCompatibilityIdeographsSupplement>$/, q{Match unrelated internally inverted } ); # InCJKRadicalsSupplement ok("\c[CJK RADICAL REPEAT]" ~~ m/^<+isInCJKRadicalsSupplement>$/, q{Match } ); ok("\c[CJK RADICAL REPEAT]" ~~ m/^<[A]+isInCJKRadicalsSupplement>$/, q{Match compound } ); ok(!( "\c[CJK RADICAL REPEAT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[CJK RADICAL REPEAT]" ~~ m/^<[A]-isInCJKRadicalsSupplement>$/ ), q{Don't match compound inverted } ); ok(!( "\c[CJK RADICAL REPEAT]" ~~ m/^<-isInCJKRadicalsSupplement>$/ ), q{Don't match internally inverted } ); ok(!( "\x[563B]" ~~ m/^<+isInCJKRadicalsSupplement>$/ ), q{Don't match unrelated } ); ok("\x[563B]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[563B]" ~~ m/^<-isInCJKRadicalsSupplement>$/, q{Match unrelated internally inverted } ); ok("\x[563B]\c[CJK RADICAL REPEAT]" ~~ m/<+isInCJKRadicalsSupplement>/, q{Match unanchored } ); # InCJKSymbolsAndPunctuation ok("\c[IDEOGRAPHIC SPACE]" ~~ m/^<+isInCJKSymbolsAndPunctuation>$/, q{Match } ); ok("\c[IDEOGRAPHIC SPACE]" ~~ m/^<[A]+isInCJKSymbolsAndPunctuation>$/, q{Match compound } ); ok(!( "\c[IDEOGRAPHIC SPACE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[IDEOGRAPHIC SPACE]" ~~ m/^<[A]-isInCJKSymbolsAndPunctuation>$/ ), q{Don't match compound inverted } ); ok(!( "\c[IDEOGRAPHIC SPACE]" ~~ m/^<-isInCJKSymbolsAndPunctuation>$/ ), q{Don't match internally inverted } ); ok(!( "\x[3BE6]" ~~ m/^<+isInCJKSymbolsAndPunctuation>$/ ), q{Don't match unrelated } ); ok("\x[3BE6]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[3BE6]" ~~ m/^<-isInCJKSymbolsAndPunctuation>$/, q{Match unrelated internally inverted } ); ok("\x[3BE6]\c[IDEOGRAPHIC SPACE]" ~~ m/<+isInCJKSymbolsAndPunctuation>/, q{Match unanchored } ); # InCJKUnifiedIdeographs ok("\x[4E00]" ~~ m/^<+isInCJKUnifiedIdeographs>$/, q{Match } ); ok("\x[4E00]" ~~ m/^<[A]+isInCJKUnifiedIdeographs>$/, q{Match compound } ); ok(!( "\x[4E00]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[4E00]" ~~ m/^<[A]-isInCJKUnifiedIdeographs>$/ ), q{Don't match compound inverted } ); ok(!( "\x[4E00]" ~~ m/^<-isInCJKUnifiedIdeographs>$/ ), q{Don't match internally inverted } ); ok(!( "\x[436E]" ~~ m/^<+isInCJKUnifiedIdeographs>$/ ), q{Don't match unrelated } ); ok("\x[436E]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[436E]" ~~ m/^<-isInCJKUnifiedIdeographs>$/, q{Match unrelated internally inverted } ); ok("\x[436E]\x[4E00]" ~~ m/<+isInCJKUnifiedIdeographs>/, q{Match unanchored } ); # InCJKUnifiedIdeographsExtensionA ok("\x[4993]" ~~ m/^<+isInCJKUnifiedIdeographsExtensionA>$/, q{Match } ); ok("\x[4993]" ~~ m/^<[A]+isInCJKUnifiedIdeographsExtensionA>$/, q{Match compound } ); ok(!( "\x[4993]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[4993]" ~~ m/^<[A]-isInCJKUnifiedIdeographsExtensionA>$/ ), q{Don't match compound inverted } ); ok(!( "\x[4993]" ~~ m/^<-isInCJKUnifiedIdeographsExtensionA>$/ ), q{Don't match internally inverted } ); ok(!( "\c[HEXAGRAM FOR THE CREATIVE HEAVEN]" ~~ m/^<+isInCJKUnifiedIdeographsExtensionA>$/ ), q{Don't match unrelated } ); ok("\c[HEXAGRAM FOR THE CREATIVE HEAVEN]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[HEXAGRAM FOR THE CREATIVE HEAVEN]" ~~ m/^<-isInCJKUnifiedIdeographsExtensionA>$/, q{Match unrelated internally inverted } ); ok("\c[HEXAGRAM FOR THE CREATIVE HEAVEN]\x[4993]" ~~ m/<+isInCJKUnifiedIdeographsExtensionA>/, q{Match unanchored } ); # InCJKUnifiedIdeographsExtensionB ok(!( "\x[3E5A]" ~~ m/^<+isInCJKUnifiedIdeographsExtensionB>$/ ), q{Don't match unrelated } ); ok("\x[3E5A]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[3E5A]" ~~ m/^<-isInCJKUnifiedIdeographsExtensionB>$/, q{Match unrelated internally inverted } ); # InCherokee ok("\c[CHEROKEE LETTER A]" ~~ m/^<+isInCherokee>$/, q{Match } ); ok("\c[CHEROKEE LETTER A]" ~~ m/^<[A]+isInCherokee>$/, q{Match compound } ); ok(!( "\c[CHEROKEE LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[CHEROKEE LETTER A]" ~~ m/^<[A]-isInCherokee>$/ ), q{Don't match compound inverted } ); ok(!( "\c[CHEROKEE LETTER A]" ~~ m/^<-isInCherokee>$/ ), q{Don't match internally inverted } ); ok(!( "\x[B311]" ~~ m/^<+isInCherokee>$/ ), q{Don't match unrelated } ); ok("\x[B311]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[B311]" ~~ m/^<-isInCherokee>$/, q{Match unrelated internally inverted } ); ok("\x[B311]\c[CHEROKEE LETTER A]" ~~ m/<+isInCherokee>/, q{Match unanchored } ); # InCombiningDiacriticalMarks ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^<+isInCombiningDiacriticalMarks>$/, q{Match } ); ok("\c[COMBINING GRAVE ACCENT]" ~~ m/^<[A]+isInCombiningDiacriticalMarks>$/, q{Match compound } ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^<[A]-isInCombiningDiacriticalMarks>$/ ), q{Don't match compound inverted } ); ok(!( "\c[COMBINING GRAVE ACCENT]" ~~ m/^<-isInCombiningDiacriticalMarks>$/ ), q{Don't match internally inverted } ); ok(!( "\x[81B8]" ~~ m/^<+isInCombiningDiacriticalMarks>$/ ), q{Don't match unrelated } ); ok("\x[81B8]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[81B8]" ~~ m/^<-isInCombiningDiacriticalMarks>$/, q{Match unrelated internally inverted } ); ok("\x[81B8]\c[COMBINING GRAVE ACCENT]" ~~ m/<+isInCombiningDiacriticalMarks>/, q{Match unanchored } ); # InCombiningDiacriticalMarksforSymbols ok("\c[COMBINING LEFT HARPOON ABOVE]" ~~ m/^<+isInCombiningDiacriticalMarksforSymbols>$/, q{Match } ); ok("\c[COMBINING LEFT HARPOON ABOVE]" ~~ m/^<[A]+isInCombiningDiacriticalMarksforSymbols>$/, q{Match compound } ); ok(!( "\c[COMBINING LEFT HARPOON ABOVE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[COMBINING LEFT HARPOON ABOVE]" ~~ m/^<[A]-isInCombiningDiacriticalMarksforSymbols>$/ ), q{Don't match compound inverted } ); ok(!( "\c[COMBINING LEFT HARPOON ABOVE]" ~~ m/^<-isInCombiningDiacriticalMarksforSymbols>$/ ), q{Don't match internally inverted } ); ok(!( "\c[YI SYLLABLE NZOX]" ~~ m/^<+isInCombiningDiacriticalMarksforSymbols>$/ ), q{Don't match unrelated } ); ok("\c[YI SYLLABLE NZOX]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[YI SYLLABLE NZOX]" ~~ m/^<-isInCombiningDiacriticalMarksforSymbols>$/, q{Match unrelated internally inverted } ); ok("\c[YI SYLLABLE NZOX]\c[COMBINING LEFT HARPOON ABOVE]" ~~ m/<+isInCombiningDiacriticalMarksforSymbols>/, q{Match unanchored } ); # InCombiningHalfMarks ok(!( "\x[7140]" ~~ m/^<+isInCombiningHalfMarks>$/ ), q{Don't match unrelated } ); ok("\x[7140]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[7140]" ~~ m/^<-isInCombiningHalfMarks>$/, q{Match unrelated internally inverted } ); # InControlPictures ok("\c[SYMBOL FOR NULL]" ~~ m/^<+isInControlPictures>$/, q{Match } ); ok("\c[SYMBOL FOR NULL]" ~~ m/^<[A]+isInControlPictures>$/, q{Match compound } ); ok(!( "\c[SYMBOL FOR NULL]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[SYMBOL FOR NULL]" ~~ m/^<[A]-isInControlPictures>$/ ), q{Don't match compound inverted } ); ok(!( "\c[SYMBOL FOR NULL]" ~~ m/^<-isInControlPictures>$/ ), q{Don't match internally inverted } ); ok(!( "\x[CBBF]" ~~ m/^<+isInControlPictures>$/ ), q{Don't match unrelated } ); ok("\x[CBBF]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[CBBF]" ~~ m/^<-isInControlPictures>$/, q{Match unrelated internally inverted } ); ok("\x[CBBF]\c[SYMBOL FOR NULL]" ~~ m/<+isInControlPictures>/, q{Match unanchored } ); # InCurrencySymbols ok("\c[EURO-CURRENCY SIGN]" ~~ m/^<+isInCurrencySymbols>$/, q{Match } ); ok("\c[EURO-CURRENCY SIGN]" ~~ m/^<[A]+isInCurrencySymbols>$/, q{Match compound } ); ok(!( "\c[EURO-CURRENCY SIGN]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[EURO-CURRENCY SIGN]" ~~ m/^<[A]-isInCurrencySymbols>$/ ), q{Don't match compound inverted } ); ok(!( "\c[EURO-CURRENCY SIGN]" ~~ m/^<-isInCurrencySymbols>$/ ), q{Don't match internally inverted } ); ok(!( "\x[D040]" ~~ m/^<+isInCurrencySymbols>$/ ), q{Don't match unrelated } ); ok("\x[D040]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[D040]" ~~ m/^<-isInCurrencySymbols>$/, q{Match unrelated internally inverted } ); ok("\x[D040]\c[EURO-CURRENCY SIGN]" ~~ m/<+isInCurrencySymbols>/, q{Match unanchored } ); # InCyrillic ok("\c[CYRILLIC CAPITAL LETTER IE WITH GRAVE]" ~~ m/^<+isInCyrillic>$/, q{Match } ); ok("\c[CYRILLIC CAPITAL LETTER IE WITH GRAVE]" ~~ m/^<[A]+isInCyrillic>$/, q{Match compound } ); ok(!( "\c[CYRILLIC CAPITAL LETTER IE WITH GRAVE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[CYRILLIC CAPITAL LETTER IE WITH GRAVE]" ~~ m/^<[A]-isInCyrillic>$/ ), q{Don't match compound inverted } ); ok(!( "\c[CYRILLIC CAPITAL LETTER IE WITH GRAVE]" ~~ m/^<-isInCyrillic>$/ ), q{Don't match internally inverted } ); ok(!( "\x[9C58]" ~~ m/^<+isInCyrillic>$/ ), q{Don't match unrelated } ); ok("\x[9C58]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[9C58]" ~~ m/^<-isInCyrillic>$/, q{Match unrelated internally inverted } ); ok("\x[9C58]\c[CYRILLIC CAPITAL LETTER IE WITH GRAVE]" ~~ m/<+isInCyrillic>/, q{Match unanchored } ); # InCyrillicSupplementary ok("\c[CYRILLIC CAPITAL LETTER KOMI DE]" ~~ m/^<+isInCyrillicSupplementary>$/, q{Match } ); ok("\c[CYRILLIC CAPITAL LETTER KOMI DE]" ~~ m/^<[A]+isInCyrillicSupplementary>$/, q{Match compound } ); ok(!( "\c[CYRILLIC CAPITAL LETTER KOMI DE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[CYRILLIC CAPITAL LETTER KOMI DE]" ~~ m/^<[A]-isInCyrillicSupplementary>$/ ), q{Don't match compound inverted } ); ok(!( "\c[CYRILLIC CAPITAL LETTER KOMI DE]" ~~ m/^<-isInCyrillicSupplementary>$/ ), q{Don't match internally inverted } ); ok(!( "\x[857A]" ~~ m/^<+isInCyrillicSupplementary>$/ ), q{Don't match unrelated } ); ok("\x[857A]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[857A]" ~~ m/^<-isInCyrillicSupplementary>$/, q{Match unrelated internally inverted } ); ok("\x[857A]\c[CYRILLIC CAPITAL LETTER KOMI DE]" ~~ m/<+isInCyrillicSupplementary>/, q{Match unanchored } ); # InDeseret ok(!( "\c[LATIN SMALL LETTER I WITH DOUBLE GRAVE]" ~~ m/^<+isInDeseret>$/ ), q{Don't match unrelated } ); ok("\c[LATIN SMALL LETTER I WITH DOUBLE GRAVE]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[LATIN SMALL LETTER I WITH DOUBLE GRAVE]" ~~ m/^<-isInDeseret>$/, q{Match unrelated internally inverted } ); # InDevanagari ok("\x[0900]" ~~ m/^<+isInDevanagari>$/, q{Match } ); ok("\x[0900]" ~~ m/^<[A]+isInDevanagari>$/, q{Match compound } ); ok(!( "\x[0900]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0900]" ~~ m/^<[A]-isInDevanagari>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0900]" ~~ m/^<-isInDevanagari>$/ ), q{Don't match internally inverted } ); ok(!( "\x[3837]" ~~ m/^<+isInDevanagari>$/ ), q{Don't match unrelated } ); ok("\x[3837]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[3837]" ~~ m/^<-isInDevanagari>$/, q{Match unrelated internally inverted } ); ok("\x[3837]\x[0900]" ~~ m/<+isInDevanagari>/, q{Match unanchored } ); # InDingbats ok("\x[2700]" ~~ m/^<+isInDingbats>$/, q{Match } ); ok("\x[2700]" ~~ m/^<[A]+isInDingbats>$/, q{Match compound } ); ok(!( "\x[2700]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[2700]" ~~ m/^<[A]-isInDingbats>$/ ), q{Don't match compound inverted } ); ok(!( "\x[2700]" ~~ m/^<-isInDingbats>$/ ), q{Don't match internally inverted } ); ok(!( "\x[C9CC]" ~~ m/^<+isInDingbats>$/ ), q{Don't match unrelated } ); ok("\x[C9CC]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[C9CC]" ~~ m/^<-isInDingbats>$/, q{Match unrelated internally inverted } ); ok("\x[C9CC]\x[2700]" ~~ m/<+isInDingbats>/, q{Match unanchored } ); # InEnclosedAlphanumerics ok("\c[CIRCLED DIGIT ONE]" ~~ m/^<+isInEnclosedAlphanumerics>$/, q{Match } ); ok("\c[CIRCLED DIGIT ONE]" ~~ m/^<[A]+isInEnclosedAlphanumerics>$/, q{Match compound } ); ok(!( "\c[CIRCLED DIGIT ONE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[CIRCLED DIGIT ONE]" ~~ m/^<[A]-isInEnclosedAlphanumerics>$/ ), q{Don't match compound inverted } ); ok(!( "\c[CIRCLED DIGIT ONE]" ~~ m/^<-isInEnclosedAlphanumerics>$/ ), q{Don't match internally inverted } ); ok(!( "\x[CCB8]" ~~ m/^<+isInEnclosedAlphanumerics>$/ ), q{Don't match unrelated } ); ok("\x[CCB8]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[CCB8]" ~~ m/^<-isInEnclosedAlphanumerics>$/, q{Match unrelated internally inverted } ); ok("\x[CCB8]\c[CIRCLED DIGIT ONE]" ~~ m/<+isInEnclosedAlphanumerics>/, q{Match unanchored } ); # InEnclosedCJKLettersAndMonths ok("\c[PARENTHESIZED HANGUL KIYEOK]" ~~ m/^<+isInEnclosedCJKLettersAndMonths>$/, q{Match } ); ok("\c[PARENTHESIZED HANGUL KIYEOK]" ~~ m/^<[A]+isInEnclosedCJKLettersAndMonths>$/, q{Match compound } ); ok(!( "\c[PARENTHESIZED HANGUL KIYEOK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[PARENTHESIZED HANGUL KIYEOK]" ~~ m/^<[A]-isInEnclosedCJKLettersAndMonths>$/ ), q{Don't match compound inverted } ); ok(!( "\c[PARENTHESIZED HANGUL KIYEOK]" ~~ m/^<-isInEnclosedCJKLettersAndMonths>$/ ), q{Don't match internally inverted } ); ok(!( "\x[8883]" ~~ m/^<+isInEnclosedCJKLettersAndMonths>$/ ), q{Don't match unrelated } ); ok("\x[8883]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[8883]" ~~ m/^<-isInEnclosedCJKLettersAndMonths>$/, q{Match unrelated internally inverted } ); ok("\x[8883]\c[PARENTHESIZED HANGUL KIYEOK]" ~~ m/<+isInEnclosedCJKLettersAndMonths>/, q{Match unanchored } ); # InEthiopic ok("\c[ETHIOPIC SYLLABLE HA]" ~~ m/^<+isInEthiopic>$/, q{Match } ); ok("\c[ETHIOPIC SYLLABLE HA]" ~~ m/^<[A]+isInEthiopic>$/, q{Match compound } ); ok(!( "\c[ETHIOPIC SYLLABLE HA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[ETHIOPIC SYLLABLE HA]" ~~ m/^<[A]-isInEthiopic>$/ ), q{Don't match compound inverted } ); ok(!( "\c[ETHIOPIC SYLLABLE HA]" ~~ m/^<-isInEthiopic>$/ ), q{Don't match internally inverted } ); ok(!( "\c[MALAYALAM DIGIT NINE]" ~~ m/^<+isInEthiopic>$/ ), q{Don't match unrelated } ); ok("\c[MALAYALAM DIGIT NINE]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[MALAYALAM DIGIT NINE]" ~~ m/^<-isInEthiopic>$/, q{Match unrelated internally inverted } ); ok("\c[MALAYALAM DIGIT NINE]\c[ETHIOPIC SYLLABLE HA]" ~~ m/<+isInEthiopic>/, q{Match unanchored } ); # InGeneralPunctuation ok("\c[EN QUAD]" ~~ m/^<+isInGeneralPunctuation>$/, q{Match } ); ok("\c[EN QUAD]" ~~ m/^<[A]+isInGeneralPunctuation>$/, q{Match compound } ); ok(!( "\c[EN QUAD]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[EN QUAD]" ~~ m/^<[A]-isInGeneralPunctuation>$/ ), q{Don't match compound inverted } ); ok(!( "\c[EN QUAD]" ~~ m/^<-isInGeneralPunctuation>$/ ), q{Don't match internally inverted } ); ok(!( "\x[BBC9]" ~~ m/^<+isInGeneralPunctuation>$/ ), q{Don't match unrelated } ); ok("\x[BBC9]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[BBC9]" ~~ m/^<-isInGeneralPunctuation>$/, q{Match unrelated internally inverted } ); ok("\x[BBC9]\c[EN QUAD]" ~~ m/<+isInGeneralPunctuation>/, q{Match unanchored } ); # InGeometricShapes ok("\c[BLACK SQUARE]" ~~ m/^<+isInGeometricShapes>$/, q{Match } ); ok("\c[BLACK SQUARE]" ~~ m/^<[A]+isInGeometricShapes>$/, q{Match compound } ); ok(!( "\c[BLACK SQUARE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[BLACK SQUARE]" ~~ m/^<[A]-isInGeometricShapes>$/ ), q{Don't match compound inverted } ); ok(!( "\c[BLACK SQUARE]" ~~ m/^<-isInGeometricShapes>$/ ), q{Don't match internally inverted } ); ok(!( "\x[C58A]" ~~ m/^<+isInGeometricShapes>$/ ), q{Don't match unrelated } ); ok("\x[C58A]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[C58A]" ~~ m/^<-isInGeometricShapes>$/, q{Match unrelated internally inverted } ); ok("\x[C58A]\c[BLACK SQUARE]" ~~ m/<+isInGeometricShapes>/, q{Match unanchored } ); # InGeorgian ok("\c[GEORGIAN CAPITAL LETTER AN]" ~~ m/^<+isInGeorgian>$/, q{Match } ); ok("\c[GEORGIAN CAPITAL LETTER AN]" ~~ m/^<[A]+isInGeorgian>$/, q{Match compound } ); ok(!( "\c[GEORGIAN CAPITAL LETTER AN]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[GEORGIAN CAPITAL LETTER AN]" ~~ m/^<[A]-isInGeorgian>$/ ), q{Don't match compound inverted } ); ok(!( "\c[GEORGIAN CAPITAL LETTER AN]" ~~ m/^<-isInGeorgian>$/ ), q{Don't match internally inverted } ); ok(!( "\c[ARMENIAN CAPITAL LETTER BEN]" ~~ m/^<+isInGeorgian>$/ ), q{Don't match unrelated } ); ok("\c[ARMENIAN CAPITAL LETTER BEN]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[ARMENIAN CAPITAL LETTER BEN]" ~~ m/^<-isInGeorgian>$/, q{Match unrelated internally inverted } ); ok("\c[ARMENIAN CAPITAL LETTER BEN]\c[GEORGIAN CAPITAL LETTER AN]" ~~ m/<+isInGeorgian>/, q{Match unanchored } ); # InGothic ok(!( "\x[1A5A]" ~~ m/^<+isInGothic>$/ ), q{Don't match unrelated } ); ok("\x[1A5A]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[1A5A]" ~~ m/^<-isInGothic>$/, q{Match unrelated internally inverted } ); # InGreekExtended ok("\c[GREEK SMALL LETTER ALPHA WITH PSILI]" ~~ m/^<+isInGreekExtended>$/, q{Match } ); ok("\c[GREEK SMALL LETTER ALPHA WITH PSILI]" ~~ m/^<[A]+isInGreekExtended>$/, q{Match compound } ); ok(!( "\c[GREEK SMALL LETTER ALPHA WITH PSILI]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[GREEK SMALL LETTER ALPHA WITH PSILI]" ~~ m/^<[A]-isInGreekExtended>$/ ), q{Don't match compound inverted } ); ok(!( "\c[GREEK SMALL LETTER ALPHA WITH PSILI]" ~~ m/^<-isInGreekExtended>$/ ), q{Don't match internally inverted } ); ok(!( "\x[39F3]" ~~ m/^<+isInGreekExtended>$/ ), q{Don't match unrelated } ); ok("\x[39F3]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[39F3]" ~~ m/^<-isInGreekExtended>$/, q{Match unrelated internally inverted } ); ok("\x[39F3]\c[GREEK SMALL LETTER ALPHA WITH PSILI]" ~~ m/<+isInGreekExtended>/, q{Match unanchored } ); # InGreekAndCoptic ok("\x[0370]" ~~ m/^<+isInGreekAndCoptic>$/, q{Match } ); ok("\x[0370]" ~~ m/^<[A]+isInGreekAndCoptic>$/, q{Match compound } ); ok(!( "\x[0370]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0370]" ~~ m/^<[A]-isInGreekAndCoptic>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0370]" ~~ m/^<-isInGreekAndCoptic>$/ ), q{Don't match internally inverted } ); ok(!( "\x[8CFE]" ~~ m/^<+isInGreekAndCoptic>$/ ), q{Don't match unrelated } ); ok("\x[8CFE]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[8CFE]" ~~ m/^<-isInGreekAndCoptic>$/, q{Match unrelated internally inverted } ); ok("\x[8CFE]\x[0370]" ~~ m/<+isInGreekAndCoptic>/, q{Match unanchored } ); # InGujarati ok("\x[0A80]" ~~ m/^<+isInGujarati>$/, q{Match } ); ok("\x[0A80]" ~~ m/^<[A]+isInGujarati>$/, q{Match compound } ); ok(!( "\x[0A80]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0A80]" ~~ m/^<[A]-isInGujarati>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0A80]" ~~ m/^<-isInGujarati>$/ ), q{Don't match internally inverted } ); ok(!( "\x[B022]" ~~ m/^<+isInGujarati>$/ ), q{Don't match unrelated } ); ok("\x[B022]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[B022]" ~~ m/^<-isInGujarati>$/, q{Match unrelated internally inverted } ); ok("\x[B022]\x[0A80]" ~~ m/<+isInGujarati>/, q{Match unanchored } ); # InGurmukhi ok("\x[0A00]" ~~ m/^<+isInGurmukhi>$/, q{Match } ); ok("\x[0A00]" ~~ m/^<[A]+isInGurmukhi>$/, q{Match compound } ); ok(!( "\x[0A00]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0A00]" ~~ m/^<[A]-isInGurmukhi>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0A00]" ~~ m/^<-isInGurmukhi>$/ ), q{Don't match internally inverted } ); ok(!( "\x[8FC3]" ~~ m/^<+isInGurmukhi>$/ ), q{Don't match unrelated } ); ok("\x[8FC3]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[8FC3]" ~~ m/^<-isInGurmukhi>$/, q{Match unrelated internally inverted } ); ok("\x[8FC3]\x[0A00]" ~~ m/<+isInGurmukhi>/, q{Match unanchored } ); # InHalfwidthAndFullwidthForms ok(!( "\x[36A3]" ~~ m/^<+isInHalfwidthAndFullwidthForms>$/ ), q{Don't match unrelated } ); ok("\x[36A3]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[36A3]" ~~ m/^<-isInHalfwidthAndFullwidthForms>$/, q{Match unrelated internally inverted } ); # InHangulCompatibilityJamo ok("\x[3130]" ~~ m/^<+isInHangulCompatibilityJamo>$/, q{Match } ); ok("\x[3130]" ~~ m/^<[A]+isInHangulCompatibilityJamo>$/, q{Match compound } ); ok(!( "\x[3130]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[3130]" ~~ m/^<[A]-isInHangulCompatibilityJamo>$/ ), q{Don't match compound inverted } ); ok(!( "\x[3130]" ~~ m/^<-isInHangulCompatibilityJamo>$/ ), q{Don't match internally inverted } ); ok(!( "\x[BAF0]" ~~ m/^<+isInHangulCompatibilityJamo>$/ ), q{Don't match unrelated } ); ok("\x[BAF0]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[BAF0]" ~~ m/^<-isInHangulCompatibilityJamo>$/, q{Match unrelated internally inverted } ); ok("\x[BAF0]\x[3130]" ~~ m/<+isInHangulCompatibilityJamo>/, q{Match unanchored } ); # InHangulJamo ok("\c[HANGUL CHOSEONG KIYEOK]" ~~ m/^<+isInHangulJamo>$/, q{Match } ); ok("\c[HANGUL CHOSEONG KIYEOK]" ~~ m/^<[A]+isInHangulJamo>$/, q{Match compound } ); ok(!( "\c[HANGUL CHOSEONG KIYEOK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[HANGUL CHOSEONG KIYEOK]" ~~ m/^<[A]-isInHangulJamo>$/ ), q{Don't match compound inverted } ); ok(!( "\c[HANGUL CHOSEONG KIYEOK]" ~~ m/^<-isInHangulJamo>$/ ), q{Don't match internally inverted } ); ok(!( "\x[4EB3]" ~~ m/^<+isInHangulJamo>$/ ), q{Don't match unrelated } ); ok("\x[4EB3]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[4EB3]" ~~ m/^<-isInHangulJamo>$/, q{Match unrelated internally inverted } ); ok("\x[4EB3]\c[HANGUL CHOSEONG KIYEOK]" ~~ m/<+isInHangulJamo>/, q{Match unanchored } ); # InHangulSyllables ok("\x[AC00]" ~~ m/^<+isInHangulSyllables>$/, q{Match } ); ok("\x[AC00]" ~~ m/^<[A]+isInHangulSyllables>$/, q{Match compound } ); ok(!( "\x[AC00]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[AC00]" ~~ m/^<[A]-isInHangulSyllables>$/ ), q{Don't match compound inverted } ); ok(!( "\x[AC00]" ~~ m/^<-isInHangulSyllables>$/ ), q{Don't match internally inverted } ); ok(!( "\x[7D7E]" ~~ m/^<+isInHangulSyllables>$/ ), q{Don't match unrelated } ); ok("\x[7D7E]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[7D7E]" ~~ m/^<-isInHangulSyllables>$/, q{Match unrelated internally inverted } ); ok("\x[7D7E]\x[AC00]" ~~ m/<+isInHangulSyllables>/, q{Match unanchored } ); # InHanunoo ok("\c[HANUNOO LETTER A]" ~~ m/^<+isInHanunoo>$/, q{Match } ); ok("\c[HANUNOO LETTER A]" ~~ m/^<[A]+isInHanunoo>$/, q{Match compound } ); ok(!( "\c[HANUNOO LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[HANUNOO LETTER A]" ~~ m/^<[A]-isInHanunoo>$/ ), q{Don't match compound inverted } ); ok(!( "\c[HANUNOO LETTER A]" ~~ m/^<-isInHanunoo>$/ ), q{Don't match internally inverted } ); ok(!( "\x[BD8A]" ~~ m/^<+isInHanunoo>$/ ), q{Don't match unrelated } ); ok("\x[BD8A]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[BD8A]" ~~ m/^<-isInHanunoo>$/, q{Match unrelated internally inverted } ); ok("\x[BD8A]\c[HANUNOO LETTER A]" ~~ m/<+isInHanunoo>/, q{Match unanchored } ); # InHebrew ok("\x[0590]" ~~ m/^<+isInHebrew>$/, q{Match } ); ok("\x[0590]" ~~ m/^<[A]+isInHebrew>$/, q{Match compound } ); ok(!( "\x[0590]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0590]" ~~ m/^<[A]-isInHebrew>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0590]" ~~ m/^<-isInHebrew>$/ ), q{Don't match internally inverted } ); ok(!( "\x[7EB3]" ~~ m/^<+isInHebrew>$/ ), q{Don't match unrelated } ); ok("\x[7EB3]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[7EB3]" ~~ m/^<-isInHebrew>$/, q{Match unrelated internally inverted } ); ok("\x[7EB3]\x[0590]" ~~ m/<+isInHebrew>/, q{Match unanchored } ); # InHighPrivateUseSurrogates ok(!( "\x[9EC6]" ~~ m/^<+isInHighPrivateUseSurrogates>$/ ), q{Don't match unrelated } ); ok("\x[9EC6]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[9EC6]" ~~ m/^<-isInHighPrivateUseSurrogates>$/, q{Match unrelated internally inverted } ); # InHighSurrogates ok(!( "\x[BC8F]" ~~ m/^<+isInHighSurrogates>$/ ), q{Don't match unrelated } ); ok("\x[BC8F]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[BC8F]" ~~ m/^<-isInHighSurrogates>$/, q{Match unrelated internally inverted } ); # InHiragana ok("\x[3040]" ~~ m/^<+isInHiragana>$/, q{Match } ); ok("\x[3040]" ~~ m/^<[A]+isInHiragana>$/, q{Match compound } ); ok(!( "\x[3040]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[3040]" ~~ m/^<[A]-isInHiragana>$/ ), q{Don't match compound inverted } ); ok(!( "\x[3040]" ~~ m/^<-isInHiragana>$/ ), q{Don't match internally inverted } ); ok(!( "\c[ARABIC SIGN ALAYHE ASSALLAM]" ~~ m/^<+isInHiragana>$/ ), q{Don't match unrelated } ); ok("\c[ARABIC SIGN ALAYHE ASSALLAM]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[ARABIC SIGN ALAYHE ASSALLAM]" ~~ m/^<-isInHiragana>$/, q{Match unrelated internally inverted } ); ok("\c[ARABIC SIGN ALAYHE ASSALLAM]\x[3040]" ~~ m/<+isInHiragana>/, q{Match unanchored } ); # InIPAExtensions ok("\c[LATIN SMALL LETTER TURNED A]" ~~ m/^<+isInIPAExtensions>$/, q{Match } ); ok("\c[LATIN SMALL LETTER TURNED A]" ~~ m/^<[A]+isInIPAExtensions>$/, q{Match compound } ); ok(!( "\c[LATIN SMALL LETTER TURNED A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LATIN SMALL LETTER TURNED A]" ~~ m/^<[A]-isInIPAExtensions>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LATIN SMALL LETTER TURNED A]" ~~ m/^<-isInIPAExtensions>$/ ), q{Don't match internally inverted } ); ok(!( "\x[0DFC]" ~~ m/^<+isInIPAExtensions>$/ ), q{Don't match unrelated } ); ok("\x[0DFC]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[0DFC]" ~~ m/^<-isInIPAExtensions>$/, q{Match unrelated internally inverted } ); ok("\x[0DFC]\c[LATIN SMALL LETTER TURNED A]" ~~ m/<+isInIPAExtensions>/, q{Match unanchored } ); # InIdeographicDescriptionCharacters ok("\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT]" ~~ m/^<+isInIdeographicDescriptionCharacters>$/, q{Match } ); ok("\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT]" ~~ m/^<[A]+isInIdeographicDescriptionCharacters>$/, q{Match compound } ); ok(!( "\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT]" ~~ m/^<[A]-isInIdeographicDescriptionCharacters>$/ ), q{Don't match compound inverted } ); ok(!( "\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT]" ~~ m/^<-isInIdeographicDescriptionCharacters>$/ ), q{Don't match internally inverted } ); ok(!( "\c[LATIN CAPITAL LETTER AE]" ~~ m/^<+isInIdeographicDescriptionCharacters>$/ ), q{Don't match unrelated } ); ok("\c[LATIN CAPITAL LETTER AE]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[LATIN CAPITAL LETTER AE]" ~~ m/^<-isInIdeographicDescriptionCharacters>$/, q{Match unrelated internally inverted } ); ok("\c[LATIN CAPITAL LETTER AE]\c[IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT]" ~~ m/<+isInIdeographicDescriptionCharacters>/, q{Match unanchored } ); # InKanbun ok("\c[IDEOGRAPHIC ANNOTATION LINKING MARK]" ~~ m/^<+isInKanbun>$/, q{Match } ); ok("\c[IDEOGRAPHIC ANNOTATION LINKING MARK]" ~~ m/^<[A]+isInKanbun>$/, q{Match compound } ); ok(!( "\c[IDEOGRAPHIC ANNOTATION LINKING MARK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[IDEOGRAPHIC ANNOTATION LINKING MARK]" ~~ m/^<[A]-isInKanbun>$/ ), q{Don't match compound inverted } ); ok(!( "\c[IDEOGRAPHIC ANNOTATION LINKING MARK]" ~~ m/^<-isInKanbun>$/ ), q{Don't match internally inverted } ); ok(!( "\x[93AB]" ~~ m/^<+isInKanbun>$/ ), q{Don't match unrelated } ); ok("\x[93AB]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[93AB]" ~~ m/^<-isInKanbun>$/, q{Match unrelated internally inverted } ); ok("\x[93AB]\c[IDEOGRAPHIC ANNOTATION LINKING MARK]" ~~ m/<+isInKanbun>/, q{Match unanchored } ); # InKangxiRadicals ok("\c[KANGXI RADICAL ONE]" ~~ m/^<+isInKangxiRadicals>$/, q{Match } ); ok("\c[KANGXI RADICAL ONE]" ~~ m/^<[A]+isInKangxiRadicals>$/, q{Match compound } ); ok(!( "\c[KANGXI RADICAL ONE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[KANGXI RADICAL ONE]" ~~ m/^<[A]-isInKangxiRadicals>$/ ), q{Don't match compound inverted } ); ok(!( "\c[KANGXI RADICAL ONE]" ~~ m/^<-isInKangxiRadicals>$/ ), q{Don't match internally inverted } ); ok(!( "\x[363D]" ~~ m/^<+isInKangxiRadicals>$/ ), q{Don't match unrelated } ); ok("\x[363D]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[363D]" ~~ m/^<-isInKangxiRadicals>$/, q{Match unrelated internally inverted } ); ok("\x[363D]\c[KANGXI RADICAL ONE]" ~~ m/<+isInKangxiRadicals>/, q{Match unanchored } ); # InKannada ok("\x[0C80]" ~~ m/^<+isInKannada>$/, q{Match } ); ok("\x[0C80]" ~~ m/^<[A]+isInKannada>$/, q{Match compound } ); ok(!( "\x[0C80]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0C80]" ~~ m/^<[A]-isInKannada>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0C80]" ~~ m/^<-isInKannada>$/ ), q{Don't match internally inverted } ); ok(!( "\x[9093]" ~~ m/^<+isInKannada>$/ ), q{Don't match unrelated } ); ok("\x[9093]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[9093]" ~~ m/^<-isInKannada>$/, q{Match unrelated internally inverted } ); ok("\x[9093]\x[0C80]" ~~ m/<+isInKannada>/, q{Match unanchored } ); # InKatakana ok("\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/^<+isInKatakana>$/, q{Match } ); ok("\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/^<[A]+isInKatakana>$/, q{Match compound } ); ok(!( "\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/^<[A]-isInKatakana>$/ ), q{Don't match compound inverted } ); ok(!( "\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/^<-isInKatakana>$/ ), q{Don't match internally inverted } ); ok(!( "\x[75DA]" ~~ m/^<+isInKatakana>$/ ), q{Don't match unrelated } ); ok("\x[75DA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[75DA]" ~~ m/^<-isInKatakana>$/, q{Match unrelated internally inverted } ); ok("\x[75DA]\c[KATAKANA-HIRAGANA DOUBLE HYPHEN]" ~~ m/<+isInKatakana>/, q{Match unanchored } ); # InKatakanaPhoneticExtensions ok("\c[KATAKANA LETTER SMALL KU]" ~~ m/^<+isInKatakanaPhoneticExtensions>$/, q{Match } ); ok("\c[KATAKANA LETTER SMALL KU]" ~~ m/^<[A]+isInKatakanaPhoneticExtensions>$/, q{Match compound } ); ok(!( "\c[KATAKANA LETTER SMALL KU]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[KATAKANA LETTER SMALL KU]" ~~ m/^<[A]-isInKatakanaPhoneticExtensions>$/ ), q{Don't match compound inverted } ); ok(!( "\c[KATAKANA LETTER SMALL KU]" ~~ m/^<-isInKatakanaPhoneticExtensions>$/ ), q{Don't match internally inverted } ); ok(!( "\c[GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA]" ~~ m/^<+isInKatakanaPhoneticExtensions>$/ ), q{Don't match unrelated } ); ok("\c[GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA]" ~~ m/^<-isInKatakanaPhoneticExtensions>$/, q{Match unrelated internally inverted } ); ok("\c[GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA]\c[KATAKANA LETTER SMALL KU]" ~~ m/<+isInKatakanaPhoneticExtensions>/, q{Match unanchored } ); # InKhmer ok("\c[KHMER LETTER KA]" ~~ m/^<+isInKhmer>$/, q{Match } ); ok("\c[KHMER LETTER KA]" ~~ m/^<[A]+isInKhmer>$/, q{Match compound } ); ok(!( "\c[KHMER LETTER KA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[KHMER LETTER KA]" ~~ m/^<[A]-isInKhmer>$/ ), q{Don't match compound inverted } ); ok(!( "\c[KHMER LETTER KA]" ~~ m/^<-isInKhmer>$/ ), q{Don't match internally inverted } ); ok(!( "\x[508C]" ~~ m/^<+isInKhmer>$/ ), q{Don't match unrelated } ); ok("\x[508C]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[508C]" ~~ m/^<-isInKhmer>$/, q{Match unrelated internally inverted } ); ok("\x[508C]\c[KHMER LETTER KA]" ~~ m/<+isInKhmer>/, q{Match unanchored } ); # InLao ok("\x[0E80]" ~~ m/^<+isInLao>$/, q{Match } ); ok("\x[0E80]" ~~ m/^<[A]+isInLao>$/, q{Match compound } ); ok(!( "\x[0E80]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0E80]" ~~ m/^<[A]-isInLao>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0E80]" ~~ m/^<-isInLao>$/ ), q{Don't match internally inverted } ); ok(!( "\c[PARENTHESIZED IDEOGRAPH CONGRATULATION]" ~~ m/^<+isInLao>$/ ), q{Don't match unrelated } ); ok("\c[PARENTHESIZED IDEOGRAPH CONGRATULATION]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[PARENTHESIZED IDEOGRAPH CONGRATULATION]" ~~ m/^<-isInLao>$/, q{Match unrelated internally inverted } ); ok("\c[PARENTHESIZED IDEOGRAPH CONGRATULATION]\x[0E80]" ~~ m/<+isInLao>/, q{Match unanchored } ); # InLatin1Supplement ok("\x[0080]" ~~ m/^<+isInLatin1Supplement>$/, q{Match } ); ok("\x[0080]" ~~ m/^<[A]+isInLatin1Supplement>$/, q{Match compound } ); ok(!( "\x[0080]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0080]" ~~ m/^<[A]-isInLatin1Supplement>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0080]" ~~ m/^<-isInLatin1Supplement>$/ ), q{Don't match internally inverted } ); ok(!( "\x[3A43]" ~~ m/^<+isInLatin1Supplement>$/ ), q{Don't match unrelated } ); ok("\x[3A43]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[3A43]" ~~ m/^<-isInLatin1Supplement>$/, q{Match unrelated internally inverted } ); ok("\x[3A43]\x[0080]" ~~ m/<+isInLatin1Supplement>/, q{Match unanchored } ); # InLatinExtendedA ok("\c[LATIN CAPITAL LETTER A WITH MACRON]" ~~ m/^<+isInLatinExtendedA>$/, q{Match } ); ok("\c[LATIN CAPITAL LETTER A WITH MACRON]" ~~ m/^<[A]+isInLatinExtendedA>$/, q{Match compound } ); ok(!( "\c[LATIN CAPITAL LETTER A WITH MACRON]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LATIN CAPITAL LETTER A WITH MACRON]" ~~ m/^<[A]-isInLatinExtendedA>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LATIN CAPITAL LETTER A WITH MACRON]" ~~ m/^<-isInLatinExtendedA>$/ ), q{Don't match internally inverted } ); ok(!( "\c[ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS]" ~~ m/^<+isInLatinExtendedA>$/ ), q{Don't match unrelated } ); ok("\c[ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS]" ~~ m/^<-isInLatinExtendedA>$/, q{Match unrelated internally inverted } ); ok("\c[ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS]\c[LATIN CAPITAL LETTER A WITH MACRON]" ~~ m/<+isInLatinExtendedA>/, q{Match unanchored } ); # InLatinExtendedAdditional ok("\c[LATIN CAPITAL LETTER A WITH RING BELOW]" ~~ m/^<+isInLatinExtendedAdditional>$/, q{Match } ); ok("\c[LATIN CAPITAL LETTER A WITH RING BELOW]" ~~ m/^<[A]+isInLatinExtendedAdditional>$/, q{Match compound } ); ok(!( "\c[LATIN CAPITAL LETTER A WITH RING BELOW]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LATIN CAPITAL LETTER A WITH RING BELOW]" ~~ m/^<[A]-isInLatinExtendedAdditional>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LATIN CAPITAL LETTER A WITH RING BELOW]" ~~ m/^<-isInLatinExtendedAdditional>$/ ), q{Don't match internally inverted } ); ok(!( "\x[36E7]" ~~ m/^<+isInLatinExtendedAdditional>$/ ), q{Don't match unrelated } ); ok("\x[36E7]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[36E7]" ~~ m/^<-isInLatinExtendedAdditional>$/, q{Match unrelated internally inverted } ); ok("\x[36E7]\c[LATIN CAPITAL LETTER A WITH RING BELOW]" ~~ m/<+isInLatinExtendedAdditional>/, q{Match unanchored } ); # InLatinExtendedB ok("\c[LATIN SMALL LETTER B WITH STROKE]" ~~ m/^<+isInLatinExtendedB>$/, q{Match } ); ok("\c[LATIN SMALL LETTER B WITH STROKE]" ~~ m/^<[A]+isInLatinExtendedB>$/, q{Match compound } ); ok(!( "\c[LATIN SMALL LETTER B WITH STROKE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[LATIN SMALL LETTER B WITH STROKE]" ~~ m/^<[A]-isInLatinExtendedB>$/ ), q{Don't match compound inverted } ); ok(!( "\c[LATIN SMALL LETTER B WITH STROKE]" ~~ m/^<-isInLatinExtendedB>$/ ), q{Don't match internally inverted } ); ok(!( "\x[877E]" ~~ m/^<+isInLatinExtendedB>$/ ), q{Don't match unrelated } ); ok("\x[877E]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[877E]" ~~ m/^<-isInLatinExtendedB>$/, q{Match unrelated internally inverted } ); ok("\x[877E]\c[LATIN SMALL LETTER B WITH STROKE]" ~~ m/<+isInLatinExtendedB>/, q{Match unanchored } ); # InLetterlikeSymbols ok("\c[ACCOUNT OF]" ~~ m/^<+isInLetterlikeSymbols>$/, q{Match } ); ok("\c[ACCOUNT OF]" ~~ m/^<[A]+isInLetterlikeSymbols>$/, q{Match compound } ); ok(!( "\c[ACCOUNT OF]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[ACCOUNT OF]" ~~ m/^<[A]-isInLetterlikeSymbols>$/ ), q{Don't match compound inverted } ); ok(!( "\c[ACCOUNT OF]" ~~ m/^<-isInLetterlikeSymbols>$/ ), q{Don't match internally inverted } ); ok(!( "\c[CIRCLED IDEOGRAPH TWO]" ~~ m/^<+isInLetterlikeSymbols>$/ ), q{Don't match unrelated } ); ok("\c[CIRCLED IDEOGRAPH TWO]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[CIRCLED IDEOGRAPH TWO]" ~~ m/^<-isInLetterlikeSymbols>$/, q{Match unrelated internally inverted } ); ok("\c[CIRCLED IDEOGRAPH TWO]\c[ACCOUNT OF]" ~~ m/<+isInLetterlikeSymbols>/, q{Match unanchored } ); # InLowSurrogates ok(!( "\x[B611]" ~~ m/^<+isInLowSurrogates>$/ ), q{Don't match unrelated } ); ok("\x[B611]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[B611]" ~~ m/^<-isInLowSurrogates>$/, q{Match unrelated internally inverted } ); # InMalayalam ok("\x[0D00]" ~~ m/^<+isInMalayalam>$/, q{Match } ); ok("\x[0D00]" ~~ m/^<[A]+isInMalayalam>$/, q{Match compound } ); ok(!( "\x[0D00]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0D00]" ~~ m/^<[A]-isInMalayalam>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0D00]" ~~ m/^<-isInMalayalam>$/ ), q{Don't match internally inverted } ); ok(!( "\x[C011]" ~~ m/^<+isInMalayalam>$/ ), q{Don't match unrelated } ); ok("\x[C011]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[C011]" ~~ m/^<-isInMalayalam>$/, q{Match unrelated internally inverted } ); ok("\x[C011]\x[0D00]" ~~ m/<+isInMalayalam>/, q{Match unanchored } ); # InMathematicalAlphanumericSymbols ok(!( "\x[73FA]" ~~ m/^<+isInMathematicalAlphanumericSymbols>$/ ), q{Don't match unrelated } ); ok("\x[73FA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[73FA]" ~~ m/^<-isInMathematicalAlphanumericSymbols>$/, q{Match unrelated internally inverted } ); # InMathematicalOperators ok("\c[FOR ALL]" ~~ m/^<+isInMathematicalOperators>$/, q{Match } ); ok("\c[FOR ALL]" ~~ m/^<[A]+isInMathematicalOperators>$/, q{Match compound } ); ok(!( "\c[FOR ALL]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[FOR ALL]" ~~ m/^<[A]-isInMathematicalOperators>$/ ), q{Don't match compound inverted } ); ok(!( "\c[FOR ALL]" ~~ m/^<-isInMathematicalOperators>$/ ), q{Don't match internally inverted } ); ok(!( "\x[B389]" ~~ m/^<+isInMathematicalOperators>$/ ), q{Don't match unrelated } ); ok("\x[B389]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[B389]" ~~ m/^<-isInMathematicalOperators>$/, q{Match unrelated internally inverted } ); ok("\x[B389]\c[FOR ALL]" ~~ m/<+isInMathematicalOperators>/, q{Match unanchored } ); # InMiscellaneousMathematicalSymbolsA ok("\x[27C0]" ~~ m/^<+isInMiscellaneousMathematicalSymbolsA>$/, q{Match } ); ok("\x[27C0]" ~~ m/^<[A]+isInMiscellaneousMathematicalSymbolsA>$/, q{Match compound } ); ok(!( "\x[27C0]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[27C0]" ~~ m/^<[A]-isInMiscellaneousMathematicalSymbolsA>$/ ), q{Don't match compound inverted } ); ok(!( "\x[27C0]" ~~ m/^<-isInMiscellaneousMathematicalSymbolsA>$/ ), q{Don't match internally inverted } ); ok(!( "\x[AAB2]" ~~ m/^<+isInMiscellaneousMathematicalSymbolsA>$/ ), q{Don't match unrelated } ); ok("\x[AAB2]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[AAB2]" ~~ m/^<-isInMiscellaneousMathematicalSymbolsA>$/, q{Match unrelated internally inverted } ); ok("\x[AAB2]\x[27C0]" ~~ m/<+isInMiscellaneousMathematicalSymbolsA>/, q{Match unanchored } ); # InMiscellaneousMathematicalSymbolsB ok("\c[TRIPLE VERTICAL BAR DELIMITER]" ~~ m/^<+isInMiscellaneousMathematicalSymbolsB>$/, q{Match } ); ok("\c[TRIPLE VERTICAL BAR DELIMITER]" ~~ m/^<[A]+isInMiscellaneousMathematicalSymbolsB>$/, q{Match compound } ); ok(!( "\c[TRIPLE VERTICAL BAR DELIMITER]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[TRIPLE VERTICAL BAR DELIMITER]" ~~ m/^<[A]-isInMiscellaneousMathematicalSymbolsB>$/ ), q{Don't match compound inverted } ); ok(!( "\c[TRIPLE VERTICAL BAR DELIMITER]" ~~ m/^<-isInMiscellaneousMathematicalSymbolsB>$/ ), q{Don't match internally inverted } ); ok(!( "\x[5793]" ~~ m/^<+isInMiscellaneousMathematicalSymbolsB>$/ ), q{Don't match unrelated } ); ok("\x[5793]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[5793]" ~~ m/^<-isInMiscellaneousMathematicalSymbolsB>$/, q{Match unrelated internally inverted } ); ok("\x[5793]\c[TRIPLE VERTICAL BAR DELIMITER]" ~~ m/<+isInMiscellaneousMathematicalSymbolsB>/, q{Match unanchored } ); # InMiscellaneousSymbols ok("\c[BLACK SUN WITH RAYS]" ~~ m/^<+isInMiscellaneousSymbols>$/, q{Match } ); ok("\c[BLACK SUN WITH RAYS]" ~~ m/^<[A]+isInMiscellaneousSymbols>$/, q{Match compound } ); ok(!( "\c[BLACK SUN WITH RAYS]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[BLACK SUN WITH RAYS]" ~~ m/^<[A]-isInMiscellaneousSymbols>$/ ), q{Don't match compound inverted } ); ok(!( "\c[BLACK SUN WITH RAYS]" ~~ m/^<-isInMiscellaneousSymbols>$/ ), q{Don't match internally inverted } ); ok(!( "\x[39D9]" ~~ m/^<+isInMiscellaneousSymbols>$/ ), q{Don't match unrelated } ); ok("\x[39D9]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[39D9]" ~~ m/^<-isInMiscellaneousSymbols>$/, q{Match unrelated internally inverted } ); ok("\x[39D9]\c[BLACK SUN WITH RAYS]" ~~ m/<+isInMiscellaneousSymbols>/, q{Match unanchored } ); # InMiscellaneousTechnical ok("\c[DIAMETER SIGN]" ~~ m/^<+isInMiscellaneousTechnical>$/, q{Match } ); ok("\c[DIAMETER SIGN]" ~~ m/^<[A]+isInMiscellaneousTechnical>$/, q{Match compound } ); ok(!( "\c[DIAMETER SIGN]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[DIAMETER SIGN]" ~~ m/^<[A]-isInMiscellaneousTechnical>$/ ), q{Don't match compound inverted } ); ok(!( "\c[DIAMETER SIGN]" ~~ m/^<-isInMiscellaneousTechnical>$/ ), q{Don't match internally inverted } ); ok(!( "\x[528A]" ~~ m/^<+isInMiscellaneousTechnical>$/ ), q{Don't match unrelated } ); ok("\x[528A]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[528A]" ~~ m/^<-isInMiscellaneousTechnical>$/, q{Match unrelated internally inverted } ); ok("\x[528A]\c[DIAMETER SIGN]" ~~ m/<+isInMiscellaneousTechnical>/, q{Match unanchored } ); # InMongolian ok("\c[MONGOLIAN BIRGA]" ~~ m/^<+isInMongolian>$/, q{Match } ); ok("\c[MONGOLIAN BIRGA]" ~~ m/^<[A]+isInMongolian>$/, q{Match compound } ); ok(!( "\c[MONGOLIAN BIRGA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[MONGOLIAN BIRGA]" ~~ m/^<[A]-isInMongolian>$/ ), q{Don't match compound inverted } ); ok(!( "\c[MONGOLIAN BIRGA]" ~~ m/^<-isInMongolian>$/ ), q{Don't match internally inverted } ); ok(!( "\x[3985]" ~~ m/^<+isInMongolian>$/ ), q{Don't match unrelated } ); ok("\x[3985]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[3985]" ~~ m/^<-isInMongolian>$/, q{Match unrelated internally inverted } ); ok("\x[3985]\c[MONGOLIAN BIRGA]" ~~ m/<+isInMongolian>/, q{Match unanchored } ); # InMusicalSymbols ok(!( "\x[7A59]" ~~ m/^<+isInMusicalSymbols>$/ ), q{Don't match unrelated } ); ok("\x[7A59]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[7A59]" ~~ m/^<-isInMusicalSymbols>$/, q{Match unrelated internally inverted } ); # InMyanmar ok("\c[MYANMAR LETTER KA]" ~~ m/^<+isInMyanmar>$/, q{Match } ); ok("\c[MYANMAR LETTER KA]" ~~ m/^<[A]+isInMyanmar>$/, q{Match compound } ); ok(!( "\c[MYANMAR LETTER KA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[MYANMAR LETTER KA]" ~~ m/^<[A]-isInMyanmar>$/ ), q{Don't match compound inverted } ); ok(!( "\c[MYANMAR LETTER KA]" ~~ m/^<-isInMyanmar>$/ ), q{Don't match internally inverted } ); ok(!( "\x[5698]" ~~ m/^<+isInMyanmar>$/ ), q{Don't match unrelated } ); ok("\x[5698]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[5698]" ~~ m/^<-isInMyanmar>$/, q{Match unrelated internally inverted } ); ok("\x[5698]\c[MYANMAR LETTER KA]" ~~ m/<+isInMyanmar>/, q{Match unanchored } ); # InNumberForms ok("\x[2150]" ~~ m/^<+isInNumberForms>$/, q{Match } ); ok("\x[2150]" ~~ m/^<[A]+isInNumberForms>$/, q{Match compound } ); ok(!( "\x[2150]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[2150]" ~~ m/^<[A]-isInNumberForms>$/ ), q{Don't match compound inverted } ); ok(!( "\x[2150]" ~~ m/^<-isInNumberForms>$/ ), q{Don't match internally inverted } ); ok(!( "\x[C41B]" ~~ m/^<+isInNumberForms>$/ ), q{Don't match unrelated } ); ok("\x[C41B]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[C41B]" ~~ m/^<-isInNumberForms>$/, q{Match unrelated internally inverted } ); ok("\x[C41B]\x[2150]" ~~ m/<+isInNumberForms>/, q{Match unanchored } ); # InOgham ok("\c[OGHAM SPACE MARK]" ~~ m/^<+isInOgham>$/, q{Match } ); ok("\c[OGHAM SPACE MARK]" ~~ m/^<[A]+isInOgham>$/, q{Match compound } ); ok(!( "\c[OGHAM SPACE MARK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[OGHAM SPACE MARK]" ~~ m/^<[A]-isInOgham>$/ ), q{Don't match compound inverted } ); ok(!( "\c[OGHAM SPACE MARK]" ~~ m/^<-isInOgham>$/ ), q{Don't match internally inverted } ); ok(!( "\x[2C8C]" ~~ m/^<+isInOgham>$/ ), q{Don't match unrelated } ); ok("\x[2C8C]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[2C8C]" ~~ m/^<-isInOgham>$/, q{Match unrelated internally inverted } ); ok("\x[2C8C]\c[OGHAM SPACE MARK]" ~~ m/<+isInOgham>/, q{Match unanchored } ); # InOldItalic ok(!( "\c[YI SYLLABLE MGAT]" ~~ m/^<+isInOldItalic>$/ ), q{Don't match unrelated } ); ok("\c[YI SYLLABLE MGAT]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[YI SYLLABLE MGAT]" ~~ m/^<-isInOldItalic>$/, q{Match unrelated internally inverted } ); # InOpticalCharacterRecognition ok("\c[OCR HOOK]" ~~ m/^<+isInOpticalCharacterRecognition>$/, q{Match } ); ok("\c[OCR HOOK]" ~~ m/^<[A]+isInOpticalCharacterRecognition>$/, q{Match compound } ); ok(!( "\c[OCR HOOK]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[OCR HOOK]" ~~ m/^<[A]-isInOpticalCharacterRecognition>$/ ), q{Don't match compound inverted } ); ok(!( "\c[OCR HOOK]" ~~ m/^<-isInOpticalCharacterRecognition>$/ ), q{Don't match internally inverted } ); ok(!( "\x[CB83]" ~~ m/^<+isInOpticalCharacterRecognition>$/ ), q{Don't match unrelated } ); ok("\x[CB83]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[CB83]" ~~ m/^<-isInOpticalCharacterRecognition>$/, q{Match unrelated internally inverted } ); ok("\x[CB83]\c[OCR HOOK]" ~~ m/<+isInOpticalCharacterRecognition>/, q{Match unanchored } ); # InOriya ok("\x[0B00]" ~~ m/^<+isInOriya>$/, q{Match } ); ok("\x[0B00]" ~~ m/^<[A]+isInOriya>$/, q{Match compound } ); ok(!( "\x[0B00]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0B00]" ~~ m/^<[A]-isInOriya>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0B00]" ~~ m/^<-isInOriya>$/ ), q{Don't match internally inverted } ); ok(!( "\x[6CE7]" ~~ m/^<+isInOriya>$/ ), q{Don't match unrelated } ); ok("\x[6CE7]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[6CE7]" ~~ m/^<-isInOriya>$/, q{Match unrelated internally inverted } ); ok("\x[6CE7]\x[0B00]" ~~ m/<+isInOriya>/, q{Match unanchored } ); # InPrivateUseArea ok(!( "\x[7662]" ~~ m/^<+isInPrivateUseArea>$/ ), q{Don't match unrelated } ); ok("\x[7662]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[7662]" ~~ m/^<-isInPrivateUseArea>$/, q{Match unrelated internally inverted } ); # InRunic ok("\c[RUNIC LETTER FEHU FEOH FE F]" ~~ m/^<+isInRunic>$/, q{Match } ); ok("\c[RUNIC LETTER FEHU FEOH FE F]" ~~ m/^<[A]+isInRunic>$/, q{Match compound } ); ok(!( "\c[RUNIC LETTER FEHU FEOH FE F]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[RUNIC LETTER FEHU FEOH FE F]" ~~ m/^<[A]-isInRunic>$/ ), q{Don't match compound inverted } ); ok(!( "\c[RUNIC LETTER FEHU FEOH FE F]" ~~ m/^<-isInRunic>$/ ), q{Don't match internally inverted } ); ok(!( "\x[47A1]" ~~ m/^<+isInRunic>$/ ), q{Don't match unrelated } ); ok("\x[47A1]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[47A1]" ~~ m/^<-isInRunic>$/, q{Match unrelated internally inverted } ); ok("\x[47A1]\c[RUNIC LETTER FEHU FEOH FE F]" ~~ m/<+isInRunic>/, q{Match unanchored } ); # InSinhala ok("\x[0D80]" ~~ m/^<+isInSinhala>$/, q{Match } ); ok("\x[0D80]" ~~ m/^<[A]+isInSinhala>$/, q{Match compound } ); ok(!( "\x[0D80]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0D80]" ~~ m/^<[A]-isInSinhala>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0D80]" ~~ m/^<-isInSinhala>$/ ), q{Don't match internally inverted } ); ok(!( "\x[1C39]" ~~ m/^<+isInSinhala>$/ ), q{Don't match unrelated } ); ok("\x[1C39]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[1C39]" ~~ m/^<-isInSinhala>$/, q{Match unrelated internally inverted } ); ok("\x[1C39]\x[0D80]" ~~ m/<+isInSinhala>/, q{Match unanchored } ); # InSmallFormVariants ok(!( "\c[YI SYLLABLE FAP]" ~~ m/^<+isInSmallFormVariants>$/ ), q{Don't match unrelated } ); ok("\c[YI SYLLABLE FAP]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[YI SYLLABLE FAP]" ~~ m/^<-isInSmallFormVariants>$/, q{Match unrelated internally inverted } ); # InSpacingModifierLetters ok("\c[MODIFIER LETTER SMALL H]" ~~ m/^<+isInSpacingModifierLetters>$/, q{Match } ); ok("\c[MODIFIER LETTER SMALL H]" ~~ m/^<[A]+isInSpacingModifierLetters>$/, q{Match compound } ); ok(!( "\c[MODIFIER LETTER SMALL H]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[MODIFIER LETTER SMALL H]" ~~ m/^<[A]-isInSpacingModifierLetters>$/ ), q{Don't match compound inverted } ); ok(!( "\c[MODIFIER LETTER SMALL H]" ~~ m/^<-isInSpacingModifierLetters>$/ ), q{Don't match internally inverted } ); ok(!( "\x[08E8]" ~~ m/^<+isInSpacingModifierLetters>$/ ), q{Don't match unrelated } ); ok("\x[08E8]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[08E8]" ~~ m/^<-isInSpacingModifierLetters>$/, q{Match unrelated internally inverted } ); ok("\x[08E8]\c[MODIFIER LETTER SMALL H]" ~~ m/<+isInSpacingModifierLetters>/, q{Match unanchored } ); # InSpecials ok(!( "\x[0C7E]" ~~ m/^<+isInSpecials>$/ ), q{Don't match unrelated } ); ok("\x[0C7E]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[0C7E]" ~~ m/^<-isInSpecials>$/, q{Match unrelated internally inverted } ); # InSuperscriptsAndSubscripts ok("\c[SUPERSCRIPT ZERO]" ~~ m/^<+isInSuperscriptsAndSubscripts>$/, q{Match } ); ok("\c[SUPERSCRIPT ZERO]" ~~ m/^<[A]+isInSuperscriptsAndSubscripts>$/, q{Match compound } ); ok(!( "\c[SUPERSCRIPT ZERO]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[SUPERSCRIPT ZERO]" ~~ m/^<[A]-isInSuperscriptsAndSubscripts>$/ ), q{Don't match compound inverted } ); ok(!( "\c[SUPERSCRIPT ZERO]" ~~ m/^<-isInSuperscriptsAndSubscripts>$/ ), q{Don't match internally inverted } ); ok(!( "\x[D378]" ~~ m/^<+isInSuperscriptsAndSubscripts>$/ ), q{Don't match unrelated } ); ok("\x[D378]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[D378]" ~~ m/^<-isInSuperscriptsAndSubscripts>$/, q{Match unrelated internally inverted } ); ok("\x[D378]\c[SUPERSCRIPT ZERO]" ~~ m/<+isInSuperscriptsAndSubscripts>/, q{Match unanchored } ); # InSupplementalArrowsA ok("\c[UPWARDS QUADRUPLE ARROW]" ~~ m/^<+isInSupplementalArrowsA>$/, q{Match } ); ok("\c[UPWARDS QUADRUPLE ARROW]" ~~ m/^<[A]+isInSupplementalArrowsA>$/, q{Match compound } ); ok(!( "\c[UPWARDS QUADRUPLE ARROW]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[UPWARDS QUADRUPLE ARROW]" ~~ m/^<[A]-isInSupplementalArrowsA>$/ ), q{Don't match compound inverted } ); ok(!( "\c[UPWARDS QUADRUPLE ARROW]" ~~ m/^<-isInSupplementalArrowsA>$/ ), q{Don't match internally inverted } ); ok(!( "\c[LIMBU DIGIT SEVEN]" ~~ m/^<+isInSupplementalArrowsA>$/ ), q{Don't match unrelated } ); ok("\c[LIMBU DIGIT SEVEN]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[LIMBU DIGIT SEVEN]" ~~ m/^<-isInSupplementalArrowsA>$/, q{Match unrelated internally inverted } ); ok("\c[LIMBU DIGIT SEVEN]\c[UPWARDS QUADRUPLE ARROW]" ~~ m/<+isInSupplementalArrowsA>/, q{Match unanchored } ); # InSupplementalArrowsB ok("\c[RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE]" ~~ m/^<+isInSupplementalArrowsB>$/, q{Match } ); ok("\c[RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE]" ~~ m/^<[A]+isInSupplementalArrowsB>$/, q{Match compound } ); ok(!( "\c[RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE]" ~~ m/^<[A]-isInSupplementalArrowsB>$/ ), q{Don't match compound inverted } ); ok(!( "\c[RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE]" ~~ m/^<-isInSupplementalArrowsB>$/ ), q{Don't match internally inverted } ); ok(!( "\x[1D7D]" ~~ m/^<+isInSupplementalArrowsB>$/ ), q{Don't match unrelated } ); ok("\x[1D7D]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[1D7D]" ~~ m/^<-isInSupplementalArrowsB>$/, q{Match unrelated internally inverted } ); ok("\x[1D7D]\c[RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE]" ~~ m/<+isInSupplementalArrowsB>/, q{Match unanchored } ); # InSupplementalMathematicalOperators ok("\c[N-ARY CIRCLED DOT OPERATOR]" ~~ m/^<+isInSupplementalMathematicalOperators>$/, q{Match } ); ok("\c[N-ARY CIRCLED DOT OPERATOR]" ~~ m/^<[A]+isInSupplementalMathematicalOperators>$/, q{Match compound } ); ok(!( "\c[N-ARY CIRCLED DOT OPERATOR]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[N-ARY CIRCLED DOT OPERATOR]" ~~ m/^<[A]-isInSupplementalMathematicalOperators>$/ ), q{Don't match compound inverted } ); ok(!( "\c[N-ARY CIRCLED DOT OPERATOR]" ~~ m/^<-isInSupplementalMathematicalOperators>$/ ), q{Don't match internally inverted } ); ok(!( "\c[YI SYLLABLE TAX]" ~~ m/^<+isInSupplementalMathematicalOperators>$/ ), q{Don't match unrelated } ); ok("\c[YI SYLLABLE TAX]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[YI SYLLABLE TAX]" ~~ m/^<-isInSupplementalMathematicalOperators>$/, q{Match unrelated internally inverted } ); ok("\c[YI SYLLABLE TAX]\c[N-ARY CIRCLED DOT OPERATOR]" ~~ m/<+isInSupplementalMathematicalOperators>/, q{Match unanchored } ); # InSupplementaryPrivateUseAreaA ok(!( "\c[TIBETAN LETTER PHA]" ~~ m/^<+isInSupplementaryPrivateUseAreaA>$/ ), q{Don't match unrelated } ); ok("\c[TIBETAN LETTER PHA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[TIBETAN LETTER PHA]" ~~ m/^<-isInSupplementaryPrivateUseAreaA>$/, q{Match unrelated internally inverted } ); # InSupplementaryPrivateUseAreaB ok(!( "\x[7E65]" ~~ m/^<+isInSupplementaryPrivateUseAreaB>$/ ), q{Don't match unrelated } ); ok("\x[7E65]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[7E65]" ~~ m/^<-isInSupplementaryPrivateUseAreaB>$/, q{Match unrelated internally inverted } ); # InSyriac ok("\c[SYRIAC END OF PARAGRAPH]" ~~ m/^<+isInSyriac>$/, q{Match } ); ok("\c[SYRIAC END OF PARAGRAPH]" ~~ m/^<[A]+isInSyriac>$/, q{Match compound } ); ok(!( "\c[SYRIAC END OF PARAGRAPH]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[SYRIAC END OF PARAGRAPH]" ~~ m/^<[A]-isInSyriac>$/ ), q{Don't match compound inverted } ); ok(!( "\c[SYRIAC END OF PARAGRAPH]" ~~ m/^<-isInSyriac>$/ ), q{Don't match internally inverted } ); ok(!( "\x[CA1C]" ~~ m/^<+isInSyriac>$/ ), q{Don't match unrelated } ); ok("\x[CA1C]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[CA1C]" ~~ m/^<-isInSyriac>$/, q{Match unrelated internally inverted } ); ok("\x[CA1C]\c[SYRIAC END OF PARAGRAPH]" ~~ m/<+isInSyriac>/, q{Match unanchored } ); # InTagalog ok("\c[TAGALOG LETTER A]" ~~ m/^<+isInTagalog>$/, q{Match } ); ok("\c[TAGALOG LETTER A]" ~~ m/^<[A]+isInTagalog>$/, q{Match compound } ); ok(!( "\c[TAGALOG LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[TAGALOG LETTER A]" ~~ m/^<[A]-isInTagalog>$/ ), q{Don't match compound inverted } ); ok(!( "\c[TAGALOG LETTER A]" ~~ m/^<-isInTagalog>$/ ), q{Don't match internally inverted } ); ok(!( "\x[D49E]" ~~ m/^<+isInTagalog>$/ ), q{Don't match unrelated } ); ok("\x[D49E]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[D49E]" ~~ m/^<-isInTagalog>$/, q{Match unrelated internally inverted } ); ok("\x[D49E]\c[TAGALOG LETTER A]" ~~ m/<+isInTagalog>/, q{Match unanchored } ); # InTagbanwa ok("\c[TAGBANWA LETTER A]" ~~ m/^<+isInTagbanwa>$/, q{Match } ); ok("\c[TAGBANWA LETTER A]" ~~ m/^<[A]+isInTagbanwa>$/, q{Match compound } ); ok(!( "\c[TAGBANWA LETTER A]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[TAGBANWA LETTER A]" ~~ m/^<[A]-isInTagbanwa>$/ ), q{Don't match compound inverted } ); ok(!( "\c[TAGBANWA LETTER A]" ~~ m/^<-isInTagbanwa>$/ ), q{Don't match internally inverted } ); ok(!( "\x[AFAA]" ~~ m/^<+isInTagbanwa>$/ ), q{Don't match unrelated } ); ok("\x[AFAA]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[AFAA]" ~~ m/^<-isInTagbanwa>$/, q{Match unrelated internally inverted } ); ok("\x[AFAA]\c[TAGBANWA LETTER A]" ~~ m/<+isInTagbanwa>/, q{Match unanchored } ); # InTags ok(!( "\x[CA38]" ~~ m/^<+isInTags>$/ ), q{Don't match unrelated } ); ok("\x[CA38]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[CA38]" ~~ m/^<-isInTags>$/, q{Match unrelated internally inverted } ); # InTamil ok("\x[0B80]" ~~ m/^<+isInTamil>$/, q{Match } ); ok("\x[0B80]" ~~ m/^<[A]+isInTamil>$/, q{Match compound } ); ok(!( "\x[0B80]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0B80]" ~~ m/^<[A]-isInTamil>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0B80]" ~~ m/^<-isInTamil>$/ ), q{Don't match internally inverted } ); ok(!( "\x[D44B]" ~~ m/^<+isInTamil>$/ ), q{Don't match unrelated } ); ok("\x[D44B]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[D44B]" ~~ m/^<-isInTamil>$/, q{Match unrelated internally inverted } ); ok("\x[D44B]\x[0B80]" ~~ m/<+isInTamil>/, q{Match unanchored } ); # InTelugu ok("\x[0C00]" ~~ m/^<+isInTelugu>$/, q{Match } ); ok("\x[0C00]" ~~ m/^<[A]+isInTelugu>$/, q{Match compound } ); ok(!( "\x[0C00]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0C00]" ~~ m/^<[A]-isInTelugu>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0C00]" ~~ m/^<-isInTelugu>$/ ), q{Don't match internally inverted } ); ok(!( "\x[D3E7]" ~~ m/^<+isInTelugu>$/ ), q{Don't match unrelated } ); ok("\x[D3E7]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[D3E7]" ~~ m/^<-isInTelugu>$/, q{Match unrelated internally inverted } ); ok("\x[D3E7]\x[0C00]" ~~ m/<+isInTelugu>/, q{Match unanchored } ); # InThaana ok("\c[THAANA LETTER HAA]" ~~ m/^<+isInThaana>$/, q{Match } ); ok("\c[THAANA LETTER HAA]" ~~ m/^<[A]+isInThaana>$/, q{Match compound } ); ok(!( "\c[THAANA LETTER HAA]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[THAANA LETTER HAA]" ~~ m/^<[A]-isInThaana>$/ ), q{Don't match compound inverted } ); ok(!( "\c[THAANA LETTER HAA]" ~~ m/^<-isInThaana>$/ ), q{Don't match internally inverted } ); ok(!( "\c[YI SYLLABLE QIT]" ~~ m/^<+isInThaana>$/ ), q{Don't match unrelated } ); ok("\c[YI SYLLABLE QIT]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[YI SYLLABLE QIT]" ~~ m/^<-isInThaana>$/, q{Match unrelated internally inverted } ); ok("\c[YI SYLLABLE QIT]\c[THAANA LETTER HAA]" ~~ m/<+isInThaana>/, q{Match unanchored } ); # InThai ok("\x[0E00]" ~~ m/^<+isInThai>$/, q{Match } ); ok("\x[0E00]" ~~ m/^<[A]+isInThai>$/, q{Match compound } ); ok(!( "\x[0E00]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[0E00]" ~~ m/^<[A]-isInThai>$/ ), q{Don't match compound inverted } ); ok(!( "\x[0E00]" ~~ m/^<-isInThai>$/ ), q{Don't match internally inverted } ); ok(!( "\x[BCED]" ~~ m/^<+isInThai>$/ ), q{Don't match unrelated } ); ok("\x[BCED]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[BCED]" ~~ m/^<-isInThai>$/, q{Match unrelated internally inverted } ); ok("\x[BCED]\x[0E00]" ~~ m/<+isInThai>/, q{Match unanchored } ); # InTibetan ok("\c[TIBETAN SYLLABLE OM]" ~~ m/^<+isInTibetan>$/, q{Match } ); ok("\c[TIBETAN SYLLABLE OM]" ~~ m/^<[A]+isInTibetan>$/, q{Match compound } ); ok(!( "\c[TIBETAN SYLLABLE OM]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[TIBETAN SYLLABLE OM]" ~~ m/^<[A]-isInTibetan>$/ ), q{Don't match compound inverted } ); ok(!( "\c[TIBETAN SYLLABLE OM]" ~~ m/^<-isInTibetan>$/ ), q{Don't match internally inverted } ); ok(!( "\c[ARABIC SIGN SINDHI AMPERSAND]" ~~ m/^<+isInTibetan>$/ ), q{Don't match unrelated } ); ok("\c[ARABIC SIGN SINDHI AMPERSAND]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[ARABIC SIGN SINDHI AMPERSAND]" ~~ m/^<-isInTibetan>$/, q{Match unrelated internally inverted } ); ok("\c[ARABIC SIGN SINDHI AMPERSAND]\c[TIBETAN SYLLABLE OM]" ~~ m/<+isInTibetan>/, q{Match unanchored } ); # InUnifiedCanadianAboriginalSyllabics ok("\x[1400]" ~~ m/^<+isInUnifiedCanadianAboriginalSyllabics>$/, q{Match } ); ok("\x[1400]" ~~ m/^<[A]+isInUnifiedCanadianAboriginalSyllabics>$/, q{Match compound } ); ok(!( "\x[1400]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\x[1400]" ~~ m/^<[A]-isInUnifiedCanadianAboriginalSyllabics>$/ ), q{Don't match compound inverted } ); ok(!( "\x[1400]" ~~ m/^<-isInUnifiedCanadianAboriginalSyllabics>$/ ), q{Don't match internally inverted } ); ok(!( "\x[49D8]" ~~ m/^<+isInUnifiedCanadianAboriginalSyllabics>$/ ), q{Don't match unrelated } ); ok("\x[49D8]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[49D8]" ~~ m/^<-isInUnifiedCanadianAboriginalSyllabics>$/, q{Match unrelated internally inverted } ); ok("\x[49D8]\x[1400]" ~~ m/<+isInUnifiedCanadianAboriginalSyllabics>/, q{Match unanchored } ); # InVariationSelectors ok(!( "\x[5307]" ~~ m/^<+isInVariationSelectors>$/ ), q{Don't match unrelated } ); ok("\x[5307]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[5307]" ~~ m/^<-isInVariationSelectors>$/, q{Match unrelated internally inverted } ); # InYiRadicals ok("\c[YI RADICAL QOT]" ~~ m/^<+isInYiRadicals>$/, q{Match } ); ok("\c[YI RADICAL QOT]" ~~ m/^<[A]+isInYiRadicals>$/, q{Match compound } ); ok(!( "\c[YI RADICAL QOT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[YI RADICAL QOT]" ~~ m/^<[A]-isInYiRadicals>$/ ), q{Don't match compound inverted } ); ok(!( "\c[YI RADICAL QOT]" ~~ m/^<-isInYiRadicals>$/ ), q{Don't match internally inverted } ); ok(!( "\x[7CAD]" ~~ m/^<+isInYiRadicals>$/ ), q{Don't match unrelated } ); ok("\x[7CAD]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\x[7CAD]" ~~ m/^<-isInYiRadicals>$/, q{Match unrelated internally inverted } ); ok("\x[7CAD]\c[YI RADICAL QOT]" ~~ m/<+isInYiRadicals>/, q{Match unanchored } ); # InYiSyllables ok("\c[YI SYLLABLE IT]" ~~ m/^<+isInYiSyllables>$/, q{Match } ); ok("\c[YI SYLLABLE IT]" ~~ m/^<[A]+isInYiSyllables>$/, q{Match compound } ); ok(!( "\c[YI SYLLABLE IT]" ~~ m/^.$/ ), q{Don't match externally inverted } ); ok(!( "\c[YI SYLLABLE IT]" ~~ m/^<[A]-isInYiSyllables>$/ ), q{Don't match compound inverted } ); ok(!( "\c[YI SYLLABLE IT]" ~~ m/^<-isInYiSyllables>$/ ), q{Don't match internally inverted } ); ok(!( "\c[BRAILLE PATTERN DOTS-1578]" ~~ m/^<+isInYiSyllables>$/ ), q{Don't match unrelated } ); ok("\c[BRAILLE PATTERN DOTS-1578]" ~~ m/^.$/, q{Match unrelated externally inverted } ); ok("\c[BRAILLE PATTERN DOTS-1578]" ~~ m/^<-isInYiSyllables>$/, q{Match unrelated internally inverted } ); ok("\c[BRAILLE PATTERN DOTS-1578]\c[YI SYLLABLE IT]" ~~ m/<+isInYiSyllables>/, q{Match unanchored } ); }