Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
0.00% |
0 / 21 |
|
0.00% |
0 / 5 |
CRAP | |
0.00% |
0 / 1 |
| TestMode | |
0.00% |
0 / 21 |
|
0.00% |
0 / 5 |
110 | |
0.00% |
0 / 1 |
| __construct | |
0.00% |
0 / 2 |
|
0.00% |
0 / 1 |
2 | |||
| isLegacy | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
| isCachingMode | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
| __toString | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
6 | |||
| requestedTestModes | |
0.00% |
0 / 10 |
|
0.00% |
0 / 1 |
30 | |||
| 1 | <?php |
| 2 | declare( strict_types = 1 ); |
| 3 | |
| 4 | namespace Wikimedia\Parsoid\ParserTests; |
| 5 | |
| 6 | /** |
| 7 | * Represents a parser test mode, that is, a certain way of executing a |
| 8 | * parser tests and evaluating the result. |
| 9 | * |
| 10 | * As a trivial example, a parser test will typically have a |
| 11 | * "wikitext" section and an "html" section. Two possible modes for |
| 12 | * evaluating the test are "wt2html" (where you programatically |
| 13 | * convert the "wikitext" section to HTML and verify that the result |
| 14 | * matches the "html" section, after normalization) and "html2wt" |
| 15 | * (where you programmatically convert the "html" section back to |
| 16 | * wikitext and verify that the result matches the "wikitext" section, |
| 17 | * after normalization). |
| 18 | */ |
| 19 | class TestMode { |
| 20 | |
| 21 | /** Valid test modes, as keys for efficient query/set intersection. */ |
| 22 | public const TEST_MODES = [ |
| 23 | 'legacy' => true, // wt2html with legacy parser |
| 24 | 'wt2html' => true, |
| 25 | 'wt2wt' => true, |
| 26 | 'html2html' => true, |
| 27 | 'html2wt' => true, |
| 28 | 'selser' => true, |
| 29 | ]; |
| 30 | |
| 31 | /** |
| 32 | * Selected test mode, typically one of the values from self::TEST_MODES. |
| 33 | * @var string |
| 34 | */ |
| 35 | public $mode; |
| 36 | |
| 37 | /** |
| 38 | * The "selser" test mode can operate with an explicit changetree |
| 39 | * provided in this property. |
| 40 | * @var ?array |
| 41 | */ |
| 42 | public $changetree; |
| 43 | |
| 44 | /** |
| 45 | * Create a new test mode |
| 46 | * @param string $mode The test mode. An external caller should use |
| 47 | * one of `self::TEST_MODES`, although ParserTestRunner uses a few |
| 48 | * additional values internally. |
| 49 | * @param ?array $changetree The specific changes to apply in selser test |
| 50 | * mode. |
| 51 | */ |
| 52 | public function __construct( |
| 53 | string $mode, |
| 54 | ?array $changetree = null |
| 55 | ) { |
| 56 | $this->mode = $mode; |
| 57 | $this->changetree = $changetree; |
| 58 | } |
| 59 | |
| 60 | /** |
| 61 | * Helper function: returns true if this test mode is 'legacy'; that is, |
| 62 | * is this test to run with the legacy parser. |
| 63 | * @return bool |
| 64 | */ |
| 65 | public function isLegacy() { |
| 66 | return $this->mode === 'legacy'; |
| 67 | } |
| 68 | |
| 69 | /** |
| 70 | * Helper function: returns true if we are running this test to cache some info |
| 71 | * for use in later tests. |
| 72 | * @return bool |
| 73 | */ |
| 74 | public function isCachingMode() { |
| 75 | return $this->mode === 'cache'; |
| 76 | } |
| 77 | |
| 78 | /** |
| 79 | * Returns a string representation of this test mode, which can also |
| 80 | * be used as an array key or for human-friendly output. |
| 81 | * @return string |
| 82 | */ |
| 83 | public function __toString(): string { |
| 84 | $s = $this->mode; |
| 85 | if ( $this->changetree !== null ) { |
| 86 | $s .= ' ' . json_encode( |
| 87 | $this->changetree, |
| 88 | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE |
| 89 | ); |
| 90 | } |
| 91 | return $s; |
| 92 | } |
| 93 | |
| 94 | /** |
| 95 | * Helper function: filter a given set of options against the |
| 96 | * TEST_MODES. Optionally ensure that all modes are returned if |
| 97 | * none are explicitly set. |
| 98 | * |
| 99 | * @param string[] $options The user-specified test modes |
| 100 | * @param bool $ifEmptySetAll If true, ensure that the result always |
| 101 | * includes at least one set test mode by setting all available test |
| 102 | * modes if the passed $options array does not contain any. |
| 103 | * @return string[] A filtered set of test modes |
| 104 | */ |
| 105 | public static function requestedTestModes( array $options, bool $ifEmptySetAll = true ) { |
| 106 | if ( $ifEmptySetAll ) { |
| 107 | $allModes = true; |
| 108 | foreach ( self::TEST_MODES as $mode => $ignore ) { |
| 109 | if ( $options[$mode] ?? false ) { |
| 110 | $allModes = false; |
| 111 | } |
| 112 | } |
| 113 | if ( $allModes ) { |
| 114 | return array_keys( self::TEST_MODES ); |
| 115 | } |
| 116 | } |
| 117 | return array_keys( array_intersect_assoc( |
| 118 | $options, self::TEST_MODES |
| 119 | ) ); |
| 120 | } |
| 121 | } |