InsertIteratorTest.php 4.7 KB

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