| 1 | Tests for use charnames with compilation errors and aliases. |
| 2 | __END__ |
| 3 | # NAME illegal :pragma |
| 4 | use warnings; |
| 5 | use charnames ":scoobydoo"; |
| 6 | "Here: \N{e_ACUTE}!\n"; |
| 7 | EXPECT |
| 8 | OPTIONS regex |
| 9 | unsupported special ':scoobydoo' in charnames at |
| 10 | ######## |
| 11 | # NAME autoload doesn't get vianame |
| 12 | print "Here: \N{DIGIT ONE}\n"; |
| 13 | charnames::vianame("DIGIT TWO"); |
| 14 | EXPECT |
| 15 | OPTIONS regex |
| 16 | Undefined subroutine &charnames::vianame called at - line \d+. |
| 17 | Here: 1 |
| 18 | ######## |
| 19 | # NAME autoload doesn't get viacode |
| 20 | print "Here: \N{DIGIT THREE}\n"; |
| 21 | charnames::viacode(0x34); |
| 22 | EXPECT |
| 23 | OPTIONS regex |
| 24 | Undefined subroutine &charnames::viacode called at - line \d+. |
| 25 | Here: 3 |
| 26 | ######## |
| 27 | # NAME autoload doesn't get string_vianame |
| 28 | print "Here: \N{DIGIT FOUR}\n"; |
| 29 | charnames::string_vianame("DIGIT FIVE"); |
| 30 | EXPECT |
| 31 | OPTIONS regex |
| 32 | Undefined subroutine &charnames::string_vianame called at - line \d+. |
| 33 | Here: 4 |
| 34 | ######## |
| 35 | # NAME wrong type of alias (missing colon) |
| 36 | no warnings; |
| 37 | use charnames "alias"; |
| 38 | "Here: \N{e_ACUTE}!\n"; |
| 39 | EXPECT |
| 40 | OPTIONS regex fatal |
| 41 | Unknown charname 'e_ACUTE' at - line \d+, within string |
| 42 | ######## |
| 43 | # NAME alias without an argument |
| 44 | use warnings; |
| 45 | use charnames ":alias"; |
| 46 | "Here: \N{e_ACUTE}!\n"; |
| 47 | EXPECT |
| 48 | OPTIONS regex |
| 49 | :alias needs an argument in charnames at |
| 50 | ######## |
| 51 | # NAME reversed sequence |
| 52 | use warnings; |
| 53 | use charnames ":alias" => ":full"; |
| 54 | "Here: \N{e_ACUTE}!\n"; |
| 55 | EXPECT |
| 56 | OPTIONS regex |
| 57 | :alias cannot use existing pragma :full \(reversed order\?\) at |
| 58 | ######## |
| 59 | # NAME alias with hashref but with :short |
| 60 | use warnings; |
| 61 | no warnings 'void'; |
| 62 | use charnames ":short", ":alias" => { e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE" }; |
| 63 | "Here: \N{e_ACUTE}!\n"; |
| 64 | EXPECT |
| 65 | OPTIONS regex fatal |
| 66 | Unknown charname 'e_ACUTE' at - line \d+, within string |
| 67 | ######## |
| 68 | # NAME alias with hashref to :full OK |
| 69 | use warnings; |
| 70 | no warnings 'void'; |
| 71 | use charnames ":full", ":alias" => { e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE" }; |
| 72 | "Here: \N{e_ACUTE}!\n"; |
| 73 | EXPECT |
| 74 | OPTIONS regex |
| 75 | $ |
| 76 | ######## |
| 77 | # NAME alias with hashref to :loose OK |
| 78 | use warnings; |
| 79 | no warnings 'void'; |
| 80 | use charnames ":loose", ":alias" => { e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE" }; |
| 81 | "Here: \N{e_ACUTE}!\n"; |
| 82 | EXPECT |
| 83 | OPTIONS regex |
| 84 | $ |
| 85 | ######## |
| 86 | # NAME alias with :loose requires :full type name |
| 87 | use warnings; |
| 88 | no warnings 'void'; |
| 89 | use charnames ":loose", ":alias" => { e_ACUTE => "latin SMALL LETTER E WITH ACUTE" }; |
| 90 | "Here: \N{e_ACUTE}!\n"; |
| 91 | EXPECT |
| 92 | OPTIONS regex fatal |
| 93 | Unknown charname 'e_ACUTE' at - line \d+, within string |
| 94 | ######## |
| 95 | # NAME alias with hashref to :short but using :full |
| 96 | use warnings; |
| 97 | no warnings 'void'; |
| 98 | use charnames ":full", ":alias" => { e_ACUTE => "LATIN:e WITH ACUTE" }; |
| 99 | "Here: \N{e_ACUTE}!\n"; |
| 100 | EXPECT |
| 101 | OPTIONS regex fatal |
| 102 | Unknown charname 'e_ACUTE' at - line \d+, within string |
| 103 | ######## |
| 104 | # NAME alias with hashref to :short OK |
| 105 | use warnings; |
| 106 | no warnings 'void'; |
| 107 | use charnames ":short", ":alias" => { e_ACUTE => "LATIN:e WITH ACUTE" }; |
| 108 | "Here: \N{e_ACUTE}!\n"; |
| 109 | EXPECT |
| 110 | OPTIONS regex |
| 111 | $ |
| 112 | ######## |
| 113 | # NAME alias with bad hashref |
| 114 | use warnings; |
| 115 | no warnings 'void'; |
| 116 | use charnames ":short", ":alias" => "e_ACUTE"; |
| 117 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 118 | EXPECT |
| 119 | OPTIONS regex |
| 120 | unicore/e_ACUTE_alias.pl cannot be used as alias file for charnames at |
| 121 | ######## |
| 122 | # NAME alias with arrayref |
| 123 | use warnings; |
| 124 | no warnings 'void'; |
| 125 | use charnames ":short", ":alias" => [ e_ACUTE => "LATIN:e WITH ACUTE" ]; |
| 126 | "Here: \N{e_ACUTE}!\n"; |
| 127 | EXPECT |
| 128 | OPTIONS regex |
| 129 | Only HASH reference supported as argument to :alias at |
| 130 | ######## |
| 131 | # NAME alias with bad hashref |
| 132 | no warnings; |
| 133 | use charnames ":short", ":alias" => { e_ACUTE => "LATIN:e WITH ACUTE", "a_ACUTE" }; |
| 134 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 135 | EXPECT |
| 136 | OPTIONS regex |
| 137 | Unknown charname 'a_ACUTE' at |
| 138 | ######## |
| 139 | # NAME alias with hashref two aliases |
| 140 | use warnings; |
| 141 | no warnings 'void'; |
| 142 | use charnames ":short", ":alias" => { |
| 143 | e_ACUTE => "LATIN:e WITH ACUTE", |
| 144 | a_ACUTE => "", |
| 145 | }; |
| 146 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 147 | EXPECT |
| 148 | OPTIONS regex fatal |
| 149 | Unknown charname 'a_ACUTE' at - line \d+, within string |
| 150 | ######## |
| 151 | # NAME alias with hashref two aliases |
| 152 | use warnings; |
| 153 | no warnings 'void'; |
| 154 | use charnames ":short", ":alias" => { |
| 155 | e_ACUTE => "LATIN:e WITH ACUTE", |
| 156 | a_ACUTE => "LATIN:a WITH ACUTE", |
| 157 | }; |
| 158 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 159 | EXPECT |
| 160 | OPTIONS regex |
| 161 | $ |
| 162 | ######## |
| 163 | # NAME alias with hashref using mixed aliases |
| 164 | use warnings; |
| 165 | use charnames ":short", ":alias" => { |
| 166 | e_ACUTE => "LATIN:e WITH ACUTE", |
| 167 | a_ACUTE => "LATIN SMALL LETTER A WITH ACUT", |
| 168 | }; |
| 169 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 170 | EXPECT |
| 171 | OPTIONS regex fatal |
| 172 | Unknown charname 'a_ACUTE' at - line \d+, within string |
| 173 | ######## |
| 174 | # NAME alias with hashref using mixed aliases |
| 175 | use warnings; |
| 176 | use charnames ":short", ":alias" => { |
| 177 | e_ACUTE => "LATIN:e WITH ACUTE", |
| 178 | a_ACUTE => "LATIN SMALL LETTER A WITH ACUTE", |
| 179 | }; |
| 180 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 181 | EXPECT |
| 182 | OPTIONS regex fatal |
| 183 | Unknown charname 'a_ACUTE' at - line \d+, within string |
| 184 | ######## |
| 185 | # NAME alias with hashref using mixed aliases |
| 186 | use warnings; |
| 187 | no warnings 'void'; |
| 188 | use charnames ":full", ":alias" => { |
| 189 | e_ACUTE => "LATIN:e WITH ACUTE", |
| 190 | a_ACUTE => "LATIN SMALL LETTER A WITH ACUTE", |
| 191 | }; |
| 192 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 193 | EXPECT |
| 194 | OPTIONS regex fatal |
| 195 | Unknown charname 'e_ACUTE' at - line \d+, within string |
| 196 | ######## |
| 197 | # NAME alias with nonexisting file |
| 198 | use warnings; |
| 199 | no warnings 'void'; |
| 200 | use charnames ":full", ":alias" => "non_existing_xyzzy"; |
| 201 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 202 | EXPECT |
| 203 | OPTIONS regex |
| 204 | unicore/non_existing_xyzzy_alias.pl cannot be used as alias file for charnames at |
| 205 | ######## |
| 206 | # NAME alias with bad file name |
| 207 | use warnings; |
| 208 | no warnings 'void'; |
| 209 | use charnames ":full", ":alias" => "xy 7-"; |
| 210 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 211 | EXPECT |
| 212 | OPTIONS regex |
| 213 | Charnames alias file names can only have identifier characters at |
| 214 | ######## |
| 215 | # NAME alias with non_absolute (existing) file name (which it should /not/ use) |
| 216 | use warnings; |
| 217 | no warnings 'void'; |
| 218 | use charnames ":full", ":alias" => "perl"; |
| 219 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 220 | EXPECT |
| 221 | OPTIONS regex |
| 222 | unicore/perl_alias.pl cannot be used as alias file for charnames at |
| 223 | ######## |
| 224 | # NAME alias with bad file |
| 225 | --FILE-- ../../lib/unicore/xyzzy_alias.pl |
| 226 | #!perl |
| 227 | 0; |
| 228 | --FILE-- |
| 229 | use warnings; |
| 230 | no warnings 'void'; |
| 231 | use charnames ":full", ":alias" => "xyzzy"; |
| 232 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 233 | EXPECT |
| 234 | OPTIONS regex |
| 235 | unicore/xyzzy_alias.pl did not return a \(valid\) list of alias pairs at |
| 236 | ######## |
| 237 | # NAME alias with file with empty list |
| 238 | --FILE-- ../../lib/unicore/xyzzy_alias.pl |
| 239 | #!perl |
| 240 | (); |
| 241 | --FILE-- |
| 242 | use warnings; |
| 243 | no warnings 'void'; |
| 244 | use charnames ":full", ":alias" => "xyzzy"; |
| 245 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 246 | EXPECT |
| 247 | OPTIONS regex fatal |
| 248 | Unknown charname 'e_ACUTE' at - line \d+, within string |
| 249 | ######## |
| 250 | # NAME alias with file OK but file has :short aliases |
| 251 | --FILE-- ../../lib/unicore/xyzzy_alias.pl |
| 252 | #!perl |
| 253 | ( e_ACUTE => "LATIN:e WITH ACUTE", |
| 254 | a_ACUTE => "LATIN:a WITH ACUTE", |
| 255 | ); |
| 256 | --FILE-- |
| 257 | use warnings; |
| 258 | no warnings 'void'; |
| 259 | use charnames ":full", ":alias" => "xyzzy"; |
| 260 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 261 | EXPECT |
| 262 | OPTIONS regex fatal |
| 263 | Unknown charname 'e_ACUTE' at - line \d+, within string |
| 264 | ######## |
| 265 | # NAME alias with :short and file OK |
| 266 | --FILE-- ../../lib/unicore/xyzzy_alias.pl |
| 267 | #!perl |
| 268 | ( e_ACUTE => "LATIN:e WITH ACUTE", |
| 269 | a_ACUTE => "LATIN:a WITH ACUTE", |
| 270 | ); |
| 271 | --FILE-- |
| 272 | use warnings; |
| 273 | no warnings 'void'; |
| 274 | use charnames ":short", ":alias" => "xyzzy"; |
| 275 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 276 | EXPECT |
| 277 | OPTIONS regex |
| 278 | $ |
| 279 | ######## |
| 280 | # NAME alias with :short and file OK has :long aliases |
| 281 | --FILE-- ../../lib/unicore/xyzzy_alias.pl |
| 282 | #!perl |
| 283 | ( e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE", |
| 284 | a_ACUTE => "LATIN SMALL LETTER A WITH ACUTE", |
| 285 | ); |
| 286 | --FILE-- |
| 287 | use warnings; |
| 288 | no warnings 'void'; |
| 289 | use charnames ":short", ":alias" => "xyzzy"; |
| 290 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 291 | EXPECT |
| 292 | OPTIONS regex fatal |
| 293 | Unknown charname 'e_ACUTE' at - line \d+, within string |
| 294 | ######## |
| 295 | # NAME alias with file implicit :full but file has :short aliases |
| 296 | --FILE-- ../../lib/unicore/xyzzy_alias.pl |
| 297 | #!perl |
| 298 | ( e_ACUTE => "LATIN:e WITH ACUTE", |
| 299 | a_ACUTE => "LATIN:a WITH ACUTE", |
| 300 | ); |
| 301 | --FILE-- |
| 302 | use warnings; |
| 303 | no warnings 'void'; |
| 304 | use charnames ":alias" => ":xyzzy"; |
| 305 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 306 | EXPECT |
| 307 | OPTIONS regex fatal |
| 308 | Unknown charname 'e_ACUTE' at - line \d+, within string |
| 309 | ######## |
| 310 | # NAME alias with file implicit :full and file has :long aliases |
| 311 | --FILE-- ../../lib/unicore/xyzzy_alias.pl |
| 312 | #!perl |
| 313 | ( e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE", |
| 314 | a_ACUTE => "LATIN SMALL LETTER A WITH ACUTE", |
| 315 | ); |
| 316 | --FILE-- |
| 317 | use warnings; |
| 318 | no warnings 'void'; |
| 319 | use charnames ":alias" => ":xyzzy"; |
| 320 | "Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; |
| 321 | EXPECT |
| 322 | OPTIONS regex |
| 323 | $ |
| 324 | ######## |
| 325 | # NAME charnames with no import still works for runtime functions |
| 326 | use warnings; |
| 327 | no warnings 'void'; |
| 328 | use charnames (); |
| 329 | charnames::vianame('SPACE'); |
| 330 | charnames::viacode(0x41); |
| 331 | EXPECT |
| 332 | OPTIONS regex |
| 333 | $ |
| 334 | ######## |
| 335 | # NAME no extraneous warning [perl #11560] |
| 336 | use warnings; |
| 337 | use charnames (); |
| 338 | print charnames::viacode(0x80), "\n"; |
| 339 | EXPECT |
| 340 | OPTIONS regex |
| 341 | PADDING CHARACTER |
| 342 | ######## |
| 343 | # NAME various wrong characters in :alias are errors |
| 344 | # Below, one of the EXPECT regexes matches both the UTF-8 and non-UTF-8 form. |
| 345 | # This is because under some circumstances the message gets output as UTF-8. |
| 346 | use charnames ":full", ":alias" => { |
| 347 | "4e_ACUTE" => "LATIN SMALL LETTER E WITH ACUTE", |
| 348 | "e_A,CUTE" => "LATIN SMALL LETTER E WITH ACUTE", |
| 349 | "e_ACUT\x{d7}E" => "LATIN SMALL LETTER E WITH ACUTE", |
| 350 | }; |
| 351 | EXPECT |
| 352 | OPTIONS regex |
| 353 | Invalid character in charnames alias definition; marked by <-- HERE in '4<-- HERE e_ACUTE' |
| 354 | Invalid character in charnames alias definition; marked by <-- HERE in 'e_A,<-- HERE CUTE' |
| 355 | Invalid character in charnames alias definition; marked by <-- HERE in 'e_ACUT(?:\x{d7}|\x{C3}\x{97})<-- HERE E' |
| 356 | ######## |
| 357 | # RT#73022 |
| 358 | # NAME \N{...} interprets ... as octets rather than UTF-8 |
| 359 | use utf8; |
| 360 | use open qw( :utf8 :std ); |
| 361 | use charnames ":full", ":alias" => { "自転車に乗る人" => "BICYCLIST" }; |
| 362 | print "ok\n" if "\N{自転車に乗る人}" eq "\x{1F6B4}"; |
| 363 | EXPECT |
| 364 | ok |
| 365 | ######## |
| 366 | # NAME Misspelled \N{} UTF-8 names are errors |
| 367 | use utf8; |
| 368 | use open qw( :utf8 :std ); |
| 369 | use charnames ":full", ":alias" => { "自転車に乗る人" => "BICYCLIST" }; |
| 370 | print "ok\n" if "\N{転車に乗る人}" eq "\x{1F6B4}"; |
| 371 | EXPECT |
| 372 | OPTIONS regex |
| 373 | Unknown charname '転車に乗る人' at - line \d+, within string |
| 374 | ######## |
| 375 | # NAME various wrong UTF-8 characters in :alias are errors |
| 376 | # First has a punctuation, KATAKANA MIDDLE DOT, in it; second begins with a |
| 377 | # digit: ARABIC-INDIC DIGIT FOUR |
| 378 | use utf8; |
| 379 | use open qw( :utf8 :std ); |
| 380 | use charnames ":full", ":alias" => { "自転車・に乗る人" => "BICYCLIST", |
| 381 | "٤転車に乗る人" => "BICYCLIST", |
| 382 | }; |
| 383 | print "ok\n" if "\N{自転車・に乗る人}" eq "\x{1F6B4}"; |
| 384 | print "ok\n" if "\N{٤転車に乗る人}" eq "\x{1F6B4}"; |
| 385 | EXPECT |
| 386 | OPTIONS regex |
| 387 | Invalid character in charnames alias definition; marked by <-- HERE in '٤<-- HERE 転車に乗る人' |
| 388 | Invalid character in charnames alias definition; marked by <-- HERE in '自転車・<-- HERE に乗る人' at - line \d+ |