You are here

class PluralizationRulesTest in Zircon Profile 8.0

Same name and namespace in other branches
  1. 8 vendor/symfony/translation/Tests/PluralizationRulesTest.php \Symfony\Component\Translation\Tests\PluralizationRulesTest

Test should cover all languages mentioned on http://translate.sourceforge.net/wiki/l10n/pluralforms and Plural forms mentioned on http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms.

See also https://developer.mozilla.org/en/Localization_and_Plurals which mentions 15 rules having a maximum of 6 forms. The mozilla code is also interesting to check for.

As mentioned by chx http://drupal.org/node/1273968 we can cover all by testing number from 0 to 199

The goal to cover all languages is to far fetched so this test case is smaller.

@author Clemens Tolboom clemens@build2be.nl

Hierarchy

  • class \Symfony\Component\Translation\Tests\PluralizationRulesTest extends \Symfony\Component\Translation\Tests\PHPUnit_Framework_TestCase

Expanded class hierarchy of PluralizationRulesTest

File

vendor/symfony/translation/Tests/PluralizationRulesTest.php, line 29

Namespace

Symfony\Component\Translation\Tests
View source
class PluralizationRulesTest extends \PHPUnit_Framework_TestCase {

  /**
   * We test failed langcode here.
   *
   * TODO: The languages mentioned in the data provide need to get fixed somehow within PluralizationRules.
   *
   * @dataProvider failingLangcodes
   */
  public function testFailedLangcodes($nplural, $langCodes) {
    $matrix = $this
      ->generateTestData($nplural, $langCodes);
    $this
      ->validateMatrix($nplural, $matrix, false);
  }

  /**
   * @dataProvider successLangcodes
   */
  public function testLangcodes($nplural, $langCodes) {
    $matrix = $this
      ->generateTestData($nplural, $langCodes);
    $this
      ->validateMatrix($nplural, $matrix);
  }

  /**
   * This array should contain all currently known langcodes.
   *
   * As it is impossible to have this ever complete we should try as hard as possible to have it almost complete.
   *
   * @return array
   */
  public function successLangcodes() {
    return array(
      array(
        '1',
        array(
          'ay',
          'bo',
          'cgg',
          'dz',
          'id',
          'ja',
          'jbo',
          'ka',
          'kk',
          'km',
          'ko',
          'ky',
        ),
      ),
      array(
        '2',
        array(
          'nl',
          'fr',
          'en',
          'de',
          'de_GE',
        ),
      ),
      array(
        '3',
        array(
          'be',
          'bs',
          'cs',
          'hr',
        ),
      ),
      array(
        '4',
        array(
          'cy',
          'mt',
          'sl',
        ),
      ),
      array(
        '5',
        array(),
      ),
      array(
        '6',
        array(
          'ar',
        ),
      ),
    );
  }

  /**
   * This array should be at least empty within the near future.
   *
   * This both depends on a complete list trying to add above as understanding
   * the plural rules of the current failing languages.
   *
   * @return array with nplural together with langcodes
   */
  public function failingLangcodes() {
    return array(
      array(
        '1',
        array(
          'fa',
        ),
      ),
      array(
        '2',
        array(
          'jbo',
        ),
      ),
      array(
        '3',
        array(
          'cbs',
        ),
      ),
      array(
        '4',
        array(
          'gd',
          'kw',
        ),
      ),
      array(
        '5',
        array(
          'ga',
        ),
      ),
      array(
        '6',
        array(),
      ),
    );
  }

  /**
   * We validate only on the plural coverage. Thus the real rules is not tested.
   *
   * @param string $nplural       plural expected
   * @param array  $matrix        containing langcodes and their plural index values.
   * @param bool   $expectSuccess
   */
  protected function validateMatrix($nplural, $matrix, $expectSuccess = true) {
    foreach ($matrix as $langCode => $data) {
      $indexes = array_flip($data);
      if ($expectSuccess) {
        $this
          ->assertEquals($nplural, count($indexes), "Langcode '{$langCode}' has '{$nplural}' plural forms.");
      }
      else {
        $this
          ->assertNotEquals((int) $nplural, count($indexes), "Langcode '{$langCode}' has '{$nplural}' plural forms.");
      }
    }
  }
  protected function generateTestData($plural, $langCodes) {
    $matrix = array();
    foreach ($langCodes as $langCode) {
      for ($count = 0; $count < 200; ++$count) {
        $plural = PluralizationRules::get($count, $langCode);
        $matrix[$langCode][$count] = $plural;
      }
    }
    return $matrix;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
PluralizationRulesTest::failingLangcodes public function This array should be at least empty within the near future.
PluralizationRulesTest::generateTestData protected function
PluralizationRulesTest::successLangcodes public function This array should contain all currently known langcodes.
PluralizationRulesTest::testFailedLangcodes public function We test failed langcode here.
PluralizationRulesTest::testLangcodes public function @dataProvider successLangcodes
PluralizationRulesTest::validateMatrix protected function We validate only on the plural coverage. Thus the real rules is not tested.