Browse Source

Add more tests for helpers (#18675)

tags/2.0.43
Bizley 3 years ago committed by GitHub
parent
commit
4cb2dfef1a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      framework/helpers/BaseFormatConverter.php
  2. 9
      phpunit.xml.dist
  3. 311
      tests/framework/helpers/ArrayHelperTest.php
  4. 6
      tests/framework/helpers/BaseConsoleTest.php
  5. 432
      tests/framework/helpers/FormatConverterTest.php
  6. 1031
      tests/framework/helpers/MimeTest.php
  7. 33
      tests/framework/helpers/ReplaceArrayValueTest.php
  8. 24
      tests/framework/helpers/UnsetArrayValueTest.php
  9. 13
      tests/framework/helpers/UrlTest.php

2
framework/helpers/BaseFormatConverter.php

@ -335,7 +335,7 @@ class BaseFormatConverter
'\\\\' => '\\',
]);
// remove `''` - the're result of consecutive escaped chars (`\A\B` will be `'A''B'`, but should be `'AB'`)
// remove `''` - they're result of consecutive escaped chars (`\A\B` will be `'A''B'`, but should be `'AB'`)
// real `'` are encoded as `''''`
return strtr($result, [
"''''" => "''",

9
phpunit.xml.dist

@ -17,16 +17,9 @@
<directory suffix=".php">framework/</directory>
</whitelist>
<blacklist>
<file>framework/helpers/Json.php</file>
<file>framework/helpers/StringHelper.php</file>
<file>framework/helpers/VarDumper.php</file>
<file>framework/helpers/Html.php</file>
<file>framework/helpers/Inflector.php</file>
<file>framework/helpers/FileHelper.php</file>
<file>framework/helpers/ArrayHelper.php</file>
<file>framework/helpers/Console.php</file>
<file>framework/i18n/GettextFile.php</file>
<file>framework/web/ResponseFormatterInterface.php</file>
<file>framework/.phpstorm.meta.php</file>
<directory suffix="Exception.php">framework/base</directory>
<directory suffix=".php">framework/db/mssql</directory>
<directory suffix=".php">framework/bootstrap</directory>

311
tests/framework/helpers/ArrayHelperTest.php

@ -15,131 +15,6 @@ use yii\data\Sort;
use yii\helpers\ArrayHelper;
use yiiunit\TestCase;
class Post1
{
public $id = 23;
public $title = 'tt';
}
class Post2 extends BaseObject
{
public $id = 123;
public $content = 'test';
private $secret = 's';
public function getSecret()
{
return $this->secret;
}
}
class Post3 extends BaseObject
{
public $id = 33;
/** @var BaseObject */
public $subObject;
public function init()
{
$this->subObject = new Post2();
}
}
class ArrayAccessibleObject implements ArrayAccess
{
public $name = 'bar1';
protected $container = [];
public function __construct($container)
{
$this->container = $container;
}
public function offsetSet($offset, $value)
{
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetExists($offset)
{
return array_key_exists($offset, $this->container);
}
public function offsetUnset($offset)
{
unset($this->container[$offset]);
}
public function offsetGet($offset)
{
return $this->offsetExists($offset) ? $this->container[$offset] : null;
}
}
class TraversableArrayAccessibleObject extends ArrayAccessibleObject implements Iterator
{
private $position = 0;
public function __construct($container)
{
$this->position = 0;
parent::__construct($container);
}
protected function getContainerKey($keyIndex)
{
$keys = array_keys($this->container);
return array_key_exists($keyIndex, $keys) ? $keys[$keyIndex] : false;
}
public function rewind()
{
$this->position = 0;
}
public function current()
{
return $this->offsetGet($this->getContainerKey($this->position));
}
public function key()
{
return $this->getContainerKey($this->position);
}
public function next()
{
++$this->position;
}
public function valid()
{
$key = $this->getContainerKey($this->position);
return !(!$key || !$this->offsetExists($key));
}
}
class MagicModel extends Model
{
protected $magic;
public function getMagic()
{
return 42;
}
private $moreMagic;
public function getMoreMagic()
{
return 'ta-da';
}
}
/**
* @group helpers
*/
@ -181,7 +56,7 @@ class ArrayHelperTest extends TestCase
'_content' => 'test',
'length' => 4,
], ArrayHelper::toArray($object, [
$object->className() => [
$object::className() => [
'id', 'secret',
'_content' => 'content',
'length' => function ($post) {
@ -200,7 +75,8 @@ class ArrayHelperTest extends TestCase
],
], ArrayHelper::toArray($object));
//recursive with attributes of object and subobject
//recursive with attributes of object and sub-object
$subObject = $object->subObject;
$this->assertEquals([
'id' => 33,
'id_plus_1' => 34,
@ -209,13 +85,13 @@ class ArrayHelperTest extends TestCase
'id_plus_1' => 124,
],
], ArrayHelper::toArray($object, [
$object->className() => [
$object::className() => [
'id', 'subObject',
'id_plus_1' => function ($post) {
return $post->id + 1;
},
],
$object->subObject->className() => [
$subObject::className() => [
'id',
'id_plus_1' => function ($post) {
return $post->id + 1;
@ -231,7 +107,7 @@ class ArrayHelperTest extends TestCase
'id_plus_1' => 124,
],
], ArrayHelper::toArray($object, [
$object->subObject->className() => [
$subObject::className() => [
'id',
'id_plus_1' => function ($post) {
return $post->id + 1;
@ -442,20 +318,16 @@ class ArrayHelperTest extends TestCase
], $changelog);
}
/**
* @expectedException \yii\base\InvalidParamException
*/
public function testMultisortInvalidParamExceptionDirection()
{
$this->expectException('yii\base\InvalidParamException');
$data = ['foo' => 'bar'];
ArrayHelper::multisort($data, ['foo'], []);
}
/**
* @expectedException \yii\base\InvalidParamException
*/
public function testMultisortInvalidParamExceptionSortFlag()
{
$this->expectException('yii\base\InvalidParamException');
$data = ['foo' => 'bar'];
ArrayHelper::multisort($data, ['foo'], ['foo'], []);
}
@ -857,12 +729,10 @@ class ArrayHelperTest extends TestCase
$this->assertFalse(ArrayHelper::keyExists('c', $array));
}
/**
* @expectedException \yii\base\InvalidArgumentException
* @expectedExceptionMessage Second parameter($array) cannot be ArrayAccess in case insensitive mode
*/
public function testKeyExistsArrayAccessCaseInsensitiveThrowsError()
{
$this->expectException('yii\base\InvalidArgumentException');
$this->expectExceptionMessage('Second parameter($array) cannot be ArrayAccess in case insensitive mode');
$array = new TraversableArrayAccessibleObject([
'a' => 1,
'B' => 2,
@ -945,26 +815,21 @@ class ArrayHelperTest extends TestCase
$this->assertEquals(23, ArrayHelper::getValue($object, 'id'));
}
/**
* This is expected to result in a PHP error.
* @requires PHPUnit 6.0
*/
public function testGetValueNonexistingProperties1()
{
$this->expectException('PHPUnit\Framework\Error\Notice');
if (PHP_VERSION_ID < 80000) {
$this->expectException('PHPUnit_Framework_Error_Notice');
} else {
$this->expectException('PHPUnit_Framework_Error_Warning');
}
$object = new Post1();
$this->assertNull(ArrayHelper::getValue($object, 'nonExisting'));
ArrayHelper::getValue($object, 'nonExisting');
}
/**
* This is expected to result in a PHP error.
* @requires PHPUnit 6.0
*/
public function testGetValueNonexistingProperties2()
public function testGetValueNonexistingPropertiesForArrayObject()
{
$this->expectException('PHPUnit\Framework\Error\Notice');
$arrayObject = new \ArrayObject(['id' => 23], \ArrayObject::ARRAY_AS_PROPS);
$this->assertEquals(23, ArrayHelper::getValue($arrayObject, 'nonExisting'));
$this->assertNull(ArrayHelper::getValue($arrayObject, 'nonExisting'));
}
public function testGetValueFromArrayAccess()
@ -1364,12 +1229,10 @@ class ArrayHelperTest extends TestCase
$this->assertFalse(ArrayHelper::isIn('1', [1, 'a'], true));
}
/**
* @expectedException \yii\base\InvalidParamException
* @expectedExceptionMessage Argument $haystack must be an array or implement Traversable
*/
public function testInException()
{
$this->expectException('yii\base\InvalidParamException');
$this->expectExceptionMessage('Argument $haystack must be an array or implement Traversable');
ArrayHelper::isIn('value', null);
}
@ -1385,12 +1248,10 @@ class ArrayHelperTest extends TestCase
$this->assertFalse(ArrayHelper::isSubset(new \ArrayObject([1]), ['1', 'b'], true));
}
/**
* @expectedException \yii\base\InvalidParamException
* @expectedExceptionMessage Argument $needles must be an array or implement Traversable
*/
public function testIsSubsetException()
{
$this->expectException('yii\base\InvalidParamException');
$this->expectExceptionMessage('Argument $needles must be an array or implement Traversable');
ArrayHelper::isSubset('a', new \ArrayObject(['a', 'b']));
}
@ -1504,6 +1365,9 @@ class ArrayHelperTest extends TestCase
'C' => 2,
],
], ArrayHelper::filter($array, ['A', '!A.D']));
$this->assertEquals([
'G' => 1
], ArrayHelper::filter($array, ['G', '!Z', '!X.A']));
//Non existing keys tests
$this->assertEquals([], ArrayHelper::filter($array, ['X']));
@ -1566,3 +1430,128 @@ class ArrayHelperTest extends TestCase
$this->assertEquals('ta-da', ArrayHelper::getValue($model, 'moreMagic'));
}
}
class Post1
{
public $id = 23;
public $title = 'tt';
}
class Post2 extends BaseObject
{
public $id = 123;
public $content = 'test';
private $secret = 's';
public function getSecret()
{
return $this->secret;
}
}
class Post3 extends BaseObject
{
public $id = 33;
/** @var BaseObject */
public $subObject;
public function init()
{
$this->subObject = new Post2();
}
}
class ArrayAccessibleObject implements ArrayAccess
{
public $name = 'bar1';
protected $container = [];
public function __construct($container)
{
$this->container = $container;
}
public function offsetSet($offset, $value)
{
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetExists($offset)
{
return array_key_exists($offset, $this->container);
}
public function offsetUnset($offset)
{
unset($this->container[$offset]);
}
public function offsetGet($offset)
{
return $this->offsetExists($offset) ? $this->container[$offset] : null;
}
}
class TraversableArrayAccessibleObject extends ArrayAccessibleObject implements Iterator
{
private $position = 0;
public function __construct($container)
{
$this->position = 0;
parent::__construct($container);
}
protected function getContainerKey($keyIndex)
{
$keys = array_keys($this->container);
return array_key_exists($keyIndex, $keys) ? $keys[$keyIndex] : false;
}
public function rewind()
{
$this->position = 0;
}
public function current()
{
return $this->offsetGet($this->getContainerKey($this->position));
}
public function key()
{
return $this->getContainerKey($this->position);
}
public function next()
{
++$this->position;
}
public function valid()
{
$key = $this->getContainerKey($this->position);
return !(!$key || !$this->offsetExists($key));
}
}
class MagicModel extends Model
{
protected $magic;
public function getMagic()
{
return 42;
}
private $moreMagic;
public function getMoreMagic()
{
return 'ta-da';
}
}

6
tests/framework/helpers/BaseConsoleTest.php

@ -80,4 +80,10 @@ class BaseConsoleTest extends TestCase
['Foo%yBar%nYes', 5, 3, '%yr%nYe'],
];
}
public function testAnsiStrlen()
{
$this->assertSame(3, BaseConsole::ansiStrlen('Foo'));
$this->assertSame(3, BaseConsole::ansiStrlen(BaseConsole::renderColoredString('Bar%y')));
}
}

432
tests/framework/helpers/FormatConverterTest.php

@ -43,18 +43,297 @@ class FormatConverterTest extends TestCase
$this->assertEquals('d.m.y', FormatConverter::convertDateIcuToPhp('short', 'date', 'de-DE'));
}
public function testEscapedIcuToPhp()
public function testIntlIcuToPhpShortFormDefaultLang()
{
Yii::$app->language = 'en';
$this->assertEquals('n/j/y', FormatConverter::convertDateIcuToPhp('short', 'date'));
Yii::$app->language = 'de';
$this->assertEquals('d.m.y', FormatConverter::convertDateIcuToPhp('short', 'date'));
}
public function testIntlIcuToPhpShortFormTime()
{
$this->assertEquals('g:i A', FormatConverter::convertDateIcuToPhp('short', 'time', 'en-US'));
$this->assertEquals('H:i', FormatConverter::convertDateIcuToPhp('short', 'time', 'de-DE'));
}
public function testIntlIcuToPhpShortFormDateTime()
{
$this->assertEquals('n/j/y, g:i A', FormatConverter::convertDateIcuToPhp('short', 'datetime', 'en-US'));
$this->assertEquals(
PHP_VERSION_ID < 50600 ? 'd.m.y H:i' : 'd.m.y, H:i',
FormatConverter::convertDateIcuToPhp('short', 'datetime', 'de-DE')
);
}
public function testEscapedIcuToPhpMixedPatterns()
{
$this->assertEquals('l, F j, Y \\a\\t g:i:s A T', FormatConverter::convertDateIcuToPhp('EEEE, MMMM d, y \'at\' h:mm:ss a zzzz'));
$this->assertEquals('\\o\\\'\\c\\l\\o\\c\\k', FormatConverter::convertDateIcuToPhp('\'o\'\'clock\''));
}
public function providerForICU2PHPPatterns()
{
return [
'two single quotes produce one' => ["''", "\\'"],
'era designator like (Anno Domini)' => ['G', ''],
'4digit year of "Week of Year"' => ['Y', 'o'],
'4digit year #1' => ['y', 'Y'],
'4digit year #2' => ['yyyy', 'Y'],
'2digit year number' => ['yy', 'y'],
'extended year e.g. 4601' => ['u', ''],
'cyclic year name, as in Chinese lunar calendar' => ['U', ''],
'related Gregorian year e.g. 1996' => ['r', ''],
'number of quarter' => ['Q', ''],
'number of quarter "02"' => ['QQ', ''],
'quarter "Q2"' => ['QQQ', ''],
'quarter 2nd quarter' => ['QQQQ', ''],
'number of quarter 2' => ['QQQQQ', ''],
'number of Stand Alone quarter' => ['q', ''],
'number of Stand Alone quarter "02"' => ['qq', ''],
'Stand Alone quarter "Q2"' => ['qqq', ''],
'Stand Alone quarter "2nd quarter"' => ['qqqq', ''],
'number of Stand Alone quarter "2"' => ['qqqqq', ''],
'Numeric representation of a month, without leading zeros' => ['M', 'n'],
'Numeric representation of a month, with leading zeros' => ['MM', 'm'],
'A short textual representation of a month, three letters' => ['MMM', 'M'],
'A full textual representation of a month, such as January or March' => ['MMMM', 'F'],
'MMMMM' => ['MMMMM', ''],
'Stand alone month in year #1' => ['L', 'n'],
'Stand alone month in year #2' => ['LL', 'm'],
'Stand alone month in year #3' => ['LLL', 'M'],
'Stand alone month in year #4' => ['LLLL', 'F'],
'Stand alone month in year #5' => ['LLLLL', ''],
'ISO-8601 week number of year #1' => ['w', 'W'],
'ISO-8601 week number of year #2' => ['ww', 'W'],
'week of the current month' => ['W', ''],
'day without leading zeros' => ['d', 'j'],
'day with leading zeros' => ['dd', 'd'],
'day of the year 0 to 365' => ['D', 'z'],
'Day of Week in Month. eg. 2nd Wednesday in July' => ['F', ''],
'Modified Julian day. This is different from the conventional Julian day number in two regards.' => ['g', ''],
'day of week written in short form eg. Sun' => ['E', 'D'],
'EE' => ['EE', 'D'],
'EEE' => ['EEE', 'D'],
'day of week fully written eg. Sunday' => ['EEEE', 'l'],
'EEEEE' => ['EEEEE', ''],
'EEEEEE' => ['EEEEEE', ''],
'ISO-8601 numeric representation of the day of the week 1=Mon to 7=Sun #1' => ['e', 'N'],
'php "w" 0=Sun to 6=Sat isn`t supported by ICU -> "w" means week number of year #1' => ['ee', 'N'],
'eee' => ['eee', 'D'],
'eeee' => ['eeee', 'l'],
'eeeee' => ['eeeee', ''],
'eeeeee' => ['eeeeee', ''],
'ISO-8601 numeric representation of the day of the week 1=Mon to 7=Sun #2' => ['c', 'N'],
'php "w" 0=Sun to 6=Sat isn`t supported by ICU -> "w" means week number of year #2' => ['cc', 'N'],
'ccc' => ['ccc', 'D'],
'cccc' => ['cccc', 'l'],
'ccccc' => ['ccccc', ''],
'cccccc' => ['cccccc', ''],
'AM/PM marker' => ['a', 'A'],
'12-hour format of an hour without leading zeros 1 to 12h' => ['h', 'g'],
'12-hour format of an hour with leading zeros, 01 to 12 h' => ['hh', 'h'],
'24-hour format of an hour without leading zeros 0 to 23h' => ['H', 'G'],
'24-hour format of an hour with leading zeros, 00 to 23 h' => ['HH', 'H'],
'hour in day (1~24) #1' => ['k', ''],
'hour in day (1~24) #2' => ['kk', ''],
'hour in am/pm (0~11) #1' => ['K', ''],
'hour in am/pm (0~11) #2' => ['KK', ''],
'Minutes without leading zeros, not supported by php but we fallback' => ['m', 'i'],
'Minutes with leading zeros' => ['mm', 'i'],
'Seconds, without leading zeros, not supported by php but we fallback' => ['s', 's'],
'Seconds, with leading zeros' => ['ss', 's'],
'fractional second #1' => ['S', ''],
'fractional second #2' => ['SS', ''],
'fractional second #3' => ['SSS', ''],
'fractional second #4' => ['SSSS', ''],
'milliseconds in day' => ['A', ''],
'Timezone abbreviation #1' => ['z', 'T'],
'Timezone abbreviation #2' => ['zz', 'T'],
'Timezone abbreviation #3' => ['zzz', 'T'],
'Timezone full name, not supported by php but we fallback' => ['zzzz', 'T'],
'Difference to Greenwich time (GMT) in hours #1' => ['Z', 'O'],
'Difference to Greenwich time (GMT) in hours #2' => ['ZZ', 'O'],
'Difference to Greenwich time (GMT) in hours #3' => ['ZZZ', 'O'],
'Time Zone: long localized GMT (=OOOO) e.g. GMT-08:00' => ['ZZZZ', '\G\M\TP'],
'TIme Zone: ISO8601 extended hms? (=XXXXX)' => ['ZZZZZ', ''],
'Time Zone: short localized GMT e.g. GMT-8' => ['O', ''],
'Time Zone: long localized GMT (=ZZZZ) e.g. GMT-08:00' => ['OOOO', '\G\M\TP'],
'Time Zone: generic non-location (falls back first to VVVV and then to OOOO) using the ICU defined fallback here #1' => ['v', '\G\M\TP'],
'Time Zone: generic non-location (falls back first to VVVV and then to OOOO) using the ICU defined fallback here #2' => ['vvvv', '\G\M\TP'],
'Time Zone: short time zone ID' => ['V', ''],
'Time Zone: long time zone ID' => ['VV', 'e'],
'Time Zone: time zone exemplar city' => ['VVV', ''],
'Time Zone: generic location (falls back to OOOO) using the ICU defined fallback here' => ['VVVV', '\G\M\TP'],
'Time Zone: ISO8601 basic hm?, with Z for 0, e.g. -08, +0530, Z' => ['X', ''],
'Time Zone: ISO8601 basic hm, with Z, e.g. -0800, Z' => ['XX', 'O, \Z'],
'Time Zone: ISO8601 extended hm, with Z, e.g. -08:00, Z' => ['XXX', 'P, \Z'],
'Time Zone: ISO8601 basic hms?, with Z, e.g. -0800, -075258, Z' => ['XXXX', ''],
'Time Zone: ISO8601 extended hms?, with Z, e.g. -08:00, -07:52:58, Z' => ['XXXXX', ''],
'Time Zone: ISO8601 basic hm?, without Z for 0, e.g. -08, +0530' => ['x', ''],
'Time Zone: ISO8601 basic hm, without Z, e.g. -0800' => ['xx', 'O'],
'Time Zone: ISO8601 extended hm, without Z, e.g. -08:00' => ['xxx', 'P'],
'Time Zone: ISO8601 basic hms?, without Z, e.g. -0800, -075258' => ['xxxx', ''],
'Time Zone: ISO8601 extended hms?, without Z, e.g. -08:00, -07:52:58' => ['xxxxx', ''],
];
}
/**
* @dataProvider providerForICU2PHPPatterns
*/
public function testEscapedIcuToPhpSinglePattern($pattern, $expected)
{
$this->assertEquals($expected, FormatConverter::convertDateIcuToPhp($pattern));
}
public function testEscapedIcuToJui()
{
$this->assertEquals('l, F j, Y \\a\\t g:i:s A T', FormatConverter::convertDateIcuToPhp('EEEE, MMMM d, y \'at\' h:mm:ss a zzzz'));
$this->assertEquals('DD, MM d, yy \'at\' ', FormatConverter::convertDateIcuToJui('EEEE, MMMM d, y \'at\' zzzz'));
$this->assertEquals('\'o\'\'clock\'', FormatConverter::convertDateIcuToJui('\'o\'\'clock\''));
}
public function testIntlIcuToJuiShortForm()
{
$this->assertEquals('m/d/y', FormatConverter::convertDateIcuToJui('short', 'date', 'en-US'));
$this->assertEquals('dd.mm.y', FormatConverter::convertDateIcuToJui('short', 'date', 'de-DE'));
}
public function testIntlIcuToJuiShortFormDefaultLang()
{
Yii::$app->language = 'en';
$this->assertEquals('m/d/y', FormatConverter::convertDateIcuToJui('short', 'date'));
Yii::$app->language = 'de';
$this->assertEquals('dd.mm.y', FormatConverter::convertDateIcuToJui('short', 'date'));
}
public function testIntlIcuToJuiShortFormTime()
{
$this->assertEquals(': ', FormatConverter::convertDateIcuToJui('short', 'time', 'en-US'));
$this->assertEquals(':', FormatConverter::convertDateIcuToJui('short', 'time', 'de-DE'));
}
public function testIntlIcuToJuiShortFormDateTime()
{
$this->assertEquals('m/d/y, : ', FormatConverter::convertDateIcuToJui('short', 'datetime', 'en-US'));
$this->assertEquals(
PHP_VERSION_ID < 50600 ? 'dd.mm.y :' : 'dd.mm.y, :',
FormatConverter::convertDateIcuToJui('short', 'datetime', 'de-DE')
);
}
public function providerForICU2JUIPatterns()
{
return [
'era designator like (Anno Domini)' => ['G', ''],
'4digit year of "Week of Year"' => ['Y', ''],
'4digit year e.g. 2014 #1' => ['y', 'yy'],
'4digit year e.g. 2014 #2' => ['yyyy', 'yy'],
'2digit year number eg. 14' => ['yy', 'y'],
'extended year e.g. 4601' => ['u', ''],
'cyclic year name, as in Chinese lunar calendar' => ['U', ''],
'related Gregorian year e.g. 1996' => ['r', ''],
'number of quarter' => ['Q', ''],
'number of quarter "02"' => ['QQ', ''],
'quarter "Q2"' => ['QQQ', ''],
'quarter "2nd quarter"' => ['QQQQ', ''],
'number of quarter "2"' => ['QQQQQ', ''],
'number of Stand Alone quarter' => ['q', ''],
'number of Stand Alone quarter "02"' => ['qq', ''],
'Stand Alone quarter "Q2"' => ['qqq', ''],
'Stand Alone quarter "2nd quarter"' => ['qqqq', ''],
'number of Stand Alone quarter "2"' => ['qqqqq', ''],
'Numeric representation of a month, without leading zeros' => ['M', 'm'],
'Numeric representation of a month, with leading zeros' => ['MM', 'mm'],
'A short textual representation of a month, three letters' => ['MMM', 'M'],
'A full textual representation of a month, such as January or March' => ['MMMM', 'MM'],
'MMMMM' => ['MMMMM', ''],
'Stand alone month in year #1' => ['L', 'm'],
'Stand alone month in year #2' => ['LL', 'mm'],
'Stand alone month in year #3' => ['LLL', 'M'],
'Stand alone month in year #4' => ['LLLL', 'MM'],
'Stand alone month in year #5' => ['LLLLL', ''],
'ISO-8601 week number of year #1' => ['w', ''],
'ISO-8601 week number of year #2' => ['ww', ''],
'week of the current month' => ['W', ''],
'day without leading zeros' => ['d', 'd'],
'day with leading zeros' => ['dd', 'dd'],
'day of the year 0 to 365' => ['D', 'o'],
'Day of Week in Month. eg. 2nd Wednesday in July' => ['F', ''],
'Modified Julian day. This is different from the conventional Julian day number in two regards.' => ['g', ''],
'day of week written in short form eg. Sun' => ['E', 'D'],
'EE' => ['EE', 'D'],
'EEE' => ['EEE', 'D'],
'day of week fully written eg. Sunday' => ['EEEE', 'DD'],
'EEEEE' => ['EEEEE', ''],
'EEEEEE' => ['EEEEEE', ''],
'ISO-8601 numeric representation of the day of the week 1=Mon to 7=Sun #1' => ['e', ''],
'php "w" 0=Sun to 6=Sat isn`t supported by ICU -> "w" means week number of year #1' => ['ee', ''],
'eee' => ['eee', 'D'],
'eeee' => ['eeee', ''],
'eeeee' => ['eeeee', ''],
'eeeeee' => ['eeeeee', ''],
'ISO-8601 numeric representation of the day of the week 1=Mon to 7=Sun #2' => ['c', ''],
'php "w" 0=Sun to 6=Sat isn`t supported by ICU -> "w" means week number of year #2' => ['cc', ''],
'ccc' => ['ccc', 'D'],
'cccc' => ['cccc', 'DD'],
'ccccc' => ['ccccc', ''],
'cccccc' => ['cccccc', ''],
'am/pm marker' => ['a', ''],
'12-hour format of an hour without leading zeros 1 to 12h' => ['h', ''],
'12-hour format of an hour with leading zeros, 01 to 12 h' => ['hh', ''],
'24-hour format of an hour without leading zeros 0 to 23h' => ['H', ''],
'24-hour format of an hour with leading zeros, 00 to 23 h' => ['HH', ''],
'hour in day (1~24) #1' => ['k', ''],
'hour in day (1~24) #2' => ['kk', ''],
'hour in am/pm (0~11) #1' => ['K', ''],
'hour in am/pm (0~11) #2' => ['KK', ''],
'Minutes without leading zeros, not supported by php but we fallback' => ['m', ''],
'Minutes with leading zeros' => ['mm', ''],
'Seconds, without leading zeros, not supported by php but we fallback' => ['s', ''],
'Seconds, with leading zeros' => ['ss', ''],
'fractional second #1' => ['S', ''],
'fractional second #2' => ['SS', ''],
'fractional second #3' => ['SSS', ''],
'fractional second #4' => ['SSSS', ''],
'milliseconds in day' => ['A', ''],
'Timezone abbreviation #1' => ['z', ''],
'Timezone abbreviation #2' => ['zz', ''],
'Timezone abbreviation #3' => ['zzz', ''],
'Timezone full name, not supported by php but we fallback' => ['zzzz', ''],
'Difference to Greenwich time (GMT) in hours #1' => ['Z', ''],
'Difference to Greenwich time (GMT) in hours #2' => ['ZZ', ''],
'Difference to Greenwich time (GMT) in hours #3' => ['ZZZ', ''],
'Time Zone: long localized GMT (=OOOO) e.g. GMT-08:00' => ['ZZZZ', ''],
'Time Zone: ISO8601 extended hms? (=XXXXX)' => ['ZZZZZ', ''],
'Time Zone: short localized GMT e.g. GMT-8' => ['O', ''],
'Time Zone: long localized GMT (=ZZZZ) e.g. GMT-08:00' => ['OOOO', ''],
'Time Zone: generic non-location (falls back first to VVVV and then to OOOO) using the ICU defined fallback here #1' => ['v', ''],
'Time Zone: generic non-location (falls back first to VVVV and then to OOOO) using the ICU defined fallback here #2' => ['vvvv', ''],
'Time Zone: short time zone ID' => ['V', ''],
'Time Zone: long time zone ID' => ['VV', ''],
'Time Zone: time zone exemplar city' => ['VVV', ''],
'Time Zone: generic location (falls back to OOOO) using the ICU defined fallback here' => ['VVVV', ''],
'Time Zone: ISO8601 basic hm?, with Z for 0, e.g. -08, +0530, Z' => ['X', ''],
'Time Zone: ISO8601 basic hm, with Z, e.g. -0800, Z' => ['XX', ''],
'Time Zone: ISO8601 extended hm, with Z, e.g. -08:00, Z' => ['XXX', ''],
'Time Zone: ISO8601 basic hms?, with Z, e.g. -0800, -075258, Z' => ['XXXX', ''],
'Time Zone: ISO8601 extended hms?, with Z, e.g. -08:00, -07:52:58, Z' => ['XXXXX', ''],
'Time Zone: ISO8601 basic hm?, without Z for 0, e.g. -08, +0530' => ['x', ''],
'Time Zone: ISO8601 basic hm, without Z, e.g. -0800' => ['xx', ''],
'Time Zone: ISO8601 extended hm, without Z, e.g. -08:00' => ['xxx', ''],
'Time Zone: ISO8601 basic hms?, without Z, e.g. -0800, -075258' => ['xxxx', ''],
'Time Zone: ISO8601 extended hms?, without Z, e.g. -08:00, -07:52:58' => ['xxxxx', ''],
];
}
/**
* @dataProvider providerForICU2JUIPatterns
*/
public function testEscapedIcuToJuiSinglePattern($pattern, $expected)
{
$this->assertEquals($expected, FormatConverter::convertDateIcuToJui($pattern));
}
public function testIntlOneDigitIcu()
{
$formatter = new Formatter(['locale' => 'en-US']);
@ -82,7 +361,7 @@ class FormatConverterTest extends TestCase
$this->assertRegExp('/24 авг\.? 2014 г\./', $formatter->asDate('2014-8-24', "dd MMM y 'г'."));
}
public function testPhpToICU()
public function testPhpToICUMixedPatterns()
{
$expected = "yyyy-MM-dd'T'HH:mm:ssxxx";
$actual = FormatConverter::convertDatePhpToIcu('Y-m-d\TH:i:sP');
@ -109,6 +388,97 @@ class FormatConverterTest extends TestCase
$this->assertEquals($expected, $actual);
}
public function providerForPHP2ICUPatterns()
{
return [
'single \' should be encoded as \'\', which internally should be encoded as \'\'\'\'' => ["'", "''"],
'\d' => ['\d', "'d'"],
'Day of the month, 2 digits with leading zeros 01 to 31' => ['d', 'dd'],
'\D' => ['\D', "'D'"],
'A textual representation of a day, three letters Mon through Sun' => ['D', 'eee'],
'\j' => ['\j', "'j'"],
'Day of the month without leading zeros 1 to 31' => ['j', 'd'],
'\l' => ['\l', "'l'"],
'A full textual representation of the day of the week Sunday through Saturday' => ['l', 'eeee'],
'\N' => ['\N', "'N'"],
'ISO-8601 numeric representation of the day of the week, 1 (for Monday) through 7 (for Sunday)' => ['N', 'e'],
'\S' => ['\S', "'S'"],
'English ordinal suffix for the day of the month, 2 characters st, nd, rd or th. Works well with j' => ['S', ''],
'\w' => ['\w', "'w'"],
'Numeric representation of the day of the week 0 (for Sunday) through 6 (for Saturday)' => ['w', ''],
'\z' => ['\z', "'z'"],
'The day of the year (starting from 0) 0 through 365' => ['z', 'D'],
'\W' => ['\W', "'W'"],
'ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) Example: 42 (the 42nd week in the year)' => ['W', 'w'],
'\F' => ['\F', "'F'"],
'A full textual representation of a month, January through December' => ['F', 'MMMM'],
'\m' => ['\m', "'m'"],
'Numeric representation of a month, with leading zeros 01 through 12' => ['m', 'MM'],
'\M' => ['\M', "'M'"],
'A short textual representation of a month, three letters Jan through Dec' => ['M', 'MMM'],
'\n' => ['\n', "'n'"],
'Numeric representation of a month, without leading zeros 1 through 12, not supported by ICU but we fallback to "with leading zero"' => ['n', 'M'],
'\t' => ['\t', "'t'"],
'Number of days in the given month 28 through 31' => ['t', ''],
'\L' => ['\L', "'L'"],
'Whether it`s a leap year, 1 if it is a leap year, 0 otherwise.' => ['L', ''],
'\o' => ['\o', "'o'"],
'ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead.' => ['o', 'Y'],
'\Y' => ['\Y', "'Y'"],
'A full numeric representation of a year, 4 digits Examples: 1999 or 2003' => ['Y', 'yyyy'],
'\y' => ['\y', "'y'"],
'A two digit representation of a year Examples: 99 or 03' => ['y', 'yy'],
'\a' => ['\a', "'a'"],
'Lowercase Ante meridiem and Post meridiem, am or pm' => ['a', 'a'],
'\A' => ['\A', "'A'"],
'Uppercase Ante meridiem and Post meridiem, AM or PM, not supported by ICU but we fallback to lowercase' => ['A', 'a'],
'\B' => ['\B', "'B'"],
'\A\B' => ['\A\B', "'AB'"],
'Swatch Internet time 000 through 999' => ['B', ''],
'\g' => ['\g', "'g'"],
'12-hour format of an hour without leading zeros 1 through 12' => ['g', 'h'],
'\G' => ['\G', "'G'"],
'24-hour format of an hour without leading zeros 0 to 23h' => ['G', 'H'],
'\h' => ['\h', "'h'"],
'12-hour format of an hour with leading zeros, 01 to 12 h' => ['h', 'hh'],
'\H' => ['\H', "'H'"],
'24-hour format of an hour with leading zeros, 00 to 23 h' => ['H', 'HH'],
'\i' => ['\i', "'i'"],
'Minutes with leading zeros 00 to 59' => ['i', 'mm'],
'\s' => ['\s', "'s'"],
'Seconds, with leading zeros 00 through 59' => ['s', 'ss'],
'\u' => ['\u', "'u'"],
'Microseconds. Example: 654321' => ['u', ''],
'\e' => ['\e', "'e'"],
'Timezone identifier. Examples: UTC, GMT, Atlantic/Azores' => ['e', 'VV'],
'\I' => ['\I', "'I'"],
'Whether or not the date is in daylight saving time, 1 if Daylight Saving Time, 0 otherwise.' => ['I', ''],
'\O' => ['\O', "'O'"],
'Difference to Greenwich time (GMT) in hours, Example: +0200' => ['O', 'xx'],
'\P' => ['\P', "'P'"],
'Difference to Greenwich time (GMT) with colon between hours and minutes, Example: +02:00' => ['P', 'xxx'],
'\T' => ['\T', "'T'"],
'Timezone abbreviation, Examples: EST, MDT ...' => ['T', 'zzz'],
'\Z' => ['\Z', "'Z'"],
'Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. -43200 through 50400' => ['Z', ''],
'\c' => ['\c', "'c'"],
'ISO 8601 date, e.g. 2004-02-12T15:19:21+00:00' => ['c', "yyyy-MM-dd'T'HH:mm:ssxxx"],
'\r' => ['\r', "'r'"],
'RFC 2822 formatted date, Example: Thu, 21 Dec 2000 16:01:07 +0200' => ['r', 'eee, dd MMM yyyy HH:mm:ss xx'],
'\U' => ['\U', "'U'"],
'Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)' => ['U', ''],
'\\' => ['\\\\', '\\'],
];
}
/**
* @dataProvider providerForPHP2ICUPatterns
*/
public function testPhpToICUSinglePattern($pattern, $expected)
{
$this->assertEquals($expected, FormatConverter::convertDatePhpToIcu($pattern));
}
public function testPhpFormatC()
{
$time = time();
@ -120,4 +490,60 @@ class FormatConverterTest extends TestCase
$formatter = new Formatter(['locale' => 'ru-RU', 'timeZone' => 'Europe/Moscow']);
$this->assertEquals(date('c', $time), $formatter->asDatetime($time, 'php:c'));
}
public function testEscapedPhpToJuiMixedPatterns()
{
$this->assertEquals('dd-mm-yy', FormatConverter::convertDatePhpToJui('d-m-Y'));
}
public function providerForPHP2JUIPatterns()
{
return [
'Day of the month, 2 digits with leading zeros 01 to 31' => ['d', 'dd'],
'A textual representation of a day, three letters Mon through Sun' => ['D', 'D'],
'Day of the month without leading zeros 1 to 31' => ['j', 'd'],
'A full textual representation of the day of the week Sunday through Saturday' => ['l', 'DD'],
'ISO-8601 numeric representation of the day of the week, 1 (for Monday) through 7 (for Sunday)' => ['N', ''],
'English ordinal suffix for the day of the month, 2 characters st, nd, rd or th. Works well with j' => ['S', ''],
'Numeric representation of the day of the week 0 (for Sunday) through 6 (for Saturday)' => ['w', ''],
'The day of the year (starting from 0) 0 through 365' => ['z', 'o'],
'ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) Example: 42 (the 42nd week in the year)' => ['W', ''],
'A full textual representation of a month, January through December' => ['F', 'MM'],
'Numeric representation of a month, with leading zeros 01 through 12' => ['m', 'mm'],
'A short textual representation of a month, three letters Jan through Dec' => ['M', 'M'],
'Numeric representation of a month, without leading zeros 1 through 12' => ['n', 'm'],
'Number of days in the given month 28 through 31' => ['t', ''],
'Whether it`s a leap year, 1 if it is a leap year, 0 otherwise.' => ['L', ''],
'ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead.' => ['o', ''],
'A full numeric representation of a year, 4 digits Examples: 1999 or 2003' => ['Y', 'yy'],
'A two digit representation of a year Examples: 99 or 03' => ['y', 'y'],
'Lowercase Ante meridiem and Post meridiem, am or pm' => ['a', ''],
'Uppercase Ante meridiem and Post meridiem, AM or PM, not supported by ICU but we fallback to lowercase' => ['A', ''],
'Swatch Internet time 000 through 999' => ['B', ''],
'12-hour format of an hour without leading zeros 1 through 12' => ['g', ''],
'24-hour format of an hour without leading zeros 0 to 23h' => ['G', ''],
'12-hour format of an hour with leading zeros, 01 to 12 h' => ['h', ''],
'24-hour format of an hour with leading zeros, 00 to 23 h' => ['H', ''],
'Minutes with leading zeros 00 to 59' => ['i', ''],
'Seconds, with leading zeros 00 through 59' => ['s', ''],
'Microseconds. Example: 654321' => ['u', ''],
'Timezone identifier. Examples: UTC, GMT, Atlantic/Azores' => ['e', ''],
'Whether or not the date is in daylight saving time, 1 if Daylight Saving Time, 0 otherwise.' => ['I', ''],
'Difference to Greenwich time (GMT) in hours, Example: +0200' => ['O', ''],
'Difference to Greenwich time (GMT) with colon between hours and minutes, Example: +02:00' => ['P', ''],
'Timezone abbreviation, Examples: EST, MDT ...' => ['T', ''],
'Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. -43200 through 50400' => ['Z', ''],
'ISO 8601 date, e.g. 2004-02-12T15:19:21+00:00, skipping the time here because it is not supported' => ['c', 'yyyy-MM-dd'],
'RFC 2822 formatted date, Example: Thu, 21 Dec 2000 16:01:07 +0200, skipping the time here because it is not supported' => ['r', 'D, d M yy'],
'Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)' => ['U', '@'],
];
}
/**
* @dataProvider providerForPHP2JUIPatterns
*/
public function testEscapedPhpToJuiSinglePattern($pattern, $expected)
{
$this->assertEquals($expected, FormatConverter::convertDatePhpToJui($pattern));
}
}

1031
tests/framework/helpers/MimeTest.php

File diff suppressed because it is too large Load Diff

33
tests/framework/helpers/ReplaceArrayValueTest.php

@ -0,0 +1,33 @@
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yiiunit\framework\helpers;
use yii\helpers\ReplaceArrayValue;
use yiiunit\TestCase;
/**
* @group helpers
*/
class ReplaceArrayValueTest extends TestCase
{
public function testSetStateWithoutValue()
{
$this->expectException('yii\base\InvalidConfigException');
$this->expectExceptionMessage('Failed to instantiate class "ReplaceArrayValue". Required parameter "value" is missing');
$object = new ReplaceArrayValue('test');
$object::__set_state([]);
}
public function testSetStateWithValue()
{
$object = new ReplaceArrayValue('test');
$result = $object::__set_state(['value' => 'test2']);
$this->assertInstanceOf('yii\helpers\ReplaceArrayValue', $result);
$this->assertSame('test2', $result->value);
}
}

24
tests/framework/helpers/UnsetArrayValueTest.php

@ -0,0 +1,24 @@
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yiiunit\framework\helpers;
use yii\helpers\UnsetArrayValue;
use yiiunit\TestCase;
/**
* @group helpers
*/
class UnsetArrayValueTest extends TestCase
{
public function testSetState()
{
$object = new UnsetArrayValue();
$result = $object::__set_state([]);
$this->assertInstanceOf('yii\helpers\UnsetArrayValue', $result);
}
}

13
tests/framework/helpers/UrlTest.php

@ -303,4 +303,17 @@ class UrlTest extends TestCase
$this->assertFalse(Url::isRelative('http://example.com/'));
$this->assertFalse(Url::isRelative('https://example.com/'));
}
public function testRemember()
{
Yii::$app->getUser()->login(UserIdentity::findIdentity('user1'));
Url::remember('test');
$this->assertSame('test', Yii::$app->getUser()->getReturnUrl());
$this->assertSame('test', Yii::$app->getSession()->get(Yii::$app->getUser()->returnUrlParam));
Yii::$app->getUser()->setReturnUrl(null);
Url::remember('test', 'remember-test');
$this->assertSame('test', Yii::$app->getSession()->get('remember-test'));
}
}

Loading…
Cancel
Save