new functions for container and new assert test
Former-commit-id: db29ea0fcecd5bb6c36ad1a21b15a35c56c5be24
This commit is contained in:
parent
5b58287f19
commit
1f0bb9cf21
|
@ -16,19 +16,13 @@ abstract class Model
|
|||
protected abstract function decode(array $data): array;
|
||||
|
||||
|
||||
private function __construct(array $unknownData)
|
||||
protected function __construct(array $unknownData)
|
||||
{
|
||||
$this->validateData($unknownData);
|
||||
$this->data = $this->decode($unknownData);
|
||||
}
|
||||
|
||||
|
||||
public static function fromArray(array $data): self
|
||||
{
|
||||
return new self($data);
|
||||
}
|
||||
|
||||
|
||||
public function toJson(): string
|
||||
{
|
||||
return \json_encode($this->data);
|
||||
|
@ -41,7 +35,7 @@ abstract class Model
|
|||
}
|
||||
|
||||
|
||||
protected static function parseBool(mixed $value): boolean
|
||||
protected static function parseBool($value): bool
|
||||
{
|
||||
if (\is_bool($value) === true) {
|
||||
return $value;
|
||||
|
@ -55,9 +49,21 @@ abstract class Model
|
|||
}
|
||||
|
||||
|
||||
protected static function notEmptyStringOr(mixed $val, string $def): mixed
|
||||
protected static function notEmptyStringOr($val, $def)
|
||||
{
|
||||
return (\is_string($val) === true && count($val) > 0) ? $val : $def;
|
||||
return (\is_string($val) === true && strlen($val) > 0) ? $val : $def;
|
||||
}
|
||||
|
||||
|
||||
protected static function issetInArray(array $val, array $keys)
|
||||
{
|
||||
foreach ($keys as $key => $value) {
|
||||
if (isset($val[$value])) {
|
||||
return $val[$value];
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -9,6 +9,12 @@ final class Container extends Model
|
|||
{
|
||||
|
||||
|
||||
public static function fromArray(array $data): self
|
||||
{
|
||||
return new self($data);
|
||||
}
|
||||
|
||||
|
||||
protected function validateData(array $data): void
|
||||
{
|
||||
if (isset($data['id']) === false
|
||||
|
@ -58,22 +64,23 @@ final class Container extends Model
|
|||
'groupId' => $this->extractGroupId($data),
|
||||
'backgroundURL' => $this->extractBackgroundUrl($data),
|
||||
'backgroundColor' => $this->extractBackgroundColor($data),
|
||||
'isFavorite' => Model::parseBool($data['is_favourite'])
|
||||
|| Model::parseBool($data['isFavorite']),
|
||||
'isFavorite' => $this->extractFavorite($data),
|
||||
'width' => (int) $data['width'],
|
||||
'height' => (int) $data['height'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
private function extractGroupId(array $data): number
|
||||
private function extractGroupId(array $data): int
|
||||
{
|
||||
if (isset($data['id_group']) === true
|
||||
&& \is_numeric($data['id_group']) === true
|
||||
&& $data['id_group'] >= 0
|
||||
) {
|
||||
return $data['id_group'];
|
||||
} else if (isset($data['groupId']) === true
|
||||
&& \is_numeric($data['groupId']) === true
|
||||
&& $data['groupId'] >= 0
|
||||
) {
|
||||
return $data['groupId'];
|
||||
}
|
||||
|
@ -84,35 +91,33 @@ final class Container extends Model
|
|||
}
|
||||
|
||||
|
||||
private function extractBackgroundUrl(array $data): mixed
|
||||
private function extractBackgroundUrl(array $data)
|
||||
{
|
||||
$backgroundUrl = Model::notEmptyStringOr($data['background'], null);
|
||||
if ($backgroundUrl !== null) {
|
||||
return $backgroundUrl;
|
||||
}
|
||||
|
||||
$backgroundUrl = Model::notEmptyStringOr($data['backgroundURL'], null);
|
||||
if ($backgroundUrl !== null) {
|
||||
return $backgroundUrl;
|
||||
}
|
||||
|
||||
return null;
|
||||
$background = Model::notEmptyStringOr(
|
||||
Model::issetInArray($data, ['background', 'backgroundURL']),
|
||||
null
|
||||
);
|
||||
return $background;
|
||||
}
|
||||
|
||||
|
||||
private function extractBackgroundColor(array $data): mixed
|
||||
private function extractBackgroundColor(array $data)
|
||||
{
|
||||
$backgroundColor = Model::notEmptyStringOr($data['background_color'], null);
|
||||
if ($backgroundColor !== null) {
|
||||
return $backgroundColor;
|
||||
}
|
||||
$backgroundColor = Model::notEmptyStringOr(
|
||||
Model::issetInArray($data, ['backgroundColor', 'background_color']),
|
||||
null
|
||||
);
|
||||
return $backgroundColor;
|
||||
}
|
||||
|
||||
$backgroundColor = Model::notEmptyStringOr($data['backgroundColor'], null);
|
||||
if ($backgroundColor !== null) {
|
||||
return $backgroundColor;
|
||||
}
|
||||
|
||||
return null;
|
||||
private function extractFavorite(array $data): bool
|
||||
{
|
||||
$favorite = Model::parseBool(
|
||||
Model::issetInArray($data, ['is_favourite', 'isFavorite']),
|
||||
null
|
||||
);
|
||||
return $favorite;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -18,8 +18,42 @@ class ContainerTest extends TestCase
|
|||
VisualConsole::class,
|
||||
VisualConsole::fromArray(
|
||||
[
|
||||
'id' => 1,
|
||||
'name' => 'foo',
|
||||
'id' => 1,
|
||||
'name' => 'foo',
|
||||
'groupId' => 1,
|
||||
'backgroundURL' => 'aaa',
|
||||
'backgroundColor' => 'bbb',
|
||||
'width' => 800,
|
||||
'height' => 800,
|
||||
]
|
||||
)
|
||||
);
|
||||
|
||||
$this->assertInstanceOf(
|
||||
VisualConsole::class,
|
||||
VisualConsole::fromArray(
|
||||
[
|
||||
'id' => 69,
|
||||
'name' => 'New visual console',
|
||||
'groupId' => 0,
|
||||
'background' => 'globalmap.jpg',
|
||||
'background_color' => 'white',
|
||||
'is_favourite' => 1,
|
||||
'width' => 100,
|
||||
'height' => 200,
|
||||
]
|
||||
)
|
||||
);
|
||||
|
||||
$this->assertInstanceOf(
|
||||
VisualConsole::class,
|
||||
VisualConsole::fromArray(
|
||||
[
|
||||
'id' => 1030,
|
||||
'name' => 'console2',
|
||||
'groupId' => 12,
|
||||
'width' => 1024,
|
||||
'height' => 768,
|
||||
]
|
||||
)
|
||||
);
|
||||
|
@ -32,13 +66,22 @@ class ContainerTest extends TestCase
|
|||
// Invalid id.
|
||||
VisualConsole::fromArray(
|
||||
[
|
||||
'id' => 'bar',
|
||||
'name' => 'foo',
|
||||
'id' => 'bar',
|
||||
'name' => 'foo',
|
||||
'groupId' => 0,
|
||||
'is_favourite' => 1,
|
||||
'width' => 1024,
|
||||
'height' => 768,
|
||||
]
|
||||
);
|
||||
// Missing id.
|
||||
VisualConsole::fromArray(
|
||||
['name' => 'foo']
|
||||
[
|
||||
'name' => 'foo',
|
||||
'groupId' => 0,
|
||||
'width' => 1024,
|
||||
'height' => 768,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -46,28 +89,117 @@ class ContainerTest extends TestCase
|
|||
public function testCannotBeCreatedWithInvalidName(): void
|
||||
{
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
// Invalid name.
|
||||
// Empty name.
|
||||
VisualConsole::fromArray(
|
||||
[
|
||||
'id' => 1,
|
||||
'name' => '',
|
||||
'id' => 1,
|
||||
'name' => '',
|
||||
'groupId' => 0,
|
||||
'width' => 1024,
|
||||
'height' => 768,
|
||||
]
|
||||
);
|
||||
// Missing name.
|
||||
VisualConsole::fromArray(
|
||||
['id' => 1]
|
||||
[
|
||||
'id' => 1,
|
||||
'groupId' => 8,
|
||||
'width' => 1024,
|
||||
'height' => 768,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
public function testUserIsRepresentedAsJson(): void
|
||||
public function testCannotBeCreatedWithInvalidGroupId(): void
|
||||
{
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
// invalid group id.
|
||||
VisualConsole::fromArray(
|
||||
[
|
||||
'id' => 1,
|
||||
'name' => 'test',
|
||||
'groupId' => 'Hi',
|
||||
'width' => 1024,
|
||||
'height' => 768,
|
||||
]
|
||||
);
|
||||
|
||||
// Missing group id.
|
||||
VisualConsole::fromArray(
|
||||
[
|
||||
'id' => 1,
|
||||
'name' => 'test',
|
||||
'width' => 1024,
|
||||
'height' => 768,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
public function testCannotBeCreatedWithInvalidWidth(): void
|
||||
{
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
// invalid width.
|
||||
VisualConsole::fromArray(
|
||||
[
|
||||
'id' => 1,
|
||||
'name' => 'test',
|
||||
'groupId' => 10,
|
||||
'width' => 0,
|
||||
'height' => 768,
|
||||
]
|
||||
);
|
||||
|
||||
// Missing width.
|
||||
VisualConsole::fromArray(
|
||||
[
|
||||
'id' => 1,
|
||||
'name' => 'test',
|
||||
'groupId' => 10,
|
||||
'height' => 768,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
public function testCannotBeCreatedWithInvalidHeigth(): void
|
||||
{
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
// invalid height.
|
||||
VisualConsole::fromArray(
|
||||
[
|
||||
'id' => 1,
|
||||
'name' => 'test',
|
||||
'groupId' => 10,
|
||||
'width' => 1024,
|
||||
'height' => -1,
|
||||
]
|
||||
);
|
||||
|
||||
// Missing height.
|
||||
VisualConsole::fromArray(
|
||||
[
|
||||
'id' => 1,
|
||||
'name' => 'test',
|
||||
'groupId' => 10,
|
||||
'width' => 1024,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
public function testContainerIsRepresentedAsJson(): void
|
||||
{
|
||||
$this->assertEquals(
|
||||
'{"id":1,"name":"foo"}',
|
||||
'{"id":1,"name":"foo","groupId":0,"backgroundURL":null,"backgroundColor":null,"isFavorite":false,"width":1024,"height":768}',
|
||||
VisualConsole::fromArray(
|
||||
[
|
||||
'id' => 1,
|
||||
'name' => 'foo',
|
||||
'id' => 1,
|
||||
'name' => 'foo',
|
||||
'groupId' => 0,
|
||||
'width' => 1024,
|
||||
'height' => 768,
|
||||
]
|
||||
)
|
||||
);
|
||||
|
|
Loading…
Reference in New Issue