InsertIteratorTest.php 4.0 KB

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