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