| 
<?php
 /*
 * This file is part of Chevere.
 *
 * (c) Rodolfo Berrios <[email protected]>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
 
 declare(strict_types=1);
 
 namespace Chevere\Tests;
 
 use Chevere\Parameter\Interfaces\ParameterInterface;
 use Chevere\Tests\src\RegexPatternEnum;
 use InvalidArgumentException;
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\TestCase;
 use function Chevere\Parameter\boolString;
 use function Chevere\Parameter\date;
 use function Chevere\Parameter\datetime;
 use function Chevere\Parameter\enum;
 use function Chevere\Parameter\intString;
 use function Chevere\Parameter\string;
 use function Chevere\Parameter\time;
 
 final class FunctionsStringTest extends TestCase
 {
 public function testString(): void
 {
 $parameter = string();
 $this->assertSame('', $parameter->description());
 $this->assertSame(null, $parameter->default());
 $this->assertSame('', $parameter(''));
 }
 
 public function testAssertString(): void
 {
 $parameter = string();
 $this->assertSame('test', $parameter('test'));
 $parameter('0');
 }
 
 public function testEnum(): void
 {
 $parameter = enum('test');
 $this->assertSame('', $parameter->description());
 $this->assertSame(null, $parameter->default());
 $this->assertSame('test', $parameter('test'));
 }
 
 public function testAssertEnum(): void
 {
 $parameter = enum('foo', 'bar');
 $this->assertSame('foo', $parameter('foo'));
 $this->assertSame('bar', $parameter('bar'));
 $this->expectException(InvalidArgumentException::class);
 $parameter('barr');
 }
 
 public function testDateDefault(): void
 {
 $parameter = date(default: '2023-04-10');
 $this->assertSame('2023-04-10', $parameter->default());
 $this->expectException(InvalidArgumentException::class);
 date(default: 'fail');
 }
 
 public function testAssertDate(): void
 {
 $parameter = date();
 $this->assertSame('1000-01-01', $parameter('1000-01-01'));
 $this->assertSame('9999-12-31', $parameter('9999-12-31'));
 $this->expectException(InvalidArgumentException::class);
 $parameter('9999-99-99');
 }
 
 public function testTimeDefault(): void
 {
 $parameter = time(default: '23:59:59');
 $this->assertSame('23:59:59', $parameter->default());
 $this->expectException(InvalidArgumentException::class);
 time(default: '999:99:99');
 }
 
 public function testAssertTime(): void
 {
 $parameter = time();
 $this->assertSame('00:00:00', $parameter('00:00:00'));
 $this->assertSame('999:59:59', $parameter('999:59:59'));
 $this->expectException(InvalidArgumentException::class);
 $parameter('9999:99:99');
 }
 
 public function testDatetimeDefault(): void
 {
 $parameter = datetime(default: '1000-01-01 23:59:59');
 $this->assertSame('1000-01-01 23:59:59', $parameter->default());
 $this->expectException(InvalidArgumentException::class);
 datetime(default: '9999-99-99 999:99:99');
 }
 
 public function testAssertDatetime(): void
 {
 $parameter = datetime();
 $this->assertSame('1000-01-01 23:59:59', $parameter('1000-01-01 23:59:59'));
 $this->expectException(InvalidArgumentException::class);
 $parameter('9999-99-99 999:99:99');
 }
 
 public function testBoolString(): void
 {
 $string = boolString();
 $this->assertSame('', $string->description());
 $this->assertNull($string->default());
 $this->expectException(InvalidArgumentException::class);
 boolString(default: '2');
 }
 
 public static function boolStringArgumentsProvider(): array
 {
 return [
 ['foo', '1'],
 ['bar', '0'],
 ];
 }
 
 #[DataProvider('boolStringArgumentsProvider')]
 public function testBoolStringArguments(string $description, string $default): void
 {
 $string = boolString($description, $default);
 $this->assertSame($description, $string->description());
 $this->assertSame($default, $string->default());
 }
 
 public static function dataProviderFunctionDefaults(): array
 {
 return [
 [time(), 'hh:mm:ss'],
 [date(), 'YYYY-MM-DD'],
 [datetime(), 'YYYY-MM-DD hh:mm:ss'],
 ];
 }
 
 public static function dataProviderFunctionDescription(): array
 {
 return [
 [time('Test'), 'Test'],
 [date('Test'), 'Test'],
 [datetime('Test'), 'Test'],
 ];
 }
 
 #[DataProvider('dataProviderFunctionDefaults')]
 public function testFunctionDefaults(ParameterInterface $parameter, string $description): void
 {
 $this->assertSame($description, $parameter->description());
 $this->assertSame(null, $parameter->default());
 }
 
 #[DataProvider('dataProviderFunctionDescription')]
 public function testFunctionDescription(ParameterInterface $parameter, string $description): void
 {
 $this->assertSame($description, $parameter->description());
 }
 
 public function testIntString(): void
 {
 $parameter = intString();
 $this->assertSame('', $parameter->description());
 $this->assertSame(null, $parameter->default());
 $this->assertSame('0', $parameter('0'));
 $this->assertSame('1', $parameter('1'));
 $this->expectException(InvalidArgumentException::class);
 $parameter('1abc');
 }
 
 public function testEnumBackedString(): void
 {
 $parameter = string(RegexPatternEnum::EMAIL);
 $this->assertSame(
 RegexPatternEnum::EMAIL->value,
 $parameter->regex()->__toString()
 );
 }
 }
 
 |