Chris@13: assertSame(['foo', 'bar'], $name->parts); Chris@0: Chris@0: $name = new Name('foo\bar'); Chris@13: $this->assertSame(['foo', 'bar'], $name->parts); Chris@0: Chris@0: $name = new Name($name); Chris@13: $this->assertSame(['foo', 'bar'], $name->parts); Chris@0: } Chris@0: Chris@0: public function testGet() { Chris@0: $name = new Name('foo'); Chris@0: $this->assertSame('foo', $name->getFirst()); Chris@0: $this->assertSame('foo', $name->getLast()); Chris@0: Chris@0: $name = new Name('foo\bar'); Chris@0: $this->assertSame('foo', $name->getFirst()); Chris@0: $this->assertSame('bar', $name->getLast()); Chris@0: } Chris@0: Chris@0: public function testToString() { Chris@13: $name = new Name('Foo\Bar'); Chris@0: Chris@13: $this->assertSame('Foo\Bar', (string) $name); Chris@13: $this->assertSame('Foo\Bar', $name->toString()); Chris@13: $this->assertSame('foo\bar', $name->toLowerString()); Chris@0: } Chris@0: Chris@0: public function testSlice() { Chris@0: $name = new Name('foo\bar\baz'); Chris@0: $this->assertEquals(new Name('foo\bar\baz'), $name->slice(0)); Chris@0: $this->assertEquals(new Name('bar\baz'), $name->slice(1)); Chris@0: $this->assertNull($name->slice(3)); Chris@0: $this->assertEquals(new Name('foo\bar\baz'), $name->slice(-3)); Chris@0: $this->assertEquals(new Name('bar\baz'), $name->slice(-2)); Chris@0: $this->assertEquals(new Name('foo\bar'), $name->slice(0, -1)); Chris@0: $this->assertNull($name->slice(0, -3)); Chris@0: $this->assertEquals(new Name('bar'), $name->slice(1, -1)); Chris@0: $this->assertNull($name->slice(1, -2)); Chris@0: $this->assertEquals(new Name('bar'), $name->slice(-2, 1)); Chris@0: $this->assertEquals(new Name('bar'), $name->slice(-2, -1)); Chris@0: $this->assertNull($name->slice(-2, -2)); Chris@0: } Chris@0: Chris@0: public function testSliceOffsetTooLarge() { Chris@17: $this->expectException(\OutOfBoundsException::class); Chris@17: $this->expectExceptionMessage('Offset 4 is out of bounds'); Chris@0: (new Name('foo\bar\baz'))->slice(4); Chris@0: } Chris@0: Chris@0: public function testSliceOffsetTooSmall() { Chris@17: $this->expectException(\OutOfBoundsException::class); Chris@17: $this->expectExceptionMessage('Offset -4 is out of bounds'); Chris@0: (new Name('foo\bar\baz'))->slice(-4); Chris@0: } Chris@0: Chris@0: public function testSliceLengthTooLarge() { Chris@17: $this->expectException(\OutOfBoundsException::class); Chris@17: $this->expectExceptionMessage('Length 4 is out of bounds'); Chris@0: (new Name('foo\bar\baz'))->slice(0, 4); Chris@0: } Chris@0: Chris@0: public function testSliceLengthTooSmall() { Chris@17: $this->expectException(\OutOfBoundsException::class); Chris@17: $this->expectExceptionMessage('Length -4 is out of bounds'); Chris@0: (new Name('foo\bar\baz'))->slice(0, -4); Chris@0: } Chris@0: Chris@0: public function testConcat() { Chris@0: $this->assertEquals(new Name('foo\bar\baz'), Name::concat('foo', 'bar\baz')); Chris@0: $this->assertEquals( Chris@0: new Name\FullyQualified('foo\bar'), Chris@0: Name\FullyQualified::concat(['foo'], new Name('bar')) Chris@0: ); Chris@0: Chris@0: $attributes = ['foo' => 'bar']; Chris@0: $this->assertEquals( Chris@0: new Name\Relative('foo\bar\baz', $attributes), Chris@0: Name\Relative::concat(new Name\FullyQualified('foo\bar'), 'baz', $attributes) Chris@0: ); Chris@0: Chris@0: $this->assertEquals(new Name('foo'), Name::concat(null, 'foo')); Chris@0: $this->assertEquals(new Name('foo'), Name::concat('foo', null)); Chris@0: $this->assertNull(Name::concat(null, null)); Chris@0: } Chris@0: Chris@13: public function testNameTypes() { Chris@0: $name = new Name('foo'); Chris@13: $this->assertTrue($name->isUnqualified()); Chris@0: $this->assertFalse($name->isQualified()); Chris@0: $this->assertFalse($name->isFullyQualified()); Chris@0: $this->assertFalse($name->isRelative()); Chris@13: $this->assertSame('foo', $name->toCodeString()); Chris@0: Chris@0: $name = new Name('foo\bar'); Chris@0: $this->assertFalse($name->isUnqualified()); Chris@13: $this->assertTrue($name->isQualified()); Chris@0: $this->assertFalse($name->isFullyQualified()); Chris@0: $this->assertFalse($name->isRelative()); Chris@13: $this->assertSame('foo\bar', $name->toCodeString()); Chris@0: Chris@0: $name = new Name\FullyQualified('foo'); Chris@0: $this->assertFalse($name->isUnqualified()); Chris@0: $this->assertFalse($name->isQualified()); Chris@13: $this->assertTrue($name->isFullyQualified()); Chris@0: $this->assertFalse($name->isRelative()); Chris@13: $this->assertSame('\foo', $name->toCodeString()); Chris@0: Chris@0: $name = new Name\Relative('foo'); Chris@0: $this->assertFalse($name->isUnqualified()); Chris@0: $this->assertFalse($name->isQualified()); Chris@0: $this->assertFalse($name->isFullyQualified()); Chris@13: $this->assertTrue($name->isRelative()); Chris@13: $this->assertSame('namespace\foo', $name->toCodeString()); Chris@0: } Chris@0: Chris@0: public function testInvalidArg() { Chris@17: $this->expectException(\InvalidArgumentException::class); Chris@17: $this->expectExceptionMessage('Expected string, array of parts or Name instance'); Chris@0: Name::concat('foo', new \stdClass); Chris@0: } Chris@13: Chris@13: public function testInvalidEmptyString() { Chris@17: $this->expectException(\InvalidArgumentException::class); Chris@17: $this->expectExceptionMessage('Name cannot be empty'); Chris@13: new Name(''); Chris@13: } Chris@13: Chris@13: public function testInvalidEmptyArray() { Chris@17: $this->expectException(\InvalidArgumentException::class); Chris@17: $this->expectExceptionMessage('Name cannot be empty'); Chris@13: new Name([]); Chris@13: } Chris@13: Chris@13: /** @dataProvider provideTestIsSpecialClassName */ Chris@13: public function testIsSpecialClassName($name, $expected) { Chris@13: $name = new Name($name); Chris@13: $this->assertSame($expected, $name->isSpecialClassName()); Chris@13: } Chris@13: Chris@13: public function provideTestIsSpecialClassName() { Chris@13: return [ Chris@13: ['self', true], Chris@13: ['PARENT', true], Chris@13: ['Static', true], Chris@13: ['self\not', false], Chris@13: ['not\self', false], Chris@13: ]; Chris@13: } Chris@13: }