InsertIteratorTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
  5. * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  6. *
  7. * Licensed under The MIT License
  8. * For full copyright and license information, please see the LICENSE.txt
  9. * Redistributions of files must retain the above copyright notice.
  10. *
  11. * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  12. * @link https://cakephp.org CakePHP(tm) Project
  13. * @since 3.0.0
  14. * @license https://opensource.org/licenses/mit-license.php MIT License
  15. */
  16. namespace Cake\Test\TestCase\Collection\Iterator;
  17. use ArrayIterator;
  18. use Cake\Collection\Iterator\InsertIterator;
  19. use Cake\TestSuite\TestCase;
  20. /**
  21. * InsertIterator Test
  22. */
  23. class InsertIteratorTest extends TestCase
  24. {
  25. /**
  26. * Test insert simple path
  27. */
  28. public function testInsertSimplePath(): void
  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. public function testInsertDeepPath(): void
  47. {
  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. public function testInsertDeepPathMissingStep(): void
  65. {
  66. $items = [
  67. 'a' => ['name' => 'Derp', 'a' => ['deep' => ['thing' => 1]]],
  68. 'b' => ['name' => 'Derpina', 'a' => ['nested' => 2]],
  69. ];
  70. $values = [20, 21];
  71. $iterator = new InsertIterator($items, 'a.deep.path', $values);
  72. $result = $iterator->toArray();
  73. $expected = [
  74. 'a' => ['name' => 'Derp', 'a' => ['deep' => ['thing' => 1, 'path' => 20]]],
  75. 'b' => ['name' => 'Derpina', 'a' => ['nested' => 2]],
  76. ];
  77. $this->assertSame($expected, $result);
  78. }
  79. /**
  80. * Tests that the iterator will insert values as long as there still exist
  81. * some in the values array
  82. */
  83. public function testInsertTargetCountBigger(): void
  84. {
  85. $items = [
  86. 'a' => ['name' => 'Derp'],
  87. 'b' => ['name' => 'Derpina'],
  88. ];
  89. $values = [20];
  90. $iterator = new InsertIterator($items, 'age', $values);
  91. $result = $iterator->toArray();
  92. $expected = [
  93. 'a' => ['name' => 'Derp', 'age' => 20],
  94. 'b' => ['name' => 'Derpina'],
  95. ];
  96. $this->assertSame($expected, $result);
  97. }
  98. /**
  99. * Tests that the iterator will insert values as long as there still exist
  100. * some in the values array
  101. */
  102. public function testInsertSourceBigger(): void
  103. {
  104. $items = [
  105. 'a' => ['name' => 'Derp'],
  106. 'b' => ['name' => 'Derpina'],
  107. ];
  108. $values = [20, 21, 23];
  109. $iterator = new InsertIterator($items, 'age', $values);
  110. $result = $iterator->toArray();
  111. $expected = [
  112. 'a' => ['name' => 'Derp', 'age' => 20],
  113. 'b' => ['name' => 'Derpina', 'age' => 21],
  114. ];
  115. $this->assertSame($expected, $result);
  116. }
  117. /**
  118. * Tests the iterator can be rewound
  119. */
  120. public function testRewind(): void
  121. {
  122. $items = [
  123. 'a' => ['name' => 'Derp'],
  124. 'b' => ['name' => 'Derpina'],
  125. ];
  126. $values = [20, 21];
  127. $iterator = new InsertIterator($items, 'age', $values);
  128. $iterator->next();
  129. $this->assertEquals(['name' => 'Derpina', 'age' => 21], $iterator->current());
  130. $iterator->rewind();
  131. $result = $iterator->toArray();
  132. $expected = [
  133. 'a' => ['name' => 'Derp', 'age' => 20],
  134. 'b' => ['name' => 'Derpina', 'age' => 21],
  135. ];
  136. $this->assertSame($expected, $result);
  137. }
  138. }