LegacyOptionsTest.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\OptionsResolver\Tests;
  11. use PHPUnit\Framework\TestCase;
  12. use Symfony\Component\OptionsResolver\Options;
  13. use Symfony\Component\OptionsResolver\OptionsResolver;
  14. /**
  15. * @group legacy
  16. */
  17. class LegacyOptionsTest extends TestCase
  18. {
  19. /**
  20. * @var OptionsResolver
  21. */
  22. private $options;
  23. protected function setUp()
  24. {
  25. $this->options = new OptionsResolver();
  26. }
  27. public function testSetLazyOption()
  28. {
  29. $test = $this;
  30. $this->options->set('foo', function (Options $options) use ($test) {
  31. return 'dynamic';
  32. });
  33. $this->assertEquals(array('foo' => 'dynamic'), $this->options->resolve());
  34. }
  35. public function testOverloadKeepsPreviousValue()
  36. {
  37. $test = $this;
  38. // defined by superclass
  39. $this->options->set('foo', 'bar');
  40. // defined by subclass
  41. $this->options->overload('foo', function (Options $options, $previousValue) use ($test) {
  42. /* @var TestCase $test */
  43. $test->assertEquals('bar', $previousValue);
  44. return 'dynamic';
  45. });
  46. $this->assertEquals(array('foo' => 'dynamic'), $this->options->resolve());
  47. }
  48. public function testPreviousValueIsEvaluatedIfLazy()
  49. {
  50. $test = $this;
  51. // defined by superclass
  52. $this->options->set('foo', function (Options $options) {
  53. return 'bar';
  54. });
  55. // defined by subclass
  56. $this->options->overload('foo', function (Options $options, $previousValue) use ($test) {
  57. /* @var TestCase $test */
  58. $test->assertEquals('bar', $previousValue);
  59. return 'dynamic';
  60. });
  61. $this->assertEquals(array('foo' => 'dynamic'), $this->options->resolve());
  62. }
  63. public function testPreviousValueIsNotEvaluatedIfNoSecondArgument()
  64. {
  65. $test = $this;
  66. // defined by superclass
  67. $this->options->set('foo', function (Options $options) use ($test) {
  68. $test->fail('Should not be called');
  69. });
  70. // defined by subclass, no $previousValue argument defined!
  71. $this->options->overload('foo', function (Options $options) use ($test) {
  72. return 'dynamic';
  73. });
  74. $this->assertEquals(array('foo' => 'dynamic'), $this->options->resolve());
  75. }
  76. public function testLazyOptionCanAccessOtherOptions()
  77. {
  78. $test = $this;
  79. $this->options->set('foo', 'bar');
  80. $this->options->set('bam', function (Options $options) use ($test) {
  81. /* @var TestCase $test */
  82. $test->assertEquals('bar', $options->get('foo'));
  83. return 'dynamic';
  84. });
  85. $this->assertEquals(array('foo' => 'bar', 'bam' => 'dynamic'), $this->options->resolve());
  86. }
  87. public function testLazyOptionCanAccessOtherLazyOptions()
  88. {
  89. $test = $this;
  90. $this->options->set('foo', function (Options $options) {
  91. return 'bar';
  92. });
  93. $this->options->set('bam', function (Options $options) use ($test) {
  94. /* @var TestCase $test */
  95. $test->assertEquals('bar', $options->get('foo'));
  96. return 'dynamic';
  97. });
  98. $this->assertEquals(array('foo' => 'bar', 'bam' => 'dynamic'), $this->options->resolve());
  99. }
  100. public function testNormalizer()
  101. {
  102. $this->options->set('foo', 'bar');
  103. $this->options->setNormalizer('foo', function () {
  104. return 'normalized';
  105. });
  106. $this->assertEquals(array('foo' => 'normalized'), $this->options->resolve());
  107. }
  108. public function testNormalizerReceivesUnnormalizedValue()
  109. {
  110. $this->options->set('foo', 'bar');
  111. $this->options->setNormalizer('foo', function (Options $options, $value) {
  112. return 'normalized['.$value.']';
  113. });
  114. $this->assertEquals(array('foo' => 'normalized[bar]'), $this->options->resolve());
  115. }
  116. public function testNormalizerCanAccessOtherOptions()
  117. {
  118. $test = $this;
  119. $this->options->set('foo', 'bar');
  120. $this->options->set('bam', 'baz');
  121. $this->options->setNormalizer('bam', function (Options $options) use ($test) {
  122. /* @var TestCase $test */
  123. $test->assertEquals('bar', $options->get('foo'));
  124. return 'normalized';
  125. });
  126. $this->assertEquals(array('foo' => 'bar', 'bam' => 'normalized'), $this->options->resolve());
  127. }
  128. public function testNormalizerCanAccessOtherLazyOptions()
  129. {
  130. $test = $this;
  131. $this->options->set('foo', function (Options $options) {
  132. return 'bar';
  133. });
  134. $this->options->set('bam', 'baz');
  135. $this->options->setNormalizer('bam', function (Options $options) use ($test) {
  136. /* @var TestCase $test */
  137. $test->assertEquals('bar', $options->get('foo'));
  138. return 'normalized';
  139. });
  140. $this->assertEquals(array('foo' => 'bar', 'bam' => 'normalized'), $this->options->resolve());
  141. }
  142. /**
  143. * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
  144. */
  145. public function testFailForCyclicDependencies()
  146. {
  147. $this->options->set('foo', function (Options $options) {
  148. $options->get('bam');
  149. });
  150. $this->options->set('bam', function (Options $options) {
  151. $options->get('foo');
  152. });
  153. $this->options->resolve();
  154. }
  155. /**
  156. * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
  157. */
  158. public function testFailForCyclicDependenciesBetweenNormalizers()
  159. {
  160. $this->options->set('foo', 'bar');
  161. $this->options->set('bam', 'baz');
  162. $this->options->setNormalizer('foo', function (Options $options) {
  163. $options->get('bam');
  164. });
  165. $this->options->setNormalizer('bam', function (Options $options) {
  166. $options->get('foo');
  167. });
  168. $this->options->resolve();
  169. }
  170. /**
  171. * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
  172. */
  173. public function testFailForCyclicDependenciesBetweenNormalizerAndLazyOption()
  174. {
  175. $this->options->set('foo', function (Options $options) {
  176. $options->get('bam');
  177. });
  178. $this->options->set('bam', 'baz');
  179. $this->options->setNormalizer('bam', function (Options $options) {
  180. $options->get('foo');
  181. });
  182. $this->options->resolve();
  183. }
  184. public function testReplaceClearsAndSets()
  185. {
  186. $this->options->set('one', '1');
  187. $this->options->replace(array(
  188. 'two' => '2',
  189. 'three' => function (Options $options) {
  190. return '2' === $options['two'] ? '3' : 'foo';
  191. },
  192. ));
  193. $this->assertEquals(array(
  194. 'two' => '2',
  195. 'three' => '3',
  196. ), $this->options->resolve());
  197. }
  198. public function testClearRemovesAllOptions()
  199. {
  200. $this->options->set('one', 1);
  201. $this->options->set('two', 2);
  202. $this->options->clear();
  203. $this->assertEmpty($this->options->resolve());
  204. }
  205. public function testOverloadCannotBeEvaluatedLazilyWithoutExpectedClosureParams()
  206. {
  207. $this->options->set('foo', 'bar');
  208. $this->options->overload('foo', function () {
  209. return 'test';
  210. });
  211. $resolved = $this->options->resolve();
  212. $this->assertInternalType('callable', $resolved['foo']);
  213. }
  214. public function testOverloadCannotBeEvaluatedLazilyWithoutFirstParamTypeHint()
  215. {
  216. $this->options->set('foo', 'bar');
  217. $this->options->overload('foo', function ($object) {
  218. return 'test';
  219. });
  220. $resolved = $this->options->resolve();
  221. $this->assertInternalType('callable', $resolved['foo']);
  222. }
  223. public function testRemoveOptionAndNormalizer()
  224. {
  225. $this->options->set('foo1', 'bar');
  226. $this->options->setNormalizer('foo1', function (Options $options) {
  227. return '';
  228. });
  229. $this->options->set('foo2', 'bar');
  230. $this->options->setNormalizer('foo2', function (Options $options) {
  231. return '';
  232. });
  233. $this->options->remove('foo2');
  234. $this->assertEquals(array('foo1' => ''), $this->options->resolve());
  235. }
  236. public function testReplaceOptionAndNormalizer()
  237. {
  238. $this->options->set('foo1', 'bar');
  239. $this->options->setNormalizer('foo1', function (Options $options) {
  240. return '';
  241. });
  242. $this->options->set('foo2', 'bar');
  243. $this->options->setNormalizer('foo2', function (Options $options) {
  244. return '';
  245. });
  246. $this->options->replace(array('foo1' => 'new'));
  247. $this->assertEquals(array('foo1' => 'new'), $this->options->resolve());
  248. }
  249. public function testClearOptionAndNormalizer()
  250. {
  251. $this->options->set('foo1', 'bar');
  252. $this->options->setNormalizer('foo1', function (Options $options) {
  253. return '';
  254. });
  255. $this->options->set('foo2', 'bar');
  256. $this->options->setNormalizer('foo2', function (Options $options) {
  257. return '';
  258. });
  259. $this->options->clear();
  260. $this->assertEmpty($this->options->resolve());
  261. }
  262. }