* @since 2.0 * @group di */ class ServiceLocatorTest extends TestCase { public function testCallable() { // anonymous function $container = new ServiceLocator; $className = TestClass::className(); $container->set($className, function () { return new TestClass([ 'prop1' => 100, 'prop2' => 200, ]); }); $object = $container->get($className); $this->assertTrue($object instanceof $className); $this->assertEquals(100, $object->prop1); $this->assertEquals(200, $object->prop2); // static method $container = new ServiceLocator; $className = TestClass::className(); $container->set($className, [__NAMESPACE__ . "\\Creator", 'create']); $object = $container->get($className); $this->assertTrue($object instanceof $className); $this->assertEquals(1, $object->prop1); $this->assertNull($object->prop2); } public function testObject() { $object = new TestClass; $className = TestClass::className(); $container = new ServiceLocator; $container->set($className, $object); $this->assertTrue($container->get($className) === $object); } public function testShared() { // with configuration: shared $container = new ServiceLocator; $className = TestClass::className(); $container->set($className, [ 'class' => $className, 'prop1' => 10, 'prop2' => 20, ]); $object = $container->get($className); $this->assertEquals(10, $object->prop1); $this->assertEquals(20, $object->prop2); $this->assertTrue($object instanceof $className); // check shared $object2 = $container->get($className); $this->assertTrue($object2 instanceof $className); $this->assertTrue($object === $object2); } }