summaryrefslogtreecommitdiffstats
path: root/tests/Inc/ArrayUtilTest.php
blob: 0423e6dac3915c83f98874372f57821b88f55558 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php

use PHPUnit\Framework\TestCase;

class ArrayUtilTest extends TestCase
{
	public function testFlattenByKeyBasicAndMissingKeys(): void
	{
		$in = [
			['id' => 1, 'name' => 'a'],
			['id' => 2, 'name' => 'b', 'x' => 5],
			['name' => 'c'], // missing 'id' -> skipped by array_column()
		];
		$this->assertSame([1, 2], ArrayUtil::flattenByKey($in, 'id'));
	}

	public function testMergeByKeyMergesAcrossSubArrays(): void
	{
		$in = [
			'a' => ['k1' => 1, 'k2' => 2],
			'b' => ['k1' => 3],
		];
		$expected = [
			'k1' => ['a' => 1, 'b' => 3],
			'k2' => ['a' => 2, 'b' => false],
		];
		$this->assertSame($expected, ArrayUtil::mergeByKey($in));
	}

	public function testSortByColumnAscendingAndDescending(): void
	{
		$rows = [
			['n' => 'b', 'v' => 2],
			['n' => 'a', 'v' => 3],
			['n' => 'c', 'v' => 1],
		];
		$copy = $rows;
		ArrayUtil::sortByColumn($rows, 'v', SORT_ASC);
		$this->assertSame([
			['n' => 'c', 'v' => 1],
			['n' => 'b', 'v' => 2],
			['n' => 'a', 'v' => 3],
		], $rows);

		ArrayUtil::sortByColumn($copy, 'n', SORT_DESC, SORT_STRING);
		$this->assertSame([
			['n' => 'c', 'v' => 1],
			['n' => 'b', 'v' => 2],
			['n' => 'a', 'v' => 3],
		], $copy);
	}

	public function testHasAllKeys(): void
	{
		$arr = ['a' => 1, 'b' => 2];
		$this->assertTrue(ArrayUtil::hasAllKeys($arr, ['a', 'b']));
		$this->assertFalse(ArrayUtil::hasAllKeys($arr, ['a', 'c']));
		$this->assertTrue(ArrayUtil::hasAllKeys($arr, []));
	}

	public function testIsOnlyPrimitiveTypes(): void
	{
		$this->assertTrue(ArrayUtil::isOnlyPrimitiveTypes([1, 'x', 1.2, null, true, false, 0]));
		$this->assertFalse(ArrayUtil::isOnlyPrimitiveTypes([[]]));
		$this->assertFalse(ArrayUtil::isOnlyPrimitiveTypes([new stdClass()]));

		$h = fopen('php://memory', 'r');
		try {
			$this->assertFalse(ArrayUtil::isOnlyPrimitiveTypes([$h]));
		} finally {
			if (is_resource($h))
				fclose($h);
		}
	}

	public function testForceTypeMutatesArrayInPlace(): void
	{
		$arr = ['1', '2', '3'];
		ArrayUtil::forceType($arr, 'int');
		$this->assertSame([1, 2, 3], $arr);

		$arr = ['0', '1', '', 'foo'];
		ArrayUtil::forceType($arr, 'bool');
		// In PHP, (bool) '0' is false; non-empty strings except '0' are true; empty string is false
		$this->assertSame([false, true, false, true], $arr);

		$arr = [1, 2, 3];
		ArrayUtil::forceType($arr, 'string');
		$this->assertSame(['1', '2', '3'], $arr);
	}
}