<?php
declare(strict_types=1);
use NetteSchemaExpect;
use NetteSchemaHelpers;
use NetteSchemaProcessor;
use TesterAssert;
require __DIR__ . '/../bootstrap.php';
test('without default value', function () {
$schema = Expect::
array();
assert::
same([],
(new Processor
)->
process($schema,
[]));
assert::
same([1,
2,
3],
(new Processor
)->
process($schema,
[1,
2,
3]));
assert::
same(['key' =>
'val'],
(new Processor
)->
process($schema,
['key' =>
'val']));
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, 'one');
}, ["The item expects to be array, 'one' given."]);
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, true);
}, ['The item expects to be array, true given.']);
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, 123);
}, ['The item expects to be array, 123 given.']);
assert::
same([],
(new Processor
)->
process($schema,
null));
});
test('not merging', function () {
$schema = Expect::
array([
'key1' => 'val1',
'key2' => 'val2',
'val3',
'arr' => ['item'],
])->mergeDefaults(false);
assert::
same([],
(new Processor
)->
process($schema,
[]));
[1, 2, 3],
(new Processor)->process($schema, [1, 2, 3])
);
});
test('merging', function () {
$schema = Expect::
array([
'key1' => 'val1',
'key2' => 'val2',
'val3',
'arr' => ['item'],
]);
'key1' => 'val1',
'key2' => 'val2',
'val3',
'arr' => ['item'],
], (new Processor)->process($schema, []));
[
'key1' => 'val1',
'key2' => 'val2',
'val3',
'arr' => ['item'],
1, 2, 3,
],
(new Processor)->process($schema, [1, 2, 3])
);
[
'key1' => 'newval',
'key2' => 'val2',
'val3',
'arr' => ['item', 'newitem'],
'key3' => 'newval',
'newval3',
],
(new Processor)->process($schema, [
'key1' => 'newval',
'key3' => 'newval',
'newval3',
'arr' => ['newitem'],
])
);
[
'key1' => 'newval',
'key3' => 'newval',
'newval3',
'arr' => ['newitem'],
],
(new Processor)->process($schema, [
Helpers::PREVENT_MERGING => true,
'key1' => 'newval',
'key3' => 'newval',
'newval3',
'arr' => ['newitem'],
])
);
[
'key1' => 'newval',
'key2' => 'val2',
'val3',
'arr' => ['newitem'],
'key3' => 'newval',
'newval3',
],
(new Processor)->process($schema, [
'key1' => 'newval',
'key3' => 'newval',
'newval3',
'arr' => [Helpers::PREVENT_MERGING => true, 'newitem'],
])
);
});
test('merging & other items validation', function () {
$schema = Expect::
array([
'key1' => 'val1',
'key2' => 'val2',
'val3',
])->items('string');
'key1' => 'val1',
'key2' => 'val2',
'val3',
], (new Processor)->process($schema, []));
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, [1, 2, 3]);
}, [
"The item '0' expects to be string, 1 given.",
"The item '1' expects to be string, 2 given.",
"The item '2' expects to be string, 3 given.",
]);
[
'key1' => 'newval',
'key2' => 'val2',
'val3',
'key3' => 'newval',
'newval3',
],
(new Processor)->process($schema, [
'key1' => 'newval',
'key3' => 'newval',
'newval3',
])
);
});
test('merging & other items validation', function () {
$schema = Expect::
array()->
items('string');
'key1' => 'val1',
'key2' => 'val2',
'val3',
], $schema->merge([
'key1' => 'val1',
'key2' => 'val2',
'val3',
], null));
[
'key1' => 'newval',
'key2' => 'val2',
'val3',
'key3' => 'newval',
'newval3',
],
$schema->merge([
'key1' => 'newval',
'key3' => 'newval',
'newval3',
], [
'key1' => 'val1',
'key2' => 'val2',
'val3',
])
);
});
test('items() & scalar', function () {
$schema = Expect::
array([
'a' => 'defval',
])->items('string');
assert::
same(['a' =>
'defval'],
(new Processor
)->
process($schema,
[]));
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, [1, 2, 3]);
}, [
"The item '0' expects to be string, 1 given.",
"The item '1' expects to be string, 2 given.",
"The item '2' expects to be string, 3 given.",
]);
assert::
same(['a' =>
'val'],
(new Processor
)->
process($schema,
['a' =>
'val']));
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, ['a' => null]);
}, ["The item 'a' expects to be string, null given."]);
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, ['b' => 123]);
}, ["The item 'b' expects to be string, 123 given."]);
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, ['b' => null]);
}, ["The item 'b' expects to be string, null given."]);
assert::
same(['a' =>
'defval',
'b' =>
'val'],
(new Processor
)->
process($schema,
['b' =>
'val']));
});
test('items() & structure', function () {
$schema = Expect::
array([
'a' => 'defval',
])->items(Expect::structure(['k' => Expect::string()]));
assert::
same(['a' =>
'defval'],
(new Processor
)->
process($schema,
[]));
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, ['a' => 'val']);
}, ["The item 'a' expects to be array, 'val' given."]);
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, [1, 2, 3]);
}, [
"The item '0' expects to be array, 1 given.",
"The item '1' expects to be array, 2 given.",
"The item '2' expects to be array, 3 given.",
]);
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, ['b' => 'val']);
}, ["The item 'b' expects to be array, 'val' given."]);
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, ['b' => ['a' => 'val']]);
}, ["Unexpected item 'b › a', did you mean 'k'?"]);
['a' => 'defval', 'b' => (object) ['k' => 'val']],
(new Processor)->process($schema, ['b' => ['k' => 'val']])
);
});
test('arrayOf() & scalar', function () {
$schema = Expect::arrayOf('string|int');
assert::
same([],
(new Processor
)->
process($schema,
[]));
assert::
same([1,
2,
3],
(new Processor
)->
process($schema,
[1,
2,
3]));
assert::
same([10 =>
20],
(new Processor
)->
process($schema,
[10 =>
20]));
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, [1, 2, false]);
}, ["The item '2' expects to be string or int, false given."]);
assert::
same(['key' =>
'val'],
(new Processor
)->
process($schema,
['key' =>
'val']));
});
test('arrayOf() & keys', function () {
$schema = Expect::arrayOf('string|int', Expect::string()->pattern('w+'));
assert::
same([],
(new Processor
)->
process($schema,
[]));
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, [1, '#' => 2]);
}, [
"The key of item '0' expects to be string, 0 given.",
"The key of item '#' expects to match pattern '\w+', '#' given.",
]);
assert::
same(['key' =>
'val'],
(new Processor
)->
process($schema,
['key' =>
'val']));
});
test('arrayOf() & keys II.', function () {
$schema = Expect::arrayOf('string|int', Expect::string()->before('strrev'));
assert::
same(['yek' =>
'val'],
(new Processor
)->
process($schema,
['key' =>
'val']));
});
test('arrayOf() error', function () {
assert::
exception(function () {
Expect::arrayOf(['a' => Expect::string()]);
}, TypeError::class);
});
test('type[]', function () {
$schema = Expect::type('int[]');
assert::
same([],
(new Processor
)->
process($schema,
null));
assert::
same([],
(new Processor
)->
process($schema,
[]));
assert::
same([1,
2,
3],
(new Processor
)->
process($schema,
[1,
2,
3]));
checkValidationErrors(function () use ($schema) {
(new Processor)->process($schema, [1, 2, false]);
}, ['The item expects to be int[], array given.']);
assert::
same(['key' =>
1],
(new Processor
)->
process($schema,
['key' =>
1]));
});