Arrays.associate().phpt 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. /**
  3. * Test: Nette\Utils\Arrays::associate()
  4. */
  5. declare(strict_types=1);
  6. use Nette\Utils\Arrays;
  7. use Nette\Utils\DateTime;
  8. use Tester\Assert;
  9. require __DIR__ . '/../bootstrap.php';
  10. $arr = [
  11. ['name' => 'John', 'age' => 11],
  12. ['name' => 'John', 'age' => 22],
  13. ['name' => 'Mary', 'age' => null],
  14. ['name' => 'Paul', 'age' => 44],
  15. ];
  16. Assert::same(
  17. [
  18. 'John' => ['name' => 'John', 'age' => 11],
  19. 'Mary' => ['name' => 'Mary', 'age' => null],
  20. 'Paul' => ['name' => 'Paul', 'age' => 44],
  21. ],
  22. Arrays::associate($arr, 'name'),
  23. );
  24. Assert::same(
  25. [],
  26. Arrays::associate([], 'name'),
  27. );
  28. Assert::same(
  29. [
  30. 'John' => ['name' => 'John', 'age' => 11],
  31. 'Mary' => ['name' => 'Mary', 'age' => null],
  32. 'Paul' => ['name' => 'Paul', 'age' => 44],
  33. ],
  34. Arrays::associate($arr, 'name='),
  35. );
  36. Assert::same(
  37. ['John' => 22, 'Mary' => null, 'Paul' => 44],
  38. Arrays::associate($arr, 'name=age'),
  39. );
  40. Assert::same(// path as array
  41. ['John' => 22, 'Mary' => null, 'Paul' => 44],
  42. Arrays::associate($arr, ['name', '=', 'age']),
  43. );
  44. Assert::equal(
  45. [
  46. 'John' => (object) [
  47. 'name' => 'John',
  48. 'age' => 11,
  49. ],
  50. 'Mary' => (object) [
  51. 'name' => 'Mary',
  52. 'age' => null,
  53. ],
  54. 'Paul' => (object) [
  55. 'name' => 'Paul',
  56. 'age' => 44,
  57. ],
  58. ],
  59. Arrays::associate($arr, 'name->'),
  60. );
  61. Assert::equal(
  62. [
  63. 11 => (object) [
  64. 'John' => ['name' => 'John', 'age' => 11],
  65. ],
  66. 22 => (object) [
  67. 'John' => ['name' => 'John', 'age' => 22],
  68. ],
  69. null => (object) [
  70. 'Mary' => ['name' => 'Mary', 'age' => null],
  71. ],
  72. 44 => (object) [
  73. 'Paul' => ['name' => 'Paul', 'age' => 44],
  74. ],
  75. ],
  76. Arrays::associate($arr, 'age->name'),
  77. );
  78. Assert::equal(
  79. (object) [
  80. 'John' => ['name' => 'John', 'age' => 11],
  81. 'Mary' => ['name' => 'Mary', 'age' => null],
  82. 'Paul' => ['name' => 'Paul', 'age' => 44],
  83. ],
  84. Arrays::associate($arr, '->name'),
  85. );
  86. Assert::equal(
  87. (object) [],
  88. Arrays::associate([], '->name'),
  89. );
  90. Assert::same(
  91. [
  92. 'John' => [
  93. 11 => ['name' => 'John', 'age' => 11],
  94. 22 => ['name' => 'John', 'age' => 22],
  95. ],
  96. 'Mary' => [
  97. null => ['name' => 'Mary', 'age' => null],
  98. ],
  99. 'Paul' => [
  100. 44 => ['name' => 'Paul', 'age' => 44],
  101. ],
  102. ],
  103. Arrays::associate($arr, 'name|age'),
  104. );
  105. Assert::same(
  106. [
  107. 'John' => ['name' => 'John', 'age' => 11],
  108. 'Mary' => ['name' => 'Mary', 'age' => null],
  109. 'Paul' => ['name' => 'Paul', 'age' => 44],
  110. ],
  111. Arrays::associate($arr, 'name|'),
  112. );
  113. Assert::same(
  114. [
  115. 'John' => [
  116. ['name' => 'John', 'age' => 11],
  117. ['name' => 'John', 'age' => 22],
  118. ],
  119. 'Mary' => [
  120. ['name' => 'Mary', 'age' => null],
  121. ],
  122. 'Paul' => [
  123. ['name' => 'Paul', 'age' => 44],
  124. ],
  125. ],
  126. Arrays::associate($arr, 'name[]'),
  127. );
  128. Assert::same(
  129. [
  130. ['John' => ['name' => 'John', 'age' => 11]],
  131. ['John' => ['name' => 'John', 'age' => 22]],
  132. ['Mary' => ['name' => 'Mary', 'age' => null]],
  133. ['Paul' => ['name' => 'Paul', 'age' => 44]],
  134. ],
  135. Arrays::associate($arr, '[]name'),
  136. );
  137. Assert::same(
  138. ['John', 'John', 'Mary', 'Paul'],
  139. Arrays::associate($arr, '[]=name'),
  140. );
  141. Assert::same(
  142. [
  143. 'John' => [
  144. [11 => ['name' => 'John', 'age' => 11]],
  145. [22 => ['name' => 'John', 'age' => 22]],
  146. ],
  147. 'Mary' => [
  148. [null => ['name' => 'Mary', 'age' => null]],
  149. ],
  150. 'Paul' => [
  151. [44 => ['name' => 'Paul', 'age' => 44]],
  152. ],
  153. ],
  154. Arrays::associate($arr, 'name[]age'),
  155. );
  156. Assert::same(
  157. $arr,
  158. Arrays::associate($arr, '[]'),
  159. );
  160. // converts object to array
  161. Assert::same(
  162. $arr,
  163. Arrays::associate($arr = [
  164. (object) ['name' => 'John', 'age' => 11],
  165. (object) ['name' => 'John', 'age' => 22],
  166. (object) ['name' => 'Mary', 'age' => null],
  167. (object) ['name' => 'Paul', 'age' => 44],
  168. ], '[]'),
  169. );
  170. // allowes objects in keys
  171. Assert::equal(
  172. ['2014-02-05 00:00:00' => new DateTime('2014-02-05')],
  173. Arrays::associate($arr = [
  174. ['date' => new DateTime('2014-02-05')],
  175. ], 'date=date'),
  176. );
  177. Assert::equal(
  178. (object) ['2014-02-05 00:00:00' => new DateTime('2014-02-05')],
  179. Arrays::associate($arr = [
  180. ['date' => new DateTime('2014-02-05')],
  181. ], '->date=date'),
  182. );