Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
TestMode
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 5
110
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 isLegacy
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 isCachingMode
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 __toString
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
 requestedTestModes
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2declare( strict_types = 1 );
3
4namespace 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 */
19class 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}