tests/spec: a recorded corpus for the positional operators #6
Reference in New Issue
Block a user
Delete Branch "m3-positional-corpus"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
M3's gate as named -- "remaining crud coverage; e2e3/e2e4 green" -- cannot see
this work.
e2e3ande2e4contain zero positional paths, and the pinned crudcorpus covers
$[<identifier>]only: no$[]case, no bare$case anywhere init. Both stayed green through a bug that replaced an array with
{"$[i]": {...}}and answered
ok: 1.So M3 brings its own corpus, built the way M2.5's was: inputs authored in
sources/, every expectation recorded from mongod 8.3.7, run through the sharedrunner with
--suite-dir.Where it stands
51 cases across the three spellings:
Red by construction and by design --
tests/spec/aggregate/expressions.jsonwasrecorded at 1 pass / 26 fail before the evaluator existed and is green now; this
is the same gate at the same stage. The 15 that pass are refusals where this
server's code already matches mongod's. Of the 36 that fail, 31 are the
constructs answering "not implemented by this server", and 5 are refusals whose
code differs -- four of them
arrayFiltersvalidation this server cannot dobecause it never parses the option.
Every case records its
outcome, refusals includedDeliberate, and the whole point of the file: a refusal that left the document
mangled is indistinguishable from a clean one in
expectErroralone, and amangled document is what this corpus exists to catch.
What recording it settled
None of it guessable, and the first row contradicts what the design review
assumed:
y.$[i].c.$[i].d, one identifier reused at two levels$[]over an empty arraymodifiedCount: 0$[]where one element is not a document$[]/$[i]where the path is missing or not an array$where several elements match$when the query never touched the array$twice in a patharrayFiltersalongside a replacementThe 2-versus-9 split is nearly "9 is the
arrayFiltersarray judged on itsown, 2 is anything needing the update or the stored document" -- and it is not a
clean rule: an identifier that is not a lowercase alphanumeric name carries the
same
Error parsing array filterprefix as the 9s and is a 2. Recorded asmeasured rather than tidied.
Notes
A case needing its own documents reseeds through operations (
deleteMany+insertMany) rather thaninitialData, because the unified format'sinitialDatais per file and the runner seeds it once per test. That keeps onefile per operator instead of one file per document shape.
PLAN §3's M3 row now names this corpus as the gate, with §6 recording why the
old one could not see the work.
Verification
crud scorecard unchanged at 204/87, aggregation corpus still 70/0, and the
--scorecard+--suite-dirguard still refuses.M3's gate as named -- "remaining crud coverage; e2e3/e2e4 green" -- cannot see this work. e2e3 and e2e4 contain zero positional paths, and the pinned crud corpus covers `$[<identifier>]` only: no `$[]` case, no bare `$` case anywhere in it. Both stayed green through a bug that replaced an array with `{"$[i]": {...}}` and answered ok: 1. So M3 brings its own corpus, built the way M2.5's was: inputs authored in `sources/`, every expectation recorded from mongod 8.3.7, run through the shared runner with `--suite-dir`. 51 cases across the three spellings. It stands at 15 pass / 36 fail against the refusal, which is the intended shape -- `expressions.json` was recorded at 1 pass / 26 fail before the evaluator and is green now. The 15 that pass are refusals where this server's code already matches; of the 36, 31 are the constructs answering "not implemented" and 5 are refusals whose code differs, four of them arrayFilters validation this server cannot do because it never parses the option. Every case records its `outcome`, refusals included. That is deliberate and it is the whole point of the file: a refusal that left the document mangled is indistinguishable from a clean one in `expectError` alone, and a mangled document is what this corpus exists to catch. What recording it settled, none of it guessable, the first contradicting what the design review assumed: - `y.$[i].c.$[i].d`, one identifier reused at two levels, is **accepted** -- not a duplicate-identifier error - `$[]` over an empty array is a no-op with modifiedCount 0 - `$[]` over an array with a non-document element is error 28, where every other path failure here is 2 - a positional segment never creates: a missing or non-array path is an error, where `$set: {'a.b': 1}` would construct one - an upsert gets no special case -- it fails for the same reason - `$` writes only the first matching element, and is refused when the query never touched the array - any of the three in first position is refused, as is `$` twice in a path - `arrayFilters` alongside a replacement is ignored rather than refused A case needing its own documents reseeds through operations rather than `initialData`, because the format's `initialData` is per file and the runner seeds it once per test. That keeps one file per operator instead of one file per document shape. crud scorecard unchanged at 204/87, aggregation corpus still 70/0.