You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

382 lines
8.9 KiB

<?php
namespace yiiunit\framework\helpers;
use yii\base\Object;
use yii\helpers\ArrayHelper;
use yiiunit\TestCase;
12 years ago
use yii\data\Sort;
class Post1
{
public $id = 23;
public $title = 'tt';
}
class Post2 extends Object
{
public $id = 123;
public $content = 'test';
private $secret = 's';
public function getSecret()
{
return $this->secret;
}
}
class Post3 extends Object
{
public $id = 33;
public $subObject;
public function init()
{
$this->subObject = new Post2();
}
}
/**
* @group helpers
*/
class ArrayHelperTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
public function testToArray()
{
$object = new Post1;
$this->assertEquals(get_object_vars($object), ArrayHelper::toArray($object));
$object = new Post2;
$this->assertEquals(get_object_vars($object), ArrayHelper::toArray($object));
$object1 = new Post1;
$object2 = new Post2;
$this->assertEquals([
get_object_vars($object1),
get_object_vars($object2),
], ArrayHelper::toArray([
$object1,
$object2,
]));
$object = new Post2;
$this->assertEquals([
'id' => 123,
'secret' => 's',
'_content' => 'test',
'length' => 4,
], ArrayHelper::toArray($object, [
$object->className() => [
'id', 'secret',
'_content' => 'content',
'length' => function ($post) {
return strlen($post->content);
}
]
]));
$object = new Post3();
$this->assertEquals(get_object_vars($object), ArrayHelper::toArray($object, [], false));
$this->assertEquals([
'id' => 33,
'subObject' => [
'id' => 123,
'content' => 'test',
],
], ArrayHelper::toArray($object));
}
public function testRemove()
{
$array = ['name' => 'b', 'age' => 3];
$name = ArrayHelper::remove($array, 'name');
$this->assertEquals($name, 'b');
$this->assertEquals($array, ['age' => 3]);
$default = ArrayHelper::remove($array, 'nonExisting', 'defaultValue');
$this->assertEquals('defaultValue', $default);
}
public function testMultisort()
{
// single key
$array = [
['name' => 'b', 'age' => 3],
['name' => 'a', 'age' => 1],
['name' => 'c', 'age' => 2],
];
ArrayHelper::multisort($array, 'name');
$this->assertEquals(['name' => 'a', 'age' => 1], $array[0]);
$this->assertEquals(['name' => 'b', 'age' => 3], $array[1]);
$this->assertEquals(['name' => 'c', 'age' => 2], $array[2]);
// multiple keys
$array = [
['name' => 'b', 'age' => 3],
['name' => 'a', 'age' => 2],
['name' => 'a', 'age' => 1],
];
ArrayHelper::multisort($array, ['name', 'age']);
$this->assertEquals(['name' => 'a', 'age' => 1], $array[0]);
$this->assertEquals(['name' => 'a', 'age' => 2], $array[1]);
$this->assertEquals(['name' => 'b', 'age' => 3], $array[2]);
// case-insensitive
$array = [
['name' => 'a', 'age' => 3],
['name' => 'b', 'age' => 2],
['name' => 'B', 'age' => 4],
['name' => 'A', 'age' => 1],
];
ArrayHelper::multisort($array, ['name', 'age'], SORT_ASC, [SORT_STRING, SORT_REGULAR]);
$this->assertEquals(['name' => 'A', 'age' => 1], $array[0]);
$this->assertEquals(['name' => 'B', 'age' => 4], $array[1]);
$this->assertEquals(['name' => 'a', 'age' => 3], $array[2]);
$this->assertEquals(['name' => 'b', 'age' => 2], $array[3]);
ArrayHelper::multisort($array, ['name', 'age'], SORT_ASC, [SORT_STRING | SORT_FLAG_CASE, SORT_REGULAR]);
$this->assertEquals(['name' => 'A', 'age' => 1], $array[0]);
$this->assertEquals(['name' => 'a', 'age' => 3], $array[1]);
$this->assertEquals(['name' => 'b', 'age' => 2], $array[2]);
$this->assertEquals(['name' => 'B', 'age' => 4], $array[3]);
}
12 years ago
public function testMultisortUseSort()
{
// single key
$sort = new Sort([
'attributes' => ['name', 'age'],
'defaultOrder' => ['name' => SORT_ASC],
]);
12 years ago
$orders = $sort->getOrders();
$array = [
['name' => 'b', 'age' => 3],
['name' => 'a', 'age' => 1],
['name' => 'c', 'age' => 2],
];
12 years ago
ArrayHelper::multisort($array, array_keys($orders), array_values($orders));
$this->assertEquals(['name' => 'a', 'age' => 1], $array[0]);
$this->assertEquals(['name' => 'b', 'age' => 3], $array[1]);
$this->assertEquals(['name' => 'c', 'age' => 2], $array[2]);
12 years ago
// multiple keys
$sort = new Sort([
'attributes' => ['name', 'age'],
'defaultOrder' => ['name' => SORT_ASC, 'age' => SORT_DESC],
]);
12 years ago
$orders = $sort->getOrders();
$array = [
['name' => 'b', 'age' => 3],
['name' => 'a', 'age' => 2],
['name' => 'a', 'age' => 1],
];
12 years ago
ArrayHelper::multisort($array, array_keys($orders), array_values($orders));
$this->assertEquals(['name' => 'a', 'age' => 2], $array[0]);
$this->assertEquals(['name' => 'a', 'age' => 1], $array[1]);
$this->assertEquals(['name' => 'b', 'age' => 3], $array[2]);
12 years ago
}
public function testMerge()
{
$a = [
'name' => 'Yii',
'version' => '1.0',
'options' => [
'namespace' => false,
'unittest' => false,
],
'features' => [
'mvc',
],
];
$b = [
'version' => '1.1',
'options' => [
'unittest' => true,
],
'features' => [
'gii',
],
];
$c = [
'version' => '2.0',
'options' => [
'namespace' => true,
],
'features' => [
'debug',
],
];
$result = ArrayHelper::merge($a, $b, $c);
$expected = [
'name' => 'Yii',
'version' => '2.0',
'options' => [
'namespace' => true,
'unittest' => true,
],
'features' => [
'mvc',
'gii',
'debug',
],
];
$this->assertEquals($expected, $result);
}
public function testIndex()
{
$array = [
['id' => '123', 'data' => 'abc'],
['id' => '345', 'data' => 'def'],
];
$result = ArrayHelper::index($array, 'id');
$this->assertEquals([
'123' => ['id' => '123', 'data' => 'abc'],
'345' => ['id' => '345', 'data' => 'def'],
], $result);
$result = ArrayHelper::index($array, function ($element) {
return $element['data'];
});
$this->assertEquals([
'abc' => ['id' => '123', 'data' => 'abc'],
'def' => ['id' => '345', 'data' => 'def'],
], $result);
}
public function testGetColumn()
{
$array = [
'a' => ['id' => '123', 'data' => 'abc'],
'b' => ['id' => '345', 'data' => 'def'],
];
$result = ArrayHelper::getColumn($array, 'id');
$this->assertEquals(['a' => '123', 'b' => '345'], $result);
$result = ArrayHelper::getColumn($array, 'id', false);
$this->assertEquals(['123', '345'], $result);
$result = ArrayHelper::getColumn($array, function ($element) {
return $element['data'];
});
$this->assertEquals(['a' => 'abc', 'b' => 'def'], $result);
$result = ArrayHelper::getColumn($array, function ($element) {
return $element['data'];
}, false);
$this->assertEquals(['abc', 'def'], $result);
}
public function testMap()
{
$array = [
['id' => '123', 'name' => 'aaa', 'class' => 'x'],
['id' => '124', 'name' => 'bbb', 'class' => 'x'],
['id' => '345', 'name' => 'ccc', 'class' => 'y'],
];
$result = ArrayHelper::map($array, 'id', 'name');
$this->assertEquals([
'123' => 'aaa',
'124' => 'bbb',
'345' => 'ccc',
], $result);
$result = ArrayHelper::map($array, 'id', 'name', 'class');
$this->assertEquals([
'x' => [
'123' => 'aaa',
'124' => 'bbb',
],
'y' => [
'345' => 'ccc',
],
], $result);
}
public function testKeyExists()
{
$array = [
'a' => 1,
'B' => 2,
];
$this->assertTrue(ArrayHelper::keyExists('a', $array));
$this->assertFalse(ArrayHelper::keyExists('b', $array));
$this->assertTrue(ArrayHelper::keyExists('B', $array));
$this->assertFalse(ArrayHelper::keyExists('c', $array));
$this->assertTrue(ArrayHelper::keyExists('a', $array, false));
$this->assertTrue(ArrayHelper::keyExists('b', $array, false));
$this->assertTrue(ArrayHelper::keyExists('B', $array, false));
$this->assertFalse(ArrayHelper::keyExists('c', $array, false));
}
public function valueProvider()
{
return [
['name', 'test'],
['noname', null],
['noname', 'test', 'test'],
['post.id', 5],
['post.id', 5, 'test'],
['nopost.id', null],
['nopost.id', 'test', 'test'],
['post.author.name', 'cebe'],
['post.author.noname', null],
['post.author.noname', 'test', 'test'],
['post.author.profile.title', '1337'],
['admin.firstname', 'Qiang'],
['admin.firstname', 'Qiang', 'test'],
['admin.lastname', 'Xue'],
[
function ($array, $defaultValue) {
return $array['date'] . $defaultValue;
},
'31-12-2113test',
'test'
],
];
}
/**
* @dataProvider valueProvider
*
* @param $key
* @param $expected
* @param null $default
*/
public function testGetValue($key, $expected, $default = null)
{
$array = [
'name' => 'test',
'date' => '31-12-2113',
'post' => [
'id' => 5,
'author' => [
'name' => 'cebe',
'profile' => [
'title' => '1337',
],
],
],
'admin.firstname' => 'Qiang',
'admin.lastname' => 'Xue',
'admin' => [
'lastname' => 'cebe',
],
];
$this->assertEquals($expected, ArrayHelper::getValue($array, $key, $default));
}
}