PHP Classes

File: tests/IntParameterTest.php

Recommend this page to a friend!
  Classes of Rodolfo Berrios Arce   Parameter   tests/IntParameterTest.php   Download  
File: tests/IntParameterTest.php
Role: Class source
Content type: text/plain
Description: Class source
Class: Parameter
Validate function parameters with PHP attributes
Author: By
Last change:
Date: 15 days ago
Size: 13,080 bytes
 

Contents

Class file image Download
<?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\Arguments; use Chevere\Parameter\IntParameter; use Chevere\Parameter\Parameters; use InvalidArgumentException; use OverflowException; use PHPUnit\Framework\TestCase; use TypeError; final class IntParameterTest extends TestCase { public function testConstruct(): void { $parameter = new IntParameter(); $this->assertSame(null, $parameter->default()); $this->assertSame(null, $parameter->min()); $this->assertSame(null, $parameter->max()); $this->assertSame([], $parameter->accept()); $this->assertSame([], $parameter->reject()); $default = 1234; $parameterWithDefault = $parameter->withDefault($default); (new ParameterHelper())->testWithParameterDefault( primitive: 'int', parameter: $parameter, default: $default, parameterWithDefault: $parameterWithDefault ); $this->assertSame([ 'type' => 'int', 'description' => '', 'default' => $default, 'min' => null, 'max' => null, 'accept' => [], 'reject' => [], ], $parameterWithDefault->schema()); } public function testWithAccept(): void { $accept = [3, 2, 1]; $sorted = [1, 2, 3]; $parameter = new IntParameter(); $with = $parameter->withAccept(...$accept); $this->assertNotSame($parameter, $with); $this->assertSame(null, $with->max()); $this->assertSame(null, $with->min()); $this->assertSame($sorted, $with->accept()); $this->assertSame([ 'type' => 'int', 'description' => '', 'default' => null, 'min' => null, 'max' => null, 'accept' => $sorted, 'reject' => [], ], $with->schema()); } public function testWithReject(): void { $reject = [3, 2, 1]; $sorted = [1, 2, 3]; $parameter = new IntParameter(); $with = $parameter->withReject(...$reject); $this->assertNotSame($parameter, $with); $this->assertSame($sorted, $with->reject()); $this->assertSame(null, $with->max()); $this->assertSame(null, $with->min()); $this->assertSame([ 'type' => 'int', 'description' => '', 'default' => null, 'min' => null, 'max' => null, 'accept' => [], 'reject' => $sorted, ], $with->schema()); } public function testWithAcceptRejectConflict(): void { $conflict = [1, 2, 3]; $parameter = new IntParameter(); $with = $parameter->withAccept(...$conflict); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Accept list `[1, 2, 3]` intersects with reject list `[1, 2, 3]`'); $with->withReject(...$conflict); } public function testWithRejectAcceptConflict(): void { $conflict = [1, 2, 3]; $parameter = new IntParameter(); $with = $parameter->withReject(...$conflict); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Accept list `[1, 2, 3]` intersects with reject list `[1, 2, 3]`'); $with->withAccept(...$conflict); } public function testWithAcceptOnArguments(): void { $accept = [1, 2, 3]; $expect = [ 'test' => 1, ]; $parameter = (new IntParameter())->withAccept(...$accept); $parameters = new Parameters(test: $parameter); $arguments = new Arguments($parameters, $expect); $this->assertSame($expect, $arguments->toArray()); $this->expectException(InvalidArgumentException::class); new Arguments($parameters, [ 'test' => 0, ]); } public function testWithRejectOnArguments(): void { $reject = [1, 2, 3]; $expect = [ 'test' => 0, ]; $parameter = (new IntParameter())->withReject(...$reject); $parameters = new Parameters(test: $parameter); $arguments = new Arguments($parameters, $expect); $this->assertSame($expect, $arguments->toArray()); $this->expectException(InvalidArgumentException::class); new Arguments($parameters, [ 'test' => 1, ]); } public function testWithMinAccept(): void { $parameter = new IntParameter(); $with = $parameter->withMin(1); $this->assertNotSame($parameter, $with); $this->assertSame(1, $with->min()); $with = $parameter->withAccept(3, 2, 1); $this->expectException(OverflowException::class); $with->withMin(0); } public function testWithMinReject(): void { $parameter = new IntParameter(); $with = $parameter->withMin(1); $this->assertNotSame($parameter, $with); $this->assertSame(1, $with->min()); $with = $parameter->withReject(3, 2, 1); $this->expectException(OverflowException::class); $with->withMin(0); } public function testWithMinOnArguments(): void { $expect = [ 'test' => 1, ]; $parameter = (new IntParameter())->withMin(1); $parameters = new Parameters(test: $parameter); $arguments = new Arguments($parameters, $expect); $this->assertSame($expect, $arguments->toArray()); $this->expectException(InvalidArgumentException::class); new Arguments($parameters, [ 'test' => -1, ]); } public function testWithMax(): void { $parameter = new IntParameter(); $withmax = $parameter->withMax(1); $this->assertNotSame($parameter, $withmax); $this->assertSame(1, $withmax->max()); $withValue = $parameter->withAccept(1, 2, 3); $this->expectException(OverflowException::class); $withValue->withMax(0); } public function testWithMaxOnArguments(): void { $expect = [ 'test' => 1, ]; $parameter = (new IntParameter())->withMax(1); $parameters = new Parameters(test: $parameter); $arguments = new Arguments($parameters, $expect); $this->assertSame($expect, $arguments->toArray()); $this->expectException(InvalidArgumentException::class); new Arguments($parameters, [ 'test' => 2, ]); } public function testWithMaxAccept(): void { $parameter = new IntParameter(); $with = $parameter->withMax(1); $this->assertNotSame($parameter, $with); $this->assertSame(1, $with->max()); $with = $parameter->withReject(3, 2, 1); $this->expectException(OverflowException::class); $with->withMax(0); } public function testWithMaxReject(): void { $parameter = new IntParameter(); $with = $parameter->withMax(1); $this->assertNotSame($parameter, $with); $this->assertSame(1, $with->max()); $with = $parameter->withReject(3, 2, 1); $this->expectException(OverflowException::class); $with->withMax(0); } public function testWithMinMax(): void { $parameter = new IntParameter(); $with = $parameter ->withMin(1) ->withMax(2); $this->expectException(InvalidArgumentException::class); $with->withMin(2); } public function testWithMaxMin(): void { $parameter = new IntParameter(); $with = $parameter ->withMin(1) ->withMax(2); $this->expectException(InvalidArgumentException::class); $with->withMax(1); } public function testAssertCompatibleMin(): void { $value = 1; $parameter = (new IntParameter())->withMin($value); $compatible = (new IntParameter())->withMin($value); $parameter->assertCompatible($compatible); $compatible->assertCompatible($parameter); $provided = $value * 2; $notCompatible = (new IntParameter())->withMin($provided); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage( <<<STRING Expected min value `{$value}`, provided `{$provided}` STRING ); $parameter->assertCompatible($notCompatible); } public function testAssertCompatibleMax(): void { $value = 1; $compatible = (new IntParameter())->withMax($value); $parameter = (new IntParameter())->withMax($value); $parameter->assertCompatible($compatible); $compatible->assertCompatible($parameter); $provided = $value * 2; $notCompatible = (new IntParameter())->withMax($provided); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage( <<<STRING Expected max value `{$value}`, provided `{$provided}` STRING ); $parameter->assertCompatible($notCompatible); } public function testAssertCompatibleAccept(): void { $parameter = (new IntParameter())->withAccept(1, 2, 3, 4); $compatible = (new IntParameter())->withAccept(4, 3, 2, 1); $parameter->assertCompatible($compatible); $compatible->assertCompatible($parameter); $notCompatible = (new IntParameter())->withAccept(1, 4); $expected = implode(', ', $parameter->accept()); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage( <<<PLAIN Expected accept values in `[1, 2, 3, 4]`, provided `[1, 4]` PLAIN ); $parameter->assertCompatible($notCompatible); } public function testAssertCompatibleReject(): void { $parameter = (new IntParameter())->withReject(1, 2, 3, 4); $compatible = (new IntParameter())->withReject(4, 3, 2, 1); $parameter->assertCompatible($compatible); $compatible->assertCompatible($parameter); $notCompatible = (new IntParameter())->withReject(1, 4); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage( <<<PLAIN Expected reject values in `[1, 2, 3, 4]`, provided `[1, 4]` PLAIN ); $parameter->assertCompatible($notCompatible); } public function testAssertCompatibleAcceptMin(): void { $parameter = (new IntParameter())->withAccept(1, 2, 3, 4); $notCompatible = (new IntParameter())->withMin(0); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage( <<<PLAIN Expected accept values in `[1, 2, 3, 4]`, provided `[]` PLAIN ); $parameter->assertCompatible($notCompatible); } public function testWithDefaultConflictMin(): void { $parameter = (new IntParameter()) ->withMin(1) ->withDefault(1); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage( <<<STRING Argument value provided `0` is less than `1` STRING ); $parameter->withDefault(0); } public function testWithDefaultConflictMax(): void { $parameter = (new IntParameter()) ->withMax(1) ->withDefault(1); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage( <<<STRING Argument value provided `2` is greater than `1` STRING ); $parameter->withDefault(2); } public function testWithDefaultConflictAccept(): void { $parameter = (new IntParameter())->withAccept(1, 2, 3); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage( <<<STRING Argument value provided `5` is not an accepted value in `[1,2,3]` STRING ); $parameter->withDefault(5); } public function testWithDefaultConflictReject(): void { $parameter = (new IntParameter())->withReject(1, 2, 3); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage( <<<STRING Argument value provided `1` is on rejected list `[1,2,3]` STRING ); $parameter->withDefault(1); } public function testInvoke(): void { $parameter = new IntParameter(); $parameter(10); $this->expectException(TypeError::class); $parameter(null); } }