2
2
3
3
namespace gapple \Tests \StructuredFields \Httpwg ;
4
4
5
- use gapple \StructuredFields \Bytes ;
6
- use gapple \StructuredFields \Date ;
7
- use gapple \StructuredFields \Dictionary ;
8
- use gapple \StructuredFields \DisplayString ;
9
- use gapple \StructuredFields \InnerList ;
10
- use gapple \StructuredFields \Item ;
11
- use gapple \StructuredFields \OuterList ;
12
- use gapple \StructuredFields \Parameters ;
13
- use gapple \StructuredFields \Token ;
14
5
use gapple \Tests \StructuredFields \Rule ;
15
6
use gapple \Tests \StructuredFields \RulesetTest ;
16
- use ParagonIE \ConstantTime \Base32 ;
17
7
18
- /**
19
- * @phpstan-type ExpectedParameters array<array{string, mixed}>
20
- * @phpstan-type ExpectedTuple array{mixed, ExpectedParameters}
21
- * @phpstan-type ExpectedInnerList array{array<ExpectedTuple>, ExpectedParameters}
22
- * @phpstan-type ExpectedOuterList array<ExpectedTuple>
23
- * @phpstan-type ExpectedDictionary array<array{string, ExpectedTuple}>
24
- */
25
8
abstract class HttpwgTest extends RulesetTest
26
9
{
27
10
/**
@@ -51,16 +34,28 @@ protected function rulesetDataProvider(): array
51
34
}
52
35
53
36
$ dataset = [];
54
- foreach ($ rules as $ rule ) {
55
- if (isset ($ rule ->expected )) {
37
+ foreach ($ rules as $ rawRule ) {
38
+ if (isset ($ rawRule ->expected )) {
56
39
try {
57
- $ rule ->expected = self ::{"convertExpected " . ucfirst ($ rule ->header_type )}($ rule ->expected );
58
- } catch (\UnexpectedValueException $ e ) {
40
+ switch ($ rawRule ->header_type ) {
41
+ case 'item ' :
42
+ $ rawRule ->expected = HttpwgRuleExpectedConverter::item ($ rawRule ->expected );
43
+ break ;
44
+ case 'list ' :
45
+ $ rawRule ->expected = HttpwgRuleExpectedConverter::list ($ rawRule ->expected );
46
+ break ;
47
+ case 'dictionary ' :
48
+ $ rawRule ->expected = HttpwgRuleExpectedConverter::dictionary ($ rawRule ->expected );
49
+ break ;
50
+ default :
51
+ throw new \UnexpectedValueException ('Unknown header type ' );
52
+ }
53
+ } catch (\UnexpectedValueException | \AssertionError $ e ) {
59
54
// Skip rules that cannot be parsed.
60
55
continue ;
61
56
}
62
57
}
63
- $ rule = Rule::fromClass ($ rule );
58
+ $ rule = Rule::fromClass ($ rawRule );
64
59
65
60
if (isset ($ dataset [$ rule ->name ])) {
66
61
user_error (
@@ -74,127 +69,4 @@ protected function rulesetDataProvider(): array
74
69
75
70
return $ dataset ;
76
71
}
77
-
78
- /**
79
- * Convert the expected value of an item tuple.
80
- *
81
- * @param ExpectedTuple $item
82
- * @return Item
83
- */
84
- private static function convertExpectedItem (array $ item ): Item
85
- {
86
- return new Item (self ::convertValue ($ item [0 ]), self ::convertParameters ($ item [1 ]));
87
- }
88
-
89
- /**
90
- * Convert the expected values of a parameters map.
91
- *
92
- * @param ExpectedParameters $parameters
93
- * @return Parameters
94
- */
95
- private static function convertParameters (array $ parameters ): Parameters
96
- {
97
- $ output = new Parameters ();
98
-
99
- foreach ($ parameters as $ value ) {
100
- // Null byte is not supported as first character of property name.
101
- if (strpos ($ value [0 ], "\0" ) === 0 ) {
102
- throw new \UnexpectedValueException ();
103
- }
104
-
105
- $ output ->{$ value [0 ]} = self ::convertValue ($ value [1 ]);
106
- }
107
-
108
- return $ output ;
109
- }
110
-
111
- /**
112
- * Convert the expected values of an inner list tuple.
113
- *
114
- * @param ExpectedInnerList $innerList
115
- * @return InnerList
116
- */
117
- private static function convertInnerList (array $ innerList ): InnerList
118
- {
119
- $ outputList = [];
120
-
121
- foreach ($ innerList [0 ] as $ value ) {
122
- $ outputList [] = new Item (self ::convertValue ($ value [0 ]), self ::convertParameters ($ value [1 ]));
123
- }
124
-
125
- return new InnerList ($ outputList , self ::convertParameters ($ innerList [1 ]));
126
- }
127
-
128
- /**
129
- * Convert the expected values of a list.
130
- *
131
- * @param ExpectedOuterList $list
132
- * @return OuterList
133
- */
134
- private static function convertExpectedList (array $ list ): OuterList
135
- {
136
- $ output = new OuterList ();
137
-
138
- foreach ($ list as $ value ) {
139
- if (is_array ($ value [0 ])) {
140
- $ output [] = self ::convertInnerList ($ value );
141
- } else {
142
- $ output [] = self ::convertExpectedItem ($ value );
143
- }
144
- }
145
-
146
- return $ output ;
147
- }
148
-
149
- /**
150
- * Convert the expected values of a dictionary.
151
- *
152
- * @param ExpectedDictionary $dictionary
153
- * @return Dictionary
154
- */
155
- private static function convertExpectedDictionary (array $ dictionary ): Dictionary
156
- {
157
- $ output = new Dictionary ();
158
-
159
- foreach ($ dictionary as $ value ) {
160
- // Null byte is not supported as first character of property name.
161
- if (strpos ($ value [0 ], "\0" ) === 0 ) {
162
- throw new \UnexpectedValueException ();
163
- }
164
-
165
- if (is_array ($ value [1 ][0 ])) {
166
- $ output ->{$ value [0 ]} = self ::convertInnerList ($ value [1 ]);
167
- } else {
168
- $ output ->{$ value [0 ]} = self ::convertExpectedItem ($ value [1 ]);
169
- }
170
- }
171
-
172
- return $ output ;
173
- }
174
-
175
- /**
176
- * Convert any encoded special values to typed objects.
177
- *
178
- * @param mixed $data
179
- * The expected bare value.
180
- * @return mixed
181
- */
182
- private static function convertValue ($ data )
183
- {
184
- if (is_object ($ data ) && property_exists ($ data , '__type ' )) {
185
- /** @var \stdClass $data */
186
- switch ($ data ->__type ) {
187
- case 'token ' :
188
- return new Token ($ data ->value );
189
- case 'binary ' :
190
- return new Bytes (Base32::decodeUpper ($ data ->value ));
191
- case 'date ' :
192
- return new Date ($ data ->value );
193
- case 'displaystring ' :
194
- return new DisplayString ($ data ->value );
195
- }
196
- }
197
-
198
- return $ data ;
199
- }
200
72
}
0 commit comments