IterZipArrayTest.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <?php
  2. namespace MathPHP\Tests\Util;
  3. use MathPHP\Util\Iter;
  4. class IterZipArrayTest extends \PHPUnit\Framework\TestCase
  5. {
  6. /**
  7. * @test zip with two arrays of the same size
  8. * @dataProvider dataProviderForZipTwoArraysSameSize
  9. * @param array $array1
  10. * @param array $array2
  11. * @param array $expected
  12. */
  13. public function testZipTwoArraysSameSize(array $array1, array $array2, array $expected)
  14. {
  15. // Given
  16. $result = [];
  17. // When
  18. foreach (Iter::zip($array1, $array2) as [$value1, $value2]) {
  19. $result[] = [$value1, $value2];
  20. }
  21. // Then
  22. $this->assertEquals($expected, $result);
  23. }
  24. /**
  25. * @return array
  26. */
  27. public function dataProviderForZipTwoArraysSameSize(): array
  28. {
  29. return [
  30. [
  31. [],
  32. [],
  33. [],
  34. ],
  35. [
  36. [1],
  37. [2],
  38. [[1, 2]],
  39. ],
  40. [
  41. [1, 2],
  42. [4, 5],
  43. [[1, 4], [2, 5]],
  44. ],
  45. [
  46. [1, 2, 3],
  47. [4, 5, 6],
  48. [[1, 4], [2, 5], [3, 6]],
  49. ],
  50. [
  51. [1, 2, 3, 4, 5, 6, 7, 8, 9],
  52. [4, 5, 6, 7, 8, 9, 1, 2, 3],
  53. [[1, 4], [2, 5], [3, 6], [4, 7], [5, 8], [6, 9], [7, 1], [8, 2], [9, 3]],
  54. ],
  55. ];
  56. }
  57. /**
  58. * @test zip with two arrays of the different sizes
  59. * @dataProvider dataProviderForZipTwoArraysDifferentSize
  60. * @param array $array1
  61. * @param array $array2
  62. * @param array $expected
  63. */
  64. public function testZipTwoArraysDifferentSize(array $array1, array $array2, array $expected)
  65. {
  66. // Given
  67. $result = [];
  68. foreach (Iter::zip($array1, $array2) as [$value1, $value2]) {
  69. $result[] = [$value1, $value2];
  70. }
  71. // Then
  72. $this->assertEquals($expected, $result);
  73. }
  74. /**
  75. * @return array
  76. */
  77. public function dataProviderForZipTwoArraysDifferentSize(): array
  78. {
  79. return [
  80. [
  81. [1],
  82. [],
  83. [],
  84. ],
  85. [
  86. [],
  87. [2],
  88. [],
  89. ],
  90. [
  91. [1, 2],
  92. [4],
  93. [[1, 4]],
  94. ],
  95. [
  96. [1],
  97. [4, 5],
  98. [[1, 4]],
  99. ],
  100. [
  101. [1, 2, 3],
  102. [4, 5],
  103. [[1, 4], [2, 5]],
  104. ],
  105. [
  106. [1, 2],
  107. [4, 5, 6],
  108. [[1, 4], [2, 5]],
  109. ],
  110. [
  111. [1, 2, 3],
  112. [4],
  113. [[1, 4]],
  114. ],
  115. [
  116. [1],
  117. [4, 5, 6],
  118. [[1, 4]],
  119. ],
  120. ];
  121. }
  122. /**
  123. * @test zip with three arrays of the same size
  124. * @dataProvider dataProviderForZipThreeArraysSameSize
  125. * @param array $array1
  126. * @param array $array2
  127. * @param array $array3
  128. * @param array $expected
  129. */
  130. public function testZipThreeArraysSameSize(array $array1, array $array2, array $array3, array $expected)
  131. {
  132. // Given
  133. $result = [];
  134. // When
  135. foreach (Iter::zip($array1, $array2, $array3) as [$value1, $value2, $value3]) {
  136. $result[] = [$value1, $value2, $value3];
  137. }
  138. // Then
  139. $this->assertEquals($expected, $result);
  140. }
  141. /**
  142. * @test zip with three arrays of the same size - unpacking
  143. * @dataProvider dataProviderForZipThreeArraysSameSize
  144. * @param array $array1
  145. * @param array $array2
  146. * @param array $array3
  147. * @param array $expected
  148. */
  149. public function testZipThreeArraysSameSizeUsingUnpacking(array $array1, array $array2, array $array3, array $expected)
  150. {
  151. // Given
  152. $result = [];
  153. // When
  154. foreach (Iter::zip(...[$array1, $array2, $array3]) as [$value1, $value2, $value3]) {
  155. $result[] = [$value1, $value2, $value3];
  156. }
  157. // Then
  158. $this->assertEquals($expected, $result);
  159. }
  160. /**
  161. * @return array
  162. */
  163. public function dataProviderForZipThreeArraysSameSize(): array
  164. {
  165. return [
  166. [
  167. [],
  168. [],
  169. [],
  170. [],
  171. ],
  172. [
  173. [1],
  174. [2],
  175. [3],
  176. [[1, 2, 3]],
  177. ],
  178. [
  179. [1, 2],
  180. [4, 5],
  181. [7, 8],
  182. [[1, 4, 7], [2, 5, 8]],
  183. ],
  184. [
  185. [1, 2, 3],
  186. [4, 5, 6],
  187. [7, 8, 9],
  188. [[1, 4, 7], [2, 5, 8], [3, 6, 9]],
  189. ],
  190. [
  191. [1, 2, 3, 4, 5, 6, 7, 8, 9],
  192. [4, 5, 6, 7, 8, 9, 1, 2, 3],
  193. [7, 8, 9, 1, 2, 3, 4, 5, 6],
  194. [[1, 4, 7], [2, 5, 8], [3, 6, 9], [4, 7, 1], [5, 8, 2], [6, 9, 3], [7, 1, 4], [8, 2, 5], [9, 3, 6]],
  195. ],
  196. ];
  197. }
  198. /**
  199. * @test zip with three arrays of different size
  200. * @dataProvider dataProviderForZipThreeArraysDifferentSize
  201. * @param array $array1
  202. * @param array $array2
  203. * @param array $array3
  204. * @param array $expected
  205. */
  206. public function testZipThreeArraysDifferentSize(array $array1, array $array2, array $array3, array $expected)
  207. {
  208. // Given
  209. $result = [];
  210. // When
  211. foreach (Iter::zip($array1, $array2, $array3) as [$value1, $value2, $value3]) {
  212. $result[] = [$value1, $value2, $value3];
  213. }
  214. // Then
  215. $this->assertEquals($expected, $result);
  216. }
  217. /**
  218. * @return array
  219. */
  220. public function dataProviderForZipThreeArraysDifferentSize(): array
  221. {
  222. return [
  223. [
  224. [],
  225. [1],
  226. [2, 3],
  227. [],
  228. ],
  229. [
  230. [1],
  231. [2, 3],
  232. [4, 5, 6],
  233. [[1, 2, 4]],
  234. ],
  235. [
  236. [1, 2],
  237. [4, 5, 7, 8],
  238. [9, 1, 2, 3, 4, 5, 6],
  239. [[1, 4, 9], [2, 5, 1]],
  240. ],
  241. [
  242. [1, 2, 3, 4],
  243. [4, 5, 6],
  244. [7, 8, 9, 0],
  245. [[1, 4, 7], [2, 5, 8], [3, 6, 9]],
  246. ],
  247. ];
  248. }
  249. }