wordpress-develop/tests/phpunit/tests/pomo/pluralForms.php
Sergey Biryukov 2f491fba50 Tests: Simplify PluralFormsTest::test_exceptions().
Previously, the test had to use an older pattern for catching the generic `Exception` exceptions for compatibility with PHPUnit 3.6 on PHP 5.2.

Now that WordPress supports PHPUnit 5.4 as the minimum version, the `expectException()` method can be used directly.

Follow-up to [41725], [41730].

See #51344.

git-svn-id: https://develop.svn.wordpress.org/trunk@48999 602fd350-edb4-49c9-b593-d223f7449a82
2020-09-18 14:11:11 +00:00

234 lines
4.9 KiB
PHP

<?php
/**
* @group pomo
*/
class PluralFormsTest extends WP_UnitTestCase {
/**
* Parenthesize plural expression.
*
* Legacy workaround for PHP's flipped precedence order for ternary.
*
* @param string $expression the expression without parentheses
* @return string the expression with parentheses added
*/
protected static function parenthesize_plural_expression( $expression ) {
$expression .= ';';
$res = '';
$depth = 0;
for ( $i = 0; $i < strlen( $expression ); ++$i ) {
$char = $expression[ $i ];
switch ( $char ) {
case '?':
$res .= ' ? (';
$depth++;
break;
case ':':
$res .= ') : (';
break;
case ';':
$res .= str_repeat( ')', $depth ) . ';';
$depth = 0;
break;
default:
$res .= $char;
}
}
return rtrim( $res, ';' );
}
/**
* @ticket 41562
* @group external-http
*/
public function test_locales_provider() {
$locales = self::locales_provider();
$this->assertNotEmpty( $locales, 'Unable to retrieve GP_Locales file' );
}
public static function locales_provider() {
if ( ! class_exists( 'GP_Locales' ) ) {
$filename = download_url( 'https://raw.githubusercontent.com/GlotPress/GlotPress-WP/develop/locales/locales.php' );
if ( is_wp_error( $filename ) ) {
return array();
}
require_once $filename;
}
$locales = GP_Locales::locales();
$plural_expressions = array();
foreach ( $locales as $slug => $locale ) {
$plural_expression = $locale->plural_expression;
if ( 'n != 1' !== $plural_expression ) {
$plural_expressions[] = array( $slug, $locale->nplurals, $plural_expression );
}
}
return $plural_expressions;
}
/**
* @ticket 41562
* @dataProvider locales_provider
* @group external-http
*/
public function test_regression( $lang, $nplurals, $expression ) {
require_once dirname( dirname( __DIR__ ) ) . '/includes/plural-form-function.php';
$parenthesized = self::parenthesize_plural_expression( $expression );
$old_style = tests_make_plural_form_function( $nplurals, $parenthesized );
$plural_forms = new Plural_Forms( $expression );
$generated_old = array();
$generated_new = array();
foreach ( range( 0, 200 ) as $i ) {
$generated_old[] = $old_style( $i );
$generated_new[] = $plural_forms->get( $i );
}
$this->assertSame( $generated_old, $generated_new );
}
public static function simple_provider() {
return array(
array(
// Simple equivalence.
'n != 1',
array(
-1 => 1,
0 => 1,
1 => 0,
2 => 1,
5 => 1,
10 => 1,
),
),
array(
// Ternary.
'n ? 1 : 2',
array(
-1 => 1,
0 => 2,
1 => 1,
2 => 1,
),
),
array(
// Comparison.
'n > 1 ? 1 : 2',
array(
-2 => 2,
-1 => 2,
0 => 2,
1 => 2,
2 => 1,
3 => 1,
),
),
array(
'n > 1 ? n > 2 ? 1 : 2 : 3',
array(
-2 => 3,
-1 => 3,
0 => 3,
1 => 3,
2 => 2,
3 => 1,
4 => 1,
),
),
);
}
/**
* @ticket 41562
* @dataProvider simple_provider
*/
public function test_simple( $expression, $expected ) {
$plural_forms = new Plural_Forms( $expression );
$actual = array();
foreach ( array_keys( $expected ) as $num ) {
$actual[ $num ] = $plural_forms->get( $num );
}
$this->assertSame( $expected, $actual );
}
public function data_exceptions() {
return array(
array(
'n # 2', // Invalid expression to parse.
'Unknown symbol "#"', // Expected exception message.
false, // Whether to call the get() method or not.
),
array(
'n & 1',
'Unknown operator "&"',
false,
),
array(
'((n)',
'Mismatched parentheses',
false,
),
array(
'(n))',
'Mismatched parentheses',
false,
),
array(
'n : 2',
'Missing starting "?" ternary operator',
false,
),
array(
'n ? 1',
'Unknown operator "?"',
true,
),
array(
'n n',
'Too many values remaining on the stack',
true,
),
);
}
/**
* Ensures that an exception is thrown when an invalid plural form is encountered.
*
* @ticket 41562
* @dataProvider data_exceptions
*/
public function test_exceptions( $expression, $expected_message, $call_get ) {
$this->expectException( 'Exception' );
$this->expectExceptionMessage( $expected_message );
$plural_forms = new Plural_Forms( $expression );
if ( $call_get ) {
$plural_forms->get( 1 );
}
}
/**
* @ticket 41562
*/
public function test_cache() {
$mock = $this->getMockBuilder( 'Plural_Forms' )
->setMethods( array( 'execute' ) )
->setConstructorArgs( array( 'n != 1' ) )
->getMock();
$mock->expects( $this->once() )
->method( 'execute' )
->with( $this->identicalTo( 2 ) )
->will( $this->returnValue( 1 ) );
$first = $mock->get( 2 );
$second = $mock->get( 2 );
$this->assertSame( $first, $second );
}
}