]> git.immae.eu Git - github/wallabag/wallabag.git/blob - vendor/symfony/translation/Symfony/Component/Translation/Tests/PluralizationRulesTest.php
gitignore vendor
[github/wallabag/wallabag.git] / vendor / symfony / translation / Symfony / Component / Translation / Tests / PluralizationRulesTest.php
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 }