Files
tez-utils-validate/tests/TypeCastTest.php
T

176 lines
4.7 KiB
PHP

<?php
declare(strict_types=1);
namespace Tez\Utils\Tests\Validate;
use PHPUnit\Framework\TestCase;
use Tez\Utils\Validate\TypeCast;
final class TypeCastTest extends TestCase
{
// --- toInt ---
public function testToIntFromInt(): void
{
self::assertSame(42, TypeCast::toInt(42));
self::assertSame(-7, TypeCast::toInt(-7));
self::assertSame(0, TypeCast::toInt(0));
}
public function testToIntFromExactFloat(): void
{
self::assertSame(3, TypeCast::toInt(3.0));
self::assertSame(-5, TypeCast::toInt(-5.0));
}
public function testToIntFromNumericString(): void
{
self::assertSame(42, TypeCast::toInt('42'));
self::assertSame(-7, TypeCast::toInt('-7'));
self::assertSame(0, TypeCast::toInt('0'));
}
public function testToIntThrowsOnFractionalFloat(): void
{
$this->expectException(\UnexpectedValueException::class);
TypeCast::toInt(3.7);
}
public function testToIntThrowsOnNonNumericString(): void
{
$this->expectException(\UnexpectedValueException::class);
TypeCast::toInt('42abc');
}
public function testToIntThrowsOnNull(): void
{
$this->expectException(\UnexpectedValueException::class);
TypeCast::toInt(null);
}
public function testToIntThrowsOnBool(): void
{
$this->expectException(\UnexpectedValueException::class);
TypeCast::toInt(true);
}
// --- toFloat ---
public function testToFloatFromFloat(): void
{
self::assertSame(3.14, TypeCast::toFloat(3.14));
}
public function testToFloatFromInt(): void
{
self::assertSame(42.0, TypeCast::toFloat(42));
}
public function testToFloatFromNumericString(): void
{
self::assertSame(3.14, TypeCast::toFloat('3.14'));
self::assertSame(42.0, TypeCast::toFloat('42'));
}
public function testToFloatThrowsOnNonNumericString(): void
{
$this->expectException(\UnexpectedValueException::class);
TypeCast::toFloat('3.14xyz');
}
public function testToFloatThrowsOnNull(): void
{
$this->expectException(\UnexpectedValueException::class);
TypeCast::toFloat(null);
}
// --- toString ---
public function testToStringFromString(): void
{
self::assertSame('hello', TypeCast::toString('hello'));
self::assertSame('', TypeCast::toString(''));
}
public function testToStringFromInt(): void
{
self::assertSame('42', TypeCast::toString(42));
}
public function testToStringFromFloat(): void
{
self::assertSame('3.14', TypeCast::toString(3.14));
}
public function testToStringThrowsOnNull(): void
{
$this->expectException(\UnexpectedValueException::class);
TypeCast::toString(null);
}
public function testToStringThrowsOnBool(): void
{
$this->expectException(\UnexpectedValueException::class);
TypeCast::toString(true);
}
// --- toBool ---
public function testToBoolFromBool(): void
{
self::assertTrue(TypeCast::toBool(true));
self::assertFalse(TypeCast::toBool(false));
}
public function testToBoolFromInt(): void
{
self::assertTrue(TypeCast::toBool(1));
self::assertFalse(TypeCast::toBool(0));
}
public function testToBoolFromTruthyStrings(): void
{
foreach (['true', 'yes', 'on', '1', 'TRUE', 'YES'] as $v) {
self::assertTrue(TypeCast::toBool($v), "Expected true for '{$v}'");
}
}
public function testToBoolFromFalsyStrings(): void
{
foreach (['false', 'no', 'off', '0', '', 'FALSE', 'NO'] as $v) {
self::assertFalse(TypeCast::toBool($v), "Expected false for '{$v}'");
}
}
public function testToBoolThrowsOnAmbiguousString(): void
{
$this->expectException(\UnexpectedValueException::class);
TypeCast::toBool('maybe');
}
public function testToBoolThrowsOnNull(): void
{
$this->expectException(\UnexpectedValueException::class);
TypeCast::toBool(null);
}
// --- nullable variants ---
public function testNullableReturnsNullOnNull(): void
{
self::assertNull(TypeCast::toNullableInt(null));
self::assertNull(TypeCast::toNullableFloat(null));
self::assertNull(TypeCast::toNullableString(null));
self::assertNull(TypeCast::toNullableBool(null));
}
public function testNullableConvertsNonNull(): void
{
self::assertSame(42, TypeCast::toNullableInt('42'));
self::assertSame(3.14, TypeCast::toNullableFloat('3.14'));
self::assertSame('hello', TypeCast::toNullableString('hello'));
self::assertTrue(TypeCast::toNullableBool('true'));
}
}