'ObjectFactoryTestFixture', 'args' => array( function() { return 'unwrapped'; }, ), 'calls' => array( 'setter' => array( function() { return 'unwrapped'; }, ), ), 'closure_expansion' => false, ) ); $this->assertInstanceOf( 'Closure', $obj->args[0] ); $this->assertSame( 'unwrapped', $obj->args[0]() ); $this->assertInstanceOf( 'Closure', $obj->setterArgs[0] ); $this->assertSame( 'unwrapped', $obj->setterArgs[0]() ); } /** * @covers ObjectFactory::getObjectFromSpec */ public function testClosureExpansionEnabled() { $obj = ObjectFactory::getObjectFromSpec( array( 'class' => 'ObjectFactoryTestFixture', 'args' => array( function() { return 'unwrapped'; }, ), 'calls' => array( 'setter' => array( function() { return 'unwrapped'; }, ), ), 'closure_expansion' => true, ) ); $this->assertInternalType( 'string', $obj->args[0] ); $this->assertSame( 'unwrapped', $obj->args[0] ); $this->assertInternalType( 'string', $obj->setterArgs[0] ); $this->assertSame( 'unwrapped', $obj->setterArgs[0] ); $obj = ObjectFactory::getObjectFromSpec( array( 'class' => 'ObjectFactoryTestFixture', 'args' => array( function() { return 'unwrapped'; }, ), 'calls' => array( 'setter' => array( function() { return 'unwrapped'; }, ), ), ) ); $this->assertInternalType( 'string', $obj->args[0] ); $this->assertSame( 'unwrapped', $obj->args[0] ); $this->assertInternalType( 'string', $obj->setterArgs[0] ); $this->assertSame( 'unwrapped', $obj->setterArgs[0] ); } /** * @covers ObjectFactory::constructClassInstance * @dataProvider provideConstructClassInstance */ public function testConstructClassInstance( $args ) { $obj = ObjectFactory::constructClassInstance( 'ObjectFactoryTestFixture', $args ); $this->assertSame( $args, $obj->args ); } public function provideConstructClassInstance() { // These args go to 11. I thought about making 10 one louder, but 11! return array( '0 args' => array( array() ), '1 args' => array( array( 1, ) ), '2 args' => array( array( 1, 2, ) ), '3 args' => array( array( 1, 2, 3, ) ), '4 args' => array( array( 1, 2, 3, 4, ) ), '5 args' => array( array( 1, 2, 3, 4, 5, ) ), '6 args' => array( array( 1, 2, 3, 4, 5, 6, ) ), '7 args' => array( array( 1, 2, 3, 4, 5, 6, 7, ) ), '8 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, ) ), '9 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, 9, ) ), '10 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ) ), '11 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ) ), ); } /** * @expectedException InvalidArgumentException */ public function testNamedArgs() { $args = array( 'foo' => 1, 'bar' => 2, 'baz' => 3 ); $obj = ObjectFactory::constructClassInstance( 'ObjectFactoryTestFixture', $args ); } } class ObjectFactoryTestFixture { public $args; public $setterArgs; public function __construct( /*...*/ ) { $this->args = func_get_args(); } public function setter( /*...*/ ) { $this->setterArgs = func_get_args(); } }