From c50cd600697b2dbf9f7302b56c5c59270ceaac67 Mon Sep 17 00:00:00 2001 From: Liangent Date: Tue, 20 Nov 2012 20:13:37 +0800 Subject: [PATCH] Always return something nice in Language::translateBlockExpiry() Change-Id: I30a1950df5ae018cb9124392dc8d6e99ca3b98b8 --- languages/Language.php | 18 +++++++++++-- tests/phpunit/languages/LanguageTest.php | 32 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/languages/Language.php b/languages/Language.php index c4807a61d3..437d3c47ca 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -3482,8 +3482,22 @@ class Language { } } } - // If all else fails, return the original string. - return $str; + + // If all else fails, return a standard duration or timestamp description. + $time = strtotime( $str, 0 ); + if ( $time === false ) { // Unknown format. Return it as-is in case. + return $str; + } elseif ( $time !== strtotime( $str, 1 ) ) { // It's a relative timestamp. + // $time is relative to 0 so it's a duration length. + return $this->formatDuration( $time ); + } else { // It's an absolute timestamp. + if ( $time === 0 ) { + // wfTimestamp() handles 0 as current time instead of epoch. + return $this->timeanddate( '19700101000000' ); + } else { + return $this->timeanddate( $time ); + } + } } /** diff --git a/tests/phpunit/languages/LanguageTest.php b/tests/phpunit/languages/LanguageTest.php index c66df6985f..94ccfd018e 100644 --- a/tests/phpunit/languages/LanguageTest.php +++ b/tests/phpunit/languages/LanguageTest.php @@ -1078,5 +1078,37 @@ class LanguageTest extends LanguageClassesTestCase { ) ), ); } + + /** + * @covers Language::translateBlockExpiry() + * @dataProvider provideTranslateBlockExpiry + */ + function testTranslateBlockExpiry( $expectedData, $str, $desc ) { + $lang = $this->getLang(); + if ( is_array( $expectedData ) ) { + list( $func, $arg ) = $expectedData; + $expected = $lang->$func( $arg ); + } else { + $expected = $expectedData; + } + $this->assertEquals( $expected, $lang->translateBlockExpiry( $str ), $desc ); + } + + function provideTranslateBlockExpiry() { + return array( + array( '2 hours', '2 hours', 'simple data from ipboptions' ), + array( 'indefinite', 'infinite', 'infinite from ipboptions' ), + array( 'indefinite', 'infinity', 'alternative infinite from ipboptions' ), + array( 'indefinite', 'indefinite', 'another alternative infinite from ipboptions' ), + array( array( 'formatDuration', 1023 * 60 * 60 ), '1023 hours', 'relative' ), + array( array( 'formatDuration', -1023 ), '-1023 seconds', 'negative relative' ), + array( array( 'formatDuration', 0 ), 'now', 'now' ), + array( array( 'timeanddate', '20120102070000' ), '2012-1-1 7:00 +1 day', 'mixed, handled as absolute' ), + array( array( 'timeanddate', '19910203040506' ), '1991-2-3 4:05:06', 'absolute' ), + array( array( 'timeanddate', '19700101000000' ), '1970-1-1 0:00:00', 'absolute at epoch' ), + array( array( 'timeanddate', '19691231235959' ), '1969-12-31 23:59:59', 'time before epoch' ), + array( 'dummy', 'dummy', 'return garbage as is' ), + ); + } } -- 2.20.1