Chris@13: createClassBuilder('SomeLogger') Chris@0: ->extend('BaseLogger') Chris@0: ->implement('Namespaced\Logger', new Name('SomeInterface')) Chris@0: ->implement('\Fully\Qualified', 'namespace\NamespaceRelative') Chris@0: ->getNode() Chris@0: ; Chris@0: Chris@0: $this->assertEquals( Chris@13: new Stmt\Class_('SomeLogger', [ Chris@0: 'extends' => new Name('BaseLogger'), Chris@13: 'implements' => [ Chris@0: new Name('Namespaced\Logger'), Chris@0: new Name('SomeInterface'), Chris@0: new Name\FullyQualified('Fully\Qualified'), Chris@0: new Name\Relative('NamespaceRelative'), Chris@13: ], Chris@13: ]), Chris@0: $node Chris@0: ); Chris@0: } Chris@0: Chris@0: public function testAbstract() { Chris@0: $node = $this->createClassBuilder('Test') Chris@0: ->makeAbstract() Chris@0: ->getNode() Chris@0: ; Chris@0: Chris@0: $this->assertEquals( Chris@13: new Stmt\Class_('Test', [ Chris@0: 'flags' => Stmt\Class_::MODIFIER_ABSTRACT Chris@13: ]), Chris@0: $node Chris@0: ); Chris@0: } Chris@0: Chris@0: public function testFinal() { Chris@0: $node = $this->createClassBuilder('Test') Chris@0: ->makeFinal() Chris@0: ->getNode() Chris@0: ; Chris@0: Chris@0: $this->assertEquals( Chris@13: new Stmt\Class_('Test', [ Chris@0: 'flags' => Stmt\Class_::MODIFIER_FINAL Chris@13: ]), Chris@0: $node Chris@0: ); Chris@0: } Chris@0: Chris@0: public function testStatementOrder() { Chris@0: $method = new Stmt\ClassMethod('testMethod'); Chris@0: $property = new Stmt\Property( Chris@0: Stmt\Class_::MODIFIER_PUBLIC, Chris@13: [new Stmt\PropertyProperty('testProperty')] Chris@0: ); Chris@13: $const = new Stmt\ClassConst([ Chris@0: new Node\Const_('TEST_CONST', new Node\Scalar\String_('ABC')) Chris@13: ]); Chris@13: $use = new Stmt\TraitUse([new Name('SomeTrait')]); Chris@0: Chris@0: $node = $this->createClassBuilder('Test') Chris@0: ->addStmt($method) Chris@0: ->addStmt($property) Chris@13: ->addStmts([$const, $use]) Chris@0: ->getNode() Chris@0: ; Chris@0: Chris@0: $this->assertEquals( Chris@13: new Stmt\Class_('Test', [ Chris@13: 'stmts' => [$use, $const, $property, $method] Chris@13: ]), Chris@0: $node Chris@0: ); Chris@0: } Chris@0: Chris@0: public function testDocComment() { Chris@0: $docComment = <<<'DOC' Chris@0: /** Chris@0: * Test Chris@0: */ Chris@0: DOC; Chris@0: $class = $this->createClassBuilder('Test') Chris@0: ->setDocComment($docComment) Chris@0: ->getNode(); Chris@0: Chris@0: $this->assertEquals( Chris@13: new Stmt\Class_('Test', [], [ Chris@13: 'comments' => [ Chris@0: new Comment\Doc($docComment) Chris@13: ] Chris@13: ]), Chris@0: $class Chris@0: ); Chris@0: Chris@0: $class = $this->createClassBuilder('Test') Chris@0: ->setDocComment(new Comment\Doc($docComment)) Chris@0: ->getNode(); Chris@0: Chris@0: $this->assertEquals( Chris@13: new Stmt\Class_('Test', [], [ Chris@13: 'comments' => [ Chris@0: new Comment\Doc($docComment) Chris@13: ] Chris@13: ]), Chris@0: $class Chris@0: ); Chris@0: } Chris@0: Chris@0: public function testInvalidStmtError() { Chris@17: $this->expectException(\LogicException::class); Chris@17: $this->expectExceptionMessage('Unexpected node of type "Stmt_Echo"'); Chris@0: $this->createClassBuilder('Test') Chris@13: ->addStmt(new Stmt\Echo_([])) Chris@0: ; Chris@0: } Chris@0: Chris@0: public function testInvalidDocComment() { Chris@17: $this->expectException(\LogicException::class); Chris@17: $this->expectExceptionMessage('Doc comment must be a string or an instance of PhpParser\Comment\Doc'); Chris@0: $this->createClassBuilder('Test') Chris@0: ->setDocComment(new Comment('Test')); Chris@0: } Chris@0: Chris@0: public function testEmptyName() { Chris@17: $this->expectException(\LogicException::class); Chris@17: $this->expectExceptionMessage('Name cannot be empty'); Chris@0: $this->createClassBuilder('Test') Chris@0: ->extend(''); Chris@0: } Chris@0: Chris@0: public function testInvalidName() { Chris@17: $this->expectException(\LogicException::class); Chris@17: $this->expectExceptionMessage('Name must be a string or an instance of Node\Name'); Chris@0: $this->createClassBuilder('Test') Chris@13: ->extend(['Foo']); Chris@0: } Chris@0: }