4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\OptionsResolver\Tests
;
14 use Symfony\Component\OptionsResolver\Options
;
16 class OptionsTest
extends \PHPUnit_Framework_TestCase
23 protected function setUp()
25 $this->options
= new Options();
28 public function testArrayAccess()
30 $this->assertFalse(isset($this->options
['foo']));
31 $this->assertFalse(isset($this->options
['bar']));
33 $this->options
['foo'] = 0;
34 $this->options
['bar'] = 1;
36 $this->assertTrue(isset($this->options
['foo']));
37 $this->assertTrue(isset($this->options
['bar']));
39 unset($this->options
['bar']);
41 $this->assertTrue(isset($this->options
['foo']));
42 $this->assertFalse(isset($this->options
['bar']));
43 $this->assertEquals(0, $this->options
['foo']);
46 public function testCountable()
48 $this->options
->set('foo', 0);
49 $this->options
->set('bar', 1);
51 $this->assertCount(2, $this->options
);
55 * @expectedException \OutOfBoundsException
57 public function testGetNonExisting()
59 $this->options
->get('foo');
63 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
65 public function testSetNotSupportedAfterGet()
67 $this->options
->set('foo', 'bar');
68 $this->options
->get('foo');
69 $this->options
->set('foo', 'baz');
73 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
75 public function testRemoveNotSupportedAfterGet()
77 $this->options
->set('foo', 'bar');
78 $this->options
->get('foo');
79 $this->options
->remove('foo');
83 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
85 public function testSetNormalizerNotSupportedAfterGet()
87 $this->options
->set('foo', 'bar');
88 $this->options
->get('foo');
89 $this->options
->setNormalizer('foo', function () {});
92 public function testSetLazyOption()
96 $this->options
->set('foo', function (Options
$options) use ($test) {
100 $this->assertEquals('dynamic', $this->options
->get('foo'));
103 public function testSetDiscardsPreviousValue()
107 // defined by superclass
108 $this->options
->set('foo', 'bar');
110 // defined by subclass
111 $this->options
->set('foo', function (Options
$options, $previousValue) use ($test) {
112 /* @var \PHPUnit_Framework_TestCase $test */
113 $test->assertNull($previousValue);
118 $this->assertEquals('dynamic', $this->options
->get('foo'));
121 public function testOverloadKeepsPreviousValue()
125 // defined by superclass
126 $this->options
->set('foo', 'bar');
128 // defined by subclass
129 $this->options
->overload('foo', function (Options
$options, $previousValue) use ($test) {
130 /* @var \PHPUnit_Framework_TestCase $test */
131 $test->assertEquals('bar', $previousValue);
136 $this->assertEquals('dynamic', $this->options
->get('foo'));
139 public function testPreviousValueIsEvaluatedIfLazy()
143 // defined by superclass
144 $this->options
->set('foo', function (Options
$options) {
148 // defined by subclass
149 $this->options
->overload('foo', function (Options
$options, $previousValue) use ($test) {
150 /* @var \PHPUnit_Framework_TestCase $test */
151 $test->assertEquals('bar', $previousValue);
156 $this->assertEquals('dynamic', $this->options
->get('foo'));
159 public function testPreviousValueIsNotEvaluatedIfNoSecondArgument()
163 // defined by superclass
164 $this->options
->set('foo', function (Options
$options) use ($test) {
165 $test->fail('Should not be called');
168 // defined by subclass, no $previousValue argument defined!
169 $this->options
->overload('foo', function (Options
$options) use ($test) {
173 $this->assertEquals('dynamic', $this->options
->get('foo'));
176 public function testLazyOptionCanAccessOtherOptions()
180 $this->options
->set('foo', 'bar');
182 $this->options
->set('bam', function (Options
$options) use ($test) {
183 /* @var \PHPUnit_Framework_TestCase $test */
184 $test->assertEquals('bar', $options->get('foo'));
189 $this->assertEquals('bar', $this->options
->get('foo'));
190 $this->assertEquals('dynamic', $this->options
->get('bam'));
193 public function testLazyOptionCanAccessOtherLazyOptions()
197 $this->options
->set('foo', function (Options
$options) {
201 $this->options
->set('bam', function (Options
$options) use ($test) {
202 /* @var \PHPUnit_Framework_TestCase $test */
203 $test->assertEquals('bar', $options->get('foo'));
208 $this->assertEquals('bar', $this->options
->get('foo'));
209 $this->assertEquals('dynamic', $this->options
->get('bam'));
212 public function testNormalizer()
214 $this->options
->set('foo', 'bar');
216 $this->options
->setNormalizer('foo', function () {
220 $this->assertEquals('normalized', $this->options
->get('foo'));
223 public function testNormalizerReceivesUnnormalizedValue()
225 $this->options
->set('foo', 'bar');
227 $this->options
->setNormalizer('foo', function (Options
$options, $value) {
228 return 'normalized['.$value.']';
231 $this->assertEquals('normalized[bar]', $this->options
->get('foo'));
234 public function testNormalizerCanAccessOtherOptions()
238 $this->options
->set('foo', 'bar');
239 $this->options
->set('bam', 'baz');
241 $this->options
->setNormalizer('bam', function (Options
$options) use ($test) {
242 /* @var \PHPUnit_Framework_TestCase $test */
243 $test->assertEquals('bar', $options->get('foo'));
248 $this->assertEquals('bar', $this->options
->get('foo'));
249 $this->assertEquals('normalized', $this->options
->get('bam'));
252 public function testNormalizerCanAccessOtherLazyOptions()
256 $this->options
->set('foo', function (Options
$options) {
259 $this->options
->set('bam', 'baz');
261 $this->options
->setNormalizer('bam', function (Options
$options) use ($test) {
262 /* @var \PHPUnit_Framework_TestCase $test */
263 $test->assertEquals('bar', $options->get('foo'));
268 $this->assertEquals('bar', $this->options
->get('foo'));
269 $this->assertEquals('normalized', $this->options
->get('bam'));
273 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
275 public function testFailForCyclicDependencies()
277 $this->options
->set('foo', function (Options
$options) {
278 $options->get('bam');
281 $this->options
->set('bam', function (Options
$options) {
282 $options->get('foo');
285 $this->options
->get('foo');
289 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
291 public function testFailForCyclicDependenciesBetweenNormalizers()
293 $this->options
->set('foo', 'bar');
294 $this->options
->set('bam', 'baz');
296 $this->options
->setNormalizer('foo', function (Options
$options) {
297 $options->get('bam');
300 $this->options
->setNormalizer('bam', function (Options
$options) {
301 $options->get('foo');
304 $this->options
->get('foo');
308 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
310 public function testFailForCyclicDependenciesBetweenNormalizerAndLazyOption()
312 $this->options
->set('foo', function (Options
$options) {
313 $options->get('bam');
315 $this->options
->set('bam', 'baz');
317 $this->options
->setNormalizer('bam', function (Options
$options) {
318 $options->get('foo');
321 $this->options
->get('foo');
324 public function testAllInvokesEachLazyOptionOnlyOnce()
329 $this->options
->set('foo', function (Options
$options) use ($test, &$i) {
330 $test->assertSame(1, $i);
333 // Implicitly invoke lazy option for "bam"
334 $options->get('bam');
336 $this->options
->set('bam', function (Options
$options) use ($test, &$i) {
337 $test->assertSame(2, $i);
341 $this->options
->all();
344 public function testAllInvokesEachNormalizerOnlyOnce()
349 $this->options
->set('foo', 'bar');
350 $this->options
->set('bam', 'baz');
352 $this->options
->setNormalizer('foo', function (Options
$options) use ($test, &$i) {
353 $test->assertSame(1, $i);
356 // Implicitly invoke normalizer for "bam"
357 $options->get('bam');
359 $this->options
->setNormalizer('bam', function (Options
$options) use ($test, &$i) {
360 $test->assertSame(2, $i);
364 $this->options
->all();
367 public function testReplaceClearsAndSets()
369 $this->options
->set('one', '1');
371 $this->options
->replace(array(
373 'three' => function (Options
$options) {
374 return '2' === $options['two'] ? '3' : 'foo';
378 $this->assertEquals(array(
381 ), $this->options
->all());
384 public function testClearRemovesAllOptions()
386 $this->options
->set('one', 1);
387 $this->options
->set('two', 2);
389 $this->options
->clear();
391 $this->assertEmpty($this->options
->all());
396 * @covers Symfony\Component\OptionsResolver\Options::replace
397 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
399 public function testCannotReplaceAfterOptionWasRead()
401 $this->options
->set('one', 1);
402 $this->options
->all();
404 $this->options
->replace(array(
410 * @covers Symfony\Component\OptionsResolver\Options::overload
411 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
413 public function testCannotOverloadAfterOptionWasRead()
415 $this->options
->set('one', 1);
416 $this->options
->all();
418 $this->options
->overload('one', 2);
422 * @covers Symfony\Component\OptionsResolver\Options::clear
423 * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
425 public function testCannotClearAfterOptionWasRead()
427 $this->options
->set('one', 1);
428 $this->options
->all();
430 $this->options
->clear();
433 public function testOverloadCannotBeEvaluatedLazilyWithoutExpectedClosureParams()
435 $this->options
->set('foo', 'bar');
437 $this->options
->overload('foo', function () {
441 $this->assertNotEquals('test', $this->options
->get('foo'));
442 $this->assertTrue(is_callable($this->options
->get('foo')));
445 public function testOverloadCannotBeEvaluatedLazilyWithoutFirstParamTypeHint()
447 $this->options
->set('foo', 'bar');
449 $this->options
->overload('foo', function ($object) {
453 $this->assertNotEquals('test', $this->options
->get('foo'));
454 $this->assertTrue(is_callable($this->options
->get('foo')));
457 public function testOptionsIteration()
459 $this->options
->set('foo', 'bar');
460 $this->options
->set('foo1', 'bar1');
461 $expectedResult = array('foo' => 'bar', 'foo1' => 'bar1');
463 $this->assertEquals($expectedResult, iterator_to_array($this->options
, true));
466 public function testHasWithNullValue()
468 $this->options
->set('foo', null);
470 $this->assertTrue($this->options
->has('foo'));
473 public function testRemoveOptionAndNormalizer()
475 $this->options
->set('foo1', 'bar');
476 $this->options
->setNormalizer('foo1', function (Options
$options) {
479 $this->options
->set('foo2', 'bar');
480 $this->options
->setNormalizer('foo2', function (Options
$options) {
484 $this->options
->remove('foo2');
485 $this->assertEquals(array('foo1' => ''), $this->options
->all());
488 public function testReplaceOptionAndNormalizer()
490 $this->options
->set('foo1', 'bar');
491 $this->options
->setNormalizer('foo1', function (Options
$options) {
494 $this->options
->set('foo2', 'bar');
495 $this->options
->setNormalizer('foo2', function (Options
$options) {
499 $this->options
->replace(array('foo1' => 'new'));
500 $this->assertEquals(array('foo1' => 'new'), $this->options
->all());
503 public function testClearOptionAndNormalizer()
505 $this->options
->set('foo1', 'bar');
506 $this->options
->setNormalizer('foo1', function (Options
$options) {
509 $this->options
->set('foo2', 'bar');
510 $this->options
->setNormalizer('foo2', function (Options
$options) {
514 $this->options
->clear();
515 $this->assertEmpty($this->options
->all());
518 public function testNormalizerWithoutCorrespondingOption()
522 $this->options
->setNormalizer('foo', function (Options
$options, $previousValue) use ($test) {
523 $test->assertNull($previousValue);
527 $this->assertEquals(array('foo' => ''), $this->options
->all());