ArrayHelperTest.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php
  2. namespace fphammerle\helpers\tests;
  3. use fphammerle\helpers\ArrayHelper;
  4. class ArrayHelperTest extends \PHPUnit_Framework_TestCase
  5. {
  6. public function testFlattenEmpty()
  7. {
  8. $this->assertEquals(
  9. [],
  10. ArrayHelper::flatten([])
  11. );
  12. }
  13. public function testFlattenFlat()
  14. {
  15. $this->assertEquals(
  16. [1, 2, 3],
  17. ArrayHelper::flatten([1, 2, 3])
  18. );
  19. }
  20. public function testFlatten2D()
  21. {
  22. $this->assertEquals(
  23. [1, 2, 3, 4, 5],
  24. ArrayHelper::flatten([1, [2, 3], [4], 5])
  25. );
  26. }
  27. public function testFlatten2DEmpty()
  28. {
  29. $this->assertEquals(
  30. [1, 2, 3, 4, 5],
  31. ArrayHelper::flatten([[], 1, [2, 3], [], [4], 5])
  32. );
  33. }
  34. public function testFlatten3D()
  35. {
  36. $this->assertEquals(
  37. [1, 2, 3, 4, 5, 6],
  38. ArrayHelper::flatten([1, [[2, 3], 4], [[5], [6]]])
  39. );
  40. }
  41. public function testFlatten3DEmpty()
  42. {
  43. $this->assertEquals(
  44. [1, 2, 3, 4, 5, 6],
  45. ArrayHelper::flatten([1, [[2, [], 3], 4, []], [[5], [6]], []])
  46. );
  47. }
  48. public function testFlattenAssociativeLetterFlat()
  49. {
  50. $this->assertEquals(
  51. [1, 2, 3, 4],
  52. ArrayHelper::flatten(['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4])
  53. );
  54. }
  55. public function testFlattenAssociativeDigit()
  56. {
  57. $this->assertEquals(
  58. [1, 2, 3, 4],
  59. ArrayHelper::flatten([1 => 1, 2 => 2, 3 => 3, 4 => 4])
  60. );
  61. }
  62. public function testFlattenAssociativeDigitReverse()
  63. {
  64. $this->assertEquals(
  65. [1, 2, 3, 4],
  66. ArrayHelper::flatten([3 => 1, 2 => 2, 1 => 3, 0 => 4])
  67. );
  68. }
  69. public function testFlattenMixed2D()
  70. {
  71. $this->assertEquals(
  72. [1, 2, 3, 4, 5, 6, 7, 8],
  73. ArrayHelper::flatten([
  74. 'a' => 1,
  75. 'b' => [2, 3],
  76. 'c' => ['#' => 4, '@' => 5],
  77. 'd' => [6, '$' => 7],
  78. 8,
  79. ])
  80. );
  81. }
  82. public function multimapProvider()
  83. {
  84. return [
  85. [
  86. ['a' => 1, 'b' => 2, 'c' => 3],
  87. function($k, $v) { return [$k => $v]; },
  88. ['a' => 1, 'b' => 2, 'c' => 3],
  89. ],
  90. [
  91. ['a' => 1, 'b' => 2, 'c' => 3],
  92. function($k, $v) { return [$v => $k]; },
  93. [1 => 'a', 2 => 'b', 3 => 'c'],
  94. ],
  95. [
  96. ['a' => 1, 'b' => 2, 'c' => 3],
  97. function($k, $v) { return [strtoupper($k) => $v * $v]; },
  98. ['A' => 1, 'B' => 4, 'C' => 9],
  99. ],
  100. [
  101. ['a' => 1, 'b' => 2, 'c' => 3],
  102. function($k, $v) { return [$k => null]; },
  103. ['a' => null, 'b' => null, 'c' => null],
  104. ],
  105. [
  106. ['a' => 1, 'b' => 2, 'b' => 3],
  107. function($k, $v) { return [$k => $v]; },
  108. ['a' => 1, 'b' => 3],
  109. ],
  110. [
  111. ['a' => 1, 'b' => 2, 'c' => 3],
  112. function($k, $v) { return ($v % 2) ? [$k => $v * $v] : null; },
  113. ['a' => 1, 'c' => 9],
  114. ],
  115. [
  116. ['a' => 1, 'b' => 2, 'c' => 3],
  117. function($k, $v) { return ($v % 2) ? [$k => $v * $v] : []; },
  118. ['a' => 1, 'c' => 9],
  119. ],
  120. [
  121. ['a' => 1, 'b' => 2, 'c' => 3],
  122. function($k, $v) { return [$k => $v, $k.'^2' => $v * $v]; },
  123. ['a' => 1, 'a^2' => 1, 'b' => 2, 'b^2' => 4, 'c' => 3, 'c^2' => 9],
  124. ],
  125. [
  126. ['a' => 1, 'b' => 2, 'c' => 3],
  127. function($k, $v) { return [$k => [[$v]], strtoupper($k) => []]; },
  128. ['a' => [[1]], 'A' => [], 'b' => [[2]], 'B' => [], 'c' => [[3]], 'C' => []],
  129. ],
  130. ];
  131. }
  132. /**
  133. * @dataProvider multimapProvider
  134. */
  135. public function testMultimap($source, $callback, $expected)
  136. {
  137. $this->assertSame($expected, ArrayHelper::multimap($source, $callback));
  138. }
  139. public function multimapUnexpectedValueProvider()
  140. {
  141. return [
  142. [
  143. ['a' => 1, 'b' => 2, 'c' => 3],
  144. function($k, $v) { return $v; },
  145. ],
  146. [
  147. ['a' => 1, 'b' => 2, 'c' => 3],
  148. function($k, $v) { return 'string'; },
  149. ],
  150. ];
  151. }
  152. /**
  153. * @dataProvider multimapUnexpectedValueProvider
  154. * @expectedException \UnexpectedValueException
  155. */
  156. public function testMultimapUnexpectedValue($source, $callback)
  157. {
  158. ArrayHelper::multimap($source, $callback);
  159. }
  160. }