InsertIteratorTest.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <?php
  2. /**
  3. * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
  4. * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  5. *
  6. * Licensed under The MIT License
  7. * For full copyright and license information, please see the LICENSE.txt
  8. * Redistributions of files must retain the above copyright notice.
  9. *
  10. * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  11. * @link http://cakephp.org CakePHP(tm) Project
  12. * @since 3.0.0
  13. * @license http://www.opensource.org/licenses/mit-license.php MIT License
  14. */
  15. namespace Cake\Test\TestCase\Collection\Iterator;
  16. use Cake\Collection\Iterator\InsertIterator;
  17. use Cake\TestSuite\TestCase;
  18. /**
  19. * InsertIterator Test
  20. *
  21. */
  22. class InsertIteratorTest extends TestCase
  23. {
  24. /**
  25. * Test insert simple path
  26. *
  27. * @return void
  28. */
  29. public function testInsertSimplePath()
  30. {
  31. $items = [
  32. 'a' => ['name' => 'Derp'],
  33. 'b' => ['name' => 'Derpina']
  34. ];
  35. $values = [20, 21];
  36. $iterator = new InsertIterator($items, 'age', $values);
  37. $result = $iterator->toArray();
  38. $expected = [
  39. 'a' => ['name' => 'Derp', 'age' => 20],
  40. 'b' => ['name' => 'Derpina', 'age' => 21]
  41. ];
  42. $this->assertSame($expected, $result);
  43. }
  44. /**
  45. * Test insert deep path
  46. *
  47. * @return void
  48. */
  49. public function testInsertDeepPath()
  50. {
  51. $items = [
  52. 'a' => ['name' => 'Derp', 'a' => ['deep' => ['thing' => 1]]],
  53. 'b' => ['name' => 'Derpina', 'a' => ['deep' => ['thing' => 2]]],
  54. ];
  55. $values = new \ArrayIterator([20, 21]);
  56. $iterator = new InsertIterator($items, 'a.deep.path', $values);
  57. $result = $iterator->toArray();
  58. $expected = [
  59. 'a' => ['name' => 'Derp', 'a' => ['deep' => ['thing' => 1, 'path' => 20]]],
  60. 'b' => ['name' => 'Derpina', 'a' => ['deep' => ['thing' => 2, 'path' => 21]]],
  61. ];
  62. $this->assertSame($expected, $result);
  63. }
  64. /**
  65. * Test that missing properties in the path will skip inserting
  66. *
  67. * @return void
  68. */
  69. public function testInsertDeepPathMissingStep()
  70. {
  71. $items = [
  72. 'a' => ['name' => 'Derp', 'a' => ['deep' => ['thing' => 1]]],
  73. 'b' => ['name' => 'Derpina', 'a' => ['nested' => 2]],
  74. ];
  75. $values = [20, 21];
  76. $iterator = new InsertIterator($items, 'a.deep.path', $values);
  77. $result = $iterator->toArray();
  78. $expected = [
  79. 'a' => ['name' => 'Derp', 'a' => ['deep' => ['thing' => 1, 'path' => 20]]],
  80. 'b' => ['name' => 'Derpina', 'a' => ['nested' => 2]],
  81. ];
  82. $this->assertSame($expected, $result);
  83. }
  84. /**
  85. * Tests that the iterator will insert values as long as there still exist
  86. * some in the values array
  87. *
  88. * @return void
  89. */
  90. public function testInsertTargetCountBigger()
  91. {
  92. $items = [
  93. 'a' => ['name' => 'Derp'],
  94. 'b' => ['name' => 'Derpina']
  95. ];
  96. $values = [20];
  97. $iterator = new InsertIterator($items, 'age', $values);
  98. $result = $iterator->toArray();
  99. $expected = [
  100. 'a' => ['name' => 'Derp', 'age' => 20],
  101. 'b' => ['name' => 'Derpina']
  102. ];
  103. $this->assertSame($expected, $result);
  104. }
  105. /**
  106. * Tests that the iterator will insert values as long as there still exist
  107. * some in the values array
  108. *
  109. * @return void
  110. */
  111. public function testInsertSourceBigger()
  112. {
  113. $items = [
  114. 'a' => ['name' => 'Derp'],
  115. 'b' => ['name' => 'Derpina']
  116. ];
  117. $values = [20, 21, 23];
  118. $iterator = new InsertIterator($items, 'age', $values);
  119. $result = $iterator->toArray();
  120. $expected = [
  121. 'a' => ['name' => 'Derp', 'age' => 20],
  122. 'b' => ['name' => 'Derpina', 'age' => 21]
  123. ];
  124. $this->assertSame($expected, $result);
  125. }
  126. /**
  127. * Tests the iterator can be rewound
  128. *
  129. * @return void
  130. */
  131. public function testRewind()
  132. {
  133. $items = [
  134. 'a' => ['name' => 'Derp'],
  135. 'b' => ['name' => 'Derpina'],
  136. ];
  137. $values = [20, 21];
  138. $iterator = new InsertIterator($items, 'age', $values);
  139. $iterator->next();
  140. $this->assertEquals(['name' => 'Derpina', 'age' => 21], $iterator->current());
  141. $iterator->rewind();
  142. $result = $iterator->toArray();
  143. $expected = [
  144. 'a' => ['name' => 'Derp', 'age' => 20],
  145. 'b' => ['name' => 'Derpina', 'age' => 21]
  146. ];
  147. $this->assertSame($expected, $result);
  148. }
  149. }