123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Config\Tests\Definition\Builder;
- use PHPUnit\Framework\TestCase;
- use Symfony\Component\Config\Definition\Builder\TreeBuilder;
- class ExprBuilderTest extends TestCase
- {
- public function testAlwaysExpression()
- {
- $test = $this->getTestBuilder()
- ->always($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('new_value', $test);
- }
- public function testIfTrueExpression()
- {
- $test = $this->getTestBuilder()
- ->ifTrue()
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('new_value', $test, ['key' => true]);
- $test = $this->getTestBuilder()
- ->ifTrue(function ($v) { return true; })
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('new_value', $test);
- $test = $this->getTestBuilder()
- ->ifTrue(function ($v) { return false; })
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('value', $test);
- }
- public function testIfStringExpression()
- {
- $test = $this->getTestBuilder()
- ->ifString()
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('new_value', $test);
- $test = $this->getTestBuilder()
- ->ifString()
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs(45, $test, ['key' => 45]);
- }
- public function testIfNullExpression()
- {
- $test = $this->getTestBuilder()
- ->ifNull()
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('new_value', $test, ['key' => null]);
- $test = $this->getTestBuilder()
- ->ifNull()
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('value', $test);
- }
- public function testIfEmptyExpression()
- {
- $test = $this->getTestBuilder()
- ->ifEmpty()
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('new_value', $test, ['key' => []]);
- $test = $this->getTestBuilder()
- ->ifEmpty()
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('value', $test);
- }
- public function testIfArrayExpression()
- {
- $test = $this->getTestBuilder()
- ->ifArray()
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('new_value', $test, ['key' => []]);
- $test = $this->getTestBuilder()
- ->ifArray()
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('value', $test);
- }
- public function testIfInArrayExpression()
- {
- $test = $this->getTestBuilder()
- ->ifInArray(['foo', 'bar', 'value'])
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('new_value', $test);
- $test = $this->getTestBuilder()
- ->ifInArray(['foo', 'bar'])
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('value', $test);
- }
- public function testIfNotInArrayExpression()
- {
- $test = $this->getTestBuilder()
- ->ifNotInArray(['foo', 'bar'])
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('new_value', $test);
- $test = $this->getTestBuilder()
- ->ifNotInArray(['foo', 'bar', 'value_from_config'])
- ->then($this->returnClosure('new_value'))
- ->end();
- $this->assertFinalizedValueIs('new_value', $test);
- }
- public function testThenEmptyArrayExpression()
- {
- $test = $this->getTestBuilder()
- ->ifString()
- ->thenEmptyArray()
- ->end();
- $this->assertFinalizedValueIs([], $test);
- }
- /**
- * @dataProvider castToArrayValues
- */
- public function testcastToArrayExpression($configValue, $expectedValue)
- {
- $test = $this->getTestBuilder()
- ->castToArray()
- ->end();
- $this->assertFinalizedValueIs($expectedValue, $test, ['key' => $configValue]);
- }
- public function castToArrayValues()
- {
- yield ['value', ['value']];
- yield [-3.14, [-3.14]];
- yield [null, [null]];
- yield [['value'], ['value']];
- }
- /**
- * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
- */
- public function testThenInvalid()
- {
- $test = $this->getTestBuilder()
- ->ifString()
- ->thenInvalid('Invalid value')
- ->end();
- $this->finalizeTestBuilder($test);
- }
- public function testThenUnsetExpression()
- {
- $test = $this->getTestBuilder()
- ->ifString()
- ->thenUnset()
- ->end();
- $this->assertEquals([], $this->finalizeTestBuilder($test));
- }
- /**
- * @expectedException \RuntimeException
- * @expectedExceptionMessage You must specify an if part.
- */
- public function testEndIfPartNotSpecified()
- {
- $this->getTestBuilder()->end();
- }
- /**
- * @expectedException \RuntimeException
- * @expectedExceptionMessage You must specify a then part.
- */
- public function testEndThenPartNotSpecified()
- {
- $builder = $this->getTestBuilder();
- $builder->ifPart = 'test';
- $builder->end();
- }
- /**
- * Create a test treebuilder with a variable node, and init the validation.
- *
- * @return TreeBuilder
- */
- protected function getTestBuilder()
- {
- $builder = new TreeBuilder('test');
- return $builder
- ->getRootNode()
- ->children()
- ->variableNode('key')
- ->validate()
- ;
- }
- /**
- * Close the validation process and finalize with the given config.
- *
- * @param TreeBuilder $testBuilder The tree builder to finalize
- * @param array $config The config you want to use for the finalization, if nothing provided
- * a simple ['key'=>'value'] will be used
- *
- * @return array The finalized config values
- */
- protected function finalizeTestBuilder($testBuilder, $config = null)
- {
- return $testBuilder
- ->end()
- ->end()
- ->end()
- ->buildTree()
- ->finalize(null === $config ? ['key' => 'value'] : $config)
- ;
- }
- /**
- * Return a closure that will return the given value.
- *
- * @param mixed $val The value that the closure must return
- *
- * @return \Closure
- */
- protected function returnClosure($val)
- {
- return function ($v) use ($val) {
- return $val;
- };
- }
- /**
- * Assert that the given test builder, will return the given value.
- *
- * @param mixed $value The value to test
- * @param TreeBuilder $treeBuilder The tree builder to finalize
- * @param mixed $config The config values that new to be finalized
- */
- protected function assertFinalizedValueIs($value, $treeBuilder, $config = null)
- {
- $this->assertEquals(['key' => $value], $this->finalizeTestBuilder($treeBuilder, $config));
- }
- }
|