150 lines
4.9 KiB
PHP
150 lines
4.9 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Symfony\Component\String\Tests\Inflector;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use Symfony\Component\String\Inflector\FrenchInflector;
|
|
|
|
class FrenchInflectorTest extends TestCase
|
|
{
|
|
public static function pluralizeProvider()
|
|
{
|
|
return [
|
|
// Le pluriel par défaut
|
|
['voiture', 'voitures'],
|
|
// special characters
|
|
['œuf', 'œufs'],
|
|
['oeuf', 'oeufs'],
|
|
|
|
// Les mots finissant par s, x, z sont invariables en nombre
|
|
['bois', 'bois'],
|
|
['fils', 'fils'],
|
|
['héros', 'héros'],
|
|
['nez', 'nez'],
|
|
['rictus', 'rictus'],
|
|
['sans', 'sans'],
|
|
['souris', 'souris'],
|
|
['tas', 'tas'],
|
|
['toux', 'toux'],
|
|
|
|
// Les mots finissant en eau prennent tous un x au pluriel
|
|
['eau', 'eaux'],
|
|
['sceau', 'sceaux'],
|
|
|
|
// Les mots finissant en au prennent tous un x au pluriel sauf landau
|
|
['noyau', 'noyaux'],
|
|
['landau', 'landaus'],
|
|
|
|
// Les mots finissant en eu prennent un x au pluriel sauf pneu, bleu et émeu
|
|
['pneu', 'pneus'],
|
|
['bleu', 'bleus'],
|
|
['émeu', 'émeus'],
|
|
['cheveu', 'cheveux'],
|
|
|
|
// Les mots finissant en al se terminent en aux au pluriel
|
|
['amiral', 'amiraux'],
|
|
['animal', 'animaux'],
|
|
['arsenal', 'arsenaux'],
|
|
['bocal', 'bocaux'],
|
|
['canal', 'canaux'],
|
|
['capital', 'capitaux'],
|
|
['caporal', 'caporaux'],
|
|
['cheval', 'chevaux'],
|
|
['cristal', 'cristaux'],
|
|
['général', 'généraux'],
|
|
['hopital', 'hopitaux'],
|
|
['hôpital', 'hôpitaux'],
|
|
['idéal', 'idéaux'],
|
|
['journal', 'journaux'],
|
|
['littoral', 'littoraux'],
|
|
['local', 'locaux'],
|
|
['mal', 'maux'],
|
|
['métal', 'métaux'],
|
|
['minéral', 'minéraux'],
|
|
['principal', 'principaux'],
|
|
['radical', 'radicaux'],
|
|
['terminal', 'terminaux'],
|
|
|
|
// sauf bal, carnaval, caracal, chacal, choral, corral, étal, festival, récital et val
|
|
['bal', 'bals'],
|
|
['carnaval', 'carnavals'],
|
|
['caracal', 'caracals'],
|
|
['chacal', 'chacals'],
|
|
['choral', 'chorals'],
|
|
['corral', 'corrals'],
|
|
['étal', 'étals'],
|
|
['festival', 'festivals'],
|
|
['récital', 'récitals'],
|
|
['val', 'vals'],
|
|
|
|
// Les noms terminés en -ail prennent un s au pluriel.
|
|
['portail', 'portails'],
|
|
['rail', 'rails'],
|
|
|
|
// SAUF aspirail, bail, corail, émail, fermail, soupirail, travail, vantail et vitrail qui font leur pluriel en -aux
|
|
['aspirail', 'aspiraux'],
|
|
['bail', 'baux'],
|
|
['corail', 'coraux'],
|
|
['émail', 'émaux'],
|
|
['fermail', 'fermaux'],
|
|
['soupirail', 'soupiraux'],
|
|
['travail', 'travaux'],
|
|
['vantail', 'vantaux'],
|
|
['vitrail', 'vitraux'],
|
|
|
|
// Les noms terminés en -ou prennent un s au pluriel.
|
|
['trou', 'trous'],
|
|
['fou', 'fous'],
|
|
|
|
// SAUF Bijou, caillou, chou, genou, hibou, joujou et pou qui prennent un x au pluriel
|
|
['bijou', 'bijoux'],
|
|
['caillou', 'cailloux'],
|
|
['chou', 'choux'],
|
|
['genou', 'genoux'],
|
|
['hibou', 'hiboux'],
|
|
['joujou', 'joujoux'],
|
|
['pou', 'poux'],
|
|
|
|
// Inflected word
|
|
['cinquante', 'cinquante'],
|
|
['soixante', 'soixante'],
|
|
['mille', 'mille'],
|
|
|
|
// Titles
|
|
['monsieur', 'messieurs'],
|
|
['madame', 'mesdames'],
|
|
['mademoiselle', 'mesdemoiselles'],
|
|
['monseigneur', 'messeigneurs'],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider pluralizeProvider
|
|
*/
|
|
public function testSingularize(string $singular, string $plural)
|
|
{
|
|
$this->assertSame([$singular], (new FrenchInflector())->singularize($plural));
|
|
// test casing: if the first letter was uppercase, it should remain so
|
|
$this->assertSame([ucfirst($singular)], (new FrenchInflector())->singularize(ucfirst($plural)));
|
|
}
|
|
|
|
/**
|
|
* @dataProvider pluralizeProvider
|
|
*/
|
|
public function testPluralize(string $singular, string $plural)
|
|
{
|
|
$this->assertSame([$plural], (new FrenchInflector())->pluralize($singular));
|
|
// test casing: if the first letter was uppercase, it should remain so
|
|
$this->assertSame([ucfirst($plural)], (new FrenchInflector())->pluralize(ucfirst($singular)));
|
|
}
|
|
}
|