public function testPreInjectedDependency() { $injector = new Phemto(); $wrap = new WrapAnything(new Thing()); $injector->willUse($wrap); $anything = $injector->create('phemto\\acceptance\\WrapAnything'); $this->assertEquals($wrap, $anything); }
public function testDetermineImplementationFromTopContext() { $injector = new Phemto(); $injector->willUse(new Reused(Preference::class)); $injector->whenCreating(HasDependency::class)->forVariable('dependency')->willUse(Preference::class); $object = $injector->create(HasDependency::class); $this->assertSame(spl_object_hash($object->dependency), spl_object_hash($injector->create(Preference::class))); }
function testCanOverridePreferenceWhenInstantiatingFromAnInterface() { $injector = new Phemto(); $injector->whenCreating('phemto\\acceptance\\SpecialInterface')->willUse('phemto\\acceptance\\SpecialImplementation'); $injector->willUse('phemto\\acceptance\\UsualImplementation'); $special = $injector->create('phemto\\acceptance\\SpecialInterface'); $this->assertEquals($special, new ClassWithSpecial(new SpecialImplementation())); }
public function testSameInstanceCanBeReusedWithinFactoryDependingOnObjectParam() { $injector = new Phemto(); $injector->willUse(new ReusedByParam(CreateMeOnceByObjectParam::class, 'dependency')); $dependency = new SomeDependency(); $object1 = $injector->create(CreateMeOnceByObjectParam::class, $dependency); $object2 = $injector->create(CreateMeOnceByObjectParam::class, $dependency); $object3 = $injector->create(CreateMeOnceByObjectParam::class, new SomeDependency()); $this->assertSame($object1, $object2); $this->assertNotSame($object1, $object3); }
function testCanBeConfiguredToPreferSpecificImplementation() { $injector = new Phemto(); $injector->willUse('phemto\\acceptance\\SecondImplementation'); $this->assertInstanceOf('phemto\\acceptance\\SecondImplementation', $injector->create('phemto\\acceptance\\InterfaceWithManyImplementations')); }
<?php use phemto\Phemto; require_once __DIR__ . '/../vendor/autoload.php'; $di = new Phemto(); class Config { public $bar = 'asdf'; } // Would be done during startup once we resolve which config to load. $di->willUse('Config'); class Database { public function __construct(Config $config) { $this->config = $config; } } $di->willUse('Database'); var_dump($di->create('Database'));
function testSameInstanceCanBeReusedWithinFactory() { $injector = new Phemto(); $injector->willUse(new Reused('phemto\\acceptance\\CreateMeOnce')); $this->assertSame($injector->create('phemto\\acceptance\\CreateMeOnce'), $injector->create('phemto\\acceptance\\CreateMeOnce')); }
function testCanBeConfiguredToPreferSpecificSubclass() { $injector = new Phemto(); $injector->willUse('phemto\\acceptance\\SecondSubclass'); $this->assertInstanceOf('phemto\\acceptance\\SecondSubclass', $injector->create('phemto\\acceptance\\ClassWithManySubclasses')); }
function testSameInstanceFromSessionWithinSameProcess() { $injector = new Phemto(); $injector->willUse(new Sessionable('phemto\\acceptance\\SerialiseMe')); $this->assertSame($injector->create('phemto\\acceptance\\SerialiseMe'), $injector->create('phemto\\acceptance\\SerialiseMe')); }
public function testInstantiateBySetters() { $injector = new Phemto(); $injector->forType(WithSetter::class)->call('setDependency'); $injector->willUse(new Graph(WithSetter::class, 'graph1')); $injector->whenCreating(SecondClass::class, 'graph1')->forVariable('property')->useString('second value for graph1'); $object1 = $injector->createGraph(WithSetter::class, 'graph1'); $this->assertEquals('second value for graph1', $object1->dependency->property); }