Skip to content

Commit 5f574a9

Browse files
committed
Rules: unit test args resolver
1 parent 6358ee9 commit 5f574a9

18 files changed

+621
-51
lines changed

tests/Unit/Rules/AllOfRuleTest.php

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,27 @@
22

33
namespace Tests\Orisai\ObjectMapper\Unit\Rules;
44

5-
use Orisai\Exceptions\Logic\InvalidArgument;
5+
use Generator;
66
use Orisai\ObjectMapper\Args\EmptyArgs;
77
use Orisai\ObjectMapper\Exception\ValueDoesNotMatch;
88
use Orisai\ObjectMapper\Meta\Compile\RuleCompileMeta;
99
use Orisai\ObjectMapper\Meta\Runtime\RuleRuntimeMeta;
1010
use Orisai\ObjectMapper\Rules\AllOfRule;
1111
use Orisai\ObjectMapper\Rules\CompoundArgs;
12+
use Orisai\ObjectMapper\Rules\IntArgs;
13+
use Orisai\ObjectMapper\Rules\IntRule;
1214
use Orisai\ObjectMapper\Rules\MappedObjectArgs;
1315
use Orisai\ObjectMapper\Rules\MappedObjectRule;
1416
use Orisai\ObjectMapper\Rules\MixedRule;
17+
use Orisai\ObjectMapper\Rules\NullArgs;
18+
use Orisai\ObjectMapper\Rules\NullRule;
1519
use Orisai\ObjectMapper\Types\CompoundType;
1620
use Orisai\ObjectMapper\Types\CompoundTypeOperator;
1721
use Orisai\ObjectMapper\Types\MessageType;
1822
use Orisai\ObjectMapper\Types\SimpleValueType;
1923
use Tests\Orisai\ObjectMapper\Doubles\DefaultsVO;
2024
use Tests\Orisai\ObjectMapper\Doubles\Rules\AlwaysInvalidRule;
2125
use Tests\Orisai\ObjectMapper\Toolkit\ProcessingTestCase;
22-
use function sprintf;
2326

2427
final class AllOfRuleTest extends ProcessingTestCase
2528
{
@@ -33,6 +36,46 @@ protected function setUp(): void
3336
$this->ruleManager->addRule(new AlwaysInvalidRule());
3437
}
3538

39+
/**
40+
* @param array<mixed> $args
41+
*
42+
* @dataProvider provideResolveValid
43+
*/
44+
public function testResolveValid(array $args, CompoundArgs $expectedArgs): void
45+
{
46+
$resolvedArgs = $this->rule->resolveArgs($args, $this->argsFieldContext());
47+
self::assertEquals($expectedArgs, $resolvedArgs);
48+
}
49+
50+
public static function provideResolveValid(): Generator
51+
{
52+
yield [
53+
[
54+
AllOfRule::Rules => [
55+
new RuleCompileMeta(MixedRule::class),
56+
new RuleCompileMeta(MixedRule::class),
57+
],
58+
],
59+
new CompoundArgs([
60+
new RuleRuntimeMeta(MixedRule::class, new EmptyArgs()),
61+
new RuleRuntimeMeta(MixedRule::class, new EmptyArgs()),
62+
]),
63+
];
64+
65+
yield [
66+
[
67+
AllOfRule::Rules => [
68+
new RuleCompileMeta(IntRule::class),
69+
new RuleCompileMeta(NullRule::class),
70+
],
71+
],
72+
new CompoundArgs([
73+
new RuleRuntimeMeta(IntRule::class, new IntArgs(0, 0, false, false)),
74+
new RuleRuntimeMeta(NullRule::class, new NullArgs(false)),
75+
]),
76+
];
77+
}
78+
3679
public function testProcessValid(): void
3780
{
3881
$processed = $this->rule->processValue(
@@ -147,27 +190,4 @@ public function testType(): void
147190
self::assertInstanceOf(MessageType::class, $subtypes[2]);
148191
}
149192

150-
public function testInnerRuleResolved(): void
151-
{
152-
$this->expectException(InvalidArgument::class);
153-
$this->expectExceptionMessage(
154-
sprintf(
155-
'"%s" does not accept any arguments, "foo" given',
156-
MixedRule::class,
157-
),
158-
);
159-
160-
$this->rule->resolveArgs(
161-
[
162-
AllOfRule::Rules => [
163-
new RuleCompileMeta(MixedRule::class),
164-
new RuleCompileMeta(MixedRule::class, [
165-
'foo' => 'bar',
166-
]),
167-
],
168-
],
169-
$this->argsFieldContext(),
170-
);
171-
}
172-
173193
}

tests/Unit/Rules/AnyOfRuleTest.php

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,27 @@
22

33
namespace Tests\Orisai\ObjectMapper\Unit\Rules;
44

5-
use Orisai\Exceptions\Logic\InvalidArgument;
5+
use Generator;
66
use Orisai\ObjectMapper\Args\EmptyArgs;
77
use Orisai\ObjectMapper\Exception\ValueDoesNotMatch;
88
use Orisai\ObjectMapper\Meta\Compile\RuleCompileMeta;
99
use Orisai\ObjectMapper\Meta\Runtime\RuleRuntimeMeta;
1010
use Orisai\ObjectMapper\Rules\AnyOfRule;
1111
use Orisai\ObjectMapper\Rules\CompoundArgs;
12+
use Orisai\ObjectMapper\Rules\IntArgs;
13+
use Orisai\ObjectMapper\Rules\IntRule;
1214
use Orisai\ObjectMapper\Rules\MappedObjectArgs;
1315
use Orisai\ObjectMapper\Rules\MappedObjectRule;
1416
use Orisai\ObjectMapper\Rules\MixedRule;
17+
use Orisai\ObjectMapper\Rules\NullArgs;
18+
use Orisai\ObjectMapper\Rules\NullRule;
1519
use Orisai\ObjectMapper\Types\CompoundType;
1620
use Orisai\ObjectMapper\Types\CompoundTypeOperator;
1721
use Orisai\ObjectMapper\Types\MessageType;
1822
use Orisai\ObjectMapper\Types\SimpleValueType;
1923
use Tests\Orisai\ObjectMapper\Doubles\DefaultsVO;
2024
use Tests\Orisai\ObjectMapper\Doubles\Rules\AlwaysInvalidRule;
2125
use Tests\Orisai\ObjectMapper\Toolkit\ProcessingTestCase;
22-
use function sprintf;
2326

2427
final class AnyOfRuleTest extends ProcessingTestCase
2528
{
@@ -33,6 +36,46 @@ protected function setUp(): void
3336
$this->ruleManager->addRule(new AlwaysInvalidRule());
3437
}
3538

39+
/**
40+
* @param array<mixed> $args
41+
*
42+
* @dataProvider provideResolveValid
43+
*/
44+
public function testResolveValid(array $args, CompoundArgs $expectedArgs): void
45+
{
46+
$resolvedArgs = $this->rule->resolveArgs($args, $this->argsFieldContext());
47+
self::assertEquals($expectedArgs, $resolvedArgs);
48+
}
49+
50+
public static function provideResolveValid(): Generator
51+
{
52+
yield [
53+
[
54+
AnyOfRule::Rules => [
55+
new RuleCompileMeta(MixedRule::class),
56+
new RuleCompileMeta(MixedRule::class),
57+
],
58+
],
59+
new CompoundArgs([
60+
new RuleRuntimeMeta(MixedRule::class, new EmptyArgs()),
61+
new RuleRuntimeMeta(MixedRule::class, new EmptyArgs()),
62+
]),
63+
];
64+
65+
yield [
66+
[
67+
AnyOfRule::Rules => [
68+
new RuleCompileMeta(IntRule::class),
69+
new RuleCompileMeta(NullRule::class),
70+
],
71+
],
72+
new CompoundArgs([
73+
new RuleRuntimeMeta(IntRule::class, new IntArgs(0, 0, false, false)),
74+
new RuleRuntimeMeta(NullRule::class, new NullArgs(false)),
75+
]),
76+
];
77+
}
78+
3679
public function testProcessValid(): void
3780
{
3881
$processed = $this->rule->processValue(
@@ -143,27 +186,4 @@ public function testType(): void
143186
self::assertInstanceOf(MessageType::class, $subtypes[2]);
144187
}
145188

146-
public function testInnerRuleResolved(): void
147-
{
148-
$this->expectException(InvalidArgument::class);
149-
$this->expectExceptionMessage(
150-
sprintf(
151-
'"%s" does not accept any arguments, "foo" given',
152-
MixedRule::class,
153-
),
154-
);
155-
156-
$this->rule->resolveArgs(
157-
[
158-
AnyOfRule::Rules => [
159-
new RuleCompileMeta(MixedRule::class),
160-
new RuleCompileMeta(MixedRule::class, [
161-
'foo' => 'bar',
162-
]),
163-
],
164-
],
165-
$this->argsFieldContext(),
166-
);
167-
}
168-
169189
}

tests/Unit/Rules/ArrayEnumRuleTest.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,45 @@ protected function setUp(): void
2020
$this->rule = new ArrayEnumRule();
2121
}
2222

23+
/**
24+
* @param array<mixed> $args
25+
*
26+
* @dataProvider provideResolveValid
27+
*/
28+
public function testResolveValid(array $args, ArrayEnumArgs $expectedArgs): void
29+
{
30+
$resolvedArgs = $this->rule->resolveArgs($args, $this->argsFieldContext());
31+
self::assertEquals($expectedArgs, $resolvedArgs);
32+
}
33+
34+
public static function provideResolveValid(): Generator
35+
{
36+
yield [
37+
[
38+
ArrayEnumRule::Cases => ['foo'],
39+
ArrayEnumRule::UseKeys => false,
40+
ArrayEnumRule::AllowUnknown => true,
41+
],
42+
new ArrayEnumArgs(['foo'], false, true),
43+
];
44+
45+
yield [
46+
[
47+
ArrayEnumRule::Cases => [123, 456],
48+
ArrayEnumRule::UseKeys => true,
49+
ArrayEnumRule::AllowUnknown => false,
50+
],
51+
new ArrayEnumArgs([123, 456], true, false),
52+
];
53+
54+
yield [
55+
[
56+
ArrayEnumRule::Cases => ['foo', 456],
57+
],
58+
new ArrayEnumArgs(['foo', 456], false, false),
59+
];
60+
}
61+
2362
/**
2463
* @param mixed $given
2564
* @param mixed $expected

tests/Unit/Rules/ArrayOfRuleTest.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,19 @@
22

33
namespace Tests\Orisai\ObjectMapper\Unit\Rules;
44

5+
use Generator;
56
use Orisai\ObjectMapper\Args\EmptyArgs;
67
use Orisai\ObjectMapper\Exception\ValueDoesNotMatch;
78
use Orisai\ObjectMapper\Exception\WithTypeAndValue;
9+
use Orisai\ObjectMapper\Meta\Compile\RuleCompileMeta;
810
use Orisai\ObjectMapper\Meta\Runtime\RuleRuntimeMeta;
911
use Orisai\ObjectMapper\Meta\Shared\DefaultValueMeta;
1012
use Orisai\ObjectMapper\Rules\ArrayOfArgs;
1113
use Orisai\ObjectMapper\Rules\ArrayOfRule;
1214
use Orisai\ObjectMapper\Rules\IntRule;
1315
use Orisai\ObjectMapper\Rules\MixedRule;
16+
use Orisai\ObjectMapper\Rules\ScalarRule;
17+
use Orisai\ObjectMapper\Rules\StringArgs;
1418
use Orisai\ObjectMapper\Rules\StringRule;
1519
use Orisai\ObjectMapper\Types\GenericArrayType;
1620
use Orisai\ObjectMapper\Types\SimpleValueType;
@@ -30,6 +34,50 @@ protected function setUp(): void
3034
$this->ruleManager->addRule(new AlwaysInvalidRule());
3135
}
3236

37+
/**
38+
* @param array<mixed> $args
39+
*
40+
* @dataProvider provideResolveValid
41+
*/
42+
public function testResolveValid(array $args, ArrayOfArgs $expectedArgs): void
43+
{
44+
$resolvedArgs = $this->rule->resolveArgs($args, $this->argsFieldContext());
45+
self::assertEquals($expectedArgs, $resolvedArgs);
46+
}
47+
48+
public static function provideResolveValid(): Generator
49+
{
50+
yield [
51+
[
52+
ArrayOfRule::ItemRule => new RuleCompileMeta(MixedRule::class),
53+
],
54+
new ArrayOfArgs(
55+
new RuleRuntimeMeta(MixedRule::class, new EmptyArgs()),
56+
null,
57+
null,
58+
null,
59+
false,
60+
),
61+
];
62+
63+
yield [
64+
[
65+
ArrayOfRule::ItemRule => new RuleCompileMeta(ScalarRule::class),
66+
ArrayOfRule::KeyRule => new RuleCompileMeta(StringRule::class),
67+
ArrayOfRule::MinItems => 1,
68+
ArrayOfRule::MaxItems => 10,
69+
ArrayOfRule::MergeDefaults => true,
70+
],
71+
new ArrayOfArgs(
72+
new RuleRuntimeMeta(ScalarRule::class, new EmptyArgs()),
73+
new RuleRuntimeMeta(StringRule::class, new StringArgs(null, false, null, null)),
74+
1,
75+
10,
76+
true,
77+
),
78+
];
79+
}
80+
3381
public function testProcessValid(): void
3482
{
3583
$value = ['foo', 'bar', 'baz', 123];

tests/Unit/Rules/ArrayShapeRuleTest.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
namespace Tests\Orisai\ObjectMapper\Unit\Rules;
44

5+
use Generator;
56
use Orisai\ObjectMapper\Args\EmptyArgs;
67
use Orisai\ObjectMapper\Exception\ValueDoesNotMatch;
8+
use Orisai\ObjectMapper\Meta\Compile\RuleCompileMeta;
79
use Orisai\ObjectMapper\Meta\Runtime\RuleRuntimeMeta;
810
use Orisai\ObjectMapper\Meta\Shared\DefaultValueMeta;
911
use Orisai\ObjectMapper\Rules\ArrayShapeArgs;
@@ -13,6 +15,8 @@
1315
use Orisai\ObjectMapper\Rules\MixedRule;
1416
use Orisai\ObjectMapper\Rules\NullArgs;
1517
use Orisai\ObjectMapper\Rules\NullRule;
18+
use Orisai\ObjectMapper\Rules\ScalarRule;
19+
use Orisai\ObjectMapper\Rules\StringArgs;
1620
use Orisai\ObjectMapper\Rules\StringRule;
1721
use Orisai\ObjectMapper\Types\ArrayShapeType;
1822
use Orisai\ObjectMapper\Types\SimpleValueType;
@@ -32,6 +36,44 @@ protected function setUp(): void
3236
$this->ruleManager->addRule(new AlwaysInvalidRule());
3337
}
3438

39+
/**
40+
* @param array<mixed> $args
41+
*
42+
* @dataProvider provideResolveValid
43+
*/
44+
public function testResolveValid(array $args, ArrayShapeArgs $expectedArgs): void
45+
{
46+
$resolvedArgs = $this->rule->resolveArgs($args, $this->argsFieldContext());
47+
self::assertEquals($expectedArgs, $resolvedArgs);
48+
}
49+
50+
public static function provideResolveValid(): Generator
51+
{
52+
yield [
53+
[
54+
ArrayShapeRule::Fields => [
55+
'foo' => new RuleCompileMeta(MixedRule::class),
56+
],
57+
],
58+
new ArrayShapeArgs([
59+
'foo' => new RuleRuntimeMeta(MixedRule::class, new EmptyArgs()),
60+
]),
61+
];
62+
63+
yield [
64+
[
65+
ArrayShapeRule::Fields => [
66+
1 => new RuleCompileMeta(ScalarRule::class),
67+
'foo' => new RuleCompileMeta(StringRule::class),
68+
],
69+
],
70+
new ArrayShapeArgs([
71+
1 => new RuleRuntimeMeta(ScalarRule::class, new EmptyArgs()),
72+
'foo' => new RuleRuntimeMeta(StringRule::class, new StringArgs(null, false, null, null)),
73+
]),
74+
];
75+
}
76+
3577
public function testProcessValid(): void
3678
{
3779
$value = [

0 commit comments

Comments
 (0)