Skip to content

Commit 2ff6647

Browse files
committed
A lot of tests, some fixes.
1 parent 7877f23 commit 2ff6647

File tree

9 files changed

+323
-3
lines changed

9 files changed

+323
-3
lines changed

src/Views/ArrayView.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,10 @@ private function numericOffsetExists($offset): bool
294294
return false;
295295
}
296296

297+
if (\is_numeric($offset) && !\is_integer($offset + 0)) {
298+
return false;
299+
}
300+
297301
try {
298302
$index = $this->convertIndex(intval($offset));
299303
} catch (IndexError $e) {

tests/unit/ArrayIndexListView/ReadTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@ class ReadTest extends \Codeception\Test\Unit
1515
public function testReadByMethod(array $source, array $indexes, array $expected)
1616
{
1717
$view = ArrayView::toView($source);
18-
$subview = $view->subview(new IndexListSelector($indexes));
1918

19+
$selector = new IndexListSelector($indexes);
20+
$this->assertSame($indexes, $selector->getValue());
21+
22+
$subview = $view->subview($selector);
2023
$this->assertInstanceOf(ArrayIndexListView::class, $subview);
2124

2225
$this->assertSame($expected, [...$subview]);
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
namespace Smoren\ArrayView\Tests\Unit\ArrayMaskView;
4+
5+
use Smoren\ArrayView\Exceptions\SizeError;
6+
use Smoren\ArrayView\Selectors\MaskSelector;
7+
use Smoren\ArrayView\Views\ArrayView;
8+
9+
class IssetTest extends \Codeception\Test\Unit
10+
{
11+
12+
/**
13+
* @dataProvider dataProviderForIssetSelectorTrue
14+
*/
15+
public function testIssetSelectorTrue(array $source, array $boolMask)
16+
{
17+
$view = ArrayView::toView($source);
18+
19+
$this->assertTrue(isset($view[new MaskSelector($boolMask)]));
20+
}
21+
22+
/**
23+
* @dataProvider dataProviderForIssetSelectorFalse
24+
*/
25+
public function testIssetSelectorFalse(array $source, array $indexes)
26+
{
27+
$view = ArrayView::toView($source);
28+
29+
$this->assertFalse(isset($view[new MaskSelector($indexes)]));
30+
31+
$this->expectException(SizeError::class);
32+
$_ = $view[new MaskSelector($indexes)];
33+
}
34+
35+
public function dataProviderForIssetSelectorTrue(): array
36+
{
37+
return [
38+
[[], [], []],
39+
[[1], [0], []],
40+
[[1, 2, 3], [0, 0, 0], []],
41+
[[1], [1], [1]],
42+
[[1, 2], [1, 0], [1]],
43+
[[1, 2], [0, 1], [2]],
44+
[[1, 2], [1, 1], [1, 2]],
45+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 0, 1, 0, 1, 0, 1, 0], [2, 4, 6, 8]],
46+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 1, 1, 0, 0, 0, 0, 0, 1], [1, 2, 3, 9]],
47+
];
48+
}
49+
50+
public function dataProviderForIssetSelectorFalse(): array
51+
{
52+
return [
53+
[[], [0], []],
54+
[[], [1], []],
55+
[[], [0, 1], []],
56+
[[1], [], []],
57+
[[1], [0, 0], []],
58+
[[1], [1, 0], []],
59+
[[1], [1, 1, 1], []],
60+
[[1, 2, 3], [], []],
61+
[[1, 2, 3], [0], []],
62+
[[1, 2, 3], [0, 0], []],
63+
[[1, 2, 3], [0, 0, 0, 0], []],
64+
[[1, 2, 3], [0, 0, 0, 0, 0], []],
65+
[[1, 2, 3], [1], []],
66+
[[1, 2, 3], [1, 1], []],
67+
[[1, 2, 3], [1, 1, 1, 1], []],
68+
[[1, 2, 3], [1, 1, 1, 1, 1], []],
69+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 0, 1, 0, 1, 0, 1], [2, 4, 6, 8]],
70+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 1, 1, 0, 0, 0, 0, 0, 1, 0], [1, 2, 3, 9]],
71+
];
72+
}
73+
}

tests/unit/ArrayMaskView/ReadTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ class ReadTest extends \Codeception\Test\Unit
1414
public function testReadByMethod(array $source, array $mask, array $expected)
1515
{
1616
$view = ArrayView::toView($source);
17-
$subview = $view->subview(new MaskSelector($mask));
1817

18+
$selector = new MaskSelector($mask);
19+
$this->assertSame($mask, $selector->getValue());
20+
21+
$subview = $view->subview($selector);
1922
$this->assertInstanceOf(ArrayMaskView::class, $subview);
2023

2124
$this->assertSame($expected, [...$subview]);
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<?php
2+
3+
namespace Smoren\ArrayView\Tests\Unit\ArraySliceView;
4+
5+
use Smoren\ArrayView\Selectors\SliceSelector;
6+
use Smoren\ArrayView\Views\ArrayView;
7+
8+
class IssetTest extends \Codeception\Test\Unit
9+
{
10+
/**
11+
* @dataProvider dataProviderForIssetSelectorStringTrue
12+
* @dataProvider dataProviderForIssetSelectorArrayTrue
13+
*/
14+
public function testIssetSelectorObjectTrue(array $source, $slice)
15+
{
16+
$view = ArrayView::toView($source);
17+
$this->assertTrue(isset($view[new SliceSelector($slice)]));
18+
}
19+
20+
/**
21+
* @dataProvider dataProviderForIssetSelectorStringTrue
22+
*/
23+
public function testIssetSelectorStringTrue(array $source, $slice)
24+
{
25+
$view = ArrayView::toView($source);
26+
$this->assertTrue(isset($view[$slice]));
27+
}
28+
29+
public function dataProviderForIssetSelectorStringTrue(): array
30+
{
31+
return [
32+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '1:6'],
33+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '1:6:1'],
34+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '1:6:2'],
35+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '2:8'],
36+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '2:8:1'],
37+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '2:8:2'],
38+
39+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '-1::-1'],
40+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '-1:0:-1'],
41+
42+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '0:9:1'],
43+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '0:9:2'],
44+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '1:9:2'],
45+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '0:10:1'],
46+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '0:10:2'],
47+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '-9:9:1'],
48+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '-9:9:2'],
49+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '-10:10:1'],
50+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '-10:10:2'],
51+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '-5:10:1'],
52+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '-5:100:2'],
53+
54+
[[], '0:'],
55+
[[], '0:0'],
56+
[[], '0:0:1'],
57+
[[], '1:-1'],
58+
[[], '-1:-1'],
59+
[[], '-2:-1'],
60+
[[], '-2:-1:2'],
61+
[[], '-1:0:-1'],
62+
[[1], '0:'],
63+
[[1], '0:1'],
64+
[[1], '0:1:1'],
65+
[[1], '0:1:2'],
66+
[[1], '0:-1'],
67+
[[1], '0:-1:1'],
68+
[[1], '0:-1:2'],
69+
[[1], '0:10:100'],
70+
[[1], '1:10:100'],
71+
[[1], '0:'],
72+
[[1, 2, 3], '0:0:1'],
73+
[[1], '1:'],
74+
[[1, 2], '1:0'],
75+
[[1, 2], '1::-1'],
76+
[[1, 2], '0:1'],
77+
[[1, 2], '1:1'],
78+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '1::2'],
79+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], '::2'],
80+
];
81+
}
82+
83+
public function dataProviderForIssetSelectorArrayTrue(): array
84+
{
85+
return [
86+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [1,6]],
87+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [1,6,1]],
88+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [1,6,2]],
89+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [2,8]],
90+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [2,8,1]],
91+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [2,8,2]],
92+
];
93+
}
94+
}

tests/unit/ArraySliceView/ReadTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,10 @@ public function testReadByIndex(array $source, string $config, array $expected)
7676
public function testReadByMethodAndIndex(array $source, $config, array $expected)
7777
{
7878
$view = ArrayView::toView($source);
79-
$slicedArray = $view->subview(new SliceSelector($config))[':'];
79+
$selector = new SliceSelector($config);
80+
$this->assertSame($selector, $selector->getValue());
8081

82+
$slicedArray = $view->subview($selector)[':'];
8183
$this->assertSame($expected, $slicedArray);
8284
$this->assertSame(\count($expected), \count($slicedArray));
8385

tests/unit/ArrayView/ErrorsTest.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44

55
use Smoren\ArrayView\Exceptions\IndexError;
66
use Smoren\ArrayView\Exceptions\KeyError;
7+
use Smoren\ArrayView\Exceptions\NotSupportedError;
78
use Smoren\ArrayView\Exceptions\SizeError;
89
use Smoren\ArrayView\Exceptions\ValueError;
10+
use Smoren\ArrayView\Selectors\IndexListSelector;
911
use Smoren\ArrayView\Selectors\MaskSelector;
1012
use Smoren\ArrayView\Selectors\SliceSelector;
1113
use Smoren\ArrayView\Views\ArrayView;
@@ -186,6 +188,18 @@ public function testWriteSizeError(array $source, callable $viewGetter, array $t
186188
$view[':'] = $toWrite;
187189
}
188190

191+
/**
192+
* @dataProvider dataProviderForUnsetError
193+
*/
194+
public function testUnsetError(array $source, $index)
195+
{
196+
$view = ArrayView::toView($source);
197+
198+
$this->expectException(NotSupportedError::class);
199+
200+
unset($view[$index]);
201+
}
202+
189203
/**
190204
* @dataProvider dataProviderForNonSequentialError
191205
*/
@@ -327,6 +341,44 @@ public function dataProviderForWriteSizeError(): array
327341
];
328342
}
329343

344+
public function dataProviderForUnsetError(): array
345+
{
346+
return [
347+
[[], 0],
348+
[[], 1],
349+
[[], -1],
350+
[[], null],
351+
[[], true],
352+
[[], false],
353+
[[], []],
354+
[[], [1, 2, 3]],
355+
[[], ['test' => 123]],
356+
[[], new \ArrayObject([1, 2, 3])],
357+
[[], INF],
358+
[[], -INF],
359+
[[], NAN],
360+
[[], new SliceSelector('0:2')],
361+
[[], new MaskSelector([0, 1])],
362+
[[], new IndexListSelector([0, 1])],
363+
[[1, 2, 3], 0],
364+
[[1, 2, 3], 1],
365+
[[1, 2, 3], -1],
366+
[[1, 2, 3], null],
367+
[[1, 2, 3], true],
368+
[[1, 2, 3], false],
369+
[[1, 2, 3], []],
370+
[[1, 2, 3], [1, 2, 3]],
371+
[[1, 2, 3], ['test' => 123]],
372+
[[1, 2, 3], new \ArrayObject([1, 2, 3])],
373+
[[1, 2, 3], INF],
374+
[[1, 2, 3], -INF],
375+
[[1, 2, 3], NAN],
376+
[[1, 2, 3], new SliceSelector('0:2')],
377+
[[1, 2, 3], new MaskSelector([0, 1])],
378+
[[1, 2, 3], new IndexListSelector([0, 1])],
379+
];
380+
}
381+
330382
public function dataProviderForNonSequentialError(): array
331383
{
332384
return [

tests/unit/ArrayView/IssetTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace Smoren\ArrayView\Tests\Unit\ArrayView;
4+
5+
use Smoren\ArrayView\Selectors\SliceSelector;
6+
use Smoren\ArrayView\Views\ArrayView;
7+
8+
class IssetTest extends \Codeception\Test\Unit
9+
{
10+
/**
11+
* @dataProvider dataProviderForIssetSelectorFalse
12+
*/
13+
public function testIssetSelectorFalse(array $source, $slice)
14+
{
15+
$view = ArrayView::toView($source);
16+
$this->assertFalse(isset($view[$slice]));
17+
}
18+
19+
public function dataProviderForIssetSelectorFalse(): array
20+
{
21+
return [
22+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], null],
23+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], true],
24+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], false],
25+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], 1.1],
26+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], INF],
27+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], -INF],
28+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [1,6]],
29+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], 'asd'],
30+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], ['a' => 1]],
31+
[[1, 2, 3, 4, 5, 6, 7, 8, 9], new \ArrayObject(['a' => 1])],
32+
];
33+
}
34+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Smoren\ArrayView\Tests\Unit\Structs;
6+
7+
use Smoren\ArrayView\Structs\Slice;
8+
9+
class NormalizedSliceTest extends \Codeception\Test\Unit
10+
{
11+
/**
12+
* @dataProvider dataProviderForToSlice
13+
*/
14+
public function testToSlice($input, $containerSize, array $expected)
15+
{
16+
$actual = Slice::toSlice($input)->normalize($containerSize);
17+
$expectedSlice = new Slice(...$expected);
18+
19+
$this->assertSame($expectedSlice->getStart(), $actual->getStart());
20+
$this->assertSame($expectedSlice->getEnd(), $actual->getEnd());
21+
$this->assertSame($expectedSlice->getStep(), $actual->getStep());
22+
}
23+
24+
public function dataProviderForToSlice(): array
25+
{
26+
return [
27+
[':', 0, [0, 0, 1]],
28+
['::', 0, [0, 0, 1]],
29+
['::', 1, [0, 1, 1]],
30+
['::', 2, [0, 2, 1]],
31+
['0:', 0, [0, 0, 1]],
32+
['0:', 1, [0, 1, 1]],
33+
['1:', 0, [0, 0, 1]],
34+
['-1:', 0, [0, 0, 1]],
35+
['-1:', 1, [0, 1, 1]],
36+
['0:0:', 0, [0, 0, 1]],
37+
['0:0:', 10, [0, 0, 1]],
38+
['1:1:', 0, [0, 0, 1]],
39+
['1:1:', 10, [1, 1, 1]],
40+
['-1:-1:', 0, [0, 0, 1]],
41+
['-1:-1:', 10, [9, 9, 1]],
42+
['1:1:-1', 0, [0, 0, -1]],
43+
['1:1:-1', 1, [0, 0, -1]],
44+
['1:1:-1', 2, [1, 1, -1]],
45+
['-1:-1:-1', 0, [0, 0, -1]],
46+
['-1:-1:-1', 1, [0, 0, -1]],
47+
['-1:-1:-1', 2, [1, 1, -1]],
48+
['1:2:3', 0, [0, 0, 3]],
49+
['1:2:3', 1, [0, 0, 3]],
50+
['1:2:3', 2, [1, 2, 3]],
51+
['1:2:3', 3, [1, 2, 3]],
52+
['1:2:3', 10, [1, 2, 3]],
53+
];
54+
}
55+
}

0 commit comments

Comments
 (0)