Expect.array.phpt 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. <?php
  2. declare(strict_types=1);
  3. use Nette\Schema\Expect;
  4. use Nette\Schema\Helpers;
  5. use Nette\Schema\Processor;
  6. use Tester\Assert;
  7. require __DIR__ . '/../bootstrap.php';
  8. test('without default value', function () {
  9. $schema = Expect::array();
  10. Assert::same([], (new Processor)->process($schema, []));
  11. Assert::same([1, 2, 3], (new Processor)->process($schema, [1, 2, 3]));
  12. Assert::same(['key' => 'val'], (new Processor)->process($schema, ['key' => 'val']));
  13. checkValidationErrors(function () use ($schema) {
  14. (new Processor)->process($schema, 'one');
  15. }, ["The item expects to be array, 'one' given."]);
  16. checkValidationErrors(function () use ($schema) {
  17. (new Processor)->process($schema, true);
  18. }, ['The item expects to be array, true given.']);
  19. checkValidationErrors(function () use ($schema) {
  20. (new Processor)->process($schema, 123);
  21. }, ['The item expects to be array, 123 given.']);
  22. Assert::same([], (new Processor)->process($schema, null));
  23. });
  24. test('not merging', function () {
  25. $schema = Expect::array([
  26. 'key1' => 'val1',
  27. 'key2' => 'val2',
  28. 'val3',
  29. 'arr' => ['item'],
  30. ])->mergeDefaults(false);
  31. Assert::same([], (new Processor)->process($schema, []));
  32. Assert::same(
  33. [1, 2, 3],
  34. (new Processor)->process($schema, [1, 2, 3])
  35. );
  36. });
  37. test('merging', function () {
  38. $schema = Expect::array([
  39. 'key1' => 'val1',
  40. 'key2' => 'val2',
  41. 'val3',
  42. 'arr' => ['item'],
  43. ]);
  44. Assert::same([
  45. 'key1' => 'val1',
  46. 'key2' => 'val2',
  47. 'val3',
  48. 'arr' => ['item'],
  49. ], (new Processor)->process($schema, []));
  50. Assert::same(
  51. [
  52. 'key1' => 'val1',
  53. 'key2' => 'val2',
  54. 'val3',
  55. 'arr' => ['item'],
  56. 1, 2, 3,
  57. ],
  58. (new Processor)->process($schema, [1, 2, 3])
  59. );
  60. Assert::same(
  61. [
  62. 'key1' => 'newval',
  63. 'key2' => 'val2',
  64. 'val3',
  65. 'arr' => ['item', 'newitem'],
  66. 'key3' => 'newval',
  67. 'newval3',
  68. ],
  69. (new Processor)->process($schema, [
  70. 'key1' => 'newval',
  71. 'key3' => 'newval',
  72. 'newval3',
  73. 'arr' => ['newitem'],
  74. ])
  75. );
  76. Assert::same(
  77. [
  78. 'key1' => 'newval',
  79. 'key3' => 'newval',
  80. 'newval3',
  81. 'arr' => ['newitem'],
  82. ],
  83. (new Processor)->process($schema, [
  84. Helpers::PreventMerging => true,
  85. 'key1' => 'newval',
  86. 'key3' => 'newval',
  87. 'newval3',
  88. 'arr' => ['newitem'],
  89. ])
  90. );
  91. Assert::same(
  92. [
  93. 'key1' => 'newval',
  94. 'key2' => 'val2',
  95. 'val3',
  96. 'arr' => ['newitem'],
  97. 'key3' => 'newval',
  98. 'newval3',
  99. ],
  100. (new Processor)->process($schema, [
  101. 'key1' => 'newval',
  102. 'key3' => 'newval',
  103. 'newval3',
  104. 'arr' => [Helpers::PreventMerging => true, 'newitem'],
  105. ])
  106. );
  107. });
  108. test('merging & other items validation', function () {
  109. $schema = Expect::array([
  110. 'key1' => 'val1',
  111. 'key2' => 'val2',
  112. 'val3',
  113. ])->items('string');
  114. Assert::same([
  115. 'key1' => 'val1',
  116. 'key2' => 'val2',
  117. 'val3',
  118. ], (new Processor)->process($schema, []));
  119. checkValidationErrors(function () use ($schema) {
  120. (new Processor)->process($schema, [1, 2, 3]);
  121. }, [
  122. "The item '0' expects to be string, 1 given.",
  123. "The item '1' expects to be string, 2 given.",
  124. "The item '2' expects to be string, 3 given.",
  125. ]);
  126. Assert::same(
  127. [
  128. 'key1' => 'newval',
  129. 'key2' => 'val2',
  130. 'val3',
  131. 'key3' => 'newval',
  132. 'newval3',
  133. ],
  134. (new Processor)->process($schema, [
  135. 'key1' => 'newval',
  136. 'key3' => 'newval',
  137. 'newval3',
  138. ])
  139. );
  140. });
  141. test('merging & other items validation', function () {
  142. $schema = Expect::array()->items('string');
  143. Assert::same([
  144. 'key1' => 'val1',
  145. 'key2' => 'val2',
  146. 'val3',
  147. ], $schema->merge([
  148. 'key1' => 'val1',
  149. 'key2' => 'val2',
  150. 'val3',
  151. ], null));
  152. Assert::same(
  153. [
  154. 'key1' => 'newval',
  155. 'key2' => 'val2',
  156. 'val3',
  157. 'key3' => 'newval',
  158. 'newval3',
  159. ],
  160. $schema->merge([
  161. 'key1' => 'newval',
  162. 'key3' => 'newval',
  163. 'newval3',
  164. ], [
  165. 'key1' => 'val1',
  166. 'key2' => 'val2',
  167. 'val3',
  168. ])
  169. );
  170. });
  171. test('items() & scalar', function () {
  172. $schema = Expect::array([
  173. 'a' => 'defval',
  174. ])->items('string');
  175. Assert::same(['a' => 'defval'], (new Processor)->process($schema, []));
  176. checkValidationErrors(function () use ($schema) {
  177. (new Processor)->process($schema, [1, 2, 3]);
  178. }, [
  179. "The item '0' expects to be string, 1 given.",
  180. "The item '1' expects to be string, 2 given.",
  181. "The item '2' expects to be string, 3 given.",
  182. ]);
  183. Assert::same(['a' => 'val'], (new Processor)->process($schema, ['a' => 'val']));
  184. checkValidationErrors(function () use ($schema) {
  185. (new Processor)->process($schema, ['a' => null]);
  186. }, ["The item 'a' expects to be string, null given."]);
  187. checkValidationErrors(function () use ($schema) {
  188. (new Processor)->process($schema, ['b' => 123]);
  189. }, ["The item 'b' expects to be string, 123 given."]);
  190. checkValidationErrors(function () use ($schema) {
  191. (new Processor)->process($schema, ['b' => null]);
  192. }, ["The item 'b' expects to be string, null given."]);
  193. Assert::same(['a' => 'defval', 'b' => 'val'], (new Processor)->process($schema, ['b' => 'val']));
  194. });
  195. test('items() & structure', function () {
  196. $schema = Expect::array([
  197. 'a' => 'defval',
  198. ])->items(Expect::structure(['k' => Expect::string()]));
  199. Assert::same(['a' => 'defval'], (new Processor)->process($schema, []));
  200. checkValidationErrors(function () use ($schema) {
  201. (new Processor)->process($schema, ['a' => 'val']);
  202. }, ["The item 'a' expects to be array, 'val' given."]);
  203. checkValidationErrors(function () use ($schema) {
  204. (new Processor)->process($schema, [1, 2, 3]);
  205. }, [
  206. "The item '0' expects to be array, 1 given.",
  207. "The item '1' expects to be array, 2 given.",
  208. "The item '2' expects to be array, 3 given.",
  209. ]);
  210. checkValidationErrors(function () use ($schema) {
  211. (new Processor)->process($schema, ['b' => 'val']);
  212. }, ["The item 'b' expects to be array, 'val' given."]);
  213. checkValidationErrors(function () use ($schema) {
  214. (new Processor)->process($schema, ['b' => ['a' => 'val']]);
  215. }, ["Unexpected item 'b\u{a0}›\u{a0}a', did you mean 'k'?"]);
  216. Assert::equal(
  217. ['a' => 'defval', 'b' => (object) ['k' => 'val']],
  218. (new Processor)->process($schema, ['b' => ['k' => 'val']])
  219. );
  220. });
  221. test('arrayOf() & scalar', function () {
  222. $schema = Expect::arrayOf('string|int');
  223. Assert::same([], (new Processor)->process($schema, []));
  224. Assert::same([1, 2, 3], (new Processor)->process($schema, [1, 2, 3]));
  225. Assert::same([10 => 20], (new Processor)->process($schema, [10 => 20]));
  226. checkValidationErrors(function () use ($schema) {
  227. (new Processor)->process($schema, [1, 2, false]);
  228. }, ["The item '2' expects to be string or int, false given."]);
  229. Assert::same(['key' => 'val'], (new Processor)->process($schema, ['key' => 'val']));
  230. });
  231. test('arrayOf() & keys', function () {
  232. $schema = Expect::arrayOf('string|int', Expect::string()->pattern('\w+'));
  233. Assert::same([], (new Processor)->process($schema, []));
  234. checkValidationErrors(function () use ($schema) {
  235. (new Processor)->process($schema, [1, '#' => 2]);
  236. }, [
  237. "The key of item '0' expects to be string, 0 given.",
  238. "The key of item '#' expects to match pattern '\\w+', '#' given.",
  239. ]);
  240. Assert::same(['key' => 'val'], (new Processor)->process($schema, ['key' => 'val']));
  241. });
  242. test('arrayOf() & keys II.', function () {
  243. $schema = Expect::arrayOf('string|int', Expect::string()->before('strrev'));
  244. Assert::same(['yek' => 'val'], (new Processor)->process($schema, ['key' => 'val']));
  245. });
  246. test('arrayOf() error', function () {
  247. Assert::exception(function () {
  248. Expect::arrayOf(['a' => Expect::string()]);
  249. }, TypeError::class);
  250. });
  251. test('type[]', function () {
  252. $schema = Expect::type('int[]');
  253. Assert::same([], (new Processor)->process($schema, null));
  254. Assert::same([], (new Processor)->process($schema, []));
  255. Assert::same([1, 2, 3], (new Processor)->process($schema, [1, 2, 3]));
  256. checkValidationErrors(function () use ($schema) {
  257. (new Processor)->process($schema, [1, 2, false]);
  258. }, ['The item expects to be int[], array given.']);
  259. Assert::same(['key' => 1], (new Processor)->process($schema, ['key' => 1]));
  260. });