Completed
Push — master ( 81538e...c2bf57 )
by Jeroen De
10:06
created

ParserHookTest::arrayWrap()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
declare( strict_types = 1 );
4
5
namespace Maps\Tests\Integration\ParserHooks;
6
7
use Maps\MapsFactory;
8
use ParamProcessor\Processor;
9
use PHPUnit\Framework\TestCase;
10
11
/**
12
 * @licence GNU GPL v2+
13
 * @author Jeroen De Dauw < [email protected] >
14
 */
15
abstract class ParserHookTest extends TestCase {
16
17
	public static function setUpBeforeClass(): void {
18
		if ( !defined( 'MEDIAWIKI' ) ) {
19
			self::markTestSkipped( 'MediaWiki is not available' );
20
		}
21
	}
22
23
	/**
24
	 * @since 2.0
25
	 * @return array
26
	 */
27
	public abstract function parametersProvider();
28
29
	/**
30
	 * Triggers the render process with different sets of parameters to see if
31
	 * no errors or notices are thrown and the result indeed is a string.
32
	 *
33
	 * @dataProvider parametersProvider
34
	 * @since 2.0
35
	 *
36
	 * @param array $parameters
37
	 * @param string|null $expected
38
	 */
39
	public function testRender( array $parameters, $expected = null ) {
40
		$parserHook = $this->getInstance();
41
42
		$parser = new \Parser();
43
		$parser->mOptions = new \ParserOptions();
44
		$parser->clearState();
45
		$parser->setTitle( \Title::newMainPage() );
46
47
		$renderResult = call_user_func_array(
48
			[ $parserHook, 'renderFunction' ],
49
			array_merge( [ &$parser ], $parameters )
50
		);
51
52
		if ( is_string( $renderResult ) ) {
53
			$this->assertTrue( true );
54
		} else {
55
			$this->assertInternalType( 'array', $renderResult );
56
			$this->assertInternalType( 'string', $renderResult[0] );
57
		}
58
59
		if ( $expected !== null ) {
60
			$this->assertEquals( $expected, $renderResult[0] );
61
		}
62
	}
63
64
	/**
65
	 * @since 2.0
66
	 * @return \ParserHook
67
	 */
68
	protected abstract function getInstance();
69
70
	public function processingProvider() {
71
		return [];
72
	}
73
74
	/**
75
	 * @dataProvider processingProvider
76
	 * @since 3.0
77
	 */
78
	public function testParamProcessing( array $parameters, array $expectedValues ) {
79
		$definitions = $this->getInstance()->getParamDefinitions();
80
81
		$processor = Processor::newDefault();
82
		$processor->setParameters( $parameters );
83
		$processor->setParameterDefinitions(
84
			MapsFactory::globalInstance()->getParamDefinitionFactory()->newDefinitionsFromArrays( $definitions )
85
		);
86
87
		$result = $processor->processParameters();
88
89
		if ( $result->hasFatal() ) {
90
			$this->fail(
91
				'Fatal error occurred during the param processing: ' . $processor->hasFatalError()->getMessage()
92
			);
93
		}
94
95
		$actual = $result->getParameters();
96
97
		$expectedValues = array_merge( $this->getDefaultValues(), $expectedValues );
98
99
		foreach ( $expectedValues as $name => $expected ) {
100
			$this->assertArrayHasKey( $name, $actual );
101
102
			$this->assertEquals(
103
				$expected,
104
				$actual[$name]->getValue(),
105
				'Expected ' . var_export( $expected, true )
106
				. ' should match actual '
107
				. var_export( $actual[$name]->getValue(), true )
108
			);
109
		}
110
	}
111
112
	/**
113
	 * Returns an array with the default values of the parameters.
114
	 */
115
	private function getDefaultValues() {
116
		$definitions = MapsFactory::globalInstance()->getParamDefinitionFactory()->newDefinitionsFromArrays(
117
			$this->getInstance()->getParamDefinitions()
118
		);
119
120
		$defaults = [];
121
122
		foreach ( $definitions as $definition ) {
123
			if ( !$definition->isRequired() ) {
124
				$defaults[$definition->getName()] = $definition->getDefault();
125
			}
126
		}
127
128
		return $defaults;
129
	}
130
131
	protected function arrayWrap( array $elements ) {
132
		return array_map(
133
			function ( $element ) {
134
				return [ $element ];
135
			},
136
			$elements
137
		);
138
	}
139
140
}
141