gestion simplifiée des schéma
This commit is contained in:
parent
efb4f037ec
commit
5e41e7d5e0
58
php/src/php/types/_schema.php
Normal file
58
php/src/php/types/_schema.php
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
<?php
|
||||||
|
namespace nulib\php\types;
|
||||||
|
|
||||||
|
use nulib\exceptions;
|
||||||
|
use nulib\str;
|
||||||
|
|
||||||
|
class _schema {
|
||||||
|
/** @var array association type simple / vclass */
|
||||||
|
const VCLASSES = [
|
||||||
|
"rawstring" => vrawstring::class,
|
||||||
|
"string" => vstring::class,
|
||||||
|
"text" => vtext::class,
|
||||||
|
"bool" => vbool::class,
|
||||||
|
"int" => vint::class,
|
||||||
|
"float" => vfloat::class,
|
||||||
|
"array" => varray::class,
|
||||||
|
"func" => vfunc::class,
|
||||||
|
"raw" => vraw::class,
|
||||||
|
"mixed" => vmixed::class,
|
||||||
|
"key" => vkey::class,
|
||||||
|
"pkey" => vpkey::class,
|
||||||
|
"content" => vcontent::class,
|
||||||
|
"datetime" => vdatetime::class,
|
||||||
|
"date" => vdate::class,
|
||||||
|
"time" => vtime::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
static function get_types($schema, &$default = null, ?bool &$required = null): array {
|
||||||
|
if (is_array($schema)) {
|
||||||
|
$types = $schema["type"] ?? $schema[0] ?? null;
|
||||||
|
$default = $schema["default"] ?? $schema[1] ?? null;
|
||||||
|
$required = vbool::with($schema["required"] ?? false);
|
||||||
|
} elseif (is_string($schema)) {
|
||||||
|
$types = $schema;
|
||||||
|
$default = null;
|
||||||
|
$required = false;
|
||||||
|
} else {
|
||||||
|
throw exceptions::invalid_value($schema, "schema");
|
||||||
|
}
|
||||||
|
if (is_string($types)) {
|
||||||
|
$types = explode(",", $types);
|
||||||
|
} elseif (!is_array($types)) {
|
||||||
|
throw exceptions::invalid_value($types, "types");
|
||||||
|
}
|
||||||
|
return $types;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function get_vclass(array $types, ?bool &$nullable): ?string {
|
||||||
|
foreach ($types as $type) {
|
||||||
|
$vclass = self::VCLASSES[$type] ?? null;
|
||||||
|
if ($vclass !== null) {
|
||||||
|
$nullable = str::del_prefix($type, "?");
|
||||||
|
return $vclass;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
75
php/src/php/types/assoc.php
Normal file
75
php/src/php/types/assoc.php
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
<?php
|
||||||
|
namespace nulib\php\types;
|
||||||
|
|
||||||
|
use nulib\exceptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class assoc: gestion simplifiée de schémas associatifs
|
||||||
|
*
|
||||||
|
* seuls les types simples sont reconnus
|
||||||
|
*/
|
||||||
|
class assoc {
|
||||||
|
/** indiquer si $array est conforme au schéma */
|
||||||
|
public static function check_schema(?array $array, array $schema, bool $strict = false): bool {
|
||||||
|
foreach ($schema as $key => $kschema) {
|
||||||
|
$types = _schema::get_types($kschema, $default, $required);
|
||||||
|
$exists = array_key_exists($key, $array);
|
||||||
|
if (!$exists) {
|
||||||
|
if ($required) return false;
|
||||||
|
else continue;
|
||||||
|
}
|
||||||
|
$vclass = _schema::get_vclass($types, $nullable);
|
||||||
|
# le test échoue si le type n'est pas supporté
|
||||||
|
if ($vclass === null) return false;
|
||||||
|
$value = $array[$key];
|
||||||
|
if ($value === null) {
|
||||||
|
if (!$nullable) return false;
|
||||||
|
} else {
|
||||||
|
if (!$vclass::isa($value, $strict)) return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* s'assurer que $array est conforme au schéma
|
||||||
|
* - les clés ne sont pas créées si elles n'existent pas, sauf si la valeur
|
||||||
|
* est requise ou si une valeur par défaut non nulle est fournie
|
||||||
|
*/
|
||||||
|
public static function ensure_schema(&$array, array $schema): bool {
|
||||||
|
$ensured = true;
|
||||||
|
foreach ($schema as $key => $kschema) {
|
||||||
|
$types = _schema::get_types($kschema, $default, $required);
|
||||||
|
|
||||||
|
$exists = array_key_exists($key, $array);
|
||||||
|
if (!$exists) {
|
||||||
|
if ($required) {
|
||||||
|
if ($default !== null) {
|
||||||
|
$array[$key] = $default;
|
||||||
|
} else {
|
||||||
|
throw exceptions::missing_value(null, "array", "$key est obligatoire");
|
||||||
|
}
|
||||||
|
} elseif ($default !== null) {
|
||||||
|
$array[$key] = $default;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$vclass = _schema::get_vclass($types, $nullable);
|
||||||
|
# le test échoue si le type n'est pas supporté
|
||||||
|
if ($vclass === null) {
|
||||||
|
$ensured = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = $array[$key];
|
||||||
|
if ($nullable) {
|
||||||
|
$array[$key] = $vclass::withn($value);
|
||||||
|
} else {
|
||||||
|
if ($value === null) $value = $default;
|
||||||
|
$array[$key] = $vclass::with($value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $ensured;
|
||||||
|
}
|
||||||
|
}
|
||||||
34
php/src/php/types/scalar.php
Normal file
34
php/src/php/types/scalar.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
namespace nulib\php\types;
|
||||||
|
|
||||||
|
use nulib\exceptions;
|
||||||
|
use nulib\str;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class scalar: gestion simplifiée de schémas de valeurs simples
|
||||||
|
*/
|
||||||
|
class scalar {
|
||||||
|
/** indiquer si $value est conforme au schéma */
|
||||||
|
static function check_schema($value, $schema, bool $strict=false): bool {
|
||||||
|
$types = _schema::get_types($schema);
|
||||||
|
$vclass = _schema::get_vclass($types, $nullable);
|
||||||
|
# le test échoue si le type n'est pas supporté
|
||||||
|
if ($vclass === null) return false;
|
||||||
|
if ($value === null) return $nullable;
|
||||||
|
return $vclass::isa($value, $strict);
|
||||||
|
}
|
||||||
|
|
||||||
|
static function ensure_schema(&$value, $schema): bool {
|
||||||
|
$types = _schema::get_types($schema, $default);
|
||||||
|
$vclass = _schema::get_vclass($types, $nullable);
|
||||||
|
# la conversion échoue si le type n'est pas supporté
|
||||||
|
if ($vclass === null) return false;
|
||||||
|
if ($nullable) {
|
||||||
|
$value = $vclass::withn($value);
|
||||||
|
} else {
|
||||||
|
if ($value === null) $value = $default;
|
||||||
|
$value = $vclass::with($value);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -2,6 +2,7 @@
|
|||||||
namespace nulib\php\types;
|
namespace nulib\php\types;
|
||||||
|
|
||||||
use nulib\cl;
|
use nulib\cl;
|
||||||
|
use nulib\exceptions;
|
||||||
|
|
||||||
class varray {
|
class varray {
|
||||||
static function isa($value, bool $strict=false) : bool {
|
static function isa($value, bool $strict=false) : bool {
|
||||||
@ -10,7 +11,10 @@ class varray {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static function ensure(&$array): void {
|
static function ensure(&$array): void {
|
||||||
if (!is_array($array)) $array = cl::with($array);
|
if (is_array($array)) return;
|
||||||
|
if ($array === null || $array === false) $array = [];
|
||||||
|
elseif (is_scalar($array)) $array = cl::with($array);
|
||||||
|
else throw exceptions::invalid_value($array, "array");
|
||||||
}
|
}
|
||||||
|
|
||||||
static function ensuren(&$array): void {
|
static function ensuren(&$array): void {
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace nulib\php\types;
|
namespace nulib\php\types;
|
||||||
|
|
||||||
|
use nulib\exceptions;
|
||||||
|
|
||||||
class vbool {
|
class vbool {
|
||||||
/** liste de valeurs chaines à considérer comme 'OUI' */
|
/** liste de valeurs chaines à considérer comme 'OUI' */
|
||||||
public const YES_VALUES = [
|
public const YES_VALUES = [
|
||||||
@ -37,11 +39,18 @@ class vbool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static function ensure(&$bool): void {
|
static function ensure(&$bool): void {
|
||||||
if (is_string($bool)) {
|
if (is_bool($bool)) return;
|
||||||
|
if ($bool === null) {
|
||||||
|
$bool = false;
|
||||||
|
} elseif (is_string($bool)) {
|
||||||
if (self::is_yes($bool)) $bool = true;
|
if (self::is_yes($bool)) $bool = true;
|
||||||
elseif (self::is_no($bool)) $bool = false;
|
elseif (self::is_no($bool)) $bool = false;
|
||||||
|
else throw exceptions::invalid_value($bool, "boolean");
|
||||||
|
} elseif (is_scalar($bool)) {
|
||||||
|
$bool = boolval($bool);
|
||||||
|
} else {
|
||||||
|
throw exceptions::invalid_value($bool, "boolean");
|
||||||
}
|
}
|
||||||
if (!is_bool($bool)) $bool = boolval($bool);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static function ensuren(&$bool): void {
|
static function ensuren(&$bool): void {
|
||||||
|
|||||||
@ -1,15 +1,28 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace nulib\php\types;
|
namespace nulib\php\types;
|
||||||
|
|
||||||
|
use nulib\exceptions;
|
||||||
|
use nulib\php\content\IContent;
|
||||||
|
use nulib\php\content\IPrintable;
|
||||||
|
|
||||||
class vcontent {
|
class vcontent {
|
||||||
static function isa($value, bool $strict=false) : bool {
|
static function isa($value, bool $strict=false) : bool {
|
||||||
if ($strict) return is_array($value) || is_string($value);
|
if ($strict) return is_array($value) || is_string($value);
|
||||||
else return is_array($value) || is_scalar($value);
|
return is_array($value) || is_scalar($value) ||
|
||||||
|
$value instanceof IContent || $value instanceof IPrintable;
|
||||||
}
|
}
|
||||||
|
|
||||||
static function ensure(&$content): void {
|
static function ensure(&$content): void {
|
||||||
if ($content === null || $content === false) $content = [];
|
if (is_array($content) || is_string($content)) return;
|
||||||
elseif (!is_string($content) && !is_array($content)) $content = strval($content);
|
if ($content === null || $content === false) {
|
||||||
|
$content = [];
|
||||||
|
} elseif (is_scalar($content)) {
|
||||||
|
$content = [$content];
|
||||||
|
} elseif ($content instanceof IContent || $content instanceof IPrintable) {
|
||||||
|
$content = [$content];
|
||||||
|
} else {
|
||||||
|
throw exceptions::invalid_value($content, "content");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static function ensuren(&$content): void {
|
static function ensuren(&$content): void {
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace nulib\php\types;
|
namespace nulib\php\types;
|
||||||
|
|
||||||
|
use nulib\exceptions;
|
||||||
|
|
||||||
class vfloat {
|
class vfloat {
|
||||||
static function isa($value, bool $strict=false) : bool {
|
static function isa($value, bool $strict=false) : bool {
|
||||||
if ($strict) return is_float($value);
|
if ($strict) return is_float($value);
|
||||||
@ -8,7 +10,10 @@ class vfloat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static function ensure(&$float): void {
|
static function ensure(&$float): void {
|
||||||
if (!is_float($float)) $float = floatval($float);
|
if (is_float($float)) return;
|
||||||
|
if ($float === null || $float === false) $float = 0.0;
|
||||||
|
elseif (is_numeric($float)) $float = floatval($float);
|
||||||
|
else throw exceptions::invalid_value($float, "float");
|
||||||
}
|
}
|
||||||
|
|
||||||
static function ensuren(&$float): void {
|
static function ensuren(&$float): void {
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace nulib\php\types;
|
namespace nulib\php\types;
|
||||||
|
|
||||||
|
use nulib\exceptions;
|
||||||
|
|
||||||
class vint {
|
class vint {
|
||||||
static function isa($value, bool $strict=false) : bool {
|
static function isa($value, bool $strict=false) : bool {
|
||||||
if ($strict) return is_int($value);
|
if ($strict) return is_int($value);
|
||||||
@ -8,7 +10,10 @@ class vint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static function ensure(&$int): void {
|
static function ensure(&$int): void {
|
||||||
if (!is_int($int)) $int = intval($int);
|
if (is_int($int)) return;
|
||||||
|
if ($int === null || $int === false) $int = 0.0;
|
||||||
|
elseif (is_numeric($int)) $int = intval($int);
|
||||||
|
else throw exceptions::invalid_value($int, "int");
|
||||||
}
|
}
|
||||||
|
|
||||||
static function ensuren(&$int): void {
|
static function ensuren(&$int): void {
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace nulib\php\types;
|
namespace nulib\php\types;
|
||||||
|
|
||||||
|
use nulib\exceptions;
|
||||||
|
|
||||||
class vkey {
|
class vkey {
|
||||||
static function isa($value, bool $strict=false) : bool {
|
static function isa($value, bool $strict=false) : bool {
|
||||||
if ($strict) return is_int($value) || is_string($value);
|
if ($strict) return is_int($value) || is_string($value);
|
||||||
@ -8,9 +10,11 @@ class vkey {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static function ensure(&$key): void {
|
static function ensure(&$key): void {
|
||||||
|
if (is_int($key) || is_string($key)) return;
|
||||||
if ($key === null) $key = "";
|
if ($key === null) $key = "";
|
||||||
elseif ($key === false) $key = 0;
|
elseif ($key === false) $key = 0;
|
||||||
elseif (!is_string($key) && !is_int($key)) $key = strval($key);
|
elseif (is_scalar($key)) $key = strval($key);
|
||||||
|
else throw exceptions::invalid_value($key, "key");
|
||||||
}
|
}
|
||||||
|
|
||||||
static function ensuren(&$key): void {
|
static function ensuren(&$key): void {
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace nulib\php\types;
|
namespace nulib\php\types;
|
||||||
|
|
||||||
|
use nulib\exceptions;
|
||||||
|
|
||||||
class vpkey {
|
class vpkey {
|
||||||
static function isa($value, bool $strict=false) : bool {
|
static function isa($value, bool $strict=false) : bool {
|
||||||
if ($strict) return is_array($value) || is_int($value) || is_string($value);
|
if ($strict) return is_array($value) || is_int($value) || is_string($value);
|
||||||
@ -8,15 +10,19 @@ class vpkey {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static function ensure(&$pkey): void {
|
static function ensure(&$pkey): void {
|
||||||
if ($pkey === null) $pkey = "";
|
|
||||||
elseif ($pkey === false) $pkey = 0;
|
|
||||||
elseif (!is_string($pkey) && !is_int($pkey) && !is_array($pkey)) $pkey = strval($pkey);
|
|
||||||
if (is_array($pkey)) {
|
if (is_array($pkey)) {
|
||||||
foreach ($pkey as &$key) {
|
foreach ($pkey as &$key) {
|
||||||
vkey::ensure($key);
|
vkey::ensure($key);
|
||||||
};
|
};
|
||||||
unset($key);
|
unset($key);
|
||||||
|
return;
|
||||||
|
} elseif (is_int($pkey) || is_string($pkey)) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
if ($pkey === null) $pkey = "";
|
||||||
|
elseif ($pkey === false) $pkey = 0;
|
||||||
|
elseif (is_scalar($pkey)) $pkey = strval($pkey);
|
||||||
|
else throw exceptions::invalid_value($pkey, "pkey");
|
||||||
}
|
}
|
||||||
|
|
||||||
static function ensuren(&$pkey): void {
|
static function ensuren(&$pkey): void {
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace nulib\php\types;
|
namespace nulib\php\types;
|
||||||
|
|
||||||
|
use nulib\exceptions;
|
||||||
use nulib\str;
|
use nulib\str;
|
||||||
|
|
||||||
class vrawstring {
|
class vrawstring {
|
||||||
@ -15,7 +16,13 @@ class vrawstring {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static function ensure(&$string): void {
|
static function ensure(&$string): void {
|
||||||
if (!is_string($string)) $string = strval($string);
|
if (!is_string($string)) {
|
||||||
|
if (is_scalar($string)) {
|
||||||
|
$string = strval($string);
|
||||||
|
} else {
|
||||||
|
throw exceptions::invalid_value($string, "string");
|
||||||
|
}
|
||||||
|
}
|
||||||
if (static::TRIM) $string = trim($string);
|
if (static::TRIM) $string = trim($string);
|
||||||
if (static::NORM_NL) $string = str::norm_nl($string);
|
if (static::NORM_NL) $string = str::norm_nl($string);
|
||||||
}
|
}
|
||||||
|
|||||||
88
php/tests/php/types/assocTest.php
Normal file
88
php/tests/php/types/assocTest.php
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
<?php
|
||||||
|
namespace nulib\php\types;
|
||||||
|
|
||||||
|
use nulib\tests\TestCase;
|
||||||
|
use nulib\ValueException;
|
||||||
|
|
||||||
|
class assocTest extends TestCase {
|
||||||
|
static function assertEnsureOk(array $schema, ?array $input, ?array $output) {
|
||||||
|
assoc::ensure_schema($input, $schema);
|
||||||
|
self::assertSame($output, $input);
|
||||||
|
}
|
||||||
|
|
||||||
|
static function assertEnsureFail(array $schema, ?array $input, ?array $output) {
|
||||||
|
self::assertException(ValueException::class, function() use ($input, $schema) {
|
||||||
|
assoc::ensure_schema($input, $schema);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function testEnsureSchema() {
|
||||||
|
self::assertEnsureOk([
|
||||||
|
"string" => "string",
|
||||||
|
"int" => "int",
|
||||||
|
], [
|
||||||
|
"string" => 5,
|
||||||
|
"int" => "42",
|
||||||
|
], [
|
||||||
|
"string" => "5",
|
||||||
|
"int" => 42,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const SCHEMA_S = ["s" => "string"];
|
||||||
|
const SCHEMA_SD = ["s" => ["string", null]];
|
||||||
|
const SCHEMA_SND = ["s" => ["string", "not null"]];
|
||||||
|
const SCHEMA_RS = ["s" => ["string", "required" => true]];
|
||||||
|
const SCHEMA_RSD = ["s" => ["string", null, "required" => true]];
|
||||||
|
const SCHEMA_RSND = ["s" => ["string", "not null", "required" => true]];
|
||||||
|
const SCHEMA_NS = ["s" => "?string"];
|
||||||
|
const SCHEMA_NSD = ["s" => ["?string", null]];
|
||||||
|
const SCHEMA_NSND = ["s" => ["?string", "not null"]];
|
||||||
|
const SCHEMA_NRS = ["s" => ["?string", "required" => true]];
|
||||||
|
const SCHEMA_NRSD = ["s" => ["?string", null, "required" => true]];
|
||||||
|
const SCHEMA_NRSND = ["s" => ["?string", "not null", "required" => true]];
|
||||||
|
|
||||||
|
function testEnsureSchema2() {
|
||||||
|
self::assertEnsureOk(self::SCHEMA_S, [], []);
|
||||||
|
self::assertEnsureFail(self::SCHEMA_S, ["s" => null], ["s" => null]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_S, ["s" => "not null"], ["s" => "not null"]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NS, [], []);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NS, ["s" => null], ["s" => null]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NS, ["s" => "not null"], ["s" => "not null"]);
|
||||||
|
|
||||||
|
self::assertEnsureOk(self::SCHEMA_SD, [], []);
|
||||||
|
self::assertEnsureFail(self::SCHEMA_SD, ["s" => null], ["s" => null]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_SD, ["s" => "not null"], ["s" => "not null"]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NSD, [], []);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NSD, ["s" => null], ["s" => null]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NSD, ["s" => "not null"], ["s" => "not null"]);
|
||||||
|
|
||||||
|
self::assertEnsureOk(self::SCHEMA_SND, [], ["s" => "not null"]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_SND, ["s" => null], ["s" => "not null"]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_SND, ["s" => "not null"], ["s" => "not null"]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NSND, [], ["s" => "not null"]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NSND, ["s" => null], ["s" => null]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NSND, ["s" => "not null"], ["s" => "not null"]);
|
||||||
|
|
||||||
|
self::assertEnsureFail(self::SCHEMA_RS, [], []);
|
||||||
|
self::assertEnsureFail(self::SCHEMA_RS, ["s" => null], []);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_RS, ["s" => "not null"], ["s" => "not null"]);
|
||||||
|
self::assertEnsureFail(self::SCHEMA_NRS, [], []);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NRS, ["s" => null], ["s" => null]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NRS, ["s" => "not null"], ["s" => "not null"]);
|
||||||
|
|
||||||
|
self::assertEnsureFail(self::SCHEMA_RSD, [], []);
|
||||||
|
self::assertEnsureFail(self::SCHEMA_RSD, ["s" => null], []);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_RSD, ["s" => "not null"], ["s" => "not null"]);
|
||||||
|
self::assertEnsureFail(self::SCHEMA_NRSD, [], []);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NRSD, ["s" => null], ["s" => null]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NRSD, ["s" => "not null"], ["s" => "not null"]);
|
||||||
|
|
||||||
|
self::assertEnsureOk(self::SCHEMA_RSND, [], ["s" => "not null"]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_RSND, ["s" => null], ["s" => "not null"]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_RSND, ["s" => "not null"], ["s" => "not null"]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NRSND, [], ["s" => "not null"]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NRSND, ["s" => null], ["s" => null]);
|
||||||
|
self::assertEnsureOk(self::SCHEMA_NRSND, ["s" => "not null"], ["s" => "not null"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
60
php/tests/php/types/scalarTest.php
Normal file
60
php/tests/php/types/scalarTest.php
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
<?php
|
||||||
|
namespace nulib\php\types;
|
||||||
|
|
||||||
|
use nulib\tests\TestCase;
|
||||||
|
use nulib\ValueException;
|
||||||
|
|
||||||
|
class scalarTest extends TestCase {
|
||||||
|
function testCheckSchema() {
|
||||||
|
self::assertTrue(scalar::check_schema(5, "int"));
|
||||||
|
self::assertTrue(scalar::check_schema(5, "string"));
|
||||||
|
self::assertTrue(scalar::check_schema(5, "float"));
|
||||||
|
|
||||||
|
self::assertTrue(scalar::check_schema(5, "int", true));
|
||||||
|
self::assertFalse(scalar::check_schema(5, "string", true));
|
||||||
|
self::assertFalse(scalar::check_schema(5, "float", true));
|
||||||
|
|
||||||
|
self::assertTrue(scalar::check_schema("5", "int"));
|
||||||
|
self::assertTrue(scalar::check_schema("5", "string"));
|
||||||
|
self::assertTrue(scalar::check_schema("5", "float"));
|
||||||
|
|
||||||
|
self::assertFalse(scalar::check_schema("5", "int", true));
|
||||||
|
self::assertTrue(scalar::check_schema("5", "string", true));
|
||||||
|
self::assertFalse(scalar::check_schema("5", "float", true));
|
||||||
|
|
||||||
|
self::assertFalse(scalar::check_schema("bad format", "int"));
|
||||||
|
}
|
||||||
|
|
||||||
|
function testEnsureSchema() {
|
||||||
|
$v = 5; scalar::ensure_schema($v, "int");
|
||||||
|
self::assertSame(5, $v);
|
||||||
|
$v = "5"; scalar::ensure_schema($v, "int");
|
||||||
|
self::assertSame(5, $v);
|
||||||
|
$v = "5.0"; scalar::ensure_schema($v, "int");
|
||||||
|
self::assertSame(5, $v);
|
||||||
|
$v = 5.0; scalar::ensure_schema($v, "int");
|
||||||
|
self::assertSame(5, $v);
|
||||||
|
|
||||||
|
$v = 5; scalar::ensure_schema($v, "string");
|
||||||
|
self::assertSame("5", $v);
|
||||||
|
$v = "5"; scalar::ensure_schema($v, "string");
|
||||||
|
self::assertSame("5", $v);
|
||||||
|
$v = "5.0"; scalar::ensure_schema($v, "string");
|
||||||
|
self::assertSame("5.0", $v);
|
||||||
|
$v = 5.0; scalar::ensure_schema($v, "string");
|
||||||
|
self::assertSame("5", $v);
|
||||||
|
|
||||||
|
$v = 5; scalar::ensure_schema($v, "float");
|
||||||
|
self::assertSame(5.0, $v);
|
||||||
|
$v = "5"; scalar::ensure_schema($v, "float");
|
||||||
|
self::assertSame(5.0, $v);
|
||||||
|
$v = "5.0"; scalar::ensure_schema($v, "float");
|
||||||
|
self::assertSame(5.0, $v);
|
||||||
|
$v = 5.0; scalar::ensure_schema($v, "float");
|
||||||
|
self::assertSame(5.0, $v);
|
||||||
|
|
||||||
|
self::assertException(ValueException::class, function() {
|
||||||
|
$v = "bad format"; scalar::ensure_schema($v, "int");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user