Task Summary
One configuration exercises one path through an operator. A parity run wants more than that: every value an enum offers, the optional knobs a default leaves empty, and a text knob carrying a value that breaks a Python literal if it was spliced rather than escaped.
This adds the sweep on top of the generator that derives the configuration. Four entry points return variants: one for an operator configured from its annotations, and three for a hand-written fixture, which needs them more, since the configuration it pins is otherwise the only one its operator ever runs.
The sweep moves one knob at a time rather than crossing them, so a failure names the knob that caused it. The exceptions are the two variants that move every knob of a kind at once, where bisecting by hand costs less than a run per field: all optional knobs filled together, and all free-text knobs carrying the hostile value together, numbered so no two knobs carry the same text. Two knobs sharing one value is not a smaller version of the same test: where both name an output column, it writes the same column twice and the run fails for a reason that has nothing to do with escaping.
Eighteenth of the twenty-one steps listed in #8325, and the second of the seventeenth entry's two halves. The two are one Scala object, so this one does not compile without the members the first defines.
Task Summary
One configuration exercises one path through an operator. A parity run wants more than that: every value an enum offers, the optional knobs a default leaves empty, and a text knob carrying a value that breaks a Python literal if it was spliced rather than escaped.
This adds the sweep on top of the generator that derives the configuration. Four entry points return variants: one for an operator configured from its annotations, and three for a hand-written fixture, which needs them more, since the configuration it pins is otherwise the only one its operator ever runs.
The sweep moves one knob at a time rather than crossing them, so a failure names the knob that caused it. The exceptions are the two variants that move every knob of a kind at once, where bisecting by hand costs less than a run per field: all optional knobs filled together, and all free-text knobs carrying the hostile value together, numbered so no two knobs carry the same text. Two knobs sharing one value is not a smaller version of the same test: where both name an output column, it writes the same column twice and the run fails for a reason that has nothing to do with escaping.
Eighteenth of the twenty-one steps listed in #8325, and the second of the seventeenth entry's two halves. The two are one Scala object, so this one does not compile without the members the first defines.