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++;
 | |
|     }
 | |
|   }
 | |
| }
 |