PHP Classes

File: tests/StringParameterTest.php

Recommend this page to a friend!
  Packages of Rodolfo Berrios Arce   Parameter   tests/StringParameterTest.php   Download  
File: tests/StringParameterTest.php
Role: Class source
Content type: text/plain
Description: Class source
Class: Parameter
Validate function parameters with PHP attributes
Author: By
Last change:
Date: 1 year ago
Size: 3,772 bytes
 

Contents

Class file image Download
<?php

/*
 * This file is part of Chevere.
 *
 * (c) Rodolfo Berrios <rodolfo@chevere.org>
 *
 * 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\StringParameterInterface;
use Chevere\Parameter\StringParameter;
use Chevere\Regex\Regex;
use InvalidArgumentException;
use PHPUnit\Framework\TestCase;
use TypeError;
use function Chevere\Parameter\string;

final class StringParameterTest extends TestCase
{
    public function testConstruct(): void
    {
        $regex = StringParameterInterface::PATTERN_DEFAULT;
        $parameter = new StringParameter();
        $this->assertSame(null, $parameter->default());
        $this->assertSame('', $parameter->description());
        $this->assertEquals($parameter, string());
        $this->assertSame($regex, $parameter->regex()->__toString());
        $this->assertSame([
            'type' => 'string',
            'description' => '',
            'default' => null,
            'regex' => $parameter->regex()->noDelimiters(),
        ], $parameter->schema());
        $description = 'ola k ase';
        $parameter = new StringParameter($description);
        $this->assertSame($description, $parameter->description());
    }

    public function testWithRegex(): void
    {
        $regex = new Regex('/^[0-9+]$/');
        $parameter = (new StringParameter())->withRegex($regex);
        $this->assertSame($regex->__toString(), $parameter->regex()->__toString());
        $this->assertSame([
            'type' => 'string',
            'description' => '',
            'default' => null,
            'regex' => $regex->noDelimiters(),
        ], $parameter->schema());
    }

    public function testWithDescription(): void
    {
        $parameter = new StringParameter();
        $try = 'description';
        $this->assertSame('', $parameter->description());
        $parameterWith = $parameter->withDescription($try);
        $this->assertNotSame($parameter, $parameterWith);
        $this->assertSame($try, $parameterWith->description());
    }

    public function testWithDefault(): void
    {
        $default = 'some value';
        $parameter = new StringParameter('test');
        $parameterWithDefault = $parameter->withDefault($default);
        (new ParameterHelper())->testWithParameterDefault(
            primitive: 'string',
            parameter: $parameter,
            default: $default,
            parameterWithDefault: $parameterWithDefault
        );
    }

    public function testWithDefaultRegexAware(): void
    {
        $parameter = (new StringParameter('test'))->withDefault('a');
        $parameterWithRegex = $parameter
            ->withRegex(new Regex('/^a|b$/'));
        $this->assertNotSame($parameter, $parameterWithRegex);
        $this->expectException(InvalidArgumentException::class);
        $parameterWithRegex->withDefault('');
    }

    public function testAssertCompatible(): void
    {
        $regex = new Regex('/^[0-9+]$/');
        $regexAlt = new Regex('/^[a-z+]$/');
        $parameter = (new StringParameter())->withRegex($regex);
        $compatible = (new StringParameter())->withRegex($regex);
        $parameter->assertCompatible($compatible);
        $compatible->assertCompatible($parameter);
        $notCompatible = (new StringParameter())->withRegex($regexAlt);
        $this->expectException(InvalidArgumentException::class);
        $parameter->assertCompatible($notCompatible);
    }

    public function testInvoke(): void
    {
        $parameter = new StringParameter();
        $parameter('100');
        $this->expectException(TypeError::class);
        $parameter(false);
    }
}