public function testUnshiftRetainAssocKeys()
 {
     $expected = ['bar', 'foo' => 5];
     $xao = new XArray(['foo' => 5]);
     $xao->unshift('bar');
     $this->assertEquals($expected, (array) $xao);
 }
 public function testChangeKeyCaseMultibyteKeys()
 {
     $xao = new XArray(['cœur' => 1, 'Søren' => 2]);
     $expected = ['CŒUR' => 1, 'SØREN' => 2];
     $obj = $xao->changeKeyCase(\CASE_UPPER);
     $this->assertEquals($expected, (array) $obj);
 }
 public function testReplaceWithSimilarKeys()
 {
     $xao = new XArray([1, 2, 3]);
     $obj = $xao->replace(['1' => 'foo']);
     // string numbers (int) are automatically converted to integers
     $this->assertEquals([1, 'foo', 3], (array) $obj);
 }
 /**
  * @expectedException RuntimeException
  */
 public function testFilterFailsForInvalidCallback()
 {
     $xao = new XArray([1, 2]);
     // ArrayObject::count() is non-static and accepts no parameters
     // though the syntax for the callable is correct the execution will fail
     $xao->filter(['ArrayObject', 'count']);
 }
 public function testContainsOnEmptyArray()
 {
     $xao = new XArray([]);
     $this->assertSame(false, $xao->contains('foo', true));
     $this->assertSame(false, $xao->contains('foo', false));
     $this->assertSame(false, $xao->contains('foo'));
 }
 public function testReversePreserveNumericKeys()
 {
     $expected = [2 => 3, 1 => 2, 0 => 1];
     $xao = new XArray([1, 2, 3]);
     $obj = $xao->reverse(true);
     $this->assertEquals($expected, (array) $obj);
 }
 public function testValuesSuccess()
 {
     $expected = [0 => 'bar', 1 => 'y'];
     $xao = new XArray(['foo' => 'bar', 'x' => 'y']);
     $obj = $xao->values();
     $this->assertCount(2, $obj);
     $this->assertEquals($expected, (array) $obj);
 }
 public function testGetPreviousObject()
 {
     $xao = new XArray([1, 2, 3]);
     $obj = $xao->map(function ($value) {
         return 2 * $value;
     });
     $this->assertSame($xao, $obj->back());
 }
 public function testRandKeysAndValuesExist()
 {
     $xao = new XArray(['foo', 'bar']);
     $obj = $xao->rand();
     $keys = array_keys((array) $obj);
     $this->assertArrayHasKey($keys[0], $obj);
     $values = array_values((array) $obj);
     $this->assertContains($values[0], $obj);
 }
 public function testShuffleNotChangesArrayElements()
 {
     $expected = [1, 2, 3, 4, 5];
     $xao = new XArray($expected);
     $array = (array) $xao->shuffle();
     // undo shuffle
     sort($array, \SORT_NUMERIC);
     $this->assertEquals($expected, $array);
 }
 public function testSlicePreservingKeys()
 {
     $xao = new XArray([3 => 5, 6 => 2, 0 => 6, 7 => 3]);
     // without
     $this->assertEquals([2, 6], (array) $xao->slice(1, 2));
     $this->assertEquals([2, 6], (array) $xao->slice(1, 2, XAInterface::IGNORE_KEYS));
     // with
     $this->assertEquals([6 => 2, 0 => 6], (array) $xao->slice(1, 2, XAInterface::PRESERVE_KEYS));
     // without length
     $this->assertEquals([6 => 2, 0 => 6, 7 => 3], (array) $xao->slice(1, NULL, XAInterface::PRESERVE_KEYS));
 }
 /**
  * Create ArrayObject instance according to the native constructor 
  * optionally adding the object from the previous action.
  * 
  * @param mixed $input An array or object (with externally iterable properties)
  * @param integer $flags Flags to control the behaviour of the ArrayObject object.
  * @param string $iterator_class Specify the class that will be used for iteration of the ArrayObject object.
  * @param ArrayObject $previous ArrayObject of the operation that created this object.
  * @return self
  * @throws InvalidArgumentException $input is not an array or object
  * @throws InvalidArgumentException $flags is not an integer
  * @throws InvalidArgumentException $iterator_class is not an object that implements Iterator
  */
 public function __construct($input = [], $flags = 0, $iterator_class = 'ArrayIterator', \ArrayObject $previous = null)
 {
     parent::__construct($input, $flags, $iterator_class);
     if ($previous) {
         $this->previous = $previous;
     }
 }
 /**
  * @expectedException RuntimeException
  */
 public function testJoinWithNonscalarArray()
 {
     $xao = new XArray([1, ['foo'], 7]);
     $xao->join('-');
 }
 /**
  * @depends testWalkAcceptsClosure
  */
 public function testWalkModifiesValuesWithUserdata()
 {
     $xao = new XArray([1, 2, 3]);
     $expected = [2, 4, 6];
     $xao->walk(function (&$value, $key, $number) {
         $value = $value * $number;
     }, 2);
     $this->assertEquals($expected, (array) $xao);
 }
 /**
  * @expectedException RuntimeException
  */
 public function testFlipWithInvalidArray()
 {
     $array = [true, null, ['foo' => 'bar']];
     $xao = new XArray($array);
     $obj = $xao->flip();
 }
 /**
  * @depends testMapAcceptsFunction
  */
 public function testMapPreserveKeys()
 {
     $array = ['x' => 28, 'y' => 68, 'z' => 4];
     $xao = new XArray($array);
     $this->assertEquals($array, (array) $xao->map('test_map', true));
 }
 public function testXAIintersectWithKeyValueCallback()
 {
     $xao = new XArray(['x' => 1, 'ab' => 2, 'z' => 3]);
     $obj = $xao->xaintersect(['xy' => 5, 'z' => 11], 'length_compare_func', 'length_compare_func');
     $this->assertEquals(['xy' => 5], (array) $obj);
 }
 public function testSearchStringLookupIsCaseSensitive()
 {
     $xao = new XArray(['foo', 'bar']);
     $this->assertFalse($xao->search('Foo'));
 }
 /**
  * @expectedException RuntimeException
  */
 public function testCountValuesWithNonScalarValues()
 {
     $xao = new XArray([1, ['foo']]);
     $obj = $xao->countValues();
 }
 public function testXADiffWithKeyValueCallback()
 {
     $xao = new XArray(['ab' => 2, 'z' => 1]);
     $obj = $xao->xadiff(['x' => 1, 'ab' => 22, 'z' => 3], 'length_compare_func', 'length_compare_func');
     $this->assertEquals(['ab' => 22], (array) $obj);
 }
 public function testSpliceModifiesObject()
 {
     $xao = new XArray([1, 2, 3]);
     $obj = $xao->splice(2);
     $this->assertEquals([1, 2], (array) $xao);
 }
 /**
  * @expectedException RuntimeException
  */
 public function testUniqueFailsOnConversionProblems()
 {
     $xao = new XArray(['foo', ['bar'], 'bar']);
     $obj = $xao->unique();
 }
 public function testMergeAssocArrayWithArrayObject()
 {
     $expected = ['x' => 1, 'y' => 2, 'z' => 2, 'a' => 1];
     $xao1 = new XArray(['x' => 1, 'y' => 2, 'z' => 3]);
     $xao2 = new XArray(['a' => 1, 'z' => 2]);
     $obj = $xao1->merge($xao2);
     $this->assertEquals($expected, (array) $obj);
 }
 /**
  * @depends testReduceSkipsInitialValueIfNoneGiven
  */
 public function testReduceCanUseArrayKeysInCallback()
 {
     $xao = new XArray(['a' => 1, 'b' => 2, 'c' => 3]);
     // this would return 0 if the default initial value of NULL gets paased
     $string = $xao->reduce(function ($carry, $value, $key) {
         return $carry .= $key . ':' . $value . '|';
     }, '|');
     $this->assertSame('|a:1|b:2|c:3|', $string);
 }
 public function testPushReturnsSameInstance()
 {
     $xao = new XArray(['foo']);
     $obj = $xao->push('bar');
     $this->assertSame($xao, $obj);
 }
 public function testCreateObjectFromnStaticMethod()
 {
     $xao = XArray::from([1, 2, 3]);
     $this->assertInstanceOf('\\Dormilich\\Core\\ArrayInterface', $xao);
     $test = new XArray([1, 2, 3]);
     $this->assertEquals($test, $xao);
 }