365 lines
11 KiB
PHP
365 lines
11 KiB
PHP
|
<?php
|
||
|
namespace nur;
|
||
|
|
||
|
use nur\b\ValueException;
|
||
|
use nur\t\TestCase;
|
||
|
|
||
|
class mdTest extends TestCase {
|
||
|
const SCHEMA_DATA1 = [
|
||
|
# sequentiel
|
||
|
[null, ["a" => null, "b" => null]],
|
||
|
[[], ["a" => null, "b" => null]],
|
||
|
[[null], ["a" => null, "b" => null]],
|
||
|
["a", ["a" => "a", "b" => null]],
|
||
|
[["a"], ["a" => "a", "b" => null]],
|
||
|
[["a", "b"], ["a" => "a", "b" => "b"]],
|
||
|
# associatif
|
||
|
[["a" => "a"], ["a" => "a", "b" => null]],
|
||
|
[["b" => "b"], ["b" => "b", "a" => null]],
|
||
|
[["a" => "a", "b" => "b"], ["a" => "a", "b" => "b"]],
|
||
|
[["b" => "b", "a" => "a"], ["b" => "b", "a" => "a"]],
|
||
|
# mix séquentiel / associatif
|
||
|
[["a" => "a", "b"], ["a" => "a", "b" => "b"]],
|
||
|
[["a", "b" => "b"], ["b" => "b", "a" => "a"]],
|
||
|
# avec extra
|
||
|
[["a", "b", "x"], ["a" => "a", "b" => "b", "x"]],
|
||
|
[["a", "b", "y" => "y"], ["y" => "y", "a" => "a", "b" => "b"]],
|
||
|
[["a" => "a", "b" => "b", "x"], ["a" => "a", "b" => "b", "x"]],
|
||
|
[["a" => "a", "b" => "b", "y" => "y"], ["a" => "a", "b" => "b", "y" => "y"]],
|
||
|
[["a" => "a", "b" => "b", "x", "y" => "y"], ["a" => "a", "b" => "b", "y" => "y", "x"]],
|
||
|
];
|
||
|
const SCHEMA_DATA2 = [
|
||
|
# sequentiel
|
||
|
["k", null, ["a" => "k", "b" => null]],
|
||
|
["k", [], ["a" => "k", "b" => null]],
|
||
|
["k", [null], ["a" => "k", "b" => null]],
|
||
|
["k", "a", ["a" => "k", "b" => "a"]],
|
||
|
["k", ["a"], ["a" => "k", "b" => "a"]],
|
||
|
["k", ["a", "b"], ["a" => "k", "b" => "a", "b"]],
|
||
|
# associatif
|
||
|
["k", ["a" => "a"], ["a" => "a", "b" => null]],
|
||
|
["k", ["b" => "b"], ["b" => "b", "a" => "k"]],
|
||
|
["k", ["a" => "a", "b" => "b"], ["a" => "a", "b" => "b"]],
|
||
|
["k", ["b" => "b", "a" => "a"], ["b" => "b", "a" => "a"]],
|
||
|
# mix séquentiel / associatif
|
||
|
["k", ["a" => "a", "b"], ["a" => "a", "b" => "b"]],
|
||
|
["k", ["a", "b" => "b"], ["b" => "b", "a" => "k", "a"]],
|
||
|
# avec extra
|
||
|
["k", ["a", "b", "x"], ["a" => "k", "b" => "a", "b", "x"]],
|
||
|
["k", ["a", "b", "y" => "y"], ["y" => "y", "a" => "k", "b" => "a", "b"]],
|
||
|
["k", ["a" => "a", "b" => "b", "x"], ["a" => "a", "b" => "b", "x"]],
|
||
|
["k", ["a" => "a", "b" => "b", "y" => "y"], ["a" => "a", "b" => "b", "y" => "y"]],
|
||
|
["k", ["a" => "a", "b" => "b", "x", "y" => "y"], ["a" => "a", "b" => "b", "y" => "y", "x"]],
|
||
|
];
|
||
|
|
||
|
function testSchema() {
|
||
|
$schema = [
|
||
|
"a" => null,
|
||
|
"b" => null,
|
||
|
];
|
||
|
|
||
|
$index = 0;
|
||
|
foreach (self::SCHEMA_DATA1 as [$data, $result]) {
|
||
|
md::ensure_schema($data, $schema);
|
||
|
self::assertSame($result, $data, "at SCHEMA_DATA1[$index]");
|
||
|
$index++;
|
||
|
}
|
||
|
$index = 0;
|
||
|
foreach (self::SCHEMA_DATA2 as [$key, $data, $result]) {
|
||
|
md::ensure_schema($data, $schema, $key);
|
||
|
self::assertSame($result, $data, "at SCHEMA_DATA2[$index]");
|
||
|
$index++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#############################################################################
|
||
|
|
||
|
function testRecursiveSchema() {
|
||
|
$item_schema = [
|
||
|
"id" => null,
|
||
|
"name" => null,
|
||
|
];
|
||
|
$schema = [
|
||
|
"item" => ["array", "default", "schema" => $item_schema],
|
||
|
"items" => ["array[]", "default", "schema" => $item_schema],
|
||
|
"nitem" => ["?array", "default", "schema" => $item_schema],
|
||
|
"nitems" => ["?array[]", "default", "schema" => $item_schema],
|
||
|
];
|
||
|
|
||
|
$data = null;
|
||
|
md::ensure_schema($data, $schema);
|
||
|
self::assertSame([
|
||
|
"item" => ["id" => "default", "name" => null],
|
||
|
"items" => [["id" => "default", "name" => null]],
|
||
|
"nitem" => ["id" => "default", "name" => null],
|
||
|
"nitems" => [["id" => "default", "name" => null]],
|
||
|
], $data);
|
||
|
|
||
|
$data = [false, false, false, false];
|
||
|
md::ensure_schema($data, $schema);
|
||
|
self::assertSame([
|
||
|
"item" => ["id" => "default", "name" => null],
|
||
|
"items" => [["id" => "default", "name" => null]],
|
||
|
"nitem" => ["id" => "default", "name" => null],
|
||
|
"nitems" => [["id" => "default", "name" => null]],
|
||
|
], $data);
|
||
|
|
||
|
$data = [null, null, null, null];
|
||
|
md::ensure_schema($data, $schema);
|
||
|
self::assertSame([
|
||
|
"item" => ["id" => "default", "name" => null],
|
||
|
"items" => [["id" => "default", "name" => null]],
|
||
|
"nitem" => null,
|
||
|
"nitems" => null,
|
||
|
], $data);
|
||
|
|
||
|
$data = ["id", "id", "id", "id"];
|
||
|
md::ensure_schema($data, $schema);
|
||
|
self::assertSame([
|
||
|
"item" => ["id" => "id", "name" => null],
|
||
|
"items" => [["id" => "id", "name" => null]],
|
||
|
"nitem" => ["id" => "id", "name" => null],
|
||
|
"nitems" => [["id" => "id", "name" => null]],
|
||
|
], $data);
|
||
|
}
|
||
|
|
||
|
#############################################################################
|
||
|
|
||
|
function testTypes() {
|
||
|
$schema = [
|
||
|
"regular" => [null, "default"],
|
||
|
"boolt" => ["bool", true],
|
||
|
"boolf" => ["bool", false],
|
||
|
"booln" => ["bool", null],
|
||
|
"nboolt" => ["?bool", true],
|
||
|
"nboolf" => ["?bool", false],
|
||
|
"nbooln" => ["?bool", null],
|
||
|
"mixed" => ["mixed", "default"],
|
||
|
];
|
||
|
|
||
|
$data = [];
|
||
|
md::ensure_schema($data, $schema);
|
||
|
self::assertSame([
|
||
|
"regular" => "default",
|
||
|
"boolt" => true, "boolf" => false, "booln" => false,
|
||
|
"nboolt" => true, "nboolf" => false, "nbooln" => null,
|
||
|
"mixed" => "default",
|
||
|
], $data);
|
||
|
|
||
|
$data = [
|
||
|
false,
|
||
|
false, false, false,
|
||
|
false, false, false,
|
||
|
false,
|
||
|
];
|
||
|
md::ensure_schema($data, $schema);
|
||
|
self::assertSame([
|
||
|
"regular" => "default",
|
||
|
"boolt" => false, "boolf" => false, "booln" => false,
|
||
|
"nboolt" => false, "nboolf" => false, "nbooln" => false,
|
||
|
"mixed" => false,
|
||
|
], $data);
|
||
|
|
||
|
$data = [
|
||
|
null,
|
||
|
null, null, null,
|
||
|
null, null, null,
|
||
|
null,
|
||
|
];
|
||
|
md::ensure_schema($data, $schema);
|
||
|
self::assertSame([
|
||
|
"regular" => null,
|
||
|
"boolt" => true, "boolf" => false, "booln" => false,
|
||
|
"nboolt" => null, "nboolf" => null, "nbooln" => null,
|
||
|
"mixed" => null,
|
||
|
], $data);
|
||
|
|
||
|
$data = [
|
||
|
"x",
|
||
|
"x", "x", "x",
|
||
|
"x", "x", "x",
|
||
|
"x",
|
||
|
];
|
||
|
md::ensure_schema($data, $schema);
|
||
|
self::assertSame([
|
||
|
"regular" => "x",
|
||
|
"boolt" => true, "boolf" => true, "booln" => true,
|
||
|
"nboolt" => true, "nboolf" => true, "nbooln" => true,
|
||
|
"mixed" => "x",
|
||
|
], $data);
|
||
|
}
|
||
|
|
||
|
function testArrayToString() {
|
||
|
$schema = ["value" => "string"];
|
||
|
|
||
|
$data = ["value" => "one"];
|
||
|
md::ensure_schema($data, $schema);
|
||
|
self::assertSame(["value" => "one"], $data);
|
||
|
|
||
|
$data = ["value" => ["one", "two"]];
|
||
|
md::ensure_schema($data, $schema);
|
||
|
self::assertSame(["value" => "one two"], $data);
|
||
|
|
||
|
$data = ["value" => ["one", "two" => false, "three" => true]];
|
||
|
md::ensure_schema($data, $schema);
|
||
|
self::assertSame(["value" => "one three"], $data);
|
||
|
}
|
||
|
|
||
|
#############################################################################
|
||
|
|
||
|
function testRequired() {
|
||
|
$schema = [
|
||
|
"required" => [null, "required" => true],
|
||
|
"nullable" => [null, 1],
|
||
|
];
|
||
|
|
||
|
$data = null;
|
||
|
self::assertException(ValueException::class, function() use (&$data, $schema) {
|
||
|
md::ensure_schema($data, $schema, null, true);
|
||
|
});
|
||
|
self::assertSame(["required" => null, "nullable" => 1], $data);
|
||
|
|
||
|
$data = [];
|
||
|
self::assertException(ValueException::class, function() use (&$data, $schema) {
|
||
|
md::ensure_schema($data, $schema, null, true);
|
||
|
});
|
||
|
self::assertSame(["required" => null, "nullable" => 1], $data);
|
||
|
|
||
|
$data = [null];
|
||
|
self::assertException(ValueException::class, function() use (&$data, $schema) {
|
||
|
md::ensure_schema($data, $schema, null, true);
|
||
|
});
|
||
|
self::assertSame(["required" => null, "nullable" => 1], $data);
|
||
|
|
||
|
$data = [false];
|
||
|
self::assertException(ValueException::class, function() use (&$data, $schema) {
|
||
|
md::ensure_schema($data, $schema, null, true);
|
||
|
});
|
||
|
self::assertSame(["required" => null, "nullable" => 1], $data);
|
||
|
|
||
|
$data = ["x"];
|
||
|
self::assertNotException(function() use (&$data, $schema) {
|
||
|
md::ensure_schema($data, $schema, null, true);
|
||
|
});
|
||
|
self::assertSame(["required" => "x", "nullable" => 1], $data);
|
||
|
|
||
|
$data = ["x", "y", "z"];
|
||
|
self::assertNotException(function() use (&$data, $schema) {
|
||
|
md::ensure_schema($data, $schema, null, true);
|
||
|
});
|
||
|
self::assertSame(["required" => "x", "nullable" => "y", "z"], $data);
|
||
|
|
||
|
$data = ["x", false, "z"];
|
||
|
self::assertNotException(function() use (&$data, $schema) {
|
||
|
md::ensure_schema($data, $schema, null, true);
|
||
|
});
|
||
|
self::assertSame(["required" => "x", "nullable" => 1, "z"], $data);
|
||
|
}
|
||
|
|
||
|
#############################################################################
|
||
|
|
||
|
const GET_DATA = [
|
||
|
[null, [
|
||
|
"a" => null,
|
||
|
"b" => "b",
|
||
|
]],
|
||
|
[false, [
|
||
|
"a" => "a",
|
||
|
"b" => "b",
|
||
|
]],
|
||
|
[1, [
|
||
|
"a" => 1,
|
||
|
"b" => "b",
|
||
|
]],
|
||
|
[[], [
|
||
|
"a" => "a",
|
||
|
"b" => "b",
|
||
|
]],
|
||
|
[[null], [
|
||
|
"a" => null,
|
||
|
"b" => "b",
|
||
|
]],
|
||
|
[[false], [
|
||
|
"a" => "a",
|
||
|
"b" => "b",
|
||
|
]],
|
||
|
[[1], [
|
||
|
"a" => 1,
|
||
|
"b" => "b",
|
||
|
]],
|
||
|
[[1, 2], [
|
||
|
"a" => 1,
|
||
|
"b" => 2,
|
||
|
]],
|
||
|
[["a" => 1], [
|
||
|
"a" => 1,
|
||
|
"b" => "b",
|
||
|
]],
|
||
|
[["b" => 2], [
|
||
|
"a" => "a",
|
||
|
"b" => 2,
|
||
|
]],
|
||
|
[["a" => 1, "b" => 2], [
|
||
|
"a" => 1,
|
||
|
"b" => 2,
|
||
|
]],
|
||
|
[["b" => 2, "a" => 1], [
|
||
|
"a" => 1,
|
||
|
"b" => 2,
|
||
|
]],
|
||
|
];
|
||
|
|
||
|
function testGet() {
|
||
|
$schema = [
|
||
|
"a" => [null, "a"],
|
||
|
"b" => [null, "b"],
|
||
|
];
|
||
|
|
||
|
$i = 0;
|
||
|
foreach (self::GET_DATA as [$data, $results]) {
|
||
|
$j = 0;
|
||
|
foreach ($results as $key => $expected) {
|
||
|
$actual = md::get($data, $key, $schema);
|
||
|
self::assertSame($expected, $actual, "at GET_DATA[$i][$j]");
|
||
|
$j++;
|
||
|
}
|
||
|
$i++;
|
||
|
}
|
||
|
|
||
|
# test default
|
||
|
$data = [];
|
||
|
self::assertSame("a", md::get($data, "a", $schema));
|
||
|
self::assertSame("A", md::get($data, "a", $schema, "A"));
|
||
|
$data = ["a" => "x"];
|
||
|
self::assertSame("x", md::get($data, "a", $schema));
|
||
|
self::assertSame("x", md::get($data, "a", $schema, "A"));
|
||
|
}
|
||
|
|
||
|
#############################################################################
|
||
|
|
||
|
const GET_VALUES_DATA = [
|
||
|
[null, [], []],
|
||
|
[["a", "b"], [], ["a", "b"]],
|
||
|
[["a" => "a"], ["a" => "a"], []],
|
||
|
[["b" => "b"], ["b" => "b"], []],
|
||
|
[["a" => "a", "b" => "b"], ["a" => "a", "b" => "b"], []],
|
||
|
[["b" => "b", "a" => "a"], ["a" => "a", "b" => "b"], []],
|
||
|
];
|
||
|
|
||
|
function testGetValues() {
|
||
|
$schema = [
|
||
|
"a" => null,
|
||
|
"b" => null,
|
||
|
];
|
||
|
|
||
|
$i = 0;
|
||
|
foreach (self::GET_VALUES_DATA as [$data, $xvalues, $xothers]) {
|
||
|
$values = md::get_values($data, $schema);
|
||
|
self::assertSame($xvalues, $values, "values at GET_VALUES_DATA[$i]");
|
||
|
$others = md::get_others($data, $schema);
|
||
|
self::assertSame($xothers, $others, "others at GET_VALUES_DATA[$i]");
|
||
|
$i++;
|
||
|
}
|
||
|
}
|
||
|
}
|