internal/cuetxtar: support suberr=(...) in @test(err, ...)
Add support for asserting on individual sub-errors of a multi-error
(failed disjunction) value using repeated suberr=(...) groups in the
@test(err, ...) directive:
x: ... @test(err, code=eval, contains="empty disjunction",
suberr=(pos=[-1:5 0:5 0:14], contains="conflicting values"),
suberr=(pos=[-1:13 0:15], contains="not allowed"))
Matching is two-pass and order-independent: specs with non-empty pos=
are matched first (pass 1); remaining specs are matched by contains=
(pass 2). The disjunction-header entry prepended by CUE is skipped.
CUE_UPDATE=1 fills in empty pos=[] placeholders in suberr groups.
When pos= is wrong but contains= matches, position diffs are shown
instead of the generic "no sub-error matched" message.
New helpers: posSpecsMatch, positionsFromSingleError, matchesErrSpec,
checkSubErrors, enqueueSubErrPosWrites, replaceSuberrPos,
isDisjunctionHeader, posUpdate.
Also: refactor checkErrPositions to use posSpecsMatch.
Convert issue3330 to use suberr=(...) annotations and add
TestInlineRunner_SubErrors to exercise the new matching.
Signed-off-by: Marcel van Lohuizen <mpvl@gmail.com>
Change-Id: I3f1902c0f09ad668c2fc923d8f6abe4682865ca8
Reviewed-on: https://cue.gerrithub.io/c/cue-lang/cue/+/1234697
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Unity-Result: CUE porcuepine <cue.porcuepine@gmail.com>
TryBot-Result: CUEcueckoo <cueckoo@cuelang.org>