--- /dev/null
+<?php
+namespace Consolidation\Config\Loader;
+
+use Consolidation\TestUtils\TestLoader;
+
+class ConfigProcessorTest extends \PHPUnit_Framework_TestCase
+{
+ public function testConfigProcessorAdd()
+ {
+ $config1 = [
+ 'c' => 'foo',
+ 'm' => [1],
+ ];
+ $config2 = [
+ 'b' => '${c}bar',
+ 'm' => [2],
+ ];
+ $config3 = [
+ 'a' => '${b}baz',
+ 'm' => [3],
+ ];
+
+ $processor = new ConfigProcessor();
+ $processor->add($config1);
+ $processor->add($config2);
+ $processor->add($config3);
+
+ $data = $processor->export();
+ $this->assertEquals('foo', $data['c']);
+ $this->assertEquals('foobar', $data['b']);
+ $this->assertEquals('foobarbaz', $data['a']);
+ }
+
+ public function processorForConfigMergeTest($provideSourceNames)
+ {
+ $config1 = [
+ 'm' => [
+ 'x' => 'x-1',
+ 'y' => [
+ 'r' => 'r-1',
+ 's' => 's-1',
+ 't' => 't-1',
+ ],
+ 'z' => 'z-1',
+ ],
+ ];
+ $config2 = [
+ 'm' => [
+ 'w' => 'w-2',
+ 'y' => [
+ 'q' => 'q-2',
+ 's' => 's-2',
+ ],
+ 'z' => 'z-2',
+ ],
+ ];
+ $config3 = [
+ 'm' => [
+ 'v' => 'v-3',
+ 'y' => [
+ 't' => 't-3',
+ 'u' => 'u-3',
+ ],
+ 'z' => 'z-3',
+ ],
+ ];
+
+ $processor = new ConfigProcessor();
+ $testLoader = new TestLoader();
+
+ $testLoader->set($config1);
+ $testLoader->setSourceName($provideSourceNames ? 'c-1' : '');
+ $processor->extend($testLoader);
+
+ $testLoader->set($config2);
+ $testLoader->setSourceName($provideSourceNames ? 'c-2' : '');
+ $processor->extend($testLoader);
+
+ $testLoader->set($config3);
+ $testLoader->setSourceName($provideSourceNames ? 'c-3' : '');
+ $processor->extend($testLoader);
+
+ return $processor;
+ }
+
+ public function testConfigProcessorMergeAssociative()
+ {
+ $processor = $this->processorForConfigMergeTest(false);
+ $data = $processor->export();
+ $this->assertEquals('{"m":{"x":"x-1","y":{"r":"r-1","s":"s-2","t":"t-3","q":"q-2","u":"u-3"},"z":"z-3","w":"w-2","v":"v-3"}}', json_encode($data));
+ }
+
+ public function testConfigProcessorMergeAssociativeWithSourceNames()
+ {
+ $processor = $this->processorForConfigMergeTest(true);
+ $sources = $processor->sources();
+ $data = $processor->export();
+ $this->assertEquals('{"m":{"x":"x-1","y":{"r":"r-1","s":"s-2","t":"t-3","q":"q-2","u":"u-3"},"z":"z-3","w":"w-2","v":"v-3"}}', json_encode($data));
+ $this->assertEquals('c-1', $sources['m']['x']);
+ $this->assertEquals('c-1', $sources['m']['y']['r']);
+ $this->assertEquals('c-2', $sources['m']['w']);
+ $this->assertEquals('c-2', $sources['m']['y']['s']);
+ $this->assertEquals('c-3', $sources['m']['z']);
+ $this->assertEquals('c-3', $sources['m']['y']['u']);
+ }
+
+ public function testConfiProcessorSources()
+ {
+ $processor = new ConfigProcessor();
+ $loader = new YamlConfigLoader();
+ $processor->extend($loader->load(__DIR__ . '/data/config-1.yml'));
+ $processor->extend($loader->load(__DIR__ . '/data/config-2.yml'));
+ $processor->extend($loader->load(__DIR__ . '/data/config-3.yml'));
+
+ $sources = $processor->sources();
+
+ $data = $processor->export();
+ $this->assertEquals('foo', $data['c']);
+ $this->assertEquals('foobar', $data['b']);
+ $this->assertEquals('foobarbaz', $data['a']);
+
+ $this->assertEquals('3', $data['m'][0]);
+
+ $this->assertEquals( __DIR__ . '/data/config-3.yml', $sources['a']);
+ $this->assertEquals( __DIR__ . '/data/config-2.yml', $sources['b']);
+ $this->assertEquals( __DIR__ . '/data/config-1.yml', $sources['c']);
+ $this->assertEquals( __DIR__ . '/data/config-3.yml', $sources['m']);
+ }
+
+ public function testConfiProcessorSourcesLoadInReverseOrder()
+ {
+ $processor = new ConfigProcessor();
+ $loader = new YamlConfigLoader();
+ $processor->extend($loader->load(__DIR__ . '/data/config-3.yml'));
+ $processor->extend($loader->load(__DIR__ . '/data/config-2.yml'));
+ $processor->extend($loader->load(__DIR__ . '/data/config-1.yml'));
+
+ $sources = $processor->sources();
+
+ $data = $processor->export();
+ $this->assertEquals('foo', $data['c']);
+ $this->assertEquals('foobar', $data['b']);
+ $this->assertEquals('foobarbaz', $data['a']);
+
+ $this->assertEquals('1', $data['m'][0]);
+
+ $this->assertEquals( __DIR__ . '/data/config-3.yml', $sources['a']);
+ $this->assertEquals( __DIR__ . '/data/config-2.yml', $sources['b']);
+ $this->assertEquals( __DIR__ . '/data/config-1.yml', $sources['c']);
+ $this->assertEquals( __DIR__ . '/data/config-1.yml', $sources['m']);
+ }
+}