-
Notifications
You must be signed in to change notification settings - Fork 435
/
ConstantArrayTypeBuilderTest.php
101 lines (83 loc) · 4.26 KB
/
ConstantArrayTypeBuilderTest.php
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
92
93
94
95
96
97
98
99
100
101
<?php declare(strict_types = 1);
namespace PHPStan\Type\Constant;
use PHPStan\Type\BooleanType;
use PHPStan\Type\NullType;
use PHPStan\Type\VerbosityLevel;
use PHPUnit\Framework\TestCase;
class ConstantArrayTypeBuilderTest extends TestCase
{
public function testOptionalKeysNextAutoIndex(): void
{
$builder = ConstantArrayTypeBuilder::createEmpty();
$builder->setOffsetValueType(null, new ConstantIntegerType(1));
$array1 = $builder->getArray();
$this->assertInstanceOf(ConstantArrayType::class, $array1);
$this->assertSame('array{1}', $array1->describe(VerbosityLevel::precise()));
$this->assertSame([1], $array1->getNextAutoIndexes());
$builder->setOffsetValueType(null, new ConstantIntegerType(2), true);
$array2 = $builder->getArray();
$this->assertInstanceOf(ConstantArrayType::class, $array2);
$this->assertSame('array{0: 1, 1?: 2}', $array2->describe(VerbosityLevel::precise()));
$this->assertSame([1, 2], $array2->getNextAutoIndexes());
$builder->setOffsetValueType(null, new ConstantIntegerType(3));
$array3 = $builder->getArray();
$this->assertInstanceOf(ConstantArrayType::class, $array3);
$this->assertSame('array{0: 1, 1: 2|3, 2?: 3}', $array3->describe(VerbosityLevel::precise()));
$this->assertSame([2, 3], $array3->getNextAutoIndexes());
$this->assertTrue($array3->isKeysSupersetOf($array2));
$array2MergedWith3 = $array3->mergeWith($array2);
$this->assertSame('array{0: 1, 1?: 2|3, 2?: 3}', $array2MergedWith3->describe(VerbosityLevel::precise()));
$this->assertSame([1, 2, 3], $array2MergedWith3->getNextAutoIndexes());
$builder->setOffsetValueType(null, new ConstantIntegerType(4));
$array4 = $builder->getArray();
$this->assertInstanceOf(ConstantArrayType::class, $array4);
$this->assertSame('array{0: 1, 1: 2|3, 2: 3|4, 3?: 4}', $array4->describe(VerbosityLevel::precise()));
$this->assertSame([3, 4], $array4->getNextAutoIndexes());
$builder->setOffsetValueType(new ConstantIntegerType(3), new ConstantIntegerType(5), true);
$array5 = $builder->getArray();
$this->assertInstanceOf(ConstantArrayType::class, $array5);
$this->assertSame('array{0: 1, 1: 2|3, 2: 3|4, 3?: 4|5}', $array5->describe(VerbosityLevel::precise()));
$this->assertSame([3, 4], $array5->getNextAutoIndexes());
$builder->setOffsetValueType(new ConstantIntegerType(3), new ConstantIntegerType(6));
$array6 = $builder->getArray();
$this->assertInstanceOf(ConstantArrayType::class, $array6);
$this->assertSame('array{1, 2|3, 3|4, 6}', $array6->describe(VerbosityLevel::precise()));
$this->assertSame([4], $array6->getNextAutoIndexes());
}
public function testNextAutoIndex(): void
{
$builder = ConstantArrayTypeBuilder::createFromConstantArray(new ConstantArrayType(
[new ConstantIntegerType(0)],
[new ConstantStringType('foo')],
[1],
));
$builder->setOffsetValueType(new ConstantIntegerType(0), new ConstantStringType('bar'));
$array = $builder->getArray();
$this->assertInstanceOf(ConstantArrayType::class, $array);
$this->assertSame('array{\'bar\'}', $array->describe(VerbosityLevel::precise()));
$this->assertSame([1], $array->getNextAutoIndexes());
}
public function testNextAutoIndexAnother(): void
{
$builder = ConstantArrayTypeBuilder::createFromConstantArray(new ConstantArrayType(
[new ConstantIntegerType(0)],
[new ConstantStringType('foo')],
[1],
));
$builder->setOffsetValueType(new ConstantIntegerType(1), new ConstantStringType('bar'));
$array = $builder->getArray();
$this->assertInstanceOf(ConstantArrayType::class, $array);
$this->assertSame('array{\'foo\', \'bar\'}', $array->describe(VerbosityLevel::precise()));
$this->assertSame([2], $array->getNextAutoIndexes());
}
public function testAppendingOptionalKeys(): void
{
$builder = ConstantArrayTypeBuilder::createEmpty();
$builder->setOffsetValueType(null, new BooleanType(), true);
$this->assertSame('array{0?: bool}', $builder->getArray()->describe(VerbosityLevel::precise()));
$builder->setOffsetValueType(null, new NullType(), true);
$this->assertSame('array{0?: bool|null, 1?: null}', $builder->getArray()->describe(VerbosityLevel::precise()));
$builder->setOffsetValueType(null, new ConstantIntegerType(17));
$this->assertSame('array{0: 17|bool|null, 1?: 17|null, 2?: 17}', $builder->getArray()->describe(VerbosityLevel::precise()));
}
}