ForTest.php 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <?php
  2. /*
  3. * This file is part of Twig.
  4. *
  5. * (c) Fabien Potencier
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. require_once dirname(__FILE__).'/TestCase.php';
  11. class Twig_Tests_Node_ForTest extends Twig_Tests_Node_TestCase
  12. {
  13. /**
  14. * @covers Twig_Node_For::__construct
  15. */
  16. public function testConstructor()
  17. {
  18. $keyTarget = new Twig_Node_Expression_AssignName('key', 0);
  19. $valueTarget = new Twig_Node_Expression_AssignName('item', 0);
  20. $seq = new Twig_Node_Expression_Name('items', 0);
  21. $body = new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 0), 0);
  22. $else = null;
  23. $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $body, $else, 0);
  24. $node->setAttribute('with_loop', false);
  25. $this->assertEquals($keyTarget, $node->getNode('key_target'));
  26. $this->assertEquals($valueTarget, $node->getNode('value_target'));
  27. $this->assertEquals($seq, $node->getNode('seq'));
  28. $this->assertEquals($body, $node->getNode('body'));
  29. $this->assertEquals(null, $node->getNode('else'));
  30. $else = new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 0), 0);
  31. $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $body, $else, 0);
  32. $node->setAttribute('with_loop', false);
  33. $this->assertEquals($else, $node->getNode('else'));
  34. }
  35. /**
  36. * @covers Twig_Node_For::compile
  37. * @dataProvider getTests
  38. */
  39. public function testCompile($node, $source, $environment = null)
  40. {
  41. parent::testCompile($node, $source, $environment);
  42. }
  43. public function getTests()
  44. {
  45. $tests = array();
  46. $keyTarget = new Twig_Node_Expression_AssignName('key', 0);
  47. $valueTarget = new Twig_Node_Expression_AssignName('item', 0);
  48. $seq = new Twig_Node_Expression_Name('items', 0);
  49. $body = new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 0), 0);
  50. $else = null;
  51. $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $body, $else, 0);
  52. $node->setAttribute('with_loop', false);
  53. $tests[] = array($node, <<<EOF
  54. \$context['_parent'] = (array) \$context;
  55. \$context['_seq'] = twig_ensure_traversable(\$this->getContext(\$context, 'items'));
  56. foreach (\$context['_seq'] as \$context['key'] => \$context['item']) {
  57. echo \$this->getContext(\$context, 'foo');
  58. }
  59. \$_parent = \$context['_parent'];
  60. unset(\$context['_seq'], \$context['_iterated'], \$context['key'], \$context['item'], \$context['_parent'], \$context['loop']);
  61. \$context = array_merge(\$_parent, array_intersect_key(\$context, \$_parent));
  62. EOF
  63. );
  64. $keyTarget = new Twig_Node_Expression_AssignName('k', 0);
  65. $valueTarget = new Twig_Node_Expression_AssignName('v', 0);
  66. $seq = new Twig_Node_Expression_Name('values', 0);
  67. $body = new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 0), 0);
  68. $else = null;
  69. $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $body, $else, 0);
  70. $node->setAttribute('with_loop', true);
  71. $tests[] = array($node, <<<EOF
  72. \$context['_parent'] = (array) \$context;
  73. \$context['_seq'] = twig_ensure_traversable(\$this->getContext(\$context, 'values'));
  74. \$context['loop'] = array(
  75. 'parent' => \$context['_parent'],
  76. 'index0' => 0,
  77. 'index' => 1,
  78. 'first' => true,
  79. );
  80. if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof Countable)) {
  81. \$length = count(\$context['_seq']);
  82. \$context['loop']['revindex0'] = \$length - 1;
  83. \$context['loop']['revindex'] = \$length;
  84. \$context['loop']['length'] = \$length;
  85. \$context['loop']['last'] = 1 === \$length;
  86. }
  87. foreach (\$context['_seq'] as \$context['k'] => \$context['v']) {
  88. echo \$this->getContext(\$context, 'foo');
  89. ++\$context['loop']['index0'];
  90. ++\$context['loop']['index'];
  91. \$context['loop']['first'] = false;
  92. if (isset(\$context['loop']['length'])) {
  93. --\$context['loop']['revindex0'];
  94. --\$context['loop']['revindex'];
  95. \$context['loop']['last'] = 0 === \$context['loop']['revindex0'];
  96. }
  97. }
  98. \$_parent = \$context['_parent'];
  99. unset(\$context['_seq'], \$context['_iterated'], \$context['k'], \$context['v'], \$context['_parent'], \$context['loop']);
  100. \$context = array_merge(\$_parent, array_intersect_key(\$context, \$_parent));
  101. EOF
  102. );
  103. $keyTarget = new Twig_Node_Expression_AssignName('k', 0);
  104. $valueTarget = new Twig_Node_Expression_AssignName('v', 0);
  105. $seq = new Twig_Node_Expression_Name('values', 0);
  106. $body = new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 0), 0);
  107. $else = new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 0), 0);
  108. $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $body, $else, 0);
  109. $node->setAttribute('with_loop', true);
  110. $tests[] = array($node, <<<EOF
  111. \$context['_parent'] = (array) \$context;
  112. \$context['_seq'] = twig_ensure_traversable(\$this->getContext(\$context, 'values'));
  113. \$context['_iterated'] = false;
  114. \$context['loop'] = array(
  115. 'parent' => \$context['_parent'],
  116. 'index0' => 0,
  117. 'index' => 1,
  118. 'first' => true,
  119. );
  120. if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof Countable)) {
  121. \$length = count(\$context['_seq']);
  122. \$context['loop']['revindex0'] = \$length - 1;
  123. \$context['loop']['revindex'] = \$length;
  124. \$context['loop']['length'] = \$length;
  125. \$context['loop']['last'] = 1 === \$length;
  126. }
  127. foreach (\$context['_seq'] as \$context['k'] => \$context['v']) {
  128. echo \$this->getContext(\$context, 'foo');
  129. \$context['_iterated'] = true;
  130. ++\$context['loop']['index0'];
  131. ++\$context['loop']['index'];
  132. \$context['loop']['first'] = false;
  133. if (isset(\$context['loop']['length'])) {
  134. --\$context['loop']['revindex0'];
  135. --\$context['loop']['revindex'];
  136. \$context['loop']['last'] = 0 === \$context['loop']['revindex0'];
  137. }
  138. }
  139. if (!\$context['_iterated']) {
  140. echo \$this->getContext(\$context, 'foo');
  141. }
  142. \$_parent = \$context['_parent'];
  143. unset(\$context['_seq'], \$context['_iterated'], \$context['k'], \$context['v'], \$context['_parent'], \$context['loop']);
  144. \$context = array_merge(\$_parent, array_intersect_key(\$context, \$_parent));
  145. EOF
  146. );
  147. return $tests;
  148. }
  149. }