--- /dev/null
+<?php
+namespace Consolidation\Config\Inject;
+
+use Consolidation\Config\Config;
+use Consolidation\TestUtils\ApplyConfigTestTarget;
+
+class ConfigForSettersTest extends \PHPUnit_Framework_TestCase
+{
+ public function testApplyConfig()
+ {
+ $data = [
+ // Define some configuration settings for the configuration
+ // of some task \My\Tasks\Operations\Frobulate.
+ 'task' => [
+ 'Operations' => [
+ // task.Operations.settings apply to all tasks in
+ // any *.Tass.Operations namespace.
+ 'settings' => [
+ 'dir' => '/base/dir',
+ ],
+ 'Frobulate' => [
+ // task.Operations.Frobulate.settings applies only
+ // the Frobulate task.
+ 'settings' => [
+ 'dir' => '/override/dir',
+ ],
+ ],
+ ],
+ ],
+ ];
+ $config = new Config($data);
+
+ $applicator = new ConfigForSetters($config, 'Operations.Frobulate', 'task.');
+
+ $testTarget = new ApplyConfigTestTarget();
+
+ $applicator->apply($testTarget, 'settings');
+
+ $this->assertEquals('/override/dir', $testTarget->getDir());
+ $this->assertEquals(null, $testTarget->getBad());
+ }
+
+ public function testApplyBadConfig()
+ {
+ $data = [
+ // Define some configuration settings for the configuration
+ // of some task \My\Tasks\Operations\Frobulate.
+ 'task' => [
+ 'Operations' => [
+ // task.Operations.settings apply to all tasks in
+ // any *.Tass.Operations namespace.
+ 'settings' => [
+ 'dir' => '/base/dir',
+ ],
+ 'Frobulate' => [
+ // task.Operations.Frobulate.settings applies only
+ // the Frobulate task.
+ 'settings' => [
+ 'bad' => 'fire truck',
+ ],
+ ],
+ ],
+ ],
+ ];
+ $config = new Config($data);
+
+ $applicator = new ConfigForSetters($config, 'Operations.Frobulate', 'task.');
+
+ $testTarget = new ApplyConfigTestTarget();
+
+ $exceptionMessage = '';
+ try
+ {
+ $applicator->apply($testTarget, 'settings');
+ }
+ catch (\Exception $e)
+ {
+ $exceptionMessage = $e->getMessage();
+ }
+ // We would prefer it if bad methods were never called; unfortunately,
+ // declaring the return type of a method cannot be done in a reliable
+ // way (via reflection) until php 7, so we allow these methods to be
+ // called for now.
+ $this->assertEquals('fire truck', $testTarget->getBad());
+ $this->assertEquals('Consolidation\\TestUtils\\ApplyConfigTestTarget::bad did not return \'$this\' when processing task.Operations.Frobulate.settings.', $exceptionMessage);
+ }
+}