File: TestAllServiceOptionsUsed.php

package info (click to toggle)
mediawiki 1%3A1.43.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 417,464 kB
  • sloc: php: 1,062,949; javascript: 664,290; sql: 9,714; python: 5,458; xml: 3,489; sh: 1,131; makefile: 64
file content (48 lines) | stat: -rw-r--r-- 1,958 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php

/**
 * Use this trait to check that code run by tests accesses every key declared for this class'
 * ServiceOptions, e.g., in a CONSTRUCTOR_OPTIONS member const. To use this trait, you need to do
 * two things (other than use-ing it):
 *
 * 1) Don't use the regular ServiceOptions when constructing your objects, but rather
 * LoggedServiceOptions. These are used the same as ServiceOptions, except in the constructor, pass
 * self::$serviceOptionsAccessLog before the regular arguments.
 *
 * 2) Make a test that calls assertAllServiceOptionsUsed(). If some ServiceOptions keys are not yet
 * accessed in tests but actually are used by the class, pass their names as an argument.
 *
 * Currently we support only one ServiceOptions per test class.
 */
trait TestAllServiceOptionsUsed {
	/** @var array [ expected keys (as list), keys accessed so far (as dictionary) ] */
	private static $serviceOptionsAccessLog = [];

	/**
	 * @param string[] $expectedUnused Options that we know are not yet tested
	 */
	public function assertAllServiceOptionsUsed( array $expectedUnused = [] ) {
		$this->assertNotEmpty( self::$serviceOptionsAccessLog,
			'You need to pass LoggedServiceOptions to your class instead of ServiceOptions ' .
			'for TestAllServiceOptionsUsed to work.'
		);

		[ $expected, $actual ] = self::$serviceOptionsAccessLog;

		$expected = array_diff( $expected, $expectedUnused );

		$this->assertSame(
			[],
			array_diff( $expected, array_keys( $actual ) ),
			"Some ServiceOptions keys were not accessed in tests. If they really aren't used, " .
			"remove them from the class' option list. If they are used, add tests to cover them, " .
			"or ignore the problem for now by passing them to assertAllServiceOptionsUsed() in " .
			"its \$expectedUnused argument."
		);

		if ( $expectedUnused ) {
			$this->markTestIncomplete( 'Some ServiceOptions keys are not yet accessed by tests: ' .
				implode( ', ', $expectedUnused ) );
		}
	}
}