]> git.saurik.com Git - apple/icu.git/blob - icuSources/test/testdata/collationtest.txt
ICU-66108.tar.gz
[apple/icu.git] / icuSources / test / testdata / collationtest.txt
1 # Copyright (C) 2016 and later: Unicode, Inc. and others.
2 # License & terms of use: http://www.unicode.org/copyright.html
3 # Copyright (c) 2012-2015 International Business Machines
4 # Corporation and others. All Rights Reserved.
5 #
6 # This file should be in UTF-8 with a signature byte sequence ("BOM").
7 #
8 # collationtest.txt: Collation test data.
9 #
10 # created on: 2012apr13
11 # created by: Markus W. Scherer
12
13 # A line with "** test: description" is used for verbose and error output.
14
15 # A collator can be set with "@ root" or "@ locale language-tag",
16 # for example "@ locale de-u-co-phonebk".
17 # An old-style locale ID can also be used, for example "@ locale de@collation=phonebook".
18
19 # A collator can be built with "@ rules".
20 # An "@ rules" line is followed by one or more lines with the tailoring rules.
21
22 # A collator can be modified with "% attribute=value".
23
24 # "* compare" tests the order (= or <) of the following strings.
25 # The relation can be "=" or "<" (the level of the difference is not specified)
26 # or "<1", "<2", "<c", "<3", "<4" (indicating the level of the difference).
27
28 # Test sections ("* compare") are terminated by
29 # definitions of new collators, changing attributes, or new test sections.
30
31 ** test: simple CEs & expansions
32 # Many types of mappings are tested elsewhere, including via the UCA conformance tests.
33 # Here we mostly cover a few unusual mappings.
34 @ rules
35 &\x01 # most control codes are ignorable
36 <<<\u0300 # tertiary CE
37 &9<\x00 # NUL not ignorable
38 &\uA00A\uA00B=\uA002 # two long-primary CEs
39 &\uA00A\uA00B\u00050005=\uA003 # three CEs, require 64 bits
40
41 * compare
42 = \x01
43 = \x02
44 <3 \u0300
45 <1 9
46 <1 \x00
47 = \x01\x00\x02
48 <1 a
49 <3 a\u0300
50 <2 a\u0308
51 = ä
52 <1 b
53 <1 か # Hiragana Ka (U+304B)
54 <2 か\u3099 # plus voiced sound mark
55 = が # Hiragana Ga (U+304C)
56 <1 \uA00A\uA00B
57 = \uA002
58 <1 \uA00A\uA00B\u00050004
59 <1 \uA00A\uA00B\u00050005
60 = \uA003
61 <1 \uA00A\uA00B\u00050006
62
63 ** test: contractions
64 # Create some interesting mappings, and map some normalization-inert characters
65 # (which are not subject to canonical reordering)
66 # to some of the same CEs to check the sequence of CEs.
67 @ rules
68
69 # Contractions starting with 'a' should not continue with any character < U+0300
70 # so that we can test a shortcut for that.
71 &a=ⓐ
72 &b<bz=ⓑ
73 &d<dz\u0301=ⓓ # d+z+acute
74 &z
75 <a\u0301=Ⓐ # a+acute sorts after z
76 <a\u0301\u0301=Ⓑ # a+acute+acute
77 <a\u0301\u0301\u0358=Ⓒ # a+acute+acute+dot above right
78 <a\u030a=Ⓓ # a+ring
79 <a\u0323=Ⓔ # a+dot below
80 <a\u0323\u0358=Ⓕ # a+dot below+dot above right
81 <a\u0327\u0323\u030a=Ⓖ # a+cedilla+dot below+ring
82 <a\u0327\u0323bz=Ⓗ # a+cedilla+dot below+b+z
83
84 &\U0001D158=⁰ # musical notehead black (has a symbol primary)
85 <\U0001D158\U0001D165=¼ # musical quarter note
86
87 # deliberately missing prefix contractions:
88 # dz
89 # a\u0327
90 # a\u0327\u0323
91 # a\u0327\u0323b
92
93 &\x01
94 <<<\U0001D165=¹ # musical stem (ccc=216)
95 <<<\U0001D16D=² # musical augmentation dot (ccc=226)
96 <<<\U0001D165\U0001D16D=³ # stem+dot (ccc=216 226)
97 &\u0301=❶ # acute (ccc=230)
98 &\u030a=❷ # ring (ccc=230)
99 &\u0308=❸ # diaeresis (ccc=230)
100 <<\u0308\u0301=❹ # diaeresis+acute (=dialytika tonos) (ccc=230 230)
101 &\u0327=❺ # cedilla (ccc=202)
102 &\u0323=❻ # dot below (ccc=220)
103 &\u0331=❼ # macron below (ccc=220)
104 <<\u0331\u0358=❽ # macron below+dot above right (ccc=220 232)
105 &\u0334=❾ # tilde overlay (ccc=1)
106 &\u0358=❿ # dot above right (ccc=232)
107
108 &\u0f71=① # tibetan vowel sign aa
109 &\u0f72=② # tibetan vowel sign i
110 # \u0f71\u0f72 # tibetan vowel sign aa + i = ii = U+0F73
111 &\u0f73=③ # tibetan vowel sign ii (ccc=0 but lccc=129)
112
113 ** test: simple contractions
114
115 # Some strings are chosen to cause incremental contiguous contraction matching to
116 # go into partial matches for prefixes of contractions
117 # (where the prefixes are deliberately not also contractions).
118 # When there is no complete match, then the matching code must back out of those
119 # so that discontiguous contractions work as specified.
120
121 * compare
122 # contraction starter with no following text, or mismatch, or blocked
123 <1 a
124 = ⓐ
125 <1 aa
126 = ⓐⓐ
127 <1 ab
128 = ⓐb
129 <1 az
130 = ⓐz
131
132 * compare
133 <1 a
134 <2 a\u0308\u030a # ring blocked by diaeresis
135 = ⓐ❸❷
136 <2 a\u0327
137 = ⓐ❺
138
139 * compare
140 <2 \u0308
141 = ❸
142 <2 \u0308\u030a\u0301 # acute blocked by ring
143 = ❸❷❶
144
145 * compare
146 <1 \U0001D158
147 = ⁰
148 <1 \U0001D158\U0001D165
149 = ¼
150
151 # no discontiguous contraction because of missing prefix contraction d+z,
152 # and a starter ('z') after the 'd'
153 * compare
154 <1 dz\u0323\u0301
155 = dz❻❶
156
157 # contiguous contractions
158 * compare
159 <1 abz
160 = ⓐⓑ
161 <1 abzz
162 = ⓐⓑz
163
164 * compare
165 <1 a
166 <1 z
167 <1 a\u0301
168 = Ⓐ
169 <1 a\u0301\u0301
170 = Ⓑ
171 <1 a\u0301\u0301\u0358
172 = Ⓒ
173 <1 a\u030a
174 = Ⓓ
175 <1 a\u0323\u0358
176 = Ⓕ
177 <1 a\u0327\u0323\u030a # match despite missing prefix
178 = Ⓖ
179 <1 a\u0327\u0323bz
180 = Ⓗ
181
182 * compare
183 <2 \u0308\u0308\u0301 # acute blocked from first diaeresis, contracts with second
184 = ❸❹
185
186 * compare
187 <1 \U0001D158\U0001D165
188 = ¼
189
190 * compare
191 <3 \U0001D165\U0001D16D
192 = ³
193
194 ** test: discontiguous contractions
195 * compare
196 <1 a\u0327\u030a # a+ring skips cedilla
197 = Ⓓ❺
198 <2 a\u0327\u0327\u030a # a+ring skips 2 cedillas
199 = Ⓓ❺❺
200 <2 a\u0327\u0327\u0327\u030a # a+ring skips 3 cedillas
201 = Ⓓ❺❺❺
202 <2 a\u0334\u0327\u0327\u030a # a+ring skips tilde overlay & 2 cedillas
203 = Ⓓ❾❺❺
204 <1 a\u0327\u0323 # a+dot below skips cedilla
205 = Ⓔ❺
206 <1 a\u0323\u0301\u0358 # a+dot below+dot ab.r.: 2-char match, then skips acute
207 = Ⓕ❶
208 <2 a\u0334\u0323\u0358 # a+dot below skips tilde overlay
209 = Ⓕ❾
210
211 * compare
212 <2 \u0331\u0331\u0358 # macron below+dot ab.r. skips the second macron below
213 = ❽❼
214
215 * compare
216 <1 a\u0327\u0331\u0323\u030a # a+ring skips cedilla, macron below, dot below (dot blocked by macron)
217 = Ⓓ❺❼❻
218 <1 a\u0327\u0323\U0001D16D\u030a # a+dot below skips cedilla
219 = Ⓔ❺²❷
220 <2 a\u0327\u0327\u0323\u030a # a+dot below skips 2 cedillas
221 = Ⓔ❺❺❷
222 <2 a\u0327\u0323\u0323\u030a # a+dot below skips cedilla
223 = Ⓔ❺❻❷
224 <2 a\u0334\u0327\u0323\u030a # a+dot below skips tilde overlay & cedilla
225 = Ⓔ❾❺❷
226
227 * compare
228 <1 \U0001D158\u0327\U0001D165 # quarter note skips cedilla
229 = ¼❺
230 <1 a\U0001D165\u0323 # a+dot below skips stem
231 = Ⓔ¹
232
233 # partial contiguous match, backs up, matches discontiguous contraction
234 <1 a\u0327\u0323b
235 = Ⓔ❺b
236 <1 a\u0327\u0323ba
237 = Ⓔ❺bⓐ
238
239 # a+acute+acute+dot above right skips cedilla, continues matching 2 same-ccc combining marks
240 * compare
241 <1 a\u0327\u0301\u0301\u0358
242 = Ⓒ❺
243
244 # FCD but not NFD
245 * compare
246 <1 a\u0f73\u0301 # a+acute skips tibetan ii
247 = Ⓐ③
248
249 # FCD but the 0f71 inside the 0f73 must be skipped
250 # to match the discontiguous contraction of the first 0f71 with the trailing 0f72 inside the 0f73
251 * compare
252 <1 \u0f71\u0f73 # == \u0f73\u0f71 == \u0f71\u0f71\u0f72
253 = ③①
254
255 ** test: discontiguous contractions with nested contractions
256 * compare
257 <1 a\u0323\u0308\u0301\u0358
258 = Ⓕ❹
259 <2 a\u0323\u0308\u0301\u0308\u0301\u0358
260 = Ⓕ❹❹
261
262 ** test: discontiguous contractions with interleaved contractions
263 * compare
264 # a+ring & cedilla & macron below+dot above right
265 <1 a\u0327\u0331\u030a\u0358
266 = Ⓓ❺❽
267
268 # a+ring & 1x..3x macron below+dot above right
269 <2 a\u0331\u030a\u0358
270 = Ⓓ❽
271 <2 a\u0331\u0331\u030a\u0358\u0358
272 = Ⓓ❽❽
273 # also skips acute
274 <2 a\u0331\u0331\u0331\u030a\u0301\u0358\u0358\u0358
275 = Ⓓ❽❽❽❶
276
277 # a+dot below & stem+augmentation dot, followed by contiguous d+z+acute
278 <1 a\U0001D165\u0323\U0001D16Ddz\u0301
279 = Ⓔ³ⓓ
280
281 ** test: some simple string comparisons
282 @ root
283 * compare
284 # first string compares against ""
285 = \u0000
286 < a
287 <1 b
288 <3 B
289 = \u0000B\u0000
290
291 ** test: compare with strength=primary
292 % strength=primary
293 * compare
294 <1 a
295 <1 b
296 = B
297
298 ** test: compare with strength=secondary
299 % strength=secondary
300 * compare
301 <1 a
302 <1 b
303 = B
304
305 ** test: compare with strength=tertiary
306 % strength=tertiary
307 * compare
308 <1 a
309 <1 b
310 <3 B
311
312 ** test: compare with strength=quaternary
313 % strength=quaternary
314 * compare
315 <1 a
316 <1 b
317 <3 B
318
319 ** test: compare with strength=identical
320 % strength=identical
321 * compare
322 <1 a
323 <1 b
324 <3 B
325
326 ** test: côté with forwards secondary
327 @ root
328 * compare
329 <1 cote
330 <2 coté
331 <2 côte
332 <2 côté
333
334 ** test: côté with forwards secondary vs. U+FFFE merge separator
335 # Merged sort keys: On each level, any difference in the first segment
336 # must trump any further difference.
337 * compare
338 <1 cote\uFFFEcôté
339 <2 coté\uFFFEcôte
340 <2 côte\uFFFEcoté
341 <2 côté\uFFFEcote
342
343 ** test: côté with backwards secondary
344 % backwards=on
345 * compare
346 <1 cote
347 <2 côte
348 <2 coté
349 <2 côté
350
351 ** test: côté with backwards secondary vs. U+FFFE merge separator
352 # Merged sort keys: On each level, any difference in the first segment
353 # must trump any further difference.
354 * compare
355 <1 cote\uFFFEcôté
356 <2 côte\uFFFEcoté
357 <2 coté\uFFFEcôte
358 <2 côté\uFFFEcote
359
360 ** test: U+FFFE on identical level
361 @ root
362 % strength=identical
363 * compare
364 # All of these control codes are completely-ignorable, so that
365 # their low code points are compared with the merge separator.
366 # The merge separator must compare less than any other character.
367 <1 \uFFFE\u0001\u0002\u0003
368 <i \u0001\uFFFE\u0002\u0003
369 <i \u0001\u0002\uFFFE\u0003
370 <i \u0001\u0002\u0003\uFFFE
371
372 * compare
373 # The merge separator must even compare less than U+0000.
374 <1 \uFFFE\u0000\u0000
375 <i \u0000\uFFFE\u0000
376 <i \u0000\u0000\uFFFE
377
378 ** test: Hani < surrogates < U+FFFD
379 # Note: compareUTF8() treats unpaired surrogates like U+FFFD,
380 # so with that the strings with surrogates will compare equal to each other
381 # and equal to the string with U+FFFD.
382 @ root
383 % strength=identical
384 * compare
385 <1 abz
386 <1 a\u4e00z
387 <1 a\U00020000z
388 <1 a\ud800z
389 <1 a\udbffz
390 <1 a\udc00z
391 <1 a\udfffz
392 <1 a\ufffdz
393
394 ** test: script reordering
395 @ root
396 % reorder Hani Zzzz digit
397 * compare
398 <1 ?
399 <1 +
400 <1 丂
401 <1 a
402 <1 α
403 <1 5
404
405 % reorder default
406 * compare
407 <1 ?
408 <1 +
409 <1 5
410 <1 a
411 <1 α
412 <1 丂
413
414 ** test: empty rules
415 @ rules
416 * compare
417 <1 a
418 <2 ä
419 <3 Ä
420 <1 b
421
422 ** test: very simple rules
423 @ rules
424 &a=e<<<<q<<<<r<x<<<X<<y<<<Y;z,Z
425 % strength=quaternary
426 * compare
427 <1 a
428 = e
429 <4 q
430 <4 r
431 <1 x
432 <3 X
433 <2 y
434 <3 Y
435 <2 z
436 <3 Z
437
438 ** test: tailoring twice before a root position: primary
439 @ rules
440 &[before 1]b<p
441 &[before 1]b<q
442 * compare
443 <1 a
444 <1 p
445 <1 q
446 <1 b
447
448 ** test: tailoring twice before a root position: secondary
449 @ rules
450 &[before 2]ſ<<p
451 &[before 2]ſ<<q
452 * compare
453 <1 s
454 <2 p
455 <2 q
456 <2 ſ
457
458 # secondary-before common weight
459 @ rules
460 &[before 2]b<<p
461 &[before 2]b<<q
462 * compare
463 <1 a
464 <1 p
465 <2 q
466 <2 b
467
468 ** test: tailoring twice before a root position: tertiary
469 @ rules
470 &[before 3]B<<<p
471 &[before 3]B<<<q
472 * compare
473 <1 b
474 <3 p
475 <3 q
476 <3 B
477
478 # tertiary-before common weight
479 @ rules
480 &[before 3]b<<<p
481 &[before 3]b<<<q
482 * compare
483 <1 a
484 <1 p
485 <3 q
486 <3 b
487
488 @ rules
489 &[before 2]b<<s
490 &[before 3]s<<<p
491 &[before 3]s<<<q
492 * compare
493 <1 a
494 <1 p
495 <3 q
496 <3 s
497 <2 b
498
499 ** test: tailor after completely ignorable
500 @ rules
501 &\x00<<<x<<y
502 * compare
503 = \x00
504 = \x1F
505 <3 x
506 <2 y
507
508 ** test: secondary tailoring gaps, ICU ticket 9362
509 @ rules
510 &[before 2]s<<'_'
511 &s<<r # secondary between s and ſ (long s)
512 &ſ<<*a-q # more than 15 between ſ and secondary CE boundary
513 &[before 2][first primary ignorable]<<u<<v # between secondary CE boundary & lowest secondary CE
514 &[last primary ignorable]<<y<<z
515
516 * compare
517 <2 u
518 <2 v
519 <2 \u0332 # lowest secondary CE
520 <2 \u0308
521 <2 y
522 <2 z
523 <1 s_
524 <2 ss
525 <2 sr
526 <2 sſ
527 <2 sa
528 <2 sb
529 <2 sp
530 <2 sq
531 <2 sus
532 <2 svs
533 <2 rs
534
535 ** test: tertiary tailoring gaps, ICU ticket 9362
536 @ rules
537 &[before 3]t<<<'_'
538 &t<<<r # tertiary between t and fullwidth t
539 &ᵀ<<<*a-q # more than 15 between ᵀ (modifier letter T) and tertiary CE boundary
540 &[before 3][first secondary ignorable]<<<u<<<v # between tertiary CE boundary & lowest tertiary CE
541 &[last secondary ignorable]<<<y<<<z
542
543 * compare
544 <3 u
545 <3 v
546 # Note: The root collator currently does not map any characters to tertiary CEs.
547 <3 y
548 <3 z
549 <1 t_
550 <3 tt
551 <3 tr
552 <3 tt
553 <3 tᵀ
554 <3 ta
555 <3 tb
556 <3 tp
557 <3 tq
558 <3 tut
559 <3 tvt
560 <3 rt
561
562 ** test: secondary & tertiary around root character
563 @ rules
564 &[before 2]m<<r
565 &m<<s
566 &[before 3]m<<<u
567 &m<<<v
568 * compare
569 <1 l
570 <1 r
571 <2 u
572 <3 m
573 <3 v
574 <2 s
575 <1 n
576
577 ** test: secondary & tertiary around tailored item
578 @ rules
579 &m<x
580 &[before 2]x<<r
581 &x<<s
582 &[before 3]x<<<u
583 &x<<<v
584 * compare
585 <1 m
586 <1 r
587 <2 u
588 <3 x
589 <3 v
590 <2 s
591 <1 n
592
593 ** test: more nesting of secondary & tertiary before
594 @ rules
595 &[before 3]m<<<u
596 &[before 2]m<<r
597 &[before 3]r<<<q
598 &m<<<w
599 &m<<t
600 &[before 3]w<<<v
601 &w<<<x
602 &w<<s
603 * compare
604 <1 l
605 <1 q
606 <3 r
607 <2 u
608 <3 m
609 <3 v
610 <3 w
611 <3 x
612 <2 s
613 <2 t
614 <1 n
615
616 ** test: case bits
617 @ rules
618 &w<x # tailored CE getting case bits
619 =uv=uV=Uv=UV # 2 chars -> 1 CE
620 &ae=ch=cH=Ch=CH # 2 chars -> 2 CEs
621 &rst=yz=yZ=Yz=YZ # 2 chars -> 3 CEs
622 % caseFirst=lower
623 * compare
624 <1 ae
625 = ch
626 <3 cH
627 <3 Ch
628 <3 CH
629 <1 rst
630 = yz
631 <3 yZ
632 <3 Yz
633 <3 YZ
634 <1 w
635 <1 x
636 = uv
637 <3 uV
638 = Uv # mixed case on single CE cannot distinguish variations
639 <3 UV
640
641 ** test: tertiary CEs, tertiary, caseLevel=off, caseFirst=lower
642 @ rules
643 &\u0001<<<t<<<T # tertiary CEs
644 % caseFirst=lower
645 * compare
646 <1 aa
647 <3 aat
648 <3 aaT
649 <3 aA
650 <3 aAt
651 <3 ata
652 <3 aTa
653
654 ** test: tertiary CEs, tertiary, caseLevel=off, caseFirst=upper
655 % caseFirst=upper
656 * compare
657 <1 aA
658 <3 aAt
659 <3 aa
660 <3 aat
661 <3 aaT
662 <3 ata
663 <3 aTa
664
665 ** test: reset on expansion, ICU tickets 9415 & 9593
666 @ rules
667 &æ<x # tailor the last primary CE so that x sorts between ae and af
668 &æb=bæ # copy all reset CEs to make bæ sort the same
669 &각<h # copy/tailor 3 CEs to make h sort before the next Hangul syllable 갂
670 &⒀<<y # copy/tailor 4 CEs to make y sort with only a secondary difference
671 &l·=z # handle the pre-context for · when fetching reset CEs
672 <<u # copy/tailor 2 CEs
673
674 * compare
675 <1 ae
676 <2 æ
677 <1 x
678 <1 af
679
680 * compare
681 <1 aeb
682 <2 æb
683 = bæ
684
685 * compare
686 <1 각
687 <1 h
688 <1 갂
689 <1 갃
690
691 * compare
692 <1 · # by itself: primary CE
693 <1 l
694 <2 l· # l+middle dot has only a secondary difference from l
695 = z
696 <2 u
697
698 * compare
699 <1 (13)
700 <3 ⒀ # DUCET sets special tertiary weights in all CEs
701 <2 y
702 <1 (13[
703
704 % alternate=shifted
705 * compare
706 <1 (13)
707 = 13
708 <3 ⒀
709 = y # alternate=shifted removes the tailoring difference on the last CE
710 <1 14
711
712 ** test: contraction inside extension, ICU ticket 9378
713 @ rules
714 &а<<х/й # all letters are Cyrillic
715 * compare
716 <1 ай
717 <2 х
718
719 ** test: no duplicate tailored CEs for different reset positions with same CEs, ICU ticket 10104
720 @ rules
721 &t<x &ᵀ<y # same primary weights
722 &q<u &[before 1]ꝗ<v # q and ꝗ are primary adjacent
723 * compare
724 <1 q
725 <1 u
726 <1 v
727 <1 ꝗ
728 <1 t
729 <3 ᵀ
730 <1 y
731 <1 x
732
733 # Principle: Each rule builds on the state of preceding rules and ignores following rules.
734
735 ** test: later rule does not affect earlier reset position, ICU ticket 10105
736 @ rules
737 &a < u < v < w &ov < x &b < v
738 * compare
739 <1 oa
740 <1 ou
741 <1 x # CE(o) followed by CE between u and w
742 <1 ow
743 <1 ob
744 <1 ov
745
746 ** test: later rule does not affect earlier extension (1), ICU ticket 10105
747 @ rules
748 &a=x/b &v=b
749 % strength=secondary
750 * compare
751 <1 B
752 <1 c
753 <1 v
754 = b
755 * compare
756 <1 AB
757 = x
758 <1 ac
759 <1 av
760 = ab
761
762 ** test: later rule does not affect earlier extension (2), ICU ticket 10105
763 @ rules
764 &a <<< c / e &g <<< e / l
765 % strength=secondary
766 * compare
767 <1 AE
768 = c
769 <2 æ
770 <1 agl
771 = ae
772
773 ** test: later rule does not affect earlier extension (3), ICU ticket 10105
774 @ rules
775 &a = b / c &d = c / e
776 % strength=secondary
777 * compare
778 <1 AC # C is still only tertiary different from the original c
779 = b
780 <1 ade
781 = ac
782
783 ** test: extension contains tailored character, ICU ticket 10105
784 @ rules
785 &a=e &b=u/e
786 * compare
787 <1 a
788 = e
789 <1 ba
790 = be
791 = u
792
793 ** test: add simple mappings for characters with root context
794 @ rules
795 &z=· # middle dot has a prefix mapping in the CLDR root
796 &n=и # и (U+0438) has contractions in the root
797 * compare
798 <1 l
799 <2 l· # root mapping for l|· still works
800 <1 z
801 = ·
802 * compare
803 <1 n
804 = и
805 <1 И
806 <1 и\u0306 # root mapping for й=и\u0306 still works
807 = й
808 <3 Й
809
810 ** test: add context mappings around characters with root context
811 @ rules
812 &z=·h # middle dot has a prefix mapping in the CLDR root
813 &n=ә|и # и (U+0438) has contractions in the root
814 * compare
815 <1 l
816 <2 l· # root mapping for l|· still works
817 <1 z
818 = ·h
819 * compare
820 <1 и
821 <3 И
822 <1 и\u0306 # root mapping for й=и\u0306 still works
823 = й
824 * compare
825 <1 әn
826 = әи
827 <1 әo
828
829 ** test: many secondary CEs at the top of their range
830 @ rules
831 &[last primary ignorable]<<*\u2801-\u28ff
832 * compare
833 <2 \u0308
834 <2 \u2801
835 <2 \u2802
836 <2 \u2803
837 <2 \u2804
838 <2 \u28fd
839 <2 \u28fe
840 <2 \u28ff
841 <1 \x20
842
843 ** test: many tertiary CEs at the top of their range
844 @ rules
845 &[last secondary ignorable]<<<*a-z
846 * compare
847 <3 a
848 <3 b
849 <3 c
850 <3 d
851 # e..w
852 <3 x
853 <3 y
854 <3 z
855 <2 \u0308
856
857 ** test: tailor contraction together with nearly equivalent prefix, ICU ticket 10101
858 @ rules
859 &a=p|x &b=px &c=op
860 * compare
861 <1 b
862 = px
863 <3 B
864 <1 c
865 = op
866 <3 C
867 * compare
868 <1 ca
869 = opx # first contraction op, then prefix p|x
870 <3 cA
871 <3 Ca
872
873 ** test: reset position with prefix (pre-context), ICU ticket 10102
874 @ rules
875 &a=p|x &px=y
876 * compare
877 <1 pa
878 = px
879 = y
880 <3 pA
881 <1 q
882 <1 x
883
884 ** test: prefix+contraction together (1), ICU ticket 10071
885 @ rules
886 &x=a|bc
887 * compare
888 <1 ab
889 <1 Abc
890 <1 abd
891 <1 ac
892 <1 aw
893 <1 ax
894 = abc
895 <3 aX
896 <3 Ax
897 <1 b
898 <1 bb
899 <1 bc
900 <3 bC
901 <3 Bc
902 <1 bd
903
904 ** test: prefix+contraction together (2), ICU ticket 10071
905 @ rules
906 &w=bc &x=a|b
907 * compare
908 <1 w
909 = bc
910 <3 W
911 * compare
912 <1 aw
913 <1 ax
914 = ab
915 <3 aX
916 <1 axb
917 <1 axc
918 = abc # prefix match a|b takes precedence over contraction match bc
919 <3 abC
920 <1 abd
921 <1 ay
922
923 ** test: prefix+contraction together (3), ICU ticket 10071
924 @ rules
925 &x=a|b &w=bc # reverse order of rules as previous test, order should not matter here
926 * compare # same "compare" sequences as previous test
927 <1 w
928 = bc
929 <3 W
930 * compare
931 <1 aw
932 <1 ax
933 = ab
934 <3 aX
935 <1 axb
936 <1 axc
937 = abc # prefix match a|b takes precedence over contraction match bc
938 <3 abC
939 <1 abd
940 <1 ay
941
942 ** test: no mapping p|c, falls back to contraction ch, CLDR ticket 5962
943 @ rules
944 &d=ch &v=p|ci
945 * compare
946 <1 pc
947 <3 pC
948 <1 pcH
949 <1 pcI
950 <1 pd
951 = pch # no-prefix contraction ch matches
952 <3 pD
953 <1 pv
954 = pci # prefix+contraction p|ci matches
955 <3 pV
956
957 ** test: tailor in & around compact ranges of root primaries
958 # The Ogham characters U+1681..U+169A are in simple ascending order of primary CEs
959 # which should be reliably encoded as one range in the root elements data.
960 @ rules
961 &[before 1]ᚁ<a
962 &ᚁ<b
963 &[before 1]ᚂ<c
964 &ᚂ<d
965 &[before 1]ᚚ<y
966 &ᚚ<z
967 &[before 2]ᚁ<<r
968 &ᚁ<<s
969 &[before 3]ᚚ<<<t
970 &ᚚ<<<u
971 * compare
972 <1 ᣵ # U+18F5 last Canadian Aboriginal
973 <1 a
974 <1 r
975 <2 ᚁ
976 <2 s
977 <1 b
978 <1 c
979 <1 ᚂ
980 <1 d
981 <1 ᚃ
982 <1 ᚙ
983 <1 y
984 <1 t
985 <3 ᚚ
986 <3 u
987 <1 z
988 <1 ᚠ # U+16A0 first Runic
989
990 ** test: suppressContractions
991 @ rules
992 &z<ch<әж [suppressContractions [·cә]]
993 * compare
994 <1 ch
995 <3 cH # ch was suppressed
996 <1 l
997 <1 l· # primary difference, not secondary, because l|· was suppressed
998 <1 ә
999 <2 ә\u0308 # secondary difference, not primary, because contractions for ә were suppressed
1000 <1 әж
1001 <3 әЖ
1002
1003 ** test: Hangul & Jamo
1004 @ rules
1005 &L=\u1100 # first Jamo L
1006 &V=\u1161 # first Jamo V
1007 &T=\u11A8 # first Jamo T
1008 &\uAC01<<*\u4E00-\u4EFF # first Hangul LVT syllable & lots of secondary diffs
1009 * compare
1010 <1 Lv
1011 <3 LV
1012 = \u1100\u1161
1013 = \uAC00
1014 <1 LVt
1015 <3 LVT
1016 = \u1100\u1161\u11A8
1017 = \uAC00\u11A8
1018 = \uAC01
1019 <2 LVT\u0308
1020 <2 \u4E00
1021 <2 \u4E01
1022 <2 \u4E80
1023 <2 \u4EFF
1024 <2 LV\u0308T
1025 <1 \uAC02
1026
1027 ** test: adjust special reset positions according to previous rules, CLDR ticket 6070
1028 @ rules
1029 &[last variable]<x
1030 [maxVariable space] # has effect only after building, no effect on following rules
1031 &[last variable]<y
1032 &[before 1][first regular]<z
1033 * compare
1034 <1 ? # some punctuation
1035 <1 x
1036 <1 y
1037 <1 z
1038 <1 $ # some symbol
1039
1040 @ rules
1041 &[last primary ignorable]<<x<<<y
1042 &[last primary ignorable]<<z
1043 * compare
1044 <2 \u0358
1045 <2 x
1046 <3 y
1047 <2 z
1048 <1 \x20
1049
1050 @ rules
1051 &[last secondary ignorable]<<<x
1052 &[last secondary ignorable]<<<y
1053 * compare
1054 <3 x
1055 <3 y
1056 <2 \u0358
1057
1058 @ rules
1059 &[before 2][first variable]<<z
1060 &[before 2][first variable]<<y
1061 &[before 3][first variable]<<<x
1062 &[before 3][first variable]<<<w
1063 &[before 1][first variable]<v
1064 &[before 2][first variable]<<u
1065 &[before 3][first variable]<<<t
1066 &[before 2]\uFDD1\xA0<<s # FractionalUCA.txt: FDD1 00A0, SPACE first primary
1067 * compare
1068 <2 \u0358
1069 <1 s
1070 <2 \uFDD1\xA0
1071 <1 t
1072 <3 u
1073 <2 v
1074 <1 w
1075 <3 x
1076 <3 y
1077 <2 z
1078 <2 \t
1079
1080 @ rules
1081 &[before 2][first regular]<<z
1082 &[before 3][first regular]<<<y
1083 &[before 1][first regular]<x
1084 &[before 3][first regular]<<<w
1085 &[before 2]\uFDD1\u263A<<v # FractionalUCA.txt: FDD1 263A, SYMBOL first primary
1086 &[before 3][first regular]<<<u
1087 &[before 1][first regular]<p # primary before the boundary: becomes variable
1088 &[before 3][first regular]<<<t # not affected by p
1089 &[last variable]<q # after p!
1090 * compare
1091 <1 ?
1092 <1 p
1093 <1 q
1094 <1 t
1095 <3 u
1096 <3 v
1097 <1 w
1098 <3 x
1099 <1 y
1100 <3 z
1101 <1 $
1102
1103 # check that p & q are indeed variable
1104 % alternate=shifted
1105 * compare
1106 = ?
1107 = p
1108 = q
1109 <1 t
1110 <3 u
1111 <3 v
1112 <1 w
1113 <3 x
1114 <1 y
1115 <3 z
1116 <1 $
1117
1118 @ rules
1119 &[before 2][first trailing]<<z
1120 &[before 1][first trailing]<y
1121 &[before 3][first trailing]<<<x
1122 * compare
1123 <1 \u4E00 # first Han, first implicit
1124 <1 \uFDD1\uFDD0 # FractionalUCA.txt: unassigned first primary
1125 # Note: The root collator currently does not map any characters to the trailing first boundary primary.
1126 <1 x
1127 <3 y
1128 <1 z
1129 <2 \uFFFD # The root collator currently maps U+FFFD to the first real trailing primary.
1130
1131 @ rules
1132 &[before 2][first primary ignorable]<<z
1133 &[before 2][first primary ignorable]<<y
1134 &[before 3][first primary ignorable]<<<x
1135 &[before 3][first primary ignorable]<<<w
1136 * compare
1137 = \x01
1138 <2 w
1139 <3 x
1140 <3 y
1141 <2 z
1142 <2 \u0301
1143
1144 @ rules
1145 &[before 3][first secondary ignorable]<<<y
1146 &[before 3][first secondary ignorable]<<<x
1147 * compare
1148 = \x01
1149 <3 x
1150 <3 y
1151 <2 \u0301
1152
1153 ** test: canonical closure
1154 @ rules
1155 &X=A &U=Â
1156 * compare
1157 <1 U
1158 = Â
1159 = A\u0302
1160 <2 Ú # U with acute
1161 = U\u0301
1162 = Ấ # A with circumflex & acute
1163 = Â\u0301
1164 = A\u0302\u0301
1165 <1 X
1166 = A
1167 <2 X\u030A # with ring above
1168 = Å
1169 = A\u030A
1170 = \u212B # Angstrom sign
1171
1172 @ rules
1173 &x=\u5140\u55C0
1174 * compare
1175 <1 x
1176 = \u5140\u55C0
1177 = \u5140\uFA0D
1178 = \uFA0C\u55C0
1179 = \uFA0C\uFA0D # CJK compatibility characters
1180 <3 X
1181
1182 # canonical closure on prefix rules, ICU ticket 9444
1183 @ rules
1184 &x=ä|ŝ
1185 * compare
1186 <1 äs # not tailored
1187 <1 äx
1188 = äŝ
1189 = a\u0308s\u0302
1190 = a\u0308ŝ
1191 = äs\u0302
1192 <3 äX
1193
1194 ** test: conjoining Jamo map to expansions
1195 @ rules
1196 &gg=\u1101 # Jamo Lead consonant GG
1197 &nj=\u11AC # Jamo Trail consonant NJ
1198 * compare
1199 <1 gg\u1161nj
1200 = \u1101\u1161\u11AC
1201 = \uAE4C\u11AC
1202 = \uAE51
1203 <3 gg\u1161nJ
1204 <1 \u1100\u1100
1205
1206 ** test: canonical tail closure, ICU ticket 5913
1207 @ rules
1208 &a<â
1209 * compare
1210 <1 a
1211 <1 â # tailored
1212 = a\u0302
1213 <2 a\u0323\u0302 # discontiguous contraction
1214 = ạ\u0302 # equivalent
1215 = ậ # equivalent
1216 <1 b
1217
1218 @ rules
1219 &a<ạ
1220 * compare
1221 <1 a
1222 <1 ạ # tailored
1223 = a\u0323
1224 <2 a\u0323\u0302 # contiguous contraction plus extra diacritic
1225 = ạ\u0302 # equivalent
1226 = ậ # equivalent
1227 <1 b
1228
1229 # Tail closure should work even if there is a prefix and/or contraction.
1230 @ rules
1231 &a<\u5140|câ
1232 # In order to find discontiguous contractions for \u5140|câ
1233 # there must exist a mapping for \u5140|ca, regardless of what it maps to.
1234 # (This follows from the UCA spec.)
1235 &x=\u5140|ca
1236 * compare
1237 <1 \u5140a
1238 = \uFA0Ca
1239 <1 \u5140câ # tailored
1240 = \uFA0Ccâ
1241 = \u5140ca\u0302
1242 = \uFA0Cca\u0302
1243 <2 \u5140ca\u0323\u0302 # discontiguous contraction
1244 = \uFA0Cca\u0323\u0302
1245 = \u5140cạ\u0302
1246 = \uFA0Ccạ\u0302
1247 = \u5140cậ
1248 = \uFA0Ccậ
1249 <1 \u5140b
1250 = \uFA0Cb
1251 <1 \u5140x
1252 = \u5140ca
1253
1254 # Double-check that without the extra mapping there will be no discontiguous match.
1255 @ rules
1256 &a<\u5140|câ
1257 * compare
1258 <1 \u5140a
1259 = \uFA0Ca
1260 <1 \u5140câ # tailored
1261 = \uFA0Ccâ
1262 = \u5140ca\u0302
1263 = \uFA0Cca\u0302
1264 <1 \u5140b
1265 = \uFA0Cb
1266 <1 \u5140ca\u0323\u0302 # no discontiguous contraction
1267 = \uFA0Cca\u0323\u0302
1268 = \u5140cạ\u0302
1269 = \uFA0Ccạ\u0302
1270 = \u5140cậ
1271 = \uFA0Ccậ
1272
1273 @ rules
1274 &a<cạ
1275 * compare
1276 <1 a
1277 <1 cạ # tailored
1278 = ca\u0323
1279 <2 ca\u0323\u0302 # contiguous contraction plus extra diacritic
1280 = cạ\u0302 # equivalent
1281 = cậ # equivalent
1282 <1 b
1283
1284 # ᾢ = U+1FA2 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
1285 # = 03C9 0313 0300 0345
1286 # ccc = 0, 230, 230, 240
1287 @ rules
1288 &δ=αῳ
1289 # In order to find discontiguous contractions for αῳ
1290 # there must exist a mapping for αω, regardless of what it maps to.
1291 # (This follows from the UCA spec.)
1292 &ε=αω
1293 * compare
1294 <1 δ
1295 = αῳ
1296 = αω\u0345
1297 <2 αω\u0313\u0300\u0345 # discontiguous contraction
1298 = αὠ\u0300\u0345
1299 = αὢ\u0345
1300 = αᾢ
1301 <2 αω\u0300\u0313\u0345
1302 = αὼ\u0313\u0345
1303 = αῲ\u0313 # not FCD
1304 <1 ε
1305 = αω
1306
1307 # Double-check that without the extra mapping there will be no discontiguous match.
1308 @ rules
1309 &δ=αῳ
1310 * compare
1311 <1 αω\u0313\u0300\u0345 # no discontiguous contraction
1312 = αὠ\u0300\u0345
1313 = αὢ\u0345
1314 = αᾢ
1315 <2 αω\u0300\u0313\u0345
1316 = αὼ\u0313\u0345
1317 = αῲ\u0313 # not FCD
1318 <1 δ
1319 = αῳ
1320 = αω\u0345
1321
1322 # Add U+0315 COMBINING COMMA ABOVE RIGHT which has ccc=232.
1323 # Tests code paths where the tailored string has a combining mark
1324 # that does not occur in any composite's decomposition.
1325 @ rules
1326 &δ=αὼ\u0315
1327 * compare
1328 <1 αω\u0313\u0300\u0315 # Not tailored: The grave accent blocks the comma above.
1329 = αὠ\u0300\u0315
1330 = αὢ\u0315
1331 <1 δ
1332 = αὼ\u0315
1333 = αω\u0300\u0315
1334 <2 αω\u0300\u0315\u0345
1335 = αὼ\u0315\u0345
1336 = αῲ\u0315 # not FCD
1337
1338 ** test: danish a+a vs. a-umlaut, ICU ticket 9319
1339 @ rules
1340 &z<aa
1341 * compare
1342 <1 z
1343 <1 aa
1344 <2 aa\u0308
1345 = aä
1346
1347 ** test: Jamo L with and in prefix
1348 # Useful for the Korean "searchjl" tailoring (instead of contractions of pairs of Jamo L).
1349 @ rules
1350 # Jamo Lead consonant G after G or GG
1351 &[last primary ignorable]<<\u1100|\u1100=\u1101|\u1100
1352 # Jamo Lead consonant GG sorts like G+G
1353 &\u1100\u1100=\u1101
1354 # Note: Making G|GG and GG|GG sort the same as G|G+G
1355 # would require the ability to reset on G|G+G,
1356 # or we could make G-after-G equal to some secondary-CE character,
1357 # and reset on a pair of those.
1358 # (It does not matter much if there are at most two G in a row in real text.)
1359 * compare
1360 <1 \u1100
1361 <2 \u1100\u1100 # only one primary from a sequence of G lead consonants
1362 = \u1101
1363 <2 \u1100\u1100\u1100
1364 = \u1101\u1100
1365 # but not = \u1100\u1101, see above
1366 <1 \u1100\u1161
1367 = \uAC00
1368 <2 \u1100\u1100\u1161
1369 = \u1100\uAC00 # prefix match from the L of the LV syllable
1370 = \u1101\u1161
1371 = \uAE4C
1372
1373 ** test: proposed Korean "searchjl" tailoring with prefixes, CLDR ticket 6546
1374 @ rules
1375 # Low secondary CEs for Jamo V & T.
1376 # Note: T should sort before V for proper syllable order.
1377 &\u0332 # COMBINING LOW LINE (first primary ignorable)
1378 <<\u1161<<\u1162
1379
1380 # Korean Jamo lead consonant search rules, part 2:
1381 # Make modern compound L jamo primary equivalent to non-compound forms.
1382
1383 # Secondary CEs for Jamo L-after-L, greater than Jamo V & T.
1384 &\u0313 # COMBINING COMMA ABOVE (second primary ignorable)
1385 =\u1100|\u1100
1386 =\u1103|\u1103
1387 =\u1107|\u1107
1388 =\u1109|\u1109
1389 =\u110C|\u110C
1390
1391 # Compound L Jamo map to equivalent expansions of primary+secondary CE.
1392 &\u1100\u0313=\u1101<<<\u3132 # HANGUL CHOSEONG SSANGKIYEOK, HANGUL LETTER SSANGKIYEOK
1393 &\u1103\u0313=\u1104<<<\u3138 # HANGUL CHOSEONG SSANGTIKEUT, HANGUL LETTER SSANGTIKEUT
1394 &\u1107\u0313=\u1108<<<\u3143 # HANGUL CHOSEONG SSANGPIEUP, HANGUL LETTER SSANGPIEUP
1395 &\u1109\u0313=\u110A<<<\u3146 # HANGUL CHOSEONG SSANGSIOS, HANGUL LETTER SSANGSIOS
1396 &\u110C\u0313=\u110D<<<\u3149 # HANGUL CHOSEONG SSANGCIEUC, HANGUL LETTER SSANGCIEUC
1397
1398 * compare
1399 <1 \u1100\u1161
1400 = \uAC00
1401 <2 \u1100\u1162
1402 = \uAC1C
1403 <2 \u1100\u1100\u1161
1404 = \u1100\uAC00
1405 = \u1101\u1161
1406 = \uAE4C
1407 <3 \u3132\u1161
1408
1409 ** test: Hangul syllables in prefix & in the interior of a contraction
1410 @ rules
1411 &x=\u1100\u1161|a\u1102\u1162z
1412 * compare
1413 <1 \u1100\u1161x
1414 = \u1100\u1161a\u1102\u1162z
1415 = \u1100\u1161a\uB0B4z
1416 = \uAC00a\u1102\u1162z
1417 = \uAC00a\uB0B4z
1418
1419 ** test: digits are unsafe-backwards when numeric=on
1420 @ root
1421 % numeric=on
1422 * compare
1423 # If digits are not unsafe, then numeric collation sees "1"=="01" and "b">"a".
1424 # We need to back up before the identical prefix "1" and compare the full numbers.
1425 <1 11b
1426 <1 101a
1427
1428 ** test: simple locale data test
1429 @ locale de
1430 * compare
1431 <1 a
1432 <2 ä
1433 <1 ae
1434 <2 æ
1435
1436 @ locale de-u-co-phonebk
1437 * compare
1438 <1 a
1439 <1 ae
1440 <2 ä
1441 <2 æ
1442
1443 # The following test cases were moved here from ICU 52's DataDrivenCollationTest.txt.
1444
1445 ** test: DataDrivenCollationTest/TestMorePinyin
1446 # Testing the primary strength.
1447 @ locale zh
1448 % strength=primary
1449 * compare
1450 < lā
1451 = lĀ
1452 = Lā
1453 = LĀ
1454 < lān
1455 = lĀn
1456 < lē
1457 = lĒ
1458 = Lē
1459 = LĒ
1460 < lēn
1461 = lĒn
1462
1463 ** test: DataDrivenCollationTest/TestLithuanian
1464 # Lithuanian sort order.
1465 @ locale lt
1466 * compare
1467 < cz
1468 < č
1469 < d
1470 < iz
1471 < j
1472 < sz
1473 < š
1474 < t
1475 < zz
1476 < ž
1477
1478 ** test: DataDrivenCollationTest/TestLatvian
1479 # Latvian sort order.
1480 @ locale lv
1481 * compare
1482 < cz
1483 < č
1484 < d
1485 < gz
1486 < ģ
1487 < h
1488 < iz
1489 < j
1490 < kz
1491 < ķ
1492 < l
1493 < lz
1494 < ļ
1495 < m
1496 < nz
1497 < ņ
1498 < o
1499 < rz
1500 < ŗ
1501 < s
1502 < sz
1503 < š
1504 < t
1505 < zz
1506 < ž
1507
1508 ** test: DataDrivenCollationTest/TestEstonian
1509 # Estonian sort order.
1510 @ locale et
1511 * compare
1512 < sy
1513 < š
1514 < šy
1515 < z
1516 < zy
1517 < ž
1518 < v
1519 < va
1520 < w
1521 < õ
1522 < õy
1523 < ä
1524 < äy
1525 < ö
1526 < öy
1527 < ü
1528 < üy
1529 < x
1530
1531 ** test: DataDrivenCollationTest/TestAlbanian
1532 # Albanian sort order.
1533 @ locale sq
1534 * compare
1535 < cz
1536 < ç
1537 < d
1538 < dz
1539 < dh
1540 < e
1541 < ez
1542 < ë
1543 < f
1544 < gz
1545 < gj
1546 < h
1547 < lz
1548 < ll
1549 < m
1550 < nz
1551 < nj
1552 < o
1553 < rz
1554 < rr
1555 < s
1556 < sz
1557 < sh
1558 < t
1559 < tz
1560 < th
1561 < u
1562 < xz
1563 < xh
1564 < y
1565 < zz
1566 < zh
1567
1568 ** test: DataDrivenCollationTest/TestSimplifiedChineseOrder
1569 # Sorted file has different order.
1570 @ root
1571 # normalization=on turned on & off automatically.
1572 * compare
1573 < \u5F20
1574 < \u5F20\u4E00\u8E3F
1575
1576 ** test: DataDrivenCollationTest/TestTibetanNormalizedIterativeCrash
1577 # This pretty much crashes.
1578 @ root
1579 * compare
1580 < \u0f71\u0f72\u0f80\u0f71\u0f72
1581 < \u0f80
1582
1583 ** test: DataDrivenCollationTest/TestThaiPartialSortKeyProblems
1584 # These are examples of strings that caused trouble in partial sort key testing.
1585 @ locale th-TH
1586 * compare
1587 < \u0E01\u0E01\u0E38\u0E18\u0E20\u0E31\u0E13\u0E11\u0E4C
1588 < \u0E01\u0E01\u0E38\u0E2A\u0E31\u0E19\u0E42\u0E18
1589 * compare
1590 < \u0E01\u0E07\u0E01\u0E32\u0E23
1591 < \u0E01\u0E07\u0E42\u0E01\u0E49
1592 * compare
1593 < \u0E01\u0E23\u0E19\u0E17\u0E32
1594 < \u0E01\u0E23\u0E19\u0E19\u0E40\u0E0A\u0E49\u0E32
1595 * compare
1596 < \u0E01\u0E23\u0E30\u0E40\u0E08\u0E35\u0E22\u0E27
1597 < \u0E01\u0E23\u0E30\u0E40\u0E08\u0E35\u0E4A\u0E22\u0E27
1598 * compare
1599 < \u0E01\u0E23\u0E23\u0E40\u0E0A\u0E2D
1600 < \u0E01\u0E23\u0E23\u0E40\u0E0A\u0E49\u0E32
1601
1602 ** test: DataDrivenCollationTest/TestJavaStyleRule
1603 # java.text allows rules to start as '<<<x<<<y...'
1604 # we emulate this by assuming a &[first tertiary ignorable] in this case.
1605 @ rules
1606 &\u0001=equal<<<z<<x<<<w &[first tertiary ignorable]=a &[first primary ignorable]=b
1607 * compare
1608 = a
1609 = equal
1610 < z
1611 < x
1612 = b # x had become the new first primary ignorable
1613 < w
1614
1615 ** test: DataDrivenCollationTest/TestShiftedIgnorable
1616 # The UCA states that primary ignorables should be completely
1617 # ignorable when following a shifted code point.
1618 @ root
1619 % alternate=shifted
1620 % strength=quaternary
1621 * compare
1622 < a\u0020b
1623 = a\u0020\u0300b
1624 = a\u0020\u0301b
1625 < a_b
1626 = a_\u0300b
1627 = a_\u0301b
1628 < A\u0020b
1629 = A\u0020\u0300b
1630 = A\u0020\u0301b
1631 < A_b
1632 = A_\u0300b
1633 = A_\u0301b
1634 < a\u0301b
1635 < A\u0301b
1636 < a\u0300b
1637 < A\u0300b
1638
1639 ** test: DataDrivenCollationTest/TestNShiftedIgnorable
1640 # The UCA states that primary ignorables should be completely
1641 # ignorable when following a shifted code point.
1642 @ root
1643 % alternate=non-ignorable
1644 % strength=tertiary
1645 * compare
1646 < a\u0020b
1647 < A\u0020b
1648 < a\u0020\u0301b
1649 < A\u0020\u0301b
1650 < a\u0020\u0300b
1651 < A\u0020\u0300b
1652 < a_b
1653 < A_b
1654 < a_\u0301b
1655 < A_\u0301b
1656 < a_\u0300b
1657 < A_\u0300b
1658 < a\u0301b
1659 < A\u0301b
1660 < a\u0300b
1661 < A\u0300b
1662
1663 ** test: DataDrivenCollationTest/TestSafeSurrogates
1664 # It turned out that surrogates were not skipped properly
1665 # when iterating backwards if they were in the middle of a
1666 # contraction. This test assures that this is fixed.
1667 @ rules
1668 &a < x\ud800\udc00b
1669 * compare
1670 < a
1671 < x\ud800\udc00b
1672
1673 ** test: DataDrivenCollationTest/da_TestPrimary
1674 # This test goes through primary strength cases
1675 @ locale da
1676 % strength=primary
1677 * compare
1678 < Lvi
1679 < Lwi
1680 * compare
1681 < L\u00e4vi
1682 < L\u00f6wi
1683 * compare
1684 < L\u00fcbeck
1685 = Lybeck
1686
1687 ** test: DataDrivenCollationTest/da_TestTertiary
1688 # This test goes through tertiary strength cases
1689 @ locale da
1690 % strength=tertiary
1691 * compare
1692 < Luc
1693 < luck
1694 * compare
1695 < luck
1696 < L\u00fcbeck
1697 * compare
1698 < lybeck
1699 < L\u00fcbeck
1700 * compare
1701 < L\u00e4vi
1702 < L\u00f6we
1703 * compare
1704 < L\u00f6ww
1705 < mast
1706
1707 * compare
1708 < A/S
1709 < ANDRE
1710 < ANDR\u00c9
1711 < ANDREAS
1712 < AS
1713 < CA
1714 < \u00c7A
1715 < CB
1716 < \u00c7C
1717 < D.S.B.
1718 < DA
1719 < \u00d0A
1720 < DB
1721 < \u00d0C
1722 < DSB
1723 < DSC
1724 < EKSTRA_ARBEJDE
1725 < EKSTRABUD0
1726 < H\u00d8ST
1727 < HAAG
1728 < H\u00c5NDBOG
1729 < HAANDV\u00c6RKSBANKEN
1730 < Karl
1731 < karl
1732 < NIELS\u0020J\u00d8RGEN
1733 < NIELS-J\u00d8RGEN
1734 < NIELSEN
1735 < R\u00c9E,\u0020A
1736 < REE,\u0020B
1737 < R\u00c9E,\u0020L
1738 < REE,\u0020V
1739 < SCHYTT,\u0020B
1740 < SCHYTT,\u0020H
1741 < SCH\u00dcTT,\u0020H
1742 < SCHYTT,\u0020L
1743 < SCH\u00dcTT,\u0020M
1744 < SS
1745 < \u00df
1746 < SSA
1747 < STORE\u0020VILDMOSE
1748 < STOREK\u00c6R0
1749 < STORM\u0020PETERSEN
1750 < STORMLY
1751 < THORVALD
1752 < THORVARDUR
1753 < \u00feORVAR\u00d0UR
1754 < THYGESEN
1755 < VESTERG\u00c5RD,\u0020A
1756 < VESTERGAARD,\u0020A
1757 < VESTERG\u00c5RD,\u0020B
1758 < \u00c6BLE
1759 < \u00c4BLE
1760 < \u00d8BERG
1761 < \u00d6BERG
1762
1763 * compare
1764 < andere
1765 < chaque
1766 < chemin
1767 < cote
1768 < cot\u00e9
1769 < c\u00f4te
1770 < c\u00f4t\u00e9
1771 < \u010du\u010d\u0113t
1772 < Czech
1773 < hi\u0161a
1774 < irdisch
1775 < lie
1776 < lire
1777 < llama
1778 < l\u00f5ug
1779 < l\u00f2za
1780 < lu\u010d
1781 < luck
1782 < L\u00fcbeck
1783 < lye
1784 < l\u00e4vi
1785 < L\u00f6wen
1786 < m\u00e0\u0161ta
1787 < m\u00eer
1788 < myndig
1789 < M\u00e4nner
1790 < m\u00f6chten
1791 < pi\u00f1a
1792 < pint
1793 < pylon
1794 < \u0161\u00e0ran
1795 < savoir
1796 < \u0160erb\u016bra
1797 < Sietla
1798 < \u015blub
1799 < subtle
1800 < symbol
1801 < s\u00e4mtlich
1802 < verkehrt
1803 < vox
1804 < v\u00e4ga
1805 < waffle
1806 < wood
1807 < yen
1808 < yuan
1809 < yucca
1810 < \u017eal
1811 < \u017eena
1812 < \u017den\u0113va
1813 < zoo0
1814 < Zviedrija
1815 < Z\u00fcrich
1816 < zysk0
1817 < \u00e4ndere
1818
1819 ** test: DataDrivenCollationTest/hi_TestNewRules
1820 # This test goes through new rules and tests against old rules
1821 @ locale hi
1822 * compare
1823 < कॐ
1824 < कं
1825 < कँ
1826 < कः
1827
1828 ** test: DataDrivenCollationTest/ro_TestNewRules
1829 # This test goes through new rules and tests against old rules
1830 @ locale ro
1831 * compare
1832 < xAx
1833 < xă
1834 < xĂ
1835 < Xă
1836 < XĂ
1837 < xăx
1838 < xĂx
1839 < xâ
1840 < xÂ
1841 < Xâ
1842 < XÂ
1843 < xâx
1844 < xÂx
1845 < xb
1846 < xIx
1847 < xî
1848 < xÎ
1849 < Xî
1850 < XÎ
1851 < xîx
1852 < xÎx
1853 < xj
1854 < xSx
1855 < xș
1856 = xş
1857 < xȘ
1858 = xŞ
1859 < Xș
1860 = Xş
1861 < XȘ
1862 = XŞ
1863 < xșx
1864 = xşx
1865 < xȘx
1866 = xŞx
1867 < xT
1868 < xTx
1869 < xț
1870 = xţ
1871 < xȚ
1872 = xŢ
1873 < Xț
1874 = Xţ
1875 < XȚ
1876 = XŢ
1877 < xțx
1878 = xţx
1879 < xȚx
1880 = xŢx
1881 < xU
1882
1883 ** test: DataDrivenCollationTest/testOffsets
1884 # This tests cases where forwards and backwards iteration get different offsets
1885 @ locale en
1886 % strength=tertiary
1887 * compare
1888 < a\uD800\uDC00\uDC00
1889 < b\uD800\uDC00\uDC00
1890 * compare
1891 < \u0301A\u0301\u0301
1892 < \u0301B\u0301\u0301
1893 * compare
1894 < abcd\r\u0301
1895 < abce\r\u0301
1896 # TODO: test offsets in new CollationTest
1897
1898 # End of test cases moved here from ICU 52's DataDrivenCollationTest.txt.
1899
1900 ** test: was ICU 52 cmsccoll/TestRedundantRules
1901 @ rules
1902 & a < b < c < d& [before 1] c < m
1903 * compare
1904 <1 a
1905 <1 b
1906 <1 m
1907 <1 c
1908 <1 d
1909
1910 @ rules
1911 & a < b <<< c << d <<< e& [before 3] e <<< x
1912 * compare
1913 <1 a
1914 <1 b
1915 <3 c
1916 <2 d
1917 <3 x
1918 <3 e
1919
1920 @ rules
1921 & a < b <<< c << d <<< e <<< f < g& [before 1] g < x
1922 * compare
1923 <1 a
1924 <1 b
1925 <3 c
1926 <2 d
1927 <3 e
1928 <3 f
1929 <1 x
1930 <1 g
1931
1932 @ rules
1933 & a <<< b << c < d& a < m
1934 * compare
1935 <1 a
1936 <3 b
1937 <2 c
1938 <1 m
1939 <1 d
1940
1941 @ rules
1942 &a<b<<b\u0301 &z<b
1943 * compare
1944 <1 a
1945 <1 b\u0301
1946 <1 z
1947 <1 b
1948
1949 @ rules
1950 &z<m<<<q<<<m
1951 * compare
1952 <1 z
1953 <1 q
1954 <3 m
1955
1956 @ rules
1957 &z<<<m<q<<<m
1958 * compare
1959 <1 z
1960 <1 q
1961 <3 m
1962
1963 @ rules
1964 & a < b < c < d& r < c
1965 * compare
1966 <1 a
1967 <1 b
1968 <1 d
1969 <1 r
1970 <1 c
1971
1972 @ rules
1973 & a < b < c < d& c < m
1974 * compare
1975 <1 a
1976 <1 b
1977 <1 c
1978 <1 m
1979 <1 d
1980
1981 @ rules
1982 & a < b < c < d& a < m
1983 * compare
1984 <1 a
1985 <1 m
1986 <1 b
1987 <1 c
1988 <1 d
1989
1990 ** test: was ICU 52 cmsccoll/TestExpansionSyntax
1991 # The following two rules should sort the particular list of strings the same.
1992 @ rules
1993 &AE <<< a << b <<< c &d <<< f
1994 * compare
1995 <1 AE
1996 <3 a
1997 <2 b
1998 <3 c
1999 <1 d
2000 <3 f
2001
2002 @ rules
2003 &A <<< a / E << b / E <<< c /E &d <<< f
2004 * compare
2005 <1 AE
2006 <3 a
2007 <2 b
2008 <3 c
2009 <1 d
2010 <3 f
2011
2012 # The following two rules should sort the particular list of strings the same.
2013 @ rules
2014 &AE <<< a <<< b << c << d < e < f <<< g
2015 * compare
2016 <1 AE
2017 <3 a
2018 <3 b
2019 <2 c
2020 <2 d
2021 <1 e
2022 <1 f
2023 <3 g
2024
2025 @ rules
2026 &A <<< a / E <<< b / E << c / E << d / E < e < f <<< g
2027 * compare
2028 <1 AE
2029 <3 a
2030 <3 b
2031 <2 c
2032 <2 d
2033 <1 e
2034 <1 f
2035 <3 g
2036
2037 # The following two rules should sort the particular list of strings the same.
2038 @ rules
2039 &AE <<< B <<< C / D <<< F
2040 * compare
2041 <1 AE
2042 <3 B
2043 <3 F
2044 <1 AED
2045 <3 C
2046
2047 @ rules
2048 &A <<< B / E <<< C / ED <<< F / E
2049 * compare
2050 <1 AE
2051 <3 B
2052 <3 F
2053 <1 AED
2054 <3 C
2055
2056 ** test: never reorder trailing primaries
2057 @ root
2058 % reorder Zzzz Grek
2059 * compare
2060 <1 L
2061 <1 字
2062 <1 Ω
2063 <1 \uFFFD
2064 <1 \uFFFF
2065
2066 ** test: fall back to mappings with shorter prefixes, not immediately to ones with no prefixes
2067 @ rules
2068 &u=ab|cd
2069 &v=b|ce
2070 * compare
2071 <1 abc
2072 <1 abcc
2073 <1 abcf
2074 <1 abcd
2075 = abu
2076 <1 abce
2077 = abv
2078
2079 # With the following rules, there is only one prefix per composite ĉ or ç,
2080 # but both prefixes apply to just c in NFD form.
2081 # We would get different results for composed vs. NFD input
2082 # if we fell back directly from longest-prefix mappings to no-prefix mappings.
2083 @ rules
2084 &x=op|ĉ
2085 &y=p|ç
2086 * compare
2087 <1 opc
2088 <2 opć
2089 <1 opcz
2090 <1 opd
2091 <1 opĉ
2092 = opc\u0302
2093 = opx
2094 <1 opç
2095 = opc\u0327
2096 = opy
2097
2098 # The mapping is used which has the longest matching prefix for which
2099 # there is also a suffix match, with the longest suffix match among several for that prefix.
2100 @ rules
2101 &❶=d
2102 &❷=de
2103 &❸=def
2104 &①=c|d
2105 &②=c|de
2106 &③=c|def
2107 &④=bc|d
2108 &⑤=bc|de
2109 &⑥=bc|def
2110 &⑦=abc|d
2111 &⑧=abc|de
2112 &⑨=abc|def
2113 * compare
2114 <1 9aadzz
2115 = 9aa❶zz
2116 <1 9aadez
2117 = 9aa❷z
2118 <1 9aadef
2119 = 9aa❸
2120 <1 9acdzz
2121 = 9ac①zz
2122 <1 9acdez
2123 = 9ac②z
2124 <1 9acdef
2125 = 9ac③
2126 <1 9bcdzz
2127 = 9bc④zz
2128 <1 9bcdez
2129 = 9bc⑤z
2130 <1 9bcdef
2131 = 9bc⑥
2132 <1 abcdzz
2133 = abc⑦zz
2134 <1 abcdez
2135 = abc⑧z
2136 <1 abcdef
2137 = abc⑨
2138
2139 ** test: prefix + discontiguous contraction with missing prefix contraction
2140 # Unfortunate terminology: The first "prefix" here is the pre-context,
2141 # the second "prefix" refers to the contraction/relation string that is
2142 # one shorter than the one being tested.
2143 @ rules
2144 &x=p|e
2145 &y=p|ê
2146 &z=op|ê
2147 # No mapping for op|e:
2148 # Discontiguous contraction matching should not match op|ê in opệ
2149 # because it would have to skip the dot below and extend a match on op|e by the circumflex,
2150 # but there is no match on op|e.
2151 * compare
2152 <1 oPe
2153 <1 ope
2154 = opx
2155 <1 opệ
2156 = opy\u0323 # y not z
2157 <1 opê
2158 = opz
2159
2160 # We cannot test for fallback by whether the contraction default CE32
2161 # is for another contraction. With the following rules, there is no mapping for op|e,
2162 # and the fallback to prefix p has no contractions.
2163 @ rules
2164 &x=p|e
2165 &z=op|ê
2166 * compare
2167 <1 oPe
2168 <1 ope
2169 = opx
2170 <2 opệ
2171 = opx\u0323\u0302 # x not z
2172 <1 opê
2173 = opz
2174
2175 # One more variation: Fallback to the simple code point, no shorter non-empty prefix.
2176 @ rules
2177 &x=e
2178 &z=op|ê
2179 * compare
2180 <1 ope
2181 = opx
2182 <3 oPe
2183 = oPx
2184 <2 opệ
2185 = opx\u0323\u0302 # x not z
2186 <1 opê
2187 = opz
2188
2189 ** test: maxVariable via rules
2190 @ rules
2191 [maxVariable space][alternate shifted]
2192 * compare
2193 = \u0020
2194 = \u000A
2195 <1 .
2196 <1 ° # degree sign
2197 <1 $
2198 <1 0
2199
2200 ** test: maxVariable via setting
2201 @ root
2202 % maxVariable=currency
2203 % alternate=shifted
2204 * compare
2205 = \u0020
2206 = \u000A
2207 = .
2208 = ° # degree sign
2209 = $
2210 <1 0
2211
2212 ** test: ICU4J CollationMiscTest/TestContractionClosure (ää)
2213 # This tests canonical closure, but it also tests that CollationFastLatin
2214 # bails out properly for contractions with combining marks.
2215 # For that we need pairs of strings that remain in the Latin fastpath
2216 # long enough, hence the extra "= b" lines.
2217 @ rules
2218 &b=\u00e4\u00e4
2219 * compare
2220 <1 b
2221 = \u00e4\u00e4
2222 = b
2223 = a\u0308a\u0308
2224 = b
2225 = \u00e4a\u0308
2226 = b
2227 = a\u0308\u00e4
2228
2229 ** test: ICU4J CollationMiscTest/TestContractionClosure (Å)
2230 @ rules
2231 &b=\u00C5
2232 * compare
2233 <1 b
2234 = \u00C5
2235 = b
2236 = A\u030A
2237 = b
2238 = \u212B
2239
2240 ** test: reset-before on already-tailored characters, ICU ticket 10108
2241 @ rules
2242 &a<w<<x &[before 2]x<<y
2243 * compare
2244 <1 a
2245 <1 w
2246 <2 y
2247 <2 x
2248
2249 @ rules
2250 &a<<w<<<x &[before 2]x<<y
2251 * compare
2252 <1 a
2253 <2 y
2254 <2 w
2255 <3 x
2256
2257 @ rules
2258 &a<w<x &[before 2]x<<y
2259 * compare
2260 <1 a
2261 <1 w
2262 <1 y
2263 <2 x
2264
2265 @ rules
2266 &a<w<<<x &[before 2]x<<y
2267 * compare
2268 <1 a
2269 <1 y
2270 <2 w
2271 <3 x
2272
2273 ** test: numeric collation with other settings, ICU ticket 9092
2274 @ root
2275 % strength=identical
2276 % caseFirst=upper
2277 % numeric=on
2278 * compare
2279 <1 100\u0020a
2280 <1 101
2281
2282 ** test: collation type fallback from unsupported type, ICU ticket 10149
2283 @ locale fr-CA-u-co-phonebk
2284 # Expect the same result as with fr-CA, using backwards-secondary order.
2285 # That is, we should fall back from the unsupported collation type
2286 # to the locale's default collation type.
2287 * compare
2288 <1 cote
2289 <2 côte
2290 <2 coté
2291 <2 côté
2292
2293 ** test: @ is equivalent to [backwards 2], ICU ticket 9956
2294 @ rules
2295 &b<a @ &v<<w
2296 * compare
2297 <1 b
2298 <1 a
2299 <1 cote
2300 <2 côte
2301 <2 coté
2302 <2 côté
2303 <1 v
2304 <2 w
2305 <1 x
2306
2307 ** test: shifted+reordering, ICU ticket 9507
2308 @ root
2309 % reorder Grek punct space
2310 % alternate=shifted
2311 % strength=quaternary
2312 # Which primaries are "variable" should be determined without script reordering,
2313 # and then primaries should be reordered whether they are shifted to quaternary or not.
2314 * compare
2315 <4 ( # punctuation
2316 <4 )
2317 <4 \u0020 # space
2318 <1 ` # symbol
2319 <1 ^
2320 <1 $ # currency symbol
2321 <1 €
2322 <1 0 # numbers
2323 <1 ε # Greek
2324 <1 e # Latin
2325 <1 e(e
2326 <4 e)e
2327 <4 e\u0020e
2328 <4 ee
2329 <3 e(E
2330 <4 e)E
2331 <4 e\u0020E
2332 <4 eE
2333
2334 ** test: "uppercase first" could sort a string before its prefix, ICU ticket 9351
2335 @ rules
2336 &\u0001<<<b<<<B
2337 % caseFirst=upper
2338 * compare
2339 <1 aaa
2340 <3 aaaB
2341
2342 ** test: secondary+case ignores secondary ignorables, ICU ticket 9355
2343 @ rules
2344 &\u0001<<<b<<<B
2345 % strength=secondary
2346 % caseLevel=on
2347 * compare
2348 <1 a
2349 = ab
2350 = aB
2351
2352 ** test: custom collation rules involving tail of a contraction in Malayalam, ICU ticket 6328
2353 @ rules
2354 &[before 2] ൌ << ൗ # U+0D57 << U+0D4C == 0D46+0D57
2355 * compare
2356 <1 ൗx
2357 <2 ൌx
2358 <1 ൗy
2359 <2 ൌy
2360
2361 ** test: quoted apostrophe in compact syntax, ICU ticket 8204
2362 @ rules
2363 &q<<*a''c
2364 * compare
2365 <1 d
2366 <1 p
2367 <1 q
2368 <2 a
2369 <2 \u0027
2370 <2 c
2371 <1 r
2372
2373 # ICU ticket #8260 "Support all collation-related keywords in Collator.getInstance()"
2374 ** test: locale -u- with collation keywords, ICU ticket 8260
2375 @ locale de-u-kv-sPace-ka-shifTed-kn-kk-falsE-kf-Upper-kc-tRue-ks-leVel4
2376 * compare
2377 <4 \u0020 # space is shifted, strength=quaternary
2378 <1 ! # punctuation is regular
2379 <1 2
2380 <1 12 # numeric sorting
2381 <1 B
2382 <c b # uppercase first on case level
2383 <1 x\u0301\u0308
2384 <2 x\u0308\u0301 # normalization off
2385
2386 ** test: locale @ with collation keywords, ICU ticket 8260
2387 @ locale fr@colbAckwards=yes;ColStrength=Quaternary;kv=currencY;colalternate=shifted
2388 * compare
2389 <4 $ # currency symbols are shifted, strength=quaternary
2390 <1 àla
2391 <2 alà # backwards secondary level
2392
2393 ** test: locale -u- with script reordering, ICU ticket 8260
2394 @ locale el-u-kr-kana-SYMBOL-Grek-hani-cyrl-latn-digit-armn-deva-ethi-thai
2395 * compare
2396 <1 \u0020
2397 <1 あ
2398 <1 ☂
2399 <1 Ω
2400 <1 丂
2401 <1 ж
2402 <1 L
2403 <1 4
2404 <1 Ձ
2405 <1 अ
2406 <1 ሄ
2407 <1 ฉ
2408
2409 ** test: locale @collation=type should be case-insensitive
2410 @ locale de@coLLation=PhoneBook
2411 * compare
2412 <1 ae
2413 <2 ä
2414 <3 Ä
2415
2416 ** test: import root search rules plus German phonebook rules, ICU ticket 8962
2417 @ locale de-u-co-search
2418 * compare
2419 <1 =
2420 <1 ≠
2421 <1 a
2422 <1 ae
2423 <2 ä
2424
2425 # Once more, but with runtime builder.
2426 @ rules
2427 [import und-u-co-search][import de-u-co-phonebk]
2428 * compare
2429 <1 =
2430 <1 ≠
2431 <1 a
2432 <1 ae
2433 <2 ä
2434
2435 # Once again, with import from "root" not "und" (as in a proper language tag).
2436 @ rules
2437 [import root-u-co-search][import de-u-co-phonebk]
2438 * compare
2439 <1 =
2440 <1 ≠
2441 <1 a
2442 <1 ae
2443 <2 ä
2444
2445 ** test: import rules from a language with non-Latin native script, and reset the reordering, ICU ticket 10998
2446 # Greek should sort Greek first.
2447 @ rules
2448 [import el]
2449 * compare
2450 <1 4
2451 <1 Ω
2452 <1 L
2453
2454 # Import Greek, and then reset the reordering.
2455 @ rules
2456 [import el][reorder Zzzz]
2457 * compare
2458 <1 4
2459 <1 L
2460 <1 Ω
2461
2462 # "others" is a synonym for Zzzz.
2463 @ rules
2464 [import el][reorder others]
2465 * compare
2466 <1 4
2467 <1 L
2468 <1 Ω
2469
2470 ** test: regression test for CollationFastLatinBuilder, ICU ticket 11388
2471 @ rules
2472 &x<<aa<<<Aa<<<AA
2473 % strength=secondary
2474 * compare
2475 <1 AA
2476 <2 Aẩ
2477 <2 aą
2478 * compare
2479 <1 AA
2480 <2 aą
2481
2482 ** test: tailor tertiary-after a common tertiary where there is a lower one
2483 # Assume that Hiragana small A has a below-common tertiary, and Hiragana A has a common one.
2484 # See ICU ticket 11448 & CLDR ticket 7222.
2485 @ rules
2486 &あ<<<x<<<y<<<z
2487 * compare
2488 <1 ぁ
2489 <3 あ
2490 <3 x
2491 <3 y
2492 <3 z
2493 <3 ァ
2494 <1 い
2495
2496 ** test: tailor tertiary-after a below-common tertiary
2497 @ rules
2498 &ぁ<<<x<<<y<<<z
2499 * compare
2500 <1 ぁ
2501 <3 x
2502 <3 y
2503 <3 z
2504 <3 あ
2505 <3 ァ
2506 <1 い
2507
2508 ** test: tailor tertiary-before a common tertiary where there is a lower one
2509 @ rules
2510 &[before 3]あ<<<x<<<y<<<z
2511 * compare
2512 <1 ぁ
2513 <3 x
2514 <3 y
2515 <3 z
2516 <3 あ
2517 <3 ァ
2518 <1 い
2519
2520 ** test: tailor tertiary-before a below-common tertiary
2521 @ rules
2522 &[before 3]ぁ<<<x<<<y<<<z
2523 * compare
2524 <1 x
2525 <3 y
2526 <3 z
2527 <3 ぁ
2528 <3 あ
2529 <3 ァ
2530 <1 い
2531
2532 ** test: reorder single scripts not groups, ICU ticket 11449
2533 @ root
2534 % reorder Goth Latn
2535 * compare
2536 <1 4
2537 <1 𐌰 # Gothic
2538 <1 L
2539 <1 Ω
2540 # Before ICU 55, the following reordered together with Gothic.
2541 <1 𐌈 # Old Italic
2542 <1 𐑐 # Shavian