--- /dev/null
+<?php
+
+namespace PhpParser;
+
+use PhpParser\Node\Expr;
+
+class BuilderFactoryTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @dataProvider provideTestFactory
+ */
+ public function testFactory($methodName, $className) {
+ $factory = new BuilderFactory;
+ $this->assertInstanceOf($className, $factory->$methodName('test'));
+ }
+
+ public function provideTestFactory() {
+ return array(
+ array('namespace', 'PhpParser\Builder\Namespace_'),
+ array('class', 'PhpParser\Builder\Class_'),
+ array('interface', 'PhpParser\Builder\Interface_'),
+ array('trait', 'PhpParser\Builder\Trait_'),
+ array('method', 'PhpParser\Builder\Method'),
+ array('function', 'PhpParser\Builder\Function_'),
+ array('property', 'PhpParser\Builder\Property'),
+ array('param', 'PhpParser\Builder\Param'),
+ array('use', 'PhpParser\Builder\Use_'),
+ );
+ }
+
+ public function testNonExistingMethod() {
+ $this->setExpectedException('LogicException', 'Method "foo" does not exist');
+ $factory = new BuilderFactory();
+ $factory->foo();
+ }
+
+ public function testIntegration() {
+ $factory = new BuilderFactory;
+ $node = $factory->namespace('Name\Space')
+ ->addStmt($factory->use('Foo\Bar\SomeOtherClass'))
+ ->addStmt($factory->use('Foo\Bar')->as('A'))
+ ->addStmt($factory
+ ->class('SomeClass')
+ ->extend('SomeOtherClass')
+ ->implement('A\Few', '\Interfaces')
+ ->makeAbstract()
+
+ ->addStmt($factory->method('firstMethod'))
+
+ ->addStmt($factory->method('someMethod')
+ ->makePublic()
+ ->makeAbstract()
+ ->addParam($factory->param('someParam')->setTypeHint('SomeClass'))
+ ->setDocComment('/**
+ * This method does something.
+ *
+ * @param SomeClass And takes a parameter
+ */'))
+
+ ->addStmt($factory->method('anotherMethod')
+ ->makeProtected()
+ ->addParam($factory->param('someParam')->setDefault('test'))
+ ->addStmt(new Expr\Print_(new Expr\Variable('someParam'))))
+
+ ->addStmt($factory->property('someProperty')->makeProtected())
+ ->addStmt($factory->property('anotherProperty')
+ ->makePrivate()
+ ->setDefault(array(1, 2, 3))))
+ ->getNode()
+ ;
+
+ $expected = <<<'EOC'
+<?php
+
+namespace Name\Space;
+
+use Foo\Bar\SomeOtherClass;
+use Foo\Bar as A;
+abstract class SomeClass extends SomeOtherClass implements A\Few, \Interfaces
+{
+ protected $someProperty;
+ private $anotherProperty = array(1, 2, 3);
+ function firstMethod()
+ {
+ }
+ /**
+ * This method does something.
+ *
+ * @param SomeClass And takes a parameter
+ */
+ public abstract function someMethod(SomeClass $someParam);
+ protected function anotherMethod($someParam = 'test')
+ {
+ print $someParam;
+ }
+}
+EOC;
+
+ $stmts = array($node);
+ $prettyPrinter = new PrettyPrinter\Standard();
+ $generated = $prettyPrinter->prettyPrintFile($stmts);
+
+ $this->assertEquals(
+ str_replace("\r\n", "\n", $expected),
+ str_replace("\r\n", "\n", $generated)
+ );
+ }
+}