J. King
7 years ago
9 changed files with 228 additions and 61 deletions
@ -0,0 +1,3 @@ |
|||||
|
<?php |
||||
|
require_once __DIR__.DIRECTORY_SEPARATOR."bootstrap.php"; |
||||
|
$data = new RuntimeData(new Conf()); |
@ -1,19 +1,20 @@ |
|||||
<?xml version="1.0"?> |
<?xml version="1.0"?> |
||||
<phpunit |
<phpunit |
||||
colors="true" |
colors="true" |
||||
bootstrap="bootstrap.php" |
bootstrap="bootstrap.php" |
||||
convertErrorsToExceptions="true" |
convertErrorsToExceptions="true" |
||||
convertNoticesToExceptions="true" |
convertNoticesToExceptions="true" |
||||
convertWarningsToExceptions="true" |
convertWarningsToExceptions="true" |
||||
beStrictAboutTestsThatDoNotTestAnything="true" |
beStrictAboutTestsThatDoNotTestAnything="true" |
||||
beStrictAboutOutputDuringTests="true" |
beStrictAboutOutputDuringTests="true" |
||||
beStrictAboutTestSize="true"> |
beStrictAboutTestSize="true"> |
||||
|
|
||||
<testsuite name="Base"> |
|
||||
<file>TestLang.php</file> |
|
||||
<file>TestConf.php</file> |
|
||||
</testsuite> |
|
||||
|
|
||||
|
|
||||
|
<testsuite name="Localization and exceptions"> |
||||
|
<file>TestLang.php</file> |
||||
|
<file>TestLangComplex.php</file> |
||||
|
</testsuite> |
||||
|
|
||||
|
<testsuite name="Configuration loading and saving"> |
||||
|
<file>TestConf.php</file> |
||||
|
</testsuite> |
||||
</phpunit> |
</phpunit> |
@ -0,0 +1,106 @@ |
|||||
|
<?php |
||||
|
declare(strict_types=1); |
||||
|
namespace JKingWeb\NewsSync; |
||||
|
use \org\bovigo\vfs\vfsStream; |
||||
|
|
||||
|
|
||||
|
class TestLangComplex extends \PHPUnit\Framework\TestCase { |
||||
|
use TestingHelpers; |
||||
|
|
||||
|
static $vfs; |
||||
|
static $path; |
||||
|
static $files; |
||||
|
static $defaultPath; |
||||
|
|
||||
|
static function setUpBeforeClass() { |
||||
|
// this is required to keep from having exceptions in Lang::msg() in turn calling Lang::msg() and looping |
||||
|
Lang\Exception::$test = true; |
||||
|
// test files |
||||
|
self::$files = [ |
||||
|
'en.php' => '<?php return ["Test.presentText" => "and the Philosopher\'s Stone"];', |
||||
|
'en_ca.php' => '<?php return ["Test.presentText" => "{0} and {1}"];', |
||||
|
'en_us.php' => '<?php return ["Test.presentText" => "and the Sorcerer\'s Stone"];', |
||||
|
'fr.php' => '<?php return ["Test.presentText" => "à l\'école des sorciers"];', |
||||
|
'ja.php' => '<?php return ["Test.absentText" => "賢者の石"];', |
||||
|
'de.php' => '<?php return ["Test.presentText" => "und der Stein der Weisen"];', |
||||
|
// corrupt files |
||||
|
'it.php' => '<?php return 0;', |
||||
|
'zh.php' => '<?php return 0', |
||||
|
'ko.php' => 'DEAD BEEF', |
||||
|
'fr_ca.php' => '', |
||||
|
// unreadable file |
||||
|
'ru.php' => '', |
||||
|
]; |
||||
|
self::$vfs = vfsStream::setup("langtest", 0777, self::$files); |
||||
|
self::$path = self::$vfs->url(); |
||||
|
// set up a file without read access |
||||
|
chmod(self::$path."/ru.php", 0000); |
||||
|
// make the Lang class use the vfs files |
||||
|
self::$defaultPath = Lang::$path; |
||||
|
Lang::$path = self::$path."/"; |
||||
|
} |
||||
|
|
||||
|
static function tearDownAfterClass() { |
||||
|
Lang\Exception::$test = false; |
||||
|
Lang::$path = self::$defaultPath; |
||||
|
self::$path = null; |
||||
|
self::$vfs = null; |
||||
|
self::$files = null; |
||||
|
Lang::set(Lang::DEFAULT, true); |
||||
|
} |
||||
|
|
||||
|
function setUp() { |
||||
|
Lang::set(Lang::DEFAULT, true); |
||||
|
} |
||||
|
|
||||
|
function testLoadLazy() { |
||||
|
Lang::set("ja"); |
||||
|
$this->assertArrayNotHasKey('Test.absentText', Lang::dump()); |
||||
|
} |
||||
|
|
||||
|
function testLoadCascade() { |
||||
|
Lang::set("ja", true); |
||||
|
$this->assertEquals("de", Lang::set("de", true)); |
||||
|
$str = Lang::dump(); |
||||
|
$this->assertArrayNotHasKey('Test.absentText', $str); |
||||
|
$this->assertEquals('und der Stein der Weisen', $str['Test.presentText']); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @depends testLoadCascade |
||||
|
*/ |
||||
|
function testLoadSubtag() { |
||||
|
$this->assertEquals("en_ca", Lang::set("en_ca", true)); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @depends testLoadSubtag |
||||
|
*/ |
||||
|
function testMessage() { |
||||
|
Lang::set("de", true); |
||||
|
$this->assertEquals('und der Stein der Weisen', Lang::msg('Test.presentText')); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @depends testMessage |
||||
|
*/ |
||||
|
function testMessageNumMSingle() { |
||||
|
Lang::set("en_ca", true); |
||||
|
$this->assertEquals('Default language file "en" missing', Lang::msg('Exception.JKingWeb/NewsSync/Lang/Exception.defaultFileMissing', Lang::DEFAULT)); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @depends testMessage |
||||
|
*/ |
||||
|
function testMessageNumMulti() { |
||||
|
Lang::set("en_ca", true); |
||||
|
$this->assertEquals('Happy Rotter and the Philosopher\'s Stone', Lang::msg('Test.presentText', ['Happy Rotter', 'the Philosopher\'s Stone'])); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @depends testMessage |
||||
|
*/ |
||||
|
function testMessageNamed() { |
||||
|
$this->assertEquals('Message string "Test.absentText" missing from all loaded language files (en)', Lang::msg('Exception.JKingWeb/NewsSync/Lang/Exception.stringMissing', ['msgID' => 'Test.absentText', 'fileList' => 'en'])); |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue