ArrayContainsComparatorTest.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. <?php
  2. namespace Codeception\Util;
  3. class ArrayContainsComparatorTest extends \Codeception\Test\Unit
  4. {
  5. /**
  6. * @var ArrayContainsComparator
  7. */
  8. protected $ary;
  9. protected function _before()
  10. {
  11. $this->ary = new ArrayContainsComparator(
  12. [
  13. 'ticket' => [
  14. 'title' => 'Bug should be fixed',
  15. 'user' => ['name' => 'Davert'],
  16. 'labels' => null
  17. ]
  18. ]
  19. );
  20. }
  21. // tests
  22. public function testInclusion()
  23. {
  24. $this->assertTrue($this->ary->containsArray(['name' => 'Davert']));
  25. $this->assertTrue($this->ary->containsArray(['user' => ['name' => 'Davert']]));
  26. $this->assertTrue($this->ary->containsArray(['ticket' => ['title' => 'Bug should be fixed']]));
  27. $this->assertTrue($this->ary->containsArray(['ticket' => ['user' => ['name' => 'Davert']]]));
  28. $this->assertTrue($this->ary->containsArray(['ticket' => ['labels' => null]]));
  29. }
  30. /**
  31. * @Issue https://github.com/Codeception/Codeception/issues/2070
  32. */
  33. public function testContainsArrayComparesArrayWithMultipleZeroesCorrectly()
  34. {
  35. $comparator = new ArrayContainsComparator([
  36. 'responseCode' => 0,
  37. 'message' => 'OK',
  38. 'data' => [9, 0, 0],
  39. ]);
  40. $expectedArray = [
  41. 'responseCode' => 0,
  42. 'message' => 'OK',
  43. 'data' => [0, 0, 0],
  44. ];
  45. $this->assertFalse($comparator->containsArray($expectedArray));
  46. }
  47. public function testContainsArrayComparesArrayWithMultipleIdenticalSubArraysCorrectly()
  48. {
  49. $comparator = new ArrayContainsComparator([
  50. 'responseCode' => 0,
  51. 'message' => 'OK',
  52. 'data' => [[9], [0], [0]],
  53. ]);
  54. $expectedArray = [
  55. 'responseCode' => 0,
  56. 'message' => 'OK',
  57. 'data' => [[0], [0], [0]],
  58. ];
  59. $this->assertFalse($comparator->containsArray($expectedArray));
  60. }
  61. public function testContainsArrayComparesArrayWithValueRepeatedMultipleTimesCorrectlyNegativeCase()
  62. {
  63. $comparator = new ArrayContainsComparator(['foo', 'foo', 'bar']);
  64. $expectedArray = ['foo', 'foo', 'foo'];
  65. $this->assertFalse($comparator->containsArray($expectedArray));
  66. }
  67. public function testContainsArrayComparesArrayWithValueRepeatedMultipleTimesCorrectlyPositiveCase()
  68. {
  69. $comparator = new ArrayContainsComparator(['foo', 'foo', 'bar']);
  70. $expectedArray = ['foo', 'bar', 'foo'];
  71. $this->assertTrue($comparator->containsArray($expectedArray));
  72. }
  73. /**
  74. * @issue https://github.com/Codeception/Codeception/issues/2630
  75. */
  76. public function testContainsArrayComparesNestedSequentialArraysCorrectlyWhenSecondValueIsTheSame()
  77. {
  78. $array = [
  79. ['2015-09-10', 'unknown-date-1'],
  80. ['2015-10-10', 'unknown-date-1'],
  81. ];
  82. $comparator = new ArrayContainsComparator($array);
  83. $this->assertTrue($comparator->containsArray($array));
  84. }
  85. /**
  86. * @issue https://github.com/Codeception/Codeception/issues/2630
  87. * @codingStandardsIgnoreStart
  88. */
  89. public function testContainsArrayComparesNestedSequentialArraysCorrectlyWhenSecondValueIsTheSameButOrderOfItemsIsDifferent()
  90. {
  91. // @codingStandardsIgnoreEnd
  92. $comparator = new ArrayContainsComparator([
  93. [
  94. "2015-09-10",
  95. "unknown-date-1"
  96. ],
  97. [
  98. "2015-10-10",
  99. "unknown-date-1"
  100. ]
  101. ]);
  102. $expectedArray = [
  103. ["2015-10-10", "unknown-date-1"],
  104. ["2015-09-10", "unknown-date-1"],
  105. ];
  106. $this->assertTrue($comparator->containsArray($expectedArray));
  107. }
  108. /**
  109. * @issue https://github.com/Codeception/Codeception/issues/2630
  110. */
  111. public function testContainsArrayComparesNestedSequentialArraysCorrectlyWhenSecondValueIsDifferent()
  112. {
  113. $comparator = new ArrayContainsComparator([
  114. [
  115. "2015-09-10",
  116. "unknown-date-1"
  117. ],
  118. [
  119. "2015-10-10",
  120. "unknown-date-2"
  121. ]
  122. ]);
  123. $expectedArray = [
  124. ["2015-09-10", "unknown-date-1"],
  125. ["2015-10-10", "unknown-date-2"],
  126. ];
  127. $this->assertTrue($comparator->containsArray($expectedArray));
  128. }
  129. /**
  130. * @issue https://github.com/Codeception/Codeception/issues/2630
  131. */
  132. public function testContainsArrayComparesNestedSequentialArraysCorrectlyWhenJsonHasMoreItemsThanExpectedArray()
  133. {
  134. $comparator = new ArrayContainsComparator([
  135. [
  136. "2015-09-10",
  137. "unknown-date-1"
  138. ],
  139. [
  140. "2015-10-02",
  141. "unknown-date-1"
  142. ],
  143. [
  144. "2015-10-10",
  145. "unknown-date-2"
  146. ]
  147. ]);
  148. $expectedArray = [
  149. ["2015-09-10", "unknown-date-1"],
  150. ["2015-10-10", "unknown-date-2"],
  151. ];
  152. $this->assertTrue($comparator->containsArray($expectedArray));
  153. }
  154. /**
  155. * @issue https://github.com/Codeception/Codeception/pull/2635
  156. */
  157. public function testContainsMatchesSuperSetOfExpectedAssociativeArrayInsideSequentialArray()
  158. {
  159. $comparator = new ArrayContainsComparator([[
  160. 'id' => '1',
  161. 'title' => 'Game of Thrones',
  162. 'body' => 'You are so awesome',
  163. 'created_at' => '2015-12-16 10:42:20',
  164. 'updated_at' => '2015-12-16 10:42:20',
  165. ]]);
  166. $expectedArray = [['id' => '1']];
  167. $this->assertTrue($comparator->containsArray($expectedArray));
  168. }
  169. /**
  170. * @issue https://github.com/Codeception/Codeception/issues/2630
  171. */
  172. public function testContainsArrayWithUnexpectedLevel()
  173. {
  174. $comparator = new ArrayContainsComparator([
  175. "level1" => [
  176. "level2irrelevant" => [],
  177. "level2" => [
  178. [
  179. "level3" => [
  180. [
  181. "level5irrelevant1" => "a1",
  182. "level5irrelevant2" => "a2",
  183. "level5irrelevant3" => "a3",
  184. "level5irrelevant4" => "a4",
  185. "level5irrelevant5" => "a5",
  186. "level5irrelevant6" => "a6",
  187. "level5irrelevant7" => "a7",
  188. "level5irrelevant8" => "a8",
  189. "int1" => 1
  190. ]
  191. ],
  192. "level3irrelevant" => [
  193. "level4irrelevant" => 1
  194. ]
  195. ],
  196. [
  197. "level3" => [
  198. [
  199. "level5irrelevant1" => "b1",
  200. "level5irrelevant2" => "b2",
  201. "level5irrelevant3" => "b3",
  202. "level5irrelevant4" => "b4",
  203. "level5irrelevant5" => "b5",
  204. "level5irrelevant6" => "b6",
  205. "level5irrelevant7" => "b7",
  206. "level5irrelevant8" => "b8",
  207. "int1" => 1
  208. ]
  209. ],
  210. "level3irrelevant" => [
  211. "level4irrelevant" => 2
  212. ]
  213. ]
  214. ]
  215. ]
  216. ]);
  217. $expectedArray = [
  218. 'level1' => [
  219. 'level2' => [
  220. [
  221. 'int1' => 1,
  222. ],
  223. [
  224. 'int1' => 1,
  225. ],
  226. ]
  227. ]
  228. ];
  229. $this->assertTrue(
  230. $comparator->containsArray($expectedArray),
  231. "- <info>" . var_export($expectedArray, true) . "</info>\n"
  232. . "+ " . var_export($comparator->getHaystack(), true)
  233. );
  234. }
  235. /**
  236. * Simplified testcase for issue reproduced by testContainsArrayWithUnexpectedLevel
  237. */
  238. public function testContainsArrayComparesSequentialArraysHavingDuplicateSubArraysCorrectly()
  239. {
  240. $comparator = new ArrayContainsComparator([[1],[1]]);
  241. $expectedArray = [[1],[1]];
  242. $this->assertTrue(
  243. $comparator->containsArray($expectedArray),
  244. "- <info>" . var_export($expectedArray, true) . "</info>\n"
  245. . "+ " . var_export($comparator->getHaystack(), true)
  246. );
  247. }
  248. /**
  249. * @issue https://github.com/Codeception/Codeception/issues/5303
  250. */
  251. public function testContainsArrayComparesAssociativeArrayIntersectCorrectlyWhenExpectedArrayKeyIsEmptyArray()
  252. {
  253. $comparator = new ArrayContainsComparator([
  254. 'key' => [
  255. 'foo' => 'bar',
  256. ],
  257. ]);
  258. $expectedArray = [
  259. 'key' => [],
  260. ];
  261. $this->assertTrue($comparator->containsArray($expectedArray));
  262. }
  263. }