Completed
Push — master ( cb0578...28965e )
by Jeroen De
07:11 queued 04:27
created

tests/phpunit/ProcessorTest.php (1 issue)

mismatching argument types.

Documentation Minor

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace ParamProcessor\Tests;
4
5
use ParamProcessor\ProcessingError;
6
use ParamProcessor\ProcessingResult;
7
use ParamProcessor\Processor;
8
use ParamProcessor\Options;
9
10
/**
11
 * @covers ParamProcessor\Processor
12
 *
13
 * @licence GNU GPL v2+
14
 * @author Jeroen De Dauw < [email protected] >
15
 */
16
class ProcessorTest extends \PHPUnit_Framework_TestCase {
17
18
	public function testNewDefault() {
19
		$this->assertInstanceOf( 'ParamProcessor\Processor', Processor::newDefault() );
20
	}
21
22
	public function newFromOptionsProvider() {
23
		$options = [];
24
25
		$option = new Options();
26
27
		$options[] = clone $option;
28
29
		$option->setName( 'foobar' );
30
		$option->setLowercaseNames( false );
31
32
		$options[] = clone $option;
33
34
		return $this->arrayWrap( $options );
35
	}
36
37
	private function arrayWrap( array $elements ) {
38
		return array_map(
39
			function( $element ) {
40
				return [ $element ];
41
			},
42
			$elements
43
		);
44
	}
45
46
	public function testNewFromOptions() {
47
		$options = new Options();
48
		$validator = Processor::newFromOptions( clone $options );
49
		$this->assertInstanceOf( '\ParamProcessor\Processor', $validator );
50
		$this->assertEquals( $options, $validator->getOptions() );
51
	}
52
53
	/**
54
	 * Simple parameter definitions and values that should all pass.
55
	 *
56
	 * @return array
57
	 */
58
	private function getSimpleParams() {
59
		$params = [
60
			'awesome' => 'yes',
61
			'Howmuch ' => '9001',
62
			'FLOAT' => '4.2',
63
			' page' => 'Ohi there!',
64
			' text     ' => 'foo bar baz o_O',
65
		];
66
67
		$definitions = [
68
			'awesome' => [
69
				'type' => 'boolean',
70
			],
71
			'howmuch' => [
72
				'type' => 'integer',
73
			],
74
			'float' => [
75
				'type' => 'float',
76
			],
77
			'page' => [
78
				'type' => 'string',
79
				'hastoexist' => false,
80
			],
81
			'text' => [],
82
		];
83
84
		$options = new Options();
85
86
		$expected = [
87
			'awesome' => true,
88
			'howmuch' => 9001,
89
			'float' => 4.2,
90
			'page' => 'Ohi there!',
91
			'text' => 'foo bar baz o_O',
92
		];
93
94
		return [ $params, $definitions, $options, $expected ];
95
	}
96
97
	/**
98
	 * Simple parameter definitions with defaults and values
99
	 * that are invalid or missing and therefore default.
100
	 *
101
	 * @return array
102
	 */
103
	private function getDefaultingParams() {
104
		$params = [
105
			'awesome' => 'omg!',
106
			'howmuch' => 'omg!',
107
			'float' => 'omg!',
108
			'page' => 42,
109
			'whot?' => 'O_o',
110
			'integerr' => ' 9001 ',
111
		];
112
113
		$definitions = [
114
			'awesome' => [
115
				'type' => 'boolean',
116
				'default' => true,
117
			],
118
			'howmuch' => [
119
				'type' => 'integer',
120
				'default' => 9001,
121
			],
122
			'float' => [
123
				'type' => 'float',
124
				'default' => 4.2,
125
			],
126
			'page' => [
127
				'type' => 'string',
128
				'hastoexist' => false,
129
				'default' => 'Ohi there!',
130
			],
131
			'text' => [
132
				'default' => 'foo bar baz o_O',
133
			],
134
			'integerr' => [
135
				'type' => 'integer',
136
				'default' => 42,
137
			],
138
		];
139
140
		$options = new Options();
141
		$options->setTrimValues( false );
142
143
		$expected = [
144
			'awesome' => true,
145
			'howmuch' => 9001,
146
			'float' => 4.2,
147
			'page' => 'Ohi there!',
148
			'text' => 'foo bar baz o_O',
149
			'integerr' => 42,
150
		];
151
152
		return [ $params, $definitions, $options, $expected ];
153
	}
154
155
	/**
156
	 * Values and definitions in-system parameter handling.
157
	 * Options set to expect non-raw values.
158
	 *
159
	 * @return array
160
	 */
161
	private function getTypedParams() {
162
		$params = [
163
			'awesome' => true,
164
			'howmuch' => '42',
165
			'float' => 4.2,
166
			'page' => 'Ohi there!',
167
			'Text' => 'foo bar baz o_O',
168
			'text1 ' => 'foo bar baz o_O',
169
			' text2' => 'foo bar baz o_O',
170
		];
171
172
		$definitions = [
173
			'awesome' => [
174
				'type' => 'boolean',
175
			],
176
			'howmuch' => [
177
				'type' => 'integer',
178
				'default' => 9001,
179
			],
180
			'float' => [
181
				'type' => 'float',
182
				'lowerbound' => 9001,
183
				'default' => 9000.1
184
			],
185
			'page' => [
186
				'type' => 'string',
187
				'hastoexist' => false,
188
			],
189
			'text' => [
190
				'default' => 'some text',
191
			],
192
			'text1' => [
193
				'default' => 'some text',
194
			],
195
			'text2' => [
196
				'default' => 'some text',
197
			],
198
		];
199
200
		$options = new Options();
201
		$options->setRawStringInputs( false );
202
		$options->setLowercaseNames( false );
203
		$options->setTrimNames( false );
204
205
		$expected = [
206
			'awesome' => true,
207
			'howmuch' => 9001,
208
			'float' => 9000.1,
209
			'page' => 'Ohi there!',
210
			'text' => 'some text',
211
			'text1' => 'some text',
212
			'text2' => 'some text',
213
		];
214
215
		return [ $params, $definitions, $options, $expected ];
216
	}
217
218
	/**
219
	 * Values with capitalization and preceding/tailing spaces to test
220
	 * of the clean options work.
221
	 *
222
	 * @return array
223
	 */
224
	private function getUncleanParams() {
225
		$params = [
226
			'awesome' => ' yes ',
227
			'text' => ' FOO  bar  ',
228
			'integerr' => ' 9001 ',
229
		];
230
231
		$definitions = [
232
			'awesome' => [
233
				'type' => 'boolean',
234
			],
235
			'text' => [
236
				'default' => 'bar',
237
			],
238
			'integerr' => [
239
				'type' => 'integer',
240
				'default' => 42,
241
			],
242
		];
243
244
		$options = new Options();
245
		$options->setLowercaseValues( true );
246
		$options->setTrimValues( true );
247
248
		$expected = [
249
			'awesome' => true,
250
			'text' => 'foo  bar',
251
			'integerr' => 9001,
252
		];
253
254
		return [ $params, $definitions, $options, $expected ];
255
	}
256
257
	/**
258
	 * List parameters to test if list handling works correctly.
259
	 *
260
	 * @return array
261
	 */
262
	private function getListParams() {
263
		$params = [
264
			'awesome' => ' yes, no, on, off ',
265
			'float' => ' 9001 ; 42 ; 4.2;0',
266
		];
267
268
		$definitions = [
269
			'awesome' => [
270
				'type' => 'boolean',
271
				'islist' => true,
272
			],
273
			'text' => [
274
				'default' => [ 'bar' ],
275
				'islist' => true,
276
			],
277
			'float' => [
278
				'type' => 'float',
279
				'islist' => true,
280
				'delimiter' => ';'
281
			],
282
		];
283
284
		$options = new Options();
285
		$options->setLowercaseValues( true );
286
		$options->setTrimValues( true );
287
288
		$expected = [
289
			'awesome' => [ true, false, true, false ],
290
			'text' => [ 'bar' ],
291
			'float' => [ 9001.0, 42.0, 4.2, 0.0 ],
292
		];
293
294
		return [ $params, $definitions, $options, $expected ];
295
	}
296
297
	public function parameterProvider() {
298
		// $params, $definitions [, $options]
299
		$argLists = [];
300
301
		$argLists[] = $this->getSimpleParams();
302
303
		$argLists[] = $this->getDefaultingParams();
304
305
		$argLists[] = $this->getTypedParams();
306
307
		$argLists[] = $this->getUncleanParams();
308
309
		$argLists[] = $this->getListParams();
310
311
		foreach ( $argLists as &$argList ) {
312
			foreach ( $argList[1] as $key => &$definition ) {
313
				$definition['message'] = 'test-' . $key;
314
			}
315
316
			if ( !array_key_exists( 2, $argList ) ) {
317
				$argList[2] = new Options();
318
			}
319
		}
320
321
		return $argLists;
322
	}
323
324
	/**
325
	 * @dataProvider parameterProvider
326
	 */
327
	public function testSetParameters( array $params, array $definitions, Options $options ) {
328
		$validator = Processor::newFromOptions( $options );
329
330
		$validator->setParameters( $params, $definitions );
331
332
		$this->assertTrue( true ); // TODO
333
	}
334
335
	/**
336
	 * @dataProvider parameterProvider
337
	 */
338
	public function testValidateParameters( array $params, array $definitions, Options $options, array $expected = [] ) {
339
		$validator = Processor::newFromOptions( $options );
340
341
		$validator->setParameters( $params, $definitions );
342
343
		$processingResult = $validator->processParameters();
344
345
		$actualValues = [];
346
347
		foreach ( $processingResult->getParameters() as $param ) {
348
			$actualValues[$param->getName()] = $param->getValue();
349
		}
350
351
		$this->assertEquals( $expected, $actualValues );
352
353
354
	}
355
356
	public function testProcessParametersOnEmptyOptions() {
357
		$processor = Processor::newDefault();
358
359
		$this->assertInstanceOf(
360
			ProcessingResult::class,
361
			$processor->processParameters()
362
		);
363
	}
364
365
	public function testErrorsCanBeRetrievedAfterProcessing() {
366
		$processor = Processor::newDefault();
367
368
		$this->processWithOneError( $processor );
369
370
		$this->assertCount( 1, $processor->getErrors() );
371
	}
372
373
	private function processWithOneError( Processor $processor ) {
374
		$processor->setParameters(
375
			[],
376
			[
0 ignored issues
show
array('awesome' => array...ge' => 'test-awesome')) is of type array<string,array<strin...ssage\":\"string\"}>"}>, but the function expects a array<integer,object<Par...ssor\IParamDefinition>>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
377
				'awesome' => [
378
					'type' => 'boolean',
379
					'message' => 'test-awesome'
380
				],
381
			]
382
		);
383
384
		// There should be a single "missing required parameter" error.
385
		$processor->processParameters();
386
	}
387
388
	public function testErrorsAreClearedBetweenProcessingRuns() {
389
		$processor = Processor::newDefault();
390
391
		$this->processWithOneError( $processor );
392
		$processor->setParameters( [], [] );
393
		$processor->processParameters();
394
395
		$this->assertEmpty( $processor->getErrors() );
396
	}
397
398
}
399