<?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 InvalidArgumentException;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
use function Chevere\Parameter\arrayp;
use function Chevere\Parameter\int;
use function Chevere\Parameter\iterable;
use function Chevere\Parameter\parameters;
use function Chevere\Parameter\string;
final class ArgumentsIterableTest extends TestCase
{
public static function dataProviderIterableArrayConflict(): array
{
return [
[
[
'a' => 'foo',
'b' => 'bar',
],
],
];
}
public static function dataProviderIterableArrayProperty(): array
{
return [
[
[
'top' => [
1 => 'one',
2 => 'two',
],
],
],
];
}
public static function dataProviderIterableArrayNestedPropertyConflict(): array
{
return [
[
[
'nested' => [
1 => [
'foo' => 1,
'bar' => 2,
],
2 => [
'wea' => 3,
'baz' => 4,
],
],
],
],
];
}
public static function iterableProvider(): array
{
return [
[
[
'test' => [
'one' => 123,
'two' => 456,
],
],
],
];
}
#[DataProvider('iterableProvider')]
public function testIterable(array $args): void
{
$parameters = parameters(
test: arrayp(
one: int(),
two: int(),
)
);
$this->expectNotToPerformAssertions();
new Arguments($parameters, $args);
}
#[DataProvider('iterableProvider')]
public function testIterableConflict(array $args): void
{
$parameters = parameters(
test: arrayp(
one: int(max: 1),
two: int(),
)
);
$this->expectException(InvalidArgumentException::class);
new Arguments($parameters, $args);
}
#[DataProvider('dataProviderIterableArrayProperty')]
public function testIterableArrayProperty(array $args): void
{
$parameters = parameters(
top: iterable(
K: int(),
V: string()
)
);
$this->expectNotToPerformAssertions();
new Arguments($parameters, $args);
}
#[DataProvider('dataProviderIterableArrayProperty')]
public function testIterableArrayPropertyConflict(array $args): void
{
$parameters = parameters(
top: iterable(
K: int(),
V: string('/^one$/')
)
);
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('Argument value provided');
$this->expectExceptionMessage("doesn't match the regex `/^one$/`");
new Arguments($parameters, $args);
}
#[DataProvider('dataProviderIterableArrayNestedPropertyConflict')]
public function testIterableArrayNestedProperty(array $args): void
{
$parameters = parameters(
nested: iterable(
K: int(),
V: iterable(
K: string(),
V: int()
)
)
);
$this->expectNotToPerformAssertions();
new Arguments($parameters, $args);
}
#[DataProvider('dataProviderIterableArrayNestedPropertyConflict')]
public function testIterableArrayNestedPropertyConflict(array $args): void
{
$parameters = parameters(
nested: iterable(
K: int(),
V: iterable(
K: string(),
V: string()
)
)
);
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('must be of type Stringable|string, int given');
new Arguments($parameters, $args);
}
#[DataProvider('dataProviderIterableArrayConflict')]
public function testIterableArray(array $args): void
{
$parameter = iterable(
V: string(),
K: string()
);
$this->expectNotToPerformAssertions();
$parameter($args);
}
#[DataProvider('dataProviderIterableArrayConflict')]
public function testIterableArrayConflict(array $args): void
{
$parameter = iterable(
V: int(),
K: string()
);
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessageMatches('/^\[V \*iterable\]\:.*/');
$parameter($args);
}
}
|