]>
Commit | Line | Data |
---|---|---|
1 | <?php | |
2 | ||
3 | /* | |
4 | * This file is part of the Symfony package. | |
5 | * | |
6 | * (c) Fabien Potencier <fabien@symfony.com> | |
7 | * | |
8 | * For the full copyright and license information, please view the LICENSE | |
9 | * file that was distributed with this source code. | |
10 | */ | |
11 | ||
12 | namespace Symfony\Component\Translation\Tests; | |
13 | ||
14 | use Symfony\Component\Translation\PluralizationRules; | |
15 | ||
16 | /** | |
17 | * Test should cover all languages mentioned on http://translate.sourceforge.net/wiki/l10n/pluralforms | |
18 | * and Plural forms mentioned on http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms | |
19 | * | |
20 | * See also https://developer.mozilla.org/en/Localization_and_Plurals which mentions 15 rules having a maximum of 6 forms. | |
21 | * The mozilla code is also interesting to check for. | |
22 | * | |
23 | * As mentioned by chx http://drupal.org/node/1273968 we can cover all by testing number from 0 to 199 | |
24 | * | |
25 | * The goal to cover all languages is to far fetched so this test case is smaller. | |
26 | * | |
27 | * @author Clemens Tolboom clemens@build2be.nl | |
28 | */ | |
29 | class PluralizationRulesTest extends \PHPUnit_Framework_TestCase | |
30 | { | |
31 | ||
32 | /** | |
33 | * We test failed langcode here. | |
34 | * | |
35 | * TODO: The languages mentioned in the data provide need to get fixed somehow within PluralizationRules. | |
36 | * | |
37 | * @dataProvider failingLangcodes | |
38 | */ | |
39 | public function testFailedLangcodes($nplural, $langCodes) | |
40 | { | |
41 | $matrix = $this->generateTestData($nplural, $langCodes); | |
42 | $this->validateMatrix($nplural, $matrix, false); | |
43 | } | |
44 | ||
45 | /** | |
46 | * @dataProvider successLangcodes | |
47 | */ | |
48 | public function testLangcodes($nplural, $langCodes) | |
49 | { | |
50 | $matrix = $this->generateTestData($nplural, $langCodes); | |
51 | $this->validateMatrix($nplural, $matrix); | |
52 | } | |
53 | ||
54 | /** | |
55 | * This array should contain all currently known langcodes. | |
56 | * | |
57 | * As it is impossible to have this ever complete we should try as hard as possible to have it almost complete. | |
58 | * | |
59 | * @return type | |
60 | */ | |
61 | public function successLangcodes() | |
62 | { | |
63 | return array( | |
64 | array('1' , array('ay','bo', 'cgg','dz','id', 'ja', 'jbo', 'ka','kk','km','ko','ky')), | |
65 | array('2' , array('nl', 'fr', 'en', 'de', 'de_GE')), | |
66 | array('3' , array('be','bs','cs','hr')), | |
67 | array('4' , array('cy','mt', 'sl')), | |
68 | array('5' , array()), | |
69 | array('6' , array('ar')), | |
70 | ); | |
71 | } | |
72 | ||
73 | /** | |
74 | * This array should be at least empty within the near future. | |
75 | * | |
76 | * This both depends on a complete list trying to add above as understanding | |
77 | * the plural rules of the current failing languages. | |
78 | * | |
79 | * @return array with nplural together with langcodes | |
80 | */ | |
81 | public function failingLangcodes() | |
82 | { | |
83 | return array( | |
84 | array('1' , array('fa')), | |
85 | array('2' , array('jbo')), | |
86 | array('3' , array('cbs')), | |
87 | array('4' , array('gd','kw')), | |
88 | array('5' , array('ga')), | |
89 | array('6' , array()), | |
90 | ); | |
91 | } | |
92 | ||
93 | /** | |
94 | * We validate only on the plural coverage. Thus the real rules is not tested. | |
95 | * | |
96 | * @param string $nplural plural expected | |
97 | * @param array $matrix containing langcodes and their plural index values. | |
98 | * @param boolean $expectSuccess | |
99 | */ | |
100 | protected function validateMatrix($nplural, $matrix, $expectSuccess = true) | |
101 | { | |
102 | foreach ($matrix as $langCode => $data) { | |
103 | $indexes = array_flip($data); | |
104 | if ($expectSuccess) { | |
105 | $this->assertEquals($nplural, count($indexes), "Langcode '$langCode' has '$nplural' plural forms."); | |
106 | } else { | |
107 | $this->assertNotEquals((int) $nplural, count($indexes), "Langcode '$langCode' has '$nplural' plural forms."); | |
108 | } | |
109 | } | |
110 | } | |
111 | ||
112 | protected function generateTestData($plural, $langCodes) | |
113 | { | |
114 | $matrix = array(); | |
115 | foreach ($langCodes as $langCode) { | |
116 | for ($count=0; $count<200; $count++) { | |
117 | $plural = PluralizationRules::get($count, $langCode); | |
118 | $matrix[$langCode][$count] = $plural; | |
119 | } | |
120 | } | |
121 | ||
122 | return $matrix; | |
123 | } | |
124 | } |