]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - tests/phpunit/includes/collation/CollationTest.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / tests / phpunit / includes / collation / CollationTest.php
1 <?php
2
3 /**
4  * Class CollationTest
5  * @covers Collation
6  * @covers IcuCollation
7  * @covers IdentityCollation
8  * @covers UppercaseCollation
9  */
10 class CollationTest extends MediaWikiLangTestCase {
11         protected function setUp() {
12                 parent::setUp();
13                 $this->checkPHPExtension( 'intl' );
14         }
15
16         /**
17          * Test to make sure, that if you
18          * have "X" and "XY", the binary
19          * sortkey also has "X" being a
20          * prefix of "XY". Our collation
21          * code makes this assumption.
22          *
23          * @param string $lang Language code for collator
24          * @param string $base Base string
25          * @param string $extended String containing base as a prefix.
26          *
27          * @dataProvider prefixDataProvider
28          */
29         public function testIsPrefix( $lang, $base, $extended ) {
30                 $cp = Collator::create( $lang );
31                 $cp->setStrength( Collator::PRIMARY );
32                 $baseBin = $cp->getSortKey( $base );
33                 // Remove sortkey terminator
34                 $baseBin = rtrim( $baseBin, "\0" );
35                 $extendedBin = $cp->getSortKey( $extended );
36                 $this->assertStringStartsWith( $baseBin, $extendedBin, "$base is not a prefix of $extended" );
37         }
38
39         public static function prefixDataProvider() {
40                 return [
41                         [ 'en', 'A', 'AA' ],
42                         [ 'en', 'A', 'AAA' ],
43                         [ 'en', 'Д', 'ДЂ' ],
44                         [ 'en', 'Д', 'ДA' ],
45                         // 'Ʒ' should expand to 'Z ' (note space).
46                         [ 'fi', 'Z', 'Ʒ' ],
47                         // 'Þ' should expand to 'th'
48                         [ 'sv', 't', 'Þ' ],
49                         // Javanese is a limited use alphabet, so should have 3 bytes
50                         // per character, so do some tests with it.
51                         [ 'en', 'ꦲ', 'ꦲꦤ' ],
52                         [ 'en', 'ꦲ', 'ꦲД' ],
53                         [ 'en', 'A', 'Aꦲ' ],
54                 ];
55         }
56
57         /**
58          * Opposite of testIsPrefix
59          *
60          * @dataProvider notPrefixDataProvider
61          */
62         public function testNotIsPrefix( $lang, $base, $extended ) {
63                 $cp = Collator::create( $lang );
64                 $cp->setStrength( Collator::PRIMARY );
65                 $baseBin = $cp->getSortKey( $base );
66                 // Remove sortkey terminator
67                 $baseBin = rtrim( $baseBin, "\0" );
68                 $extendedBin = $cp->getSortKey( $extended );
69                 $this->assertStringStartsNotWith( $baseBin, $extendedBin, "$base is a prefix of $extended" );
70         }
71
72         public static function notPrefixDataProvider() {
73                 return [
74                         [ 'en', 'A', 'B' ],
75                         [ 'en', 'AC', 'ABC' ],
76                         [ 'en', 'Z', 'Ʒ' ],
77                         [ 'en', 'A', 'ꦲ' ],
78                 ];
79         }
80
81         /**
82          * Test correct first letter is fetched.
83          *
84          * @param string $collation Collation name (aka uca-en)
85          * @param string $string String to get first letter of
86          * @param string $firstLetter Expected first letter.
87          *
88          * @dataProvider firstLetterProvider
89          */
90         public function testGetFirstLetter( $collation, $string, $firstLetter ) {
91                 $col = Collation::factory( $collation );
92                 $this->assertEquals( $firstLetter, $col->getFirstLetter( $string ) );
93         }
94
95         function firstLetterProvider() {
96                 return [
97                         [ 'uppercase', 'Abc', 'A' ],
98                         [ 'uppercase', 'abc', 'A' ],
99                         [ 'identity', 'abc', 'a' ],
100                         [ 'uca-en', 'abc', 'A' ],
101                         [ 'uca-en', ' ', ' ' ],
102                         [ 'uca-en', 'Êveryone', 'E' ],
103                         [ 'uca-vi', 'Êveryone', 'Ê' ],
104                         // Make sure thorn is not a first letter.
105                         [ 'uca-sv', 'The', 'T' ],
106                         [ 'uca-sv', 'Å', 'Å' ],
107                         [ 'uca-hu', 'dzsdo', 'Dzs' ],
108                         [ 'uca-hu', 'dzdso', 'Dz' ],
109                         [ 'uca-hu', 'CSD', 'Cs' ],
110                         [ 'uca-root', 'CSD', 'C' ],
111                         [ 'uca-fi', 'Ǥ', 'G' ],
112                         [ 'uca-fi', 'Ŧ', 'T' ],
113                         [ 'uca-fi', 'Ʒ', 'Z' ],
114                         [ 'uca-fi', 'Ŋ', 'N' ],
115                         [ 'uppercase-ba', 'в', 'В' ],
116                 ];
117         }
118 }