<?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 ArgumentCountError; 
use Chevere\Parameter\ArrayStringParameter; 
use PHPUnit\Framework\Attributes\DataProvider; 
use PHPUnit\Framework\TestCase; 
use function Chevere\Parameter\arrayp; 
use function Chevere\Parameter\arrayString; 
use function Chevere\Parameter\assertArray; 
use function Chevere\Parameter\assertArrayString; 
use function Chevere\Parameter\file; 
use function Chevere\Parameter\int; 
use function Chevere\Parameter\string; 
 
final class FunctionsArrayTest extends TestCase 
{ 
    public function testArrayp(): void 
    { 
        $parameter = arrayp(); 
        $this->assertCount(0, $parameter->parameters()); 
        $int = int(); 
        $string = string(); 
        $parameter = arrayp(a: $int)->withOptional(b: $string); 
        $this->assertCount(2, $parameter->parameters()); 
        $this->assertSame($int, $parameter->parameters()->get('a')); 
        $this->assertSame($string, $parameter->parameters()->get('b')); 
        $this->assertSame(['a'], $parameter->parameters()->requiredKeys()->toArray()); 
        $this->assertSame(['b'], $parameter->parameters()->optionalKeys()->toArray()); 
    } 
 
    public static function dataProviderArrayRequiredEmptyAny(): array 
    { 
        return [ 
            [[]], 
            [[ 
                'a' => 1, 
            ]], 
        ]; 
    } 
 
    #[DataProvider('dataProviderArrayRequiredEmptyAny')] 
    public function testArrayRequiredEmptyAny(array $test): void 
    { 
        $parameter = arrayp(); 
        $this->assertSame($test, assertArray($parameter, $test)); 
    } 
 
    public function testArrayRequired(): void 
    { 
        $parameter = arrayp(a: int()); 
        $array = [ 
            'a' => 1, 
        ]; 
        $this->assertSame($array, assertArray($parameter, $array)); 
        $this->expectException(ArgumentCountError::class); 
        assertArray($parameter, []); 
    } 
 
    public function testArrayRequiredOptional(): void 
    { 
        $parameter = arrayp()->withOptional(a: int()); 
        $array = [ 
            'a' => 123, 
        ]; 
        $this->assertSame($array, assertArray($parameter, $array)); 
    } 
 
    public function testArrayDefaults(): void 
    { 
        $parameter = arrayp(a: int(default: 10)); 
        $array = []; 
        $expected = [ 
            'a' => 10, 
        ]; 
        $this->assertSame($expected, assertArray($parameter, $array)); 
    } 
 
    public function testArrayOptionalDefaults(): void 
    { 
        $parameter = arrayp()->withOptional(a: int(default: 10)); 
        $array = []; 
        $expected = [ 
            'a' => 10, 
        ]; 
        $this->assertSame($expected, assertArray($parameter, $array)); 
    } 
 
    public function testArrayOptional(): void 
    { 
        $parameter = arrayp(); 
        $this->assertEquals(arrayp(), $parameter); 
        $parameter = arrayp()->withOptional(a: int()); 
        $expected = [ 
            'a' => 1, 
        ]; 
        $this->assertSame($expected, assertArray($parameter, $expected)); 
        $parameter = arrayp()->withOptional(a: int(default: 123)); 
        $expected = [ 
            'a' => 123, 
        ]; 
        $this->assertSame($expected, assertArray($parameter, $expected)); 
    } 
 
    public function testArrayString(): void 
    { 
        $string = string(); 
        $parameter = arrayString(foo: $string); 
        $expected = [ 
            'foo' => 'bar', 
        ]; 
        $this->assertSame($expected, assertArrayString($parameter, $expected)); 
        $new = new ArrayStringParameter(); 
        $new = $new->withRequired(foo: $string); 
        $this->assertEquals($new, $parameter); 
    } 
 
    public function testFile(): void 
    { 
        $file = file(); 
        $array = [ 
            'error' => UPLOAD_ERR_OK, 
            'name' => 'foo', 
            'size' => 123, 
            'type' => 'text/plain', 
            'tmp_name' => '/tmp/foo', 
        ]; 
        $this->assertSame( 
            array_keys($array), 
            $file->parameters()->keys() 
        ); 
        $this->assertSame($array, assertArray($file, $array)); 
        $arguments = [ 
            'error' => int(), 
            'name' => string(), 
            'size' => int(), 
            'type' => string(), 
            'tmp_name' => string(), 
            'contents' => string(), 
        ]; 
        $file = file(...$arguments); 
        foreach ($arguments as $key => $argument) { 
            $this->assertSame($argument, $file->parameters()->get($key)); 
        } 
    } 
} 
 
 |