You are here

ArrayHelperTest.test in Helper 7

File

tests/ArrayHelperTest.test
View source
<?php

require_once __DIR__ . '/../lib/ArrayHelper.php';
class ArrayHelperTest extends DrupalUnitTestCase {
  public static function getInfo() {
    return array(
      'name' => 'ArrayHelper',
      'description' => 'Tests for the ArrayHelper class.',
      'group' => 'Helper',
    );
  }
  function testNestedValue() {
    $input = array(
      0 => array(
        'test' => 'foo',
        'keys' => array(
          'first',
          'a',
        ),
      ),
      1 => (object) array(
        'test' => 'bar',
        'keys' => array(
          'second',
          'b',
        ),
      ),
      2 => new ArrayHelperTestObject(array(
        'test' => 'foo',
        'keys' => array(
          'third',
          'c',
        ),
      )),
    );
    $this
      ->assertIdentical(ArrayHelper::filterByNestedValue($input, array(
      'test',
    ), 'foo'), array(
      0 => $input[0],
      2 => $input[2],
    ));
    $this
      ->assertIdentical(ArrayHelper::filterByNestedValue($input, array(
      'test',
    ), 'bar'), array(
      1 => $input[1],
    ));
    $this
      ->assertIdentical(ArrayHelper::filterByNestedValue($input, array(
      'test',
    ), 'ferzle'), array());
    $this
      ->assertIdentical(ArrayHelper::extractNestedValuesToArray($input, array(
      'test',
    )), array(
      0 => 'foo',
      1 => 'bar',
      2 => 'foo',
    ));
    $this
      ->assertIdentical(ArrayHelper::extractNestedValuesToArray($input, array(
      'test',
    ), array(
      'keys',
      0,
    )), array(
      'first' => 'foo',
      'second' => 'bar',
      'third' => 'foo',
    ));
    $this
      ->assertIdentical(ArrayHelper::extractNestedValuesToArray($input, array(
      'test',
    ), array(
      'keys',
      1,
    )), array(
      'a' => 'foo',
      'b' => 'bar',
      'c' => 'foo',
    ));
    $this
      ->assertIdentical(ArrayHelper::extractNestedValuesToArray($input, array(
      'invalid',
    )), array());
  }
  function testMapKeys() {
    $input = array(
      'a' => 1,
      'b' => '1',
      'c' => 1,
      0 => '2',
      1 => 2,
    );
    $expected = array(
      '#a' => 1,
      '#b' => '1',
      '#c' => 1,
      '#0' => '2',
      '#1' => 2,
    );
    $result = ArrayHelper::mapKeys(function ($value) {
      return '#' . $value;
    }, $input);
    $this
      ->assertIdentical($result, $expected);
  }
  function testFilterKeys() {
    $input = array_fill_keys(range(0, 10), 'test');
    $expected1 = array_fill_keys(array(
      0,
      3,
      6,
      9,
    ), 'test');
    $expected2 = array_fill_keys(array(
      1,
      2,
      4,
      5,
      7,
      8,
      10,
    ), 'test');
    $result = ArrayHelper::filterKeys($input, function ($value) {
      return $value % 3 === 0;
    }, $input);
    $this
      ->assertIdentical($result, $expected1);
    $result = ArrayHelper::filterKeys($input, function ($value) {
      return $value % 3;
    }, $input);
    $this
      ->assertIdentical($result, $expected2);
  }
  public function testSpliceAssociativeValues() {
    $input = array(
      0 => 'value1',
      'key1' => 'value2',
      1 => 'value3',
      'key2' => 'value4',
    );
    $result = ArrayHelper::spliceAssociativeValues($input, array(
      'newkey' => 'newvalue',
    ), 2);
    $this
      ->assertIdentical($result, array(
      0 => 'value1',
      'key1' => 'value2',
      'newkey' => 'newvalue',
      1 => 'value3',
      'key2' => 'value4',
    ));
    $result = ArrayHelper::spliceAssociativeValues($input, array(
      'newkey' => 'newvalue',
    ), 1, 1);
    $this
      ->assertIdentical($result, array(
      0 => 'value1',
      'newkey' => 'newvalue',
      1 => 'value3',
      'key2' => 'value4',
    ));
    $result = ArrayHelper::spliceAssociativeValues($input, array(
      'newkey' => 'newvalue',
    ), 2, 1);
    $this
      ->assertIdentical($result, array(
      0 => 'value1',
      'key1' => 'value2',
      'newkey' => 'newvalue',
      'key2' => 'value4',
    ));
  }
  public function testChunkEvenly() {
    $input = array_combine(range(10, 1, -1), range(1, 10));
    $result = ArrayHelper::chunkEvenly($input, 3);
    $this
      ->assertIdentical($result, array(
      0 => array(
        1,
        2,
        3,
        4,
      ),
      1 => array(
        5,
        6,
        7,
      ),
      2 => array(
        8,
        9,
        10,
      ),
    ));
    $result = ArrayHelper::chunkEvenly($input, 4, TRUE);
    $this
      ->assertIdentical($result, array(
      0 => array(
        10 => 1,
        9 => 2,
        8 => 3,
      ),
      1 => array(
        7 => 4,
        6 => 5,
        5 => 6,
      ),
      2 => array(
        4 => 7,
        3 => 8,
      ),
      3 => array(
        2 => 9,
        1 => 10,
      ),
    ));

    // Test using $num greater than items in the array.
    $result = ArrayHelper::chunkEvenly($input, 11);
    $this
      ->assertIdentical($result, array(
      0 => array(
        1,
      ),
      1 => array(
        2,
      ),
      2 => array(
        3,
      ),
      3 => array(
        4,
      ),
      4 => array(
        5,
      ),
      5 => array(
        6,
      ),
      6 => array(
        7,
      ),
      7 => array(
        8,
      ),
      8 => array(
        9,
      ),
      9 => array(
        10,
      ),
    ));

    // Test empty array.
    $this
      ->assertIdentical(ArrayHelper::chunkEvenly(array(), 1), array());
    $this
      ->assertIdentical(ArrayHelper::chunkEvenly(array(), 5), array());

    // Test $num less than 1.
    try {
      $this
        ->assertIdentical(ArrayHelper::chunkEvenly($input, 0), array());
      throw new Exception();
    } catch (InvalidArgumentException $e) {
      $this
        ->pass("InvalidArgumentException thrown.");
    } catch (Exception $e) {
      $this
        ->fail("InvalidArgumentException not thrown.");
    }

    // Test non-numeric $num
    try {
      $this
        ->assertIdentical(ArrayHelper::chunkEvenly($input, 'invalid'), array());
      throw new Exception();
    } catch (InvalidArgumentException $e) {
      $this
        ->pass("InvalidArgumentException thrown.");
    } catch (Exception $e) {
      $this
        ->fail("InvalidArgumentException not thrown.");
    }
  }

}
class ArrayHelperTestObject {
  private $data;
  public function __construct(array $data = array()) {
    $this->data = $data;
  }
  public function __get($key) {
    if (array_key_exists($key, $this->data)) {
      return $this->data[$key];
    }
  }
  public function __set($key, $value) {
    $this->data[$key] = $value;
  }

}