function testExplicitlyNamedVariables()
 {
     $injector = new Phemto();
     $injector->forVariable('first')->willUse('phemto\\acceptance\\NeededForFirst');
     $injector->forVariable('second')->willUse('phemto\\acceptance\\NeededForSecond');
     $this->assertEquals($injector->create('phemto\\acceptance\\VariablesInConstructor'), new VariablesInConstructor(new NeededForFirst(), new NeededForSecond()));
 }
 public function testUsingApplicationConfigValue()
 {
     $injector = new Phemto();
     $injector->forVariable(ConfigValue::CONFIG_NAME)->willUse(SomeApplicationConfig::class);
     $injector->forVariable('property')->useConfig('config_param1');
     $object = $injector->create(SomeClassNeedConfigValue::class);
     $this->assertEquals((new SomeApplicationConfig())->data['config_param1'], $object->property);
 }
 public function testInstantiateListOfDependenciesDeclareInTopContext()
 {
     $injector = new Phemto();
     $injector->forVariable('dependencies')->willUse(new ListOf(AutomaticallyInstantiatedDependency::class));
     $object = $injector->create(RequiresDependencies::class);
     $this->assertInstanceOf(AutomaticallyInstantiatedDependency::class, $object->dependencies[0]);
 }
 function testSetterInjectionStopsAtFirstMissingArgument()
 {
     $injector = new Phemto();
     $injector->forVariable('maybe')->willUse('phemto\\acceptance\\MaybeThis');
     $injector->forVariable('unlikely')->willUse('phemto\\acceptance\\MaybeThis');
     $injector->forType('phemto\\acceptance\\OptionalArgumentsInSetter')->call('readyToGo');
     $expected = new OptionalArgumentsInSetter();
     $expected->readyToGo(new MaybeThis(), null, new MaybeThis());
     $this->assertEquals($injector->create('phemto\\acceptance\\OptionalArgumentsInSetter'), $expected);
 }
 function testInjectingString()
 {
     $injector = new Phemto();
     $injector->forVariable('thing')->useString('100');
     $this->assertEquals($injector->create('phemto\\acceptance\\WrapAnything'), new WrapAnything('100'));
 }