1<?php
2
3/*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Symfony\Component\OptionsResolver\Tests\Debug;
13
14use PHPUnit\Framework\TestCase;
15use Symfony\Component\OptionsResolver\Debug\OptionsResolverIntrospector;
16use Symfony\Component\OptionsResolver\Options;
17use Symfony\Component\OptionsResolver\OptionsResolver;
18
19class OptionsResolverIntrospectorTest extends TestCase
20{
21    public function testGetDefault()
22    {
23        $resolver = new OptionsResolver();
24        $resolver->setDefault($option = 'foo', 'bar');
25
26        $debug = new OptionsResolverIntrospector($resolver);
27        $this->assertSame('bar', $debug->getDefault($option));
28    }
29
30    public function testGetDefaultNull()
31    {
32        $resolver = new OptionsResolver();
33        $resolver->setDefault($option = 'foo', null);
34
35        $debug = new OptionsResolverIntrospector($resolver);
36        $this->assertNull($debug->getDefault($option));
37    }
38
39    public function testGetDefaultThrowsOnNoConfiguredValue()
40    {
41        $this->expectException('Symfony\Component\OptionsResolver\Exception\NoConfigurationException');
42        $this->expectExceptionMessage('No default value was set for the "foo" option.');
43        $resolver = new OptionsResolver();
44        $resolver->setDefined($option = 'foo');
45
46        $debug = new OptionsResolverIntrospector($resolver);
47        $debug->getDefault($option);
48    }
49
50    public function testGetDefaultThrowsOnNotDefinedOption()
51    {
52        $this->expectException('Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException');
53        $this->expectExceptionMessage('The option "foo" does not exist.');
54        $resolver = new OptionsResolver();
55
56        $debug = new OptionsResolverIntrospector($resolver);
57        $debug->getDefault('foo');
58    }
59
60    public function testGetLazyClosures()
61    {
62        $resolver = new OptionsResolver();
63        $closures = [];
64        $resolver->setDefault($option = 'foo', $closures[] = function (Options $options) {});
65
66        $debug = new OptionsResolverIntrospector($resolver);
67        $this->assertSame($closures, $debug->getLazyClosures($option));
68    }
69
70    public function testGetLazyClosuresThrowsOnNoConfiguredValue()
71    {
72        $this->expectException('Symfony\Component\OptionsResolver\Exception\NoConfigurationException');
73        $this->expectExceptionMessage('No lazy closures were set for the "foo" option.');
74        $resolver = new OptionsResolver();
75        $resolver->setDefined($option = 'foo');
76
77        $debug = new OptionsResolverIntrospector($resolver);
78        $debug->getLazyClosures($option);
79    }
80
81    public function testGetLazyClosuresThrowsOnNotDefinedOption()
82    {
83        $this->expectException('Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException');
84        $this->expectExceptionMessage('The option "foo" does not exist.');
85        $resolver = new OptionsResolver();
86
87        $debug = new OptionsResolverIntrospector($resolver);
88        $debug->getLazyClosures('foo');
89    }
90
91    public function testGetAllowedTypes()
92    {
93        $resolver = new OptionsResolver();
94        $resolver->setDefined($option = 'foo');
95        $resolver->setAllowedTypes($option = 'foo', $allowedTypes = ['string', 'bool']);
96
97        $debug = new OptionsResolverIntrospector($resolver);
98        $this->assertSame($allowedTypes, $debug->getAllowedTypes($option));
99    }
100
101    public function testGetAllowedTypesThrowsOnNoConfiguredValue()
102    {
103        $this->expectException('Symfony\Component\OptionsResolver\Exception\NoConfigurationException');
104        $this->expectExceptionMessage('No allowed types were set for the "foo" option.');
105        $resolver = new OptionsResolver();
106        $resolver->setDefined($option = 'foo');
107
108        $debug = new OptionsResolverIntrospector($resolver);
109        $this->assertSame('bar', $debug->getAllowedTypes($option));
110    }
111
112    public function testGetAllowedTypesThrowsOnNotDefinedOption()
113    {
114        $this->expectException('Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException');
115        $this->expectExceptionMessage('The option "foo" does not exist.');
116        $resolver = new OptionsResolver();
117
118        $debug = new OptionsResolverIntrospector($resolver);
119        $this->assertSame('bar', $debug->getAllowedTypes('foo'));
120    }
121
122    public function testGetAllowedValues()
123    {
124        $resolver = new OptionsResolver();
125        $resolver->setDefined($option = 'foo');
126        $resolver->setAllowedValues($option = 'foo', $allowedValues = ['bar', 'baz']);
127
128        $debug = new OptionsResolverIntrospector($resolver);
129        $this->assertSame($allowedValues, $debug->getAllowedValues($option));
130    }
131
132    public function testGetAllowedValuesThrowsOnNoConfiguredValue()
133    {
134        $this->expectException('Symfony\Component\OptionsResolver\Exception\NoConfigurationException');
135        $this->expectExceptionMessage('No allowed values were set for the "foo" option.');
136        $resolver = new OptionsResolver();
137        $resolver->setDefined($option = 'foo');
138
139        $debug = new OptionsResolverIntrospector($resolver);
140        $this->assertSame('bar', $debug->getAllowedValues($option));
141    }
142
143    public function testGetAllowedValuesThrowsOnNotDefinedOption()
144    {
145        $this->expectException('Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException');
146        $this->expectExceptionMessage('The option "foo" does not exist.');
147        $resolver = new OptionsResolver();
148
149        $debug = new OptionsResolverIntrospector($resolver);
150        $this->assertSame('bar', $debug->getAllowedValues('foo'));
151    }
152
153    public function testGetNormalizer()
154    {
155        $resolver = new OptionsResolver();
156        $resolver->setDefined($option = 'foo');
157        $resolver->setNormalizer($option = 'foo', $normalizer = function () {});
158
159        $debug = new OptionsResolverIntrospector($resolver);
160        $this->assertSame($normalizer, $debug->getNormalizer($option));
161    }
162
163    public function testGetNormalizerThrowsOnNoConfiguredValue()
164    {
165        $this->expectException('Symfony\Component\OptionsResolver\Exception\NoConfigurationException');
166        $this->expectExceptionMessage('No normalizer was set for the "foo" option.');
167        $resolver = new OptionsResolver();
168        $resolver->setDefined($option = 'foo');
169
170        $debug = new OptionsResolverIntrospector($resolver);
171        $this->assertSame('bar', $debug->getNormalizer($option));
172    }
173
174    public function testGetNormalizerThrowsOnNotDefinedOption()
175    {
176        $this->expectException('Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException');
177        $this->expectExceptionMessage('The option "foo" does not exist.');
178        $resolver = new OptionsResolver();
179
180        $debug = new OptionsResolverIntrospector($resolver);
181        $this->assertSame('bar', $debug->getNormalizer('foo'));
182    }
183}
184