Chris@13: builder = new Interface_('Contract'); Chris@0: } Chris@0: Chris@0: private function dump($node) { Chris@0: $pp = new \PhpParser\PrettyPrinter\Standard; Chris@13: return $pp->prettyPrint([$node]); Chris@0: } Chris@0: Chris@0: public function testEmpty() { Chris@0: $contract = $this->builder->getNode(); Chris@13: $this->assertInstanceOf(Stmt\Interface_::class, $contract); Chris@13: $this->assertEquals(new Node\Identifier('Contract'), $contract->name); Chris@0: } Chris@0: Chris@0: public function testExtending() { Chris@0: $contract = $this->builder->extend('Space\Root1', 'Root2')->getNode(); Chris@0: $this->assertEquals( Chris@13: new Stmt\Interface_('Contract', [ Chris@13: 'extends' => [ Chris@0: new Node\Name('Space\Root1'), Chris@0: new Node\Name('Root2') Chris@13: ], Chris@13: ]), $contract Chris@0: ); Chris@0: } Chris@0: Chris@0: public function testAddMethod() { Chris@0: $method = new Stmt\ClassMethod('doSomething'); Chris@0: $contract = $this->builder->addStmt($method)->getNode(); Chris@13: $this->assertSame([$method], $contract->stmts); Chris@0: } Chris@0: Chris@0: public function testAddConst() { Chris@13: $const = new Stmt\ClassConst([ Chris@0: new Node\Const_('SPEED_OF_LIGHT', new DNumber(299792458.0)) Chris@13: ]); Chris@0: $contract = $this->builder->addStmt($const)->getNode(); Chris@0: $this->assertSame(299792458.0, $contract->stmts[0]->consts[0]->value->value); Chris@0: } Chris@0: Chris@0: public function testOrder() { Chris@13: $const = new Stmt\ClassConst([ Chris@0: new Node\Const_('SPEED_OF_LIGHT', new DNumber(299792458)) Chris@13: ]); Chris@0: $method = new Stmt\ClassMethod('doSomething'); Chris@0: $contract = $this->builder Chris@0: ->addStmt($method) Chris@0: ->addStmt($const) Chris@0: ->getNode() Chris@0: ; Chris@0: Chris@13: $this->assertInstanceOf(Stmt\ClassConst::class, $contract->stmts[0]); Chris@13: $this->assertInstanceOf(Stmt\ClassMethod::class, $contract->stmts[1]); Chris@0: } Chris@0: Chris@0: public function testDocComment() { Chris@0: $node = $this->builder Chris@0: ->setDocComment('/** Test */') Chris@0: ->getNode(); Chris@0: Chris@13: $this->assertEquals(new Stmt\Interface_('Contract', [], [ Chris@13: 'comments' => [new Comment\Doc('/** Test */')] Chris@13: ]), $node); Chris@0: } Chris@0: Chris@0: public function testInvalidStmtError() { Chris@17: $this->expectException(\LogicException::class); Chris@17: $this->expectExceptionMessage('Unexpected node of type "Stmt_PropertyProperty"'); Chris@0: $this->builder->addStmt(new Stmt\PropertyProperty('invalid')); Chris@0: } Chris@0: Chris@0: public function testFullFunctional() { Chris@13: $const = new Stmt\ClassConst([ Chris@0: new Node\Const_('SPEED_OF_LIGHT', new DNumber(299792458)) Chris@13: ]); Chris@0: $method = new Stmt\ClassMethod('doSomething'); Chris@0: $contract = $this->builder Chris@0: ->addStmt($method) Chris@0: ->addStmt($const) Chris@0: ->getNode() Chris@0: ; Chris@0: Chris@0: eval($this->dump($contract)); Chris@0: Chris@0: $this->assertTrue(interface_exists('Contract', false)); Chris@0: } Chris@0: }