Chris@13
|
1 <?php declare(strict_types=1);
|
Chris@0
|
2
|
Chris@0
|
3 namespace PhpParser\Node;
|
Chris@0
|
4
|
Chris@17
|
5 class NameTest extends \PHPUnit\Framework\TestCase
|
Chris@0
|
6 {
|
Chris@0
|
7 public function testConstruct() {
|
Chris@13
|
8 $name = new Name(['foo', 'bar']);
|
Chris@13
|
9 $this->assertSame(['foo', 'bar'], $name->parts);
|
Chris@0
|
10
|
Chris@0
|
11 $name = new Name('foo\bar');
|
Chris@13
|
12 $this->assertSame(['foo', 'bar'], $name->parts);
|
Chris@0
|
13
|
Chris@0
|
14 $name = new Name($name);
|
Chris@13
|
15 $this->assertSame(['foo', 'bar'], $name->parts);
|
Chris@0
|
16 }
|
Chris@0
|
17
|
Chris@0
|
18 public function testGet() {
|
Chris@0
|
19 $name = new Name('foo');
|
Chris@0
|
20 $this->assertSame('foo', $name->getFirst());
|
Chris@0
|
21 $this->assertSame('foo', $name->getLast());
|
Chris@0
|
22
|
Chris@0
|
23 $name = new Name('foo\bar');
|
Chris@0
|
24 $this->assertSame('foo', $name->getFirst());
|
Chris@0
|
25 $this->assertSame('bar', $name->getLast());
|
Chris@0
|
26 }
|
Chris@0
|
27
|
Chris@0
|
28 public function testToString() {
|
Chris@13
|
29 $name = new Name('Foo\Bar');
|
Chris@0
|
30
|
Chris@13
|
31 $this->assertSame('Foo\Bar', (string) $name);
|
Chris@13
|
32 $this->assertSame('Foo\Bar', $name->toString());
|
Chris@13
|
33 $this->assertSame('foo\bar', $name->toLowerString());
|
Chris@0
|
34 }
|
Chris@0
|
35
|
Chris@0
|
36 public function testSlice() {
|
Chris@0
|
37 $name = new Name('foo\bar\baz');
|
Chris@0
|
38 $this->assertEquals(new Name('foo\bar\baz'), $name->slice(0));
|
Chris@0
|
39 $this->assertEquals(new Name('bar\baz'), $name->slice(1));
|
Chris@0
|
40 $this->assertNull($name->slice(3));
|
Chris@0
|
41 $this->assertEquals(new Name('foo\bar\baz'), $name->slice(-3));
|
Chris@0
|
42 $this->assertEquals(new Name('bar\baz'), $name->slice(-2));
|
Chris@0
|
43 $this->assertEquals(new Name('foo\bar'), $name->slice(0, -1));
|
Chris@0
|
44 $this->assertNull($name->slice(0, -3));
|
Chris@0
|
45 $this->assertEquals(new Name('bar'), $name->slice(1, -1));
|
Chris@0
|
46 $this->assertNull($name->slice(1, -2));
|
Chris@0
|
47 $this->assertEquals(new Name('bar'), $name->slice(-2, 1));
|
Chris@0
|
48 $this->assertEquals(new Name('bar'), $name->slice(-2, -1));
|
Chris@0
|
49 $this->assertNull($name->slice(-2, -2));
|
Chris@0
|
50 }
|
Chris@0
|
51
|
Chris@0
|
52 public function testSliceOffsetTooLarge() {
|
Chris@17
|
53 $this->expectException(\OutOfBoundsException::class);
|
Chris@17
|
54 $this->expectExceptionMessage('Offset 4 is out of bounds');
|
Chris@0
|
55 (new Name('foo\bar\baz'))->slice(4);
|
Chris@0
|
56 }
|
Chris@0
|
57
|
Chris@0
|
58 public function testSliceOffsetTooSmall() {
|
Chris@17
|
59 $this->expectException(\OutOfBoundsException::class);
|
Chris@17
|
60 $this->expectExceptionMessage('Offset -4 is out of bounds');
|
Chris@0
|
61 (new Name('foo\bar\baz'))->slice(-4);
|
Chris@0
|
62 }
|
Chris@0
|
63
|
Chris@0
|
64 public function testSliceLengthTooLarge() {
|
Chris@17
|
65 $this->expectException(\OutOfBoundsException::class);
|
Chris@17
|
66 $this->expectExceptionMessage('Length 4 is out of bounds');
|
Chris@0
|
67 (new Name('foo\bar\baz'))->slice(0, 4);
|
Chris@0
|
68 }
|
Chris@0
|
69
|
Chris@0
|
70 public function testSliceLengthTooSmall() {
|
Chris@17
|
71 $this->expectException(\OutOfBoundsException::class);
|
Chris@17
|
72 $this->expectExceptionMessage('Length -4 is out of bounds');
|
Chris@0
|
73 (new Name('foo\bar\baz'))->slice(0, -4);
|
Chris@0
|
74 }
|
Chris@0
|
75
|
Chris@0
|
76 public function testConcat() {
|
Chris@0
|
77 $this->assertEquals(new Name('foo\bar\baz'), Name::concat('foo', 'bar\baz'));
|
Chris@0
|
78 $this->assertEquals(
|
Chris@0
|
79 new Name\FullyQualified('foo\bar'),
|
Chris@0
|
80 Name\FullyQualified::concat(['foo'], new Name('bar'))
|
Chris@0
|
81 );
|
Chris@0
|
82
|
Chris@0
|
83 $attributes = ['foo' => 'bar'];
|
Chris@0
|
84 $this->assertEquals(
|
Chris@0
|
85 new Name\Relative('foo\bar\baz', $attributes),
|
Chris@0
|
86 Name\Relative::concat(new Name\FullyQualified('foo\bar'), 'baz', $attributes)
|
Chris@0
|
87 );
|
Chris@0
|
88
|
Chris@0
|
89 $this->assertEquals(new Name('foo'), Name::concat(null, 'foo'));
|
Chris@0
|
90 $this->assertEquals(new Name('foo'), Name::concat('foo', null));
|
Chris@0
|
91 $this->assertNull(Name::concat(null, null));
|
Chris@0
|
92 }
|
Chris@0
|
93
|
Chris@13
|
94 public function testNameTypes() {
|
Chris@0
|
95 $name = new Name('foo');
|
Chris@13
|
96 $this->assertTrue($name->isUnqualified());
|
Chris@0
|
97 $this->assertFalse($name->isQualified());
|
Chris@0
|
98 $this->assertFalse($name->isFullyQualified());
|
Chris@0
|
99 $this->assertFalse($name->isRelative());
|
Chris@13
|
100 $this->assertSame('foo', $name->toCodeString());
|
Chris@0
|
101
|
Chris@0
|
102 $name = new Name('foo\bar');
|
Chris@0
|
103 $this->assertFalse($name->isUnqualified());
|
Chris@13
|
104 $this->assertTrue($name->isQualified());
|
Chris@0
|
105 $this->assertFalse($name->isFullyQualified());
|
Chris@0
|
106 $this->assertFalse($name->isRelative());
|
Chris@13
|
107 $this->assertSame('foo\bar', $name->toCodeString());
|
Chris@0
|
108
|
Chris@0
|
109 $name = new Name\FullyQualified('foo');
|
Chris@0
|
110 $this->assertFalse($name->isUnqualified());
|
Chris@0
|
111 $this->assertFalse($name->isQualified());
|
Chris@13
|
112 $this->assertTrue($name->isFullyQualified());
|
Chris@0
|
113 $this->assertFalse($name->isRelative());
|
Chris@13
|
114 $this->assertSame('\foo', $name->toCodeString());
|
Chris@0
|
115
|
Chris@0
|
116 $name = new Name\Relative('foo');
|
Chris@0
|
117 $this->assertFalse($name->isUnqualified());
|
Chris@0
|
118 $this->assertFalse($name->isQualified());
|
Chris@0
|
119 $this->assertFalse($name->isFullyQualified());
|
Chris@13
|
120 $this->assertTrue($name->isRelative());
|
Chris@13
|
121 $this->assertSame('namespace\foo', $name->toCodeString());
|
Chris@0
|
122 }
|
Chris@0
|
123
|
Chris@0
|
124 public function testInvalidArg() {
|
Chris@17
|
125 $this->expectException(\InvalidArgumentException::class);
|
Chris@17
|
126 $this->expectExceptionMessage('Expected string, array of parts or Name instance');
|
Chris@0
|
127 Name::concat('foo', new \stdClass);
|
Chris@0
|
128 }
|
Chris@13
|
129
|
Chris@13
|
130 public function testInvalidEmptyString() {
|
Chris@17
|
131 $this->expectException(\InvalidArgumentException::class);
|
Chris@17
|
132 $this->expectExceptionMessage('Name cannot be empty');
|
Chris@13
|
133 new Name('');
|
Chris@13
|
134 }
|
Chris@13
|
135
|
Chris@13
|
136 public function testInvalidEmptyArray() {
|
Chris@17
|
137 $this->expectException(\InvalidArgumentException::class);
|
Chris@17
|
138 $this->expectExceptionMessage('Name cannot be empty');
|
Chris@13
|
139 new Name([]);
|
Chris@13
|
140 }
|
Chris@13
|
141
|
Chris@13
|
142 /** @dataProvider provideTestIsSpecialClassName */
|
Chris@13
|
143 public function testIsSpecialClassName($name, $expected) {
|
Chris@13
|
144 $name = new Name($name);
|
Chris@13
|
145 $this->assertSame($expected, $name->isSpecialClassName());
|
Chris@13
|
146 }
|
Chris@13
|
147
|
Chris@13
|
148 public function provideTestIsSpecialClassName() {
|
Chris@13
|
149 return [
|
Chris@13
|
150 ['self', true],
|
Chris@13
|
151 ['PARENT', true],
|
Chris@13
|
152 ['Static', true],
|
Chris@13
|
153 ['self\not', false],
|
Chris@13
|
154 ['not\self', false],
|
Chris@13
|
155 ];
|
Chris@13
|
156 }
|
Chris@13
|
157 }
|