diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9159269..d5c0955 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -12,7 +12,7 @@ updates: # implementation and changes only through an explicit compatibility # decision, so it is excluded from automated updates. - package-ecosystem: npm - directory: /compatibility/oracle + directory: /tools/overpy/oracle schedule: interval: monthly ignore: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7653b6a..76fae5e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,12 +62,12 @@ jobs: - name: Build internal compatibility evidence target run: cargo build --locked -p opy-cli --features compatibility --bin opy-compat - - name: Run compatibility harness tests - run: python3 -B -m unittest discover -s compatibility/tests + - name: Run OverPy evidence harness tests + run: python3 -B -m unittest discover -s tools/overpy/tests - name: Run native compiler compatibility gate run: >- - python3 -B compatibility/run_native.py + python3 -B tools/overpy/run_native.py --binary target/debug/opy-cli --semantic-binary target/debug/opy-compat --results target/opy-rs-compiler-results @@ -83,7 +83,7 @@ jobs: - name: Run independent conformance baseline run: >- - python3 -B compatibility/conformance.py + python3 -B tools/overpy/conformance.py --binary target/debug/opy-cli --semantic-binary target/debug/opy-compat --report target/opy-rs-conformance-report.json diff --git a/.gitignore b/.gitignore index 1710faf..afd5b67 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,8 @@ **/*.rs.bk .DS_Store .env -# Pinned oracle installs (pnpm install --dir compatibility/oracle) -compatibility/oracle/node_modules/ +# Pinned oracle installs (pnpm install --dir tools/overpy/oracle) +tools/overpy/oracle/node_modules/ # Python harness caches __pycache__/ *.pyc diff --git a/README.md b/README.md index fbdf791..49f04e8 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,6 @@ opy-cli check main.opy opy-cli compile main.opy opy-cli compile --format json main.opy opy-cli inspect main.opy -opy-cli support --json opy-cli completion bash opy-cli version ``` @@ -107,10 +106,9 @@ compatibility corpus and pinned OverPy reference evidence. | OPY β†’ Workshop compilation | 🟑 Partial | The versioned library/CLI compile contract and bounded lowering surface are supported; remaining corpus gaps stay explicit | | Workshop β†’ OPY reconstruction | ⏳ Not yet | Will consume canonical `workshop-rs` semantics and remain owned by `opy-rs` | -Exact per-feature evidence remains available in the -[canonical human-readable support contract](docs/language-support.md). Internal -fixture and implementation metadata remains in -[compatibility/support-matrix.json](compatibility/support-matrix.json). +The exhaustive per-feature evidence and pinned denominator are maintained in +the [canonical human-readable support contract](docs/language-support.md) and +its linked inventories. ## Relationship with Wright @@ -127,7 +125,7 @@ capability that `opy-rs` itself should own. cargo fmt --all -- --check cargo clippy --workspace --all-targets --all-features -- -D warnings cargo test --workspace --all-targets --all-features -python3 -m unittest discover -s compatibility/tests +python3 -m unittest discover -s tools/overpy/tests ``` CI additionally exercises the JavaScript macro runtime on macOS and Windows. diff --git a/compatibility/support-matrix.json b/compatibility/support-matrix.json deleted file mode 100644 index 6fa0979..0000000 --- a/compatibility/support-matrix.json +++ /dev/null @@ -1,808 +0,0 @@ -{ - "schemaVersion": 1, - "visibility": "internal-engineering-metadata", - "artifact": "opy-rs OverPy feature inventory and support matrix", - "reference": { - "name": "overpy", - "version": "9.7.10", - "contentCommit": "889d9749d1def17f146548cbddb94ea1ab015847", - "integrity": "sha512-oX17nauJcPTaKIrRFY/rD0Rl8atqFUVv9Hg2TKH+A68/fC8+ZO344Mkd1A/Y0oOVp1hr5tktMBjzMEDDnMEYUw==" - }, - "snapshot": { - "date": "2026-08-29", - "note": "Readiness baseline through the #38 versioned compile API and CLI. Supported settings, catalog-declared locale emission, and post-compile hooks have explicit OPY -> HIR -> WIR -> validated Workshop emission evidence. Compiler and CLI failures remain structured and source-attributed; optimizer controls remain non-blocking presentation differences and semantic replacement directives remain explicit gaps. Canonical Workshop catalog data, settings tables, locale spellings, WIR, validation, and emission remain owned by workshop-rs.", - "asOfCommit": "9f7c62b1958a3804780a2de7d1bd55e2fb298533" - }, - "states": { - "planned": "Declared surface, not yet implemented in opy-rs; evidence/provenance recorded for the implementing issue.", - "source-supported": "Source implementation behavior (lex/parse/preprocess/macro expansion) implemented in opy-rs and corpus-evidenced.", - "semantic-supported": "Semantic resolution implemented in opy-rs (names, members, enums, call semantics covered by the semantic model).", - "lowering-dependent": "Completion requires canonical Workshop semantics/catalog/emission owned by workshop-rs; inventory-only until the integration stage.", - "end-to-end-supported": "A declared feature or bounded integration slice has explicit OPY -> HIR -> WIR -> validated Workshop emission evidence for that scope; this state does not imply full-language OPY-to-Workshop parity." - }, - "categories": [ - "syntax", - "semantics", - "preprocessing", - "macros", - "directives", - "translations", - "optimization", - "runtime", - "compilation", - "decompilation" - ], - "features": [ - { - "id": "syntax/lexing", - "name": "Lexer: identifiers, literals, strings, comments, #! directives, operators", - "category": "syntax", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/basic-rule", - "fixtures:synthetic/control-flow", - "fixtures:synthetic/expressions-values", - "fixtures:synthetic/diagnostics", - "fixtures:real-world/overpy-cake", - "upstream:src/tests/comments.opy", - "upstream:src/tests/operators.opy", - "upstream:src/tests/strings.opy", - "upstream:src/tests/arrays.opy" - ], - "notes": "Corpus-evidenced: differential suite runs 40 fixtures; upstream tokenizer surface probed." - }, - { - "id": "syntax/expressions", - "name": "Expression/postfix/member/call grammar, precedence, indexing, conditional values", - "category": "syntax", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/expressions-values", - "fixtures:synthetic/receiver-calls", - "fixtures:synthetic/postfix-assignment", - "fixtures:synthetic/postfix-prefix-invalid", - "fixtures:synthetic/postfix-embedded-invalid", - "fixtures:real-world/overpy-cake", - "upstream:src/tests/operators.opy", - "upstream:src/tests/arrays.opy", - "upstream:src/tests/strings_args.opy" - ], - "notes": "Corpus-evidenced: expression fixtures + receiver-calls fixture resolve through the semantic model; conditional values retain right-associative nesting and source spans. Postfix ++/-- are accepted only as statement-level assignments; prefix ++ and embedded postfix ++/-- remain stable parse diagnostics, while prefix --x remains valid consecutive unary-minus syntax." - }, - { - "id": "syntax/declarations", - "name": "Declarations: globalvar/playervar (index + initializer), subroutine, def, enum, macro constants", - "category": "syntax", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/declarations-rules", - "fixtures:synthetic/declarations-numbers", - "fixtures:synthetic/preprocessing", - "fixtures:real-world/overpy-cake", - "upstream:src/tests/variables.opy", - "upstream:src/tests/subroutines.opy", - "upstream:src/tests/enums.opy" - ], - "notes": "Corpus-evidenced: declarations fixtures + overpy-cake resolve; diagnostics for malformed declarations." - }, - { - "id": "syntax/assignments-control-flow", - "name": "Assignments and control flow: =, +=, -=, *=, /=, %=, **=, if/elif/else, for-in-range, while, pass", - "category": "syntax", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/control-flow", - "fixtures:synthetic/for-range-agentlab", - "fixtures:synthetic/chase-condition-agentlab", - "fixtures:synthetic/postfix-assignment", - "upstream:src/tests/loops.opy", - "upstream:src/tests/conditions.opy" - ], - "notes": "Corpus-evidenced: the supported augmented assignment subset is +=, -=, *=, /=, %=, and **=, plus statement-level postfix ++/--; control-flow fixtures resolve; parser rejects out-of-surface forms structurally. min=/max= remains an explicit follow-up (wrightkit/workshop-rs#95)." - }, - { - "id": "syntax/switch", - "name": "switch/case/default", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "fixtures:synthetic/switch-break", "upstream:src/tests/switches.opy"], - "notes": "Issue #28/#33: switch/case/default preserve source-order arms and fall through into subsequent arms; explicit break exits the innermost switch or loop. Workshop lowering remains out of scope." - }, - { - "id": "syntax/break", - "name": "break statements in switch and loops", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/switch-break", "upstream:src/tests/switches.opy", "upstream:src/tests/loops.opy"], - "notes": "Issue #33: break is a real HIR statement, validates its enclosing switch/loop context, and is retained without implicit arm exits." - }, - { - "id": "syntax/statement-surface", - "name": "del, continue, goto, labels, and dynamic loc+ targets", - "category": "syntax", - "state": "source-supported", - "evidence": ["tests:crates/opy-rs/tests/source_syntax.rs", "upstream:src/tests/loops.opy", "upstream:src/tests/gotos.opy"], - "notes": "Issue #141: audited statements lower to source HIR nodes with spans; continue context and malformed targets produce structured diagnostics. Canonical WIR lowering remains an explicit integration boundary." - }, - { - "id": "syntax/augmented-min-max", - "name": "min= and max= modification forms", - "category": "syntax", - "state": "source-supported", - "evidence": ["tests:crates/opy-rs/tests/source_syntax.rs", "upstream:src/tests/operators.opy"], - "notes": "Issue #141: min=/max= are retained as source-semantic binary modifications with provenance; Workshop support is not claimed." - }, - { - "id": "syntax/do-while", - "name": "do … while", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "upstream:src/tests/loops.opy"], - "notes": "Issue #28: the body executes before the condition and the condition is retained as an OPY HIR expression; malformed/truncated conditions remain structured parse errors." - }, - { - "id": "syntax/hex-literals", - "name": "Hexadecimal numeric literals (0x/0X)", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "upstream:src/tests/operators.opy"], - "notes": "Issue #28: hexadecimal source spelling is preserved in the numeric HIR text while the numeric value is decoded independently." - }, - { - "id": "syntax/membership", - "name": "Expression-level in/not in membership", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "upstream:src/tests/operators.opy"], - "notes": "Issue #28: in/not in are represented as source-semantic binary operators; no Workshop Array Contains catalog or lowering is copied here." - }, - { - "id": "syntax/string-modifiers", - "name": "String modifiers (f/w/l/b/c/t)", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/string-modifiers", "fixtures:synthetic/syntax-surface", "fixtures:synthetic/strings-and-lambda", "upstream:src/tests/strings.opy"], - "notes": "Issue #28/#33: f-string interpolation lowers to a semantic format node with source-spanned arguments; w/b/c remain semantic string modifiers and l/t remain syntax-carried without duplicating translation data." - }, - { - "id": "syntax/dicts", - "name": "Dictionary literals and keyed access", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "upstream:src/tests/dicts.opy"], - "notes": "Issue #28: dictionary entries and keyed access are represented in OPY HIR; bare dictionaries and malformed entries produce structured diagnostics." - }, - { - "id": "syntax/comprehensions", - "name": "List comprehensions (mapping/filtering, element and index binders)", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "upstream:src/tests/dicts.opy"], - "notes": "Issue #28: one-for-clause comprehensions with an optional filter and optional element/index binders preserve local scope in HIR." - }, - { - "id": "syntax/lambda", - "name": "Lambda expressions for array operations", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "fixtures:synthetic/strings-and-lambda", "fixtures:synthetic/lambda-invalid", "upstream:src/tests/dicts.opy"], - "notes": "Issue #28/#33: lambda x: expr is accepted only in signature-approved positions (sorted index 1/key and array map/filter/all/any index 0); standalone and other argument positions produce a structured diagnostic." - }, - { - "id": "syntax/settings-blocks", - "name": "settings { ... } custom-game-settings blocks: JSONC parse into the typed HIR payload", - "category": "syntax", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/settings", - "fixtures:real-world/overpy-meipocalypse/settings.opy", - "fixtures:real-world/6v6-adjustments/lobby/lobby.opy", - "upstream:src/tests/customGameSettings.opy", - "upstream:src/tests/workshopSettings.opy" - ], - "notes": "Corpus-evidenced: settings fixtures parse into the typed HIR payload. Validation is structural only (group shape, span validity, non-empty key names); key-existence and leaf-kind settings validation was removed from the core and is lowering-dependent (#8). Emission lowering-dependent." - }, - { - "id": "semantics/declaration-resolution", - "name": "Name resolution: undeclared identifiers, subroutine and constant references, enum types", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/declarations-rules", - "fixtures:synthetic/expressions-values", - "upstream:src/tests/functions.opy", - "upstream:src/tests/subroutines.opy" - ], - "notes": "Resolved in Opy HIR with structured unknown-identifier/unsupported-member diagnostics; fixtures + tooling tests." - }, - { - "id": "semantics/for-binder", - "name": "for-loop binder: declared globalvar/playervar or implicit default variables A-Z … DA-DX", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/for-range-agentlab", - "fixtures:synthetic/range-player-variable", - "upstream:src/tests/loops.opy" - ], - "notes": "for-loop binders resolve to declared globals or player variables, including implicit default variables (A-Z .. DA-DX); player receivers such as eventPlayer, hostPlayer, and variable expressions are preserved in HIR." - }, - { - "id": "semantics/builtin-actions-values", - "name": "OPY builtin actions and values: manifest identities, signatures, aliases, and call semantics", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "probes:generic-builtins", - "probes:chase-over-time", - "probes:is-game-in-progress", - "probes:get-players-in-radius", - "probes:catalog-only-names", - "probes:unknown-function", - "probes:unknown-value", - "probes:action-in-value-position", - "probes:value-in-action-position", - "fixtures:synthetic/basic-rule", - "fixtures:synthetic/chase-condition-agentlab" - ], - "notes": "Issue #30. The manifest-declared OPY overlay is semantic-supported: source identities, action/value position, signatures, keyword binding, aliases, and canonical catalogId links are probe-validated against the pinned oracle. Canonical Workshop existence/content/emission breadth is tracked separately as lowering-dependent." - }, - { - "id": "semantics/workshop-builtin-catalog", - "name": "Canonical Workshop builtin action/value catalog existence, content, and emission", - "category": "semantics", - "state": "lowering-dependent", - "evidence": [ - "probes:catalog-only-names", - "fixtures:synthetic/receiver-calls", - "fixtures:synthetic/chase-condition-agentlab", - "upstream:src/data/opy/functions.ts" - ], - "notes": "Issue #42 closes a bounded catalog-backed slice: manifest catalogId links lower to canonical action/value ids and representative receiver/chase cases emit through workshop-rs with WIR and canonical-id validation. Full Workshop catalog breadth, content domains, localized spellings, and emission remain lowering-dependent; opy-rs does not copy the catalog or claim full 225/267 coverage." - }, - { - "id": "semantics/receiver-members", - "name": "OPY receiver/member semantics: receiver categories and explicit-argument signatures", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "probes:receiver-calls", - "probes:enum-gated-members", - "probes:invalid-arity-member", - "probes:generic-member-only-action", - "probes:member-value-in-action-position", - "probes:invalid-receiver-append", - "probes:invalid-receiver-format", - "fixtures:synthetic/receiver-calls", - "upstream:src/data/opy/memberFunctions.ts" - ], - "notes": "Issue #30. The manifest-declared OPY member overlay is semantic-supported: receiver syntax/category semantics, explicit-argument signatures, variable receiver rules, aliases, and catalogId links are probe-validated. Canonical member existence/content and Workshop emission remain lowering-dependent." - }, - { - "id": "semantics/workshop-receiver-catalog", - "name": "Canonical Workshop receiver/member catalog existence, content, and emission", - "category": "semantics", - "state": "lowering-dependent", - "evidence": [ - "probes:receiver-calls", - "fixtures:synthetic/receiver-calls", - "upstream:src/data/opy/memberFunctions.ts" - ], - "notes": "Issue #42 closes the evidenced receiver slice: member action/value catalogIds are lowered with the receiver as the canonical leading operand, and catalog-gap members remain explicit integration diagnostics. The OPY receiver/member source-language surface (names, aliases, receiver categories, and signatures) belongs to opy-rs; workshop-rs owns canonical Workshop target identities and semantics, content domains, localization, validation, and emission." - }, - { - "id": "semantics/receiver-playervar", - "name": "Bare playervar receiver member access (`A = B.C`)", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/receiver-playervar", - "upstream:src/tests/variables.opy", - "upstream:src/data/opy/memberFunctions.ts" - ], - "notes": "Issue #30 repair. The pinned oracle accepts this OPY-owned receiver form and the source implementation preserves its variable receiver and member identity in HIR with source provenance. Canonical member existence and emission remain Workshop-owned and lowering-dependent; #8 must not be used to claim the OPY expression incomplete." - }, - { - "id": "semantics/enum-domains", - "name": "OPY enum/domain semantics: declared domain identities and contextual dispatch", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "probes:unknown-enum", - "fixtures:synthetic/chase-enums", - "fixtures:synthetic/chase-keywords", - "upstream:src/tests/builtinenums.opy", - "upstream:src/data/opy/constants.ts" - ], - "notes": "Issue #30. Manifest parameter domains and contextual dispatch are semantic-supported OPY identity links with oracle/corpus evidence. Domain member lists, member existence, domain membership, localized spellings, and emission remain Workshop-owned and are never approximated in opy-rs." - }, - { - "id": "semantics/workshop-enum-domains", - "name": "Canonical Workshop enum/domain member lists, membership, and emission", - "category": "semantics", - "state": "lowering-dependent", - "evidence": [ - "probes:unknown-enum", - "fixtures:synthetic/chase-enums", - "fixtures:synthetic/chase-condition-agentlab", - "upstream:src/data/opy/constants.ts" - ], - "notes": "Issue #42 closes catalog validation for the representative declared and contextual enum slice: canonical domains/members are checked through workshop-rs and contextual chase dispatch reaches canonical action ids. Full Hero, Map, Gamemode, Team, and settings/content domain breadth remains Workshop-owned and lowering-dependent." - }, - { - "id": "semantics/aliases", - "name": "Source aliases: non-contextual (stopChasingVariable, getCurrentHero, hasStatusEffect) and the ChaseReeval contextual alias", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "probes:aliases", - "probes:member-aliases", - "probes:chase-reeval-context", - "probes:chase-reeval-outside" - ], - "notes": "Issue #4. Declared alias surface (3 non-contextual + ChaseReeval contextual) resolves; probes pass (chase-reeval-outside stays: it documents the contextual-domain identity rule). Wrong-domain member rejection is lowering-dependent (#8). Remaining alias surface legacy-quirk/demand-driven." - }, - { - "id": "semantics/modules", - "name": "Modules: random.{randint,uniform,choice,shuffle}", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "fixtures:real-world/overpy-cake", - "fixtures:real-world/overpy-zencopter/heli.opy", - "fixtures:real-world/overpy-meipocalypse/meipocalypse.opy", - "upstream:src/data/opy/modules.ts" - ], - "notes": "random.{uniform,choice} calls resolve; corpus-evidenced (overpy-cake, zencopter, meipocalypse)." - }, - { - "id": "semantics/keyword-arguments", - "name": "Named/keyword arguments: generic name=expr binding and the chase/ChaseReeval special form", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "probes:chase-keywords", - "probes:chase-keyword-binding", - "probes:chase-arg3-keyword-required", - "probes:chase-duplicate-keyword", - "probes:chase-missing-argument", - "probes:chase-positional-after-keyword", - "probes:chase-unknown-keyword", - "probes:wait-keyword-names", - "probes:keyword-arguments-unsupported", - "fixtures:synthetic/chase-keywords" - ], - "notes": "Generic keyword binding + chase/ChaseReeval special form; probe-evidenced (chase-keywords set)." - }, - { - "id": "semantics/diagnostics", - "name": "Source identity and diagnostics: structured, source-located source implementation errors, wright-result/v1 envelope", - "category": "semantics", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/diagnostics", - "fixtures:synthetic/declarations-rules", - "upstream:runTests.mjs" - ], - "notes": "Structured stable-code diagnostics with 1-based spans; the stable-code contract is documented in docs/opy/tooling-api.md and tested in opy-rs tooling tests." - }, - { - "id": "semantics/settings-emission", - "name": "Workshop settings-section emission: key table, enum values, map/hero list elements", - "category": "semantics", - "state": "end-to-end-supported", - "evidence": [ - "fixtures:synthetic/settings", - "fixtures:real-world/6v6-adjustments/lobby/lobby.opy", - "test:opy-rs::compiler::integration_tests::preprocessing::included_settings_are_extracted_with_file_provenance", - "upstream:src/tests/customGameSettings.opy" - ], - "notes": "Settings lower directly into the neutral workshop-rs carrier, including when extracted from an included source; workshop-rs owns key/value validation, locale spellings, and emission. Emitted settings are deliberately not reparseable (round-trip boundary)." - }, - { - "id": "preprocessing/include", - "name": "#!include: including-file-relative resolution, duplicate suppression, cycle detection, missing-file diagnostics, file registry", - "category": "preprocessing", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/preprocessing", - "fixtures:real-world/ow1-emulator", - "fixtures:real-world/6v6-adjustments", - "test:opy-rs::preprocess::tests::alias_include_paths_are_distinct_imports", - "test:opy-rs::preprocess::tests::duplicate_include_is_skipped_without_redeclaring_macros", - "upstream:src/tests/include.opy", - "upstream:src/tests/include3.opy", - "upstream:src/tests/include5.opy" - ], - "notes": "Includes resolve from the declaring source file, including nested closures; repeated files are imported once while directive provenance is retained; cycle detection, missing-file diagnostics, file registry, and deterministic multi-file provenance are covered." - }, - { - "id": "preprocessing/define-undef", - "name": "#!define/#!defineMember (object- and function-like), #!undef, recursive expansion, recursion guard", - "category": "preprocessing", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/preprocessing", - "fixtures:real-world/overpy-cake", - "test:opy-rs::compiler::integration_tests::preprocessing::included_define_member_expands_with_definition_provenance", - "test:opy-rs::compiler::integration_tests::preprocessing::nested_includes_resolve_relative_to_the_including_file", - "upstream:src/tests/macros.opy", - "upstream:src/tests/builtinmacros.opy" - ], - "notes": "Object- and function-like #!define/#!defineMember, #!undef, recursive expansion with recursion guard; member defines share the pinned textual macro contract and retain definition-site provenance." - }, - { - "id": "preprocessing/advanced-directives", - "name": "#!mainFile, #!allowMacroRedeclaration, backend-only directive state, #!optimize*/#!replace0By* family, #!rulePrefix*", - "category": "preprocessing", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/directives", - "fixtures:synthetic/project-main-file", - "upstream:src/tests/rulePrefix.opy", - "upstream:src/tests/compression.opy", - "upstream:src/data/opy/preprocessing.ts", - "test:opy-rs::preprocess::tests::backend_only_directives_are_validated_and_recorded", - "test:opy-rs::preprocess::tests::extension_directive_rejects_unknown_schema_values", - "test:opy-rs::compiler::integration_tests::preprocessing::duplicate_include_warning_is_exposed_by_frontend_tooling" - ], - "notes": "Issue #29 plus #142: source implementation validates and records main-file provenance, duplicate-import and macro-redeclaration policy, backend-only directive state, canonical extension names, and rule-prefix application. Optimizer, localization, extension point accounting, output-file, compression, and generated Workshop effects remain separate." - }, - { - "id": "preprocessing/directive-effects", - "name": "Preprocessing directive effects on Workshop emission and optimization", - "category": "preprocessing", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic/directives", - "upstream:src/data/opy/preprocessing.ts" - ], - "notes": "Rule-prefix metadata is already reflected in HIR rule names. Optimizer controls remain non-blocking presentation differences. The compiler rejects replacement directives at their source anchor until a canonical lowering and corpus evidence exist; it does not silently drop or approximate semantic rewrites." - }, - { - "id": "macros/definitions", - "name": "macro name(params): statement bodies with MacroParam references, macro constants", - "category": "macros", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/preprocessing", - "fixtures:real-world/overpy-cake", - "fixtures:real-world/overpy-meipocalypse", - "fixtures:real-world/ow1-emulator/common/macro_functions.opy", - "upstream:src/tests/macros.opy", - "upstream:src/tests/astMacros.opy", - "upstream:src/tests/builtinmacros.opy" - ], - "notes": "macro name(params): statement bodies with MacroParam references expand; corpus-evidenced (cake, meipocalypse, ow1-emulator)." - }, - { - "id": "macros/javascript", - "name": "__script__ JavaScript macros (QuickJS runtime); #!postCompileHook parsed and recorded", - "category": "macros", - "state": "source-supported", - "evidence": [ - "upstream:runTests.mjs", - "upstream:src/tests/postCompileHook.opy", - "upstream:src/tests/quickjs-modern.js", - "upstream:src/tests/quickjs-invalid-return.js", - "upstream:src/tests/quickjs-runaway.js", - "upstream:src/quickjs.ts", - "test:opy-rs::macro_integration", - "test-fixture:crates/opy-rs/tests/fixtures/macros", - "test:opy-rs-differential", - "fixtures:real-world/overpy-meipocalypse" - ], - "notes": "Issue #6 + #7 part B. `#!define name(args) __script__(\"path.js\")` parsed (script resolution relative to the definition file, script-not-found at the define site like the reference's ENOENT), expanded through opy_macro_js::MacroRuntime with the reference's var-injection ABI, indentation rule, and string-only completion contract β€” compile-time expansion executes and is source-supported. `#!postCompileHook` is parsed, validated, and recorded (duplicate rejection); compiler execution against final Workshop text is tracked by hooks/post-compile-workshop. Structured script-* diagnostics carry script provenance. Catalog constants remain lowering-dependent; `#!require` does not exist in the pinned reference." - }, - { - "id": "hooks/post-compile-workshop", - "name": "Post-compile hook execution against the final Workshop text", - "category": "macros", - "state": "end-to-end-supported", - "evidence": [ - "upstream:src/tests/postCompileHook.opy", - "upstream:src/quickjs.ts", - "test:opy-rs::macro_js::tests::hooks", - "test:opy-rs-macro-integration", - "test:opy-rs::compiler" - ], - "notes": "The compiler runs the bounded internal macro runtime hook only after successful workshop-rs emission, passes the exact emitted Workshop text, and exposes the string completion as final output; hook failures retain both the directive anchor and structured script provenance." - }, - { - "id": "directives/rule-annotations", - "name": "Rule annotations: @Event, @Condition, bare @Team/@Slot", - "category": "directives", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/basic-rule", - "fixtures:synthetic/declarations-rules", - "fixtures:synthetic/control-flow", - "upstream:src/tests/rules.opy", - "upstream:README.md" - ], - "notes": "Core rule annotations and event/condition structure are source implementation-owned." - }, - { - "id": "directives/advanced-rule-annotations", - "name": "Rule annotations: @Team/@Slot args, @Name, @Hero, @Disabled, @Delimiter, @NewPage, @SuppressWarnings", - "category": "directives", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/directives", - "fixtures:synthetic/duplicate-rule-diagnostic", - "upstream:src/data/opy/annotations.ts" - ], - "notes": "Issue #29: annotation arguments, rule metadata, and source diagnostics are retained in OPY HIR; hero/team/slot domain validation and Workshop UI effects remain lowering-dependent." - }, - { - "id": "directives/rule-model", - "name": "Rule model: rule \"name\": with events (global, eachPlayer), conditions list, statements", - "category": "directives", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/basic-rule", - "fixtures:synthetic/chase-condition-agentlab", - "fixtures:synthetic/control-flow", - "upstream:src/tests/rules.opy", - "upstream:src/tests/eventVars.opy" - ], - "notes": "rule \"name\": with global/eachPlayer events, conditions, statements; differential fixtures." - }, - { - "id": "translations/directive", - "name": "#!translations directive recognition and .po generation surface", - "category": "translations", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/directives", - "upstream:src/tests/translations.opy", - "upstream:src/tests/translations2.opy", - "upstream:src/tests/translations.es.po", - "upstream:src/tests/translations2.fr.po", - "upstream:src/compiler/translations.ts" - ], - "notes": "Issue #29: language-tag syntax, uniqueness/conflict validation, provenance, and translation state are source implementation-owned; locale availability, .po content, and generated Workshop helpers remain lowering-dependent." - }, - { - "id": "translations/locale-emission", - "name": "Localized Workshop output (--language flag, localizedStrings data)", - "category": "translations", - "state": "end-to-end-supported", - "evidence": [ - "upstream:src/data/localizedStrings.ts", - "oracle:CLI --language en-US invocation recorded in compatibility/run_oracle.py", - "test:opy-rs::compiler" - ], - "notes": "Compiler locale selection delegates to workshop-rs catalog coverage and rejects undeclared locales explicitly; missing per-identity mappings remain fail-explicit." - }, - { - "id": "optimization/controls", - "name": "#!optimize*/#!replace0By* family and compression controls", - "category": "optimization", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/directives", - "upstream:src/tests/compression.opy", - "upstream:src/data/opy/preprocessing.ts" - ], - "notes": "Issue #29: optimizer/replacement controls are parsed, validated, ordered, and exposed as source implementation state; transformation execution is not part of opy-rs." - }, - { - "id": "optimization/backend-effects", - "name": "Optimizer transformations and replacement rewrites", - "category": "optimization", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic/directives", - "upstream:src/data/opy/preprocessing.ts" - ], - "notes": "Optimizer transformations and replacement rewrites remain lowering-dependent. Optimizer controls remain non-blocking; replacement directives fail explicitly rather than silently changing Workshop output." - }, - { - "id": "optimization/emission-form", - "name": "Workshop text emission form (variable naming, enum spellings, formatting)", - "category": "optimization", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic/basic-rule/oracle.json", - "fixtures:real-world/overpy-cake/oracle.json" - ], - "notes": "Output-text identity is explicitly not the compatibility contract; exact-vs-normalized differences are presentation differences. Emission form is workshop-rs-owned." - }, - { - "id": "runtime/js-hooks", - "name": "QuickJS runtime for __script__ macro and hook execution (synthetic-content hook ABI)", - "category": "runtime", - "state": "source-supported", - "evidence": [ - "upstream:runTests.mjs", - "upstream:src/quickjs.ts", - "oracle:quickjs-ng.wasm shipped in the pinned npm package", - "test:opy-rs::macro_js::tests::macro_abi", - "test:opy-rs::macro_js::tests::hooks", - "test:opy-rs::macro_js::tests::limits", - "test:opy-rs::macro_integration" - ], - "notes": "Issue #6 + #7 part B. Bounded runtime surface wired into the source implementation: macro execution with argument injection, `vect` helper, empty constant objects, console capture, reference-compatible accept/reject and result semantics, resource limits defaulting to the pinned reference constants (1000 ms macro / 2000 ms hook budgets, 64 MiB memory, 512 KiB stack). The hook ABI runs against synthetic content in the internal macro runtime; hook execution against the Workshop output is lowering-dependent (see hooks/post-compile-workshop, issue #8). Browser/WASM execution remains unsupported (native embedding only), matching the declared boundary." - }, - { - "id": "compilation/source implementation-pipeline", - "name": "Source implementation pipeline: lexer -> preprocess -> CST/parser -> semantic resolution -> Opy HIR v2", - "category": "compilation", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic", - "fixtures:real-world", - "docs:docs/hir/opy-hir-v2.md", - "test:opy-rs-differential" - ], - "notes": "Issues #3-#7, #25, and the #28/#29/#30/#33 readiness tracks. Fully Workshop-independent; the pinned differential corpus is the acceptance corpus. Differential harness runs every fixture through the native pipeline in cargo test with structural self-checks (HIR validation, wire round-trip, deterministic dump), status/rule-name parity against recorded oracle.json snapshots, explicit native evidence expectations, and a machine-readable report (target/opy-differential-report.json). The generated report records per-fixture matches and known gaps; no unexpected divergence or inconclusive result is a support claim." - }, - { - "id": "compilation/opy-integration-vertical-slice", - "name": "Minimal OPY -> canonical WIR -> Workshop emission vertical slice", - "category": "compilation", - "state": "end-to-end-supported", - "evidence": [ - "fixtures:synthetic/compiler-vertical-slice", - "test:opy-rs::compiler-vertical-slice", - "contract:workshop-rs-v0.1.18" - ], - "notes": "Issue #35. The internal compiler module consumes resolved OPY HIR, preserves source files/spans in workshop-rs WIR, cross-checks manifest catalogId/domain links against Catalog, validates canonical WIR, and emits deterministic en-US Workshop through the published workshop-rs v0.1.18 contract. This is a bounded first slice; broader OPY lowering remains lowering-dependent and is not reclassified by this fixture." - }, - { - "id": "compilation/opy-structural-lowering", - "name": "OPY structural HIR -> canonical WIR lowering: declarations, subroutines, rules, events, and provenance", - "category": "compilation", - "state": "end-to-end-supported", - "evidence": [ - "fixtures:synthetic/compiler-vertical-slice", - "fixtures:synthetic/compiler-structure", - "test:opy-rs::compiler-structural-lowering", - "contract:workshop-rs-v0.1.18" - ], - "notes": "Issue #40. Global/player variables and subroutines use deterministic canonical indices with source/name spans; subroutine definitions and calls, rule disabled state, conditions, supported event/filter identities, and source-file provenance lower directly into workshop-rs WIR. Unsupported settings, declarations, annotations, events, filters, and statement forms remain explicit source-attributed integration diagnostics. This does not claim full statement/expression, catalog/member/enum, settings, locale, optimizer, hook, or decompilation coverage." - }, - { - "id": "compilation/opy-assignment-lowering", - "name": "OPY assignment and modification HIR -> canonical WIR lowering", - "category": "compilation", - "state": "end-to-end-supported", - "evidence": [ - "fixtures:synthetic/primitive-lowering", - "fixtures:synthetic/postfix-assignment", - "fixtures:synthetic/indexed-assignment-nested", - "fixtures:synthetic/indexed-assignment-4d-invalid", - "test:opy-rs::compiler-primitive-lowering", - "test:opy-rs::compiler::integration_tests::postfix_assignments::postfix_assignments_match_the_pinned_oracle", - "test:opy-rs::compiler::integration_tests::indexed_assignments::nested_indexed_assignments_match_the_pinned_oracle", - "test:opy-rs::compiler::integration_tests::semantic_diagnostics::semantic_boundary_errors_are_reported_before_lowering", - "test:opy-rs::compiler::integration_tests::variable_initializers::null_initializers_are_dropped_but_float_zero_is_preserved", - "contract:workshop-rs-v0.1.18" - ], - "notes": "Issue #46/#59/#60/#145/#162. Global/player assignments and augmented assignments (+=, -=, *=, /=, %=, **=, ++, --), literal dictionary lookup folding, single-level and nested indexed variable assignments and modifications (setGlobalVariableAtIndex, modifyGlobalVariableAtIndex, setPlayerVariableAtIndex, modifyPlayerVariableAtIndex), and pass no-op statements lower into canonical workshop-rs WIR. Nested targets are rebuilt through canonical array slices, while four-dimensional assignments are rejected by source semantics at the pinned diagnostic frontier before lowering; null and integer-zero declaration initializers are omitted while float zero remains observable. Direct global/player modifications carry full statement and target-variable span provenance; indexed forms lower to canonical Call actions, which carry only the statement-level source span (the canonical WIR Call shape has no separate target-span field)." - }, - { - "id": "compilation/opy-implicit-default-variables", - "name": "OverPy implicit default global and player variables (A-DX) at fixed Workshop slots", - "category": "compilation", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic/primitive-lowering", - "test:opy-rs::compiler-implicit-default-variables", - "contract:workshop-rs-v0.1.18" - ], - "notes": "Issue #46. Undeclared A-Z, AA-AZ, ..., DA-DX global references and eventPlayer. player references resolve through the source implementation default_var_index contract and lower to separate Workshop variable namespaces at their fixed reference slots (A=0 ... DX=127); used implicit slots are reserved independently for declared global/player allocation, an explicit declared index colliding with a used implicit slot fails with the stable source-attributed index-collision diagnostic, and a declared name wins in its own namespace. The pinned oracle snapshot for the primitive-lowering fixture constrains global and player slots through structural equivalence." - }, - { - "id": "compilation/opy-literal-dict-lookup", - "name": "Literal dictionary lookup lowering to canonical WIR", - "category": "compilation", - "state": "end-to-end-supported", - "evidence": [ - "fixtures:synthetic/dictionary-lookup", - "test:opy-rs::compiler::integration_tests::dictionary_lowering::literal_dictionary_lookup_matches_the_pinned_oracle" - ], - "notes": "Issue #145. Literal dictionary lookups with literal keys are folded to the selected value, or to Null on a literal miss, and compared directly with the pinned oracle WIR. Dictionary-indexed assignment targets remain outside this bounded path and are not silently guessed." - }, - { - "id": "compilation/opy-expression-lowering", - "name": "OPY non-control-flow value expression HIR -> canonical WIR lowering", - "category": "compilation", - "state": "end-to-end-supported", - "evidence": [ - "fixtures:synthetic/primitive-lowering", - "test:opy-rs::compiler-primitive-lowering", - "test:opy-rs::compiler::integration_tests::conditionals", - "contract:workshop-rs-v0.1.18" - ], - "notes": "Issue #46/#100/#145. Literals (numbers, strings, booleans, null), arrays, vectors (vect), enum constants, global/player/eventPlayer variable references, literal dictionary lookup, array indexing (valueInArray; a literal zero index lowers to firstOf, matching the pinned oracle), string formatting (customString), f/w/b/c literal string modifiers, arithmetic/comparison/logical binary operations, unary operations (not, -; not on a comparison lowers to the negated comparison, matching the pinned oracle), right-associative conditional values (ifThenElse), and power operations lower into canonical workshop-rs WIR. Value-position power uses the canonical raiseToPower Value contract; direct and indexed power modifications use the canonical Workshop Operation contract." - }, - { - "id": "compilation/opy-control-flow-lowering", - "name": "OPY control-flow HIR -> canonical WIR lowering", - "category": "compilation", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic/control-flow-lowering", - "fixtures:synthetic/switch-break-unsupported", - "fixtures:synthetic/switch-order", - "fixtures:synthetic/switch-structured-target", - "fixtures:synthetic/switch-multiple-break", - "fixtures:synthetic/do-while-break", - "fixtures:synthetic/do-while-invalid", - "fixtures:synthetic/range-player-variable", - "fixtures:synthetic/range-invalid-binder", - "fixtures:synthetic/switch-break", - "test:opy-rs::compiler::integration_tests::control_flow::switch_lowering_matches_the_pinned_oracle", - "contract:workshop-rs-v0.1.18" - ], - "notes": "Issue #47/#65/#162. If/elif/else, while, global- and player-variable range-for, do-while expansion, source-ordered switch fallthrough/default, and direct loop/switch/do-while break lower into canonical workshop-rs WIR. Player-variable binders preserve their receiver and source span through HIR and use the existing For Player Variable contract; non-variable range binders are rejected by source semantics before lowering. Switch offsets and do-while distances use workshop-rs v0.1.18 canonical emitted action widths; direct, conditional, and nested do-while shapes are pinned and oracle-equivalent. Residual native-WIR differences in switch-break and switch-target shapes remain explicit compiler gaps; nested conditional switch break remains a stable source-attributed unsupported-integration-surface diagnostic, while multiple direct switch breaks use canonical nested exit layers with pinned action-trace evidence." - }, - { - "id": "compilation/workshop-lowering", - "name": "HIR -> Workshop lowering and emission through workshop-rs", - "category": "compilation", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic", - "fixtures:real-world" - ], - "notes": "Issue #38 exposes the bounded compiler/library/CLI surface over the released workshop-rs v0.1.18 contract. Full OPY statement/expression lowering, catalog/member/enum breadth, optimizer effects, and remaining real-project gaps stay explicit in compiler-expectations.json and the native corpus report; no temporary Workshop IR is introduced here." - }, - { - "id": "compilation/end-to-end", - "name": "End-to-end OPY -> Workshop compile parity", - "category": "compilation", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic", - "fixtures:real-world", - "fixtures:census/workshop-feature-census" - ], - "notes": "Full OPY-to-Workshop parity remains broader than the declared #38 baseline. compatibility/run_native.py compiles every fixture through the versioned CLI contract and compares it with the separate compiler-expectations.json baseline. Source/frontend expectations remain independent; entries are separately classified and no unverified case is counted as compiler parity." - }, - { - "id": "decompilation/workshop-to-opy", - "name": "Workshop -> OPY decompilation", - "category": "decompilation", - "state": "lowering-dependent", - "evidence": [ - "upstream:src/tests/decompiler", - "upstream:src/decompiler" - ], - "notes": "Deferred until the canonical Workshop semantic representation exists (workshop-rs integration); a non-goal before it. Upstream decompiler corpus (17 inputs) is the future reference." - }, - { - "id": "decompilation/roundtrip-boundary", - "name": "Round-trip boundary: emitted settings reparsing, .ws round-trip", - "category": "decompilation", - "state": "lowering-dependent", - "evidence": [ - "docs:docs/opy/support-matrix.md" - ], - "notes": "Documented boundary: emitted settings sections are deliberately not reparseable; a .ws decompiler is a non-goal. Reconstruction of arbitrary Workshop text is out of scope." - } - ], - "summary": { - "byState": { - "planned": 0, - "source-supported": 25, - "semantic-supported": 13, - "lowering-dependent": 12, - "end-to-end-supported": 8 - }, - "byCategory": { - "syntax": 16, - "semantics": 14, - "preprocessing": 4, - "macros": 3, - "directives": 3, - "translations": 2, - "optimization": 3, - "runtime": 1, - "compilation": 10, - "decompilation": 2 - } - } -} diff --git a/compatibility/tests/test_support_matrix.py b/compatibility/tests/test_support_matrix.py deleted file mode 100644 index 1ac41aa..0000000 --- a/compatibility/tests/test_support_matrix.py +++ /dev/null @@ -1,131 +0,0 @@ -"""Machine-readable support-matrix consistency checks (issue #2). - -The support matrix (compatibility/support-matrix.json) is the mechanically -checkable artifact behind docs/opy/support-matrix.md. These checks enforce: - -* the envelope: schemaVersion, pinned reference identity, declared states and - categories; -* every feature has a unique id, a declared state, a declared category, - evidence, and notes; -* every `fixtures:` evidence path exists in the corpus (relative to - compatibility/fixtures); and -* the embedded summary counts match the feature array (self-reporting - artifact). -""" - -import json -import sys -import unittest -from pathlib import Path - - -COMPATIBILITY_DIR = Path(__file__).resolve().parents[1] -MATRIX_PATH = COMPATIBILITY_DIR / "support-matrix.json" -PACKAGED_MATRIX_PATH = COMPATIBILITY_DIR.parent / "crates/opy-rs/support-matrix.json" -FIXTURES_DIR = COMPATIBILITY_DIR / "fixtures" - -STATES = { - "planned", - "source-supported", - "semantic-supported", - "lowering-dependent", - "end-to-end-supported", -} -CATEGORIES = { - "syntax", - "semantics", - "preprocessing", - "macros", - "directives", - "translations", - "optimization", - "runtime", - "compilation", - "decompilation", -} - -REFERENCE = { - "name": "overpy", - "version": "9.7.10", - "contentCommit": "889d9749d1def17f146548cbddb94ea1ab015847", - "integrity": "sha512-oX17nauJcPTaKIrRFY/rD0Rl8atqFUVv9Hg2TKH+A68/fC8+ZO344Mkd1A/Y0oOVp1hr5tktMBjzMEDDnMEYUw==", -} - - -class SupportMatrixTests(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.matrix = json.loads(MATRIX_PATH.read_text(encoding="utf-8")) - cls.features = cls.matrix["features"] - - def test_envelope_identity(self): - self.assertEqual(self.matrix["schemaVersion"], 1) - self.assertEqual(self.matrix["reference"], REFERENCE) - self.assertEqual(set(self.matrix["states"]), STATES) - self.assertEqual(set(self.matrix["categories"]), CATEGORIES) - - def test_features_have_unique_ids_and_declared_fields(self): - ids = [feature["id"] for feature in self.features] - self.assertEqual(len(ids), len(set(ids)), "feature ids must be unique") - for feature in self.features: - self.assertIn(feature["state"], STATES, feature["id"]) - self.assertIn(feature["category"], CATEGORIES, feature["id"]) - self.assertTrue(feature["name"]) - self.assertIsInstance(feature["evidence"], list) - self.assertTrue(feature["evidence"], feature["id"]) - self.assertTrue(feature["notes"], feature["id"]) - - def test_fixture_evidence_paths_exist(self): - referenced = set() - for feature in self.features: - for item in feature["evidence"]: - if item.startswith("fixtures:"): - referenced.add(item.removeprefix("fixtures:")) - for relative in sorted(referenced): - path = FIXTURES_DIR / relative - self.assertTrue( - path.exists(), - f"fixture evidence path does not exist: {relative}", - ) - - def test_summary_matches_features(self): - by_state = {state: 0 for state in sorted(STATES)} - by_category = {category: 0 for category in sorted(CATEGORIES)} - for feature in self.features: - by_state[feature["state"]] += 1 - by_category[feature["category"]] += 1 - self.assertEqual(self.matrix["summary"]["byState"], by_state) - self.assertEqual(self.matrix["summary"]["byCategory"], by_category) - self.assertEqual( - sum(self.matrix["summary"]["byState"].values()), - len(self.features), - ) - - def test_packaged_matrix_matches_canonical_matrix(self): - self.assertEqual( - PACKAGED_MATRIX_PATH.read_bytes(), - MATRIX_PATH.read_bytes(), - "the published opy-rs crate must ship the validated support matrix", - ) - - def test_semantic_ownership_split_is_explicit(self): - by_id = {feature["id"]: feature for feature in self.features} - for overlay in ( - "semantics/builtin-actions-values", - "semantics/receiver-members", - "semantics/enum-domains", - ): - self.assertEqual(by_id[overlay]["state"], "semantic-supported") - for catalog in ( - "semantics/workshop-builtin-catalog", - "semantics/workshop-receiver-catalog", - "semantics/workshop-enum-domains", - ): - self.assertEqual(by_id[catalog]["state"], "lowering-dependent") - self.assertEqual( - by_id["semantics/receiver-playervar"]["state"], "semantic-supported" - ) - - -if __name__ == "__main__": - unittest.main() diff --git a/crates/opy-cli/Cargo.toml b/crates/opy-cli/Cargo.toml index b4dbe76..4f1edfa 100644 --- a/crates/opy-cli/Cargo.toml +++ b/crates/opy-cli/Cargo.toml @@ -4,7 +4,7 @@ version.workspace = true edition.workspace = true rust-version.workspace = true license.workspace = true -description = "Standalone OPY CLI: check, compile, inspect, support-matrix, version." +description = "Standalone OPY CLI: check, compile, inspect, and version." [features] compatibility = ["dep:workshop-rs"] diff --git a/crates/opy-cli/src/cli.rs b/crates/opy-cli/src/cli.rs index edc157d..de6a5fe 100644 --- a/crates/opy-cli/src/cli.rs +++ b/crates/opy-cli/src/cli.rs @@ -44,8 +44,6 @@ pub(crate) enum Command { Compile(CompileArgs), /// Print the resolved program model as JSON. Inspect(FileArgs), - /// Print the compatibility support matrix or a filtered slice as JSON. - Support(SupportArgs), /// Generate static shell completion from this command model. Completion(CompletionArgs), /// Show the top-level help. @@ -85,17 +83,6 @@ pub(crate) struct FileArgs { pub(crate) main: PathBuf, } -#[derive(Debug, Args)] -pub(crate) struct SupportArgs { - /// Explicitly request the existing JSON output (output is JSON by default). - #[arg(long)] - pub(crate) json: bool, - - /// Filter by category or feature id. - #[arg(value_name = "CATEGORY|FEATURE-ID")] - pub(crate) filter: Option, -} - #[derive(Debug, Args)] pub(crate) struct CompletionArgs { /// Shell to generate completion for. diff --git a/crates/opy-cli/src/main.rs b/crates/opy-cli/src/main.rs index 10b0b53..490f956 100644 --- a/crates/opy-cli/src/main.rs +++ b/crates/opy-cli/src/main.rs @@ -15,13 +15,12 @@ use std::process::ExitCode; use clap::{CommandFactory, Parser, error::ErrorKind}; use clap_complete::{generate, shells}; -use opy_rs::support::{self, SupportMatrixError}; use opy_rs::tooling::{CheckOutcome, Diagnostic as OpyDiagnostic, check}; use opy_rs::{CompileDiagnostic, CompileStatus, Compiler}; use opy_rs::{LANGUAGE_NAME, LANGUAGE_VERSION}; use serde::Serialize; -use crate::cli::{CheckArgs, Cli, Command, CompileArgs, FileArgs, OutputFormatArg, SupportArgs}; +use crate::cli::{CheckArgs, Cli, Command, CompileArgs, FileArgs, OutputFormatArg}; use crate::present::{ CheckView, DiagnosticSeverity, DiagnosticView, PositionView, Presentation, SpanView, }; @@ -56,7 +55,6 @@ fn main() -> ExitCode { Some(Command::Check(args)) => cmd_check(&args, presentation), Some(Command::Compile(args)) => cmd_compile(&args, presentation), Some(Command::Inspect(args)) => cmd_inspect(&args, presentation), - Some(Command::Support(args)) => cmd_support(&args), Some(Command::Completion(args)) => cmd_completion(args.shell), Some(Command::Help) => { print!("{}", Cli::command().render_help()); @@ -186,43 +184,6 @@ fn cmd_inspect(args: &FileArgs, presentation: Presentation) -> ExitCode { } } -fn cmd_support(args: &SupportArgs) -> ExitCode { - let _json_flag_is_accepted_for_compatibility = args.json; - let matrix = match support::SupportMatrix::builtin() { - Ok(matrix) => matrix, - Err(error) => return matrix_error_exit(error), - }; - let value = match args.filter.as_deref() { - None => serde_json::to_value(matrix).expect("the matrix is serializable"), - Some(filter) => { - if let Some(feature) = matrix.feature(filter) { - serde_json::to_value(feature).expect("a feature is serializable") - } else if matrix - .categories() - .iter() - .any(|category| category == filter) - { - let features = matrix.features_by_category(filter); - serde_json::json!({ - "category": filter, - "count": features.len(), - "features": features, - }) - } else { - eprintln!( - "opy-cli: unknown feature id or category '{filter}' \ - (see `opy-cli support` for the declared matrix)" - ); - return ExitCode::from(2); - } - } - }; - match print_json(&value) { - Ok(()) => ExitCode::SUCCESS, - Err(code) => code, - } -} - fn cmd_completion(shell: cli::ShellArg) -> ExitCode { let mut command = Cli::command(); let mut stdout = std::io::stdout(); @@ -338,8 +299,3 @@ fn print_json(value: &T) -> Result<(), ExitCode> { } } } - -fn matrix_error_exit(error: SupportMatrixError) -> ExitCode { - eprintln!("opy-cli: the embedded support matrix is invalid: {error}"); - ExitCode::from(2) -} diff --git a/crates/opy-cli/tests/cli.rs b/crates/opy-cli/tests/cli.rs index 24fd4aa..8d4c424 100644 --- a/crates/opy-cli/tests/cli.rs +++ b/crates/opy-cli/tests/cli.rs @@ -17,11 +17,11 @@ const MULTI_MAIN: &str = concat!( ); const BASIC_RULE: &str = concat!( env!("CARGO_MANIFEST_DIR"), - "/../../compatibility/fixtures/synthetic/basic-rule/source.opy" + "/../opy-rs/tests/fixtures/corpus/synthetic/basic-rule/source.opy" ); const LITERAL_DICT_LOOKUP_FIXTURE: &str = concat!( env!("CARGO_MANIFEST_DIR"), - "/../../compatibility/fixtures/synthetic/dictionary-lookup/source.opy" + "/../opy-rs/tests/fixtures/corpus/synthetic/dictionary-lookup/source.opy" ); fn run(args: &[&str]) -> std::process::Output { run_with_env(args, &[]) @@ -247,42 +247,6 @@ fn inspect_reports_diagnostics_and_exits_one() { let _ = std::fs::remove_dir_all(&dir); } -#[test] -fn support_prints_the_embedded_matrix_as_json() { - let output = run(&["support", "--json"]); - assert_eq!(output.status.code(), Some(0)); - let json: serde_json::Value = serde_json::from_slice(&output.stdout).expect("matrix JSON"); - assert_eq!(json["schemaVersion"], 1); - assert_eq!(json["reference"]["name"], "overpy"); - assert!(json["features"].as_array().expect("features").len() >= 30); -} - -#[test] -fn support_filters_by_feature_id_and_category() { - let by_id = run(&["support", "compilation/workshop-lowering"]); - assert_eq!(by_id.status.code(), Some(0)); - let feature: serde_json::Value = serde_json::from_slice(&by_id.stdout).expect("feature JSON"); - assert_eq!(feature["state"], "lowering-dependent"); - - let by_category = run(&["support", "syntax"]); - assert_eq!(by_category.status.code(), Some(0)); - let slice: serde_json::Value = - serde_json::from_slice(&by_category.stdout).expect("category JSON"); - assert_eq!(slice["category"], "syntax"); - let features = slice["features"].as_array().expect("filtered features"); - assert_eq!(slice["count"], features.len()); - assert!(!features.is_empty()); - assert!( - features - .iter() - .all(|feature| feature["category"] == "syntax") - ); - - let unknown = run(&["support", "nope/nothing"]); - assert_eq!(unknown.status.code(), Some(2)); - assert!(String::from_utf8_lossy(&unknown.stderr).contains("unknown feature id or category")); -} - #[test] fn version_prints_crate_and_protocol_identity() { let output = run(&["version"]); @@ -303,6 +267,13 @@ fn unknown_command_is_a_usage_error() { assert!(String::from_utf8_lossy(&output.stderr).contains("unknown command")); } +#[test] +fn retired_support_command_is_a_usage_error() { + let output = run(&["support"]); + assert_eq!(output.status.code(), Some(2)); + assert!(String::from_utf8_lossy(&output.stderr).contains("unknown command")); +} + #[test] fn help_and_parse_are_driven_by_the_structured_command_model() { let help = run(&["--help"]); @@ -313,7 +284,6 @@ fn help_and_parse_are_driven_by_the_structured_command_model() { "check", "compile", "inspect", - "support", "completion", "--renderer", "--color", diff --git a/crates/opy-provider/tests/lpp.rs b/crates/opy-provider/tests/lpp.rs index 3d85eab..63138eb 100644 --- a/crates/opy-provider/tests/lpp.rs +++ b/crates/opy-provider/tests/lpp.rs @@ -16,15 +16,15 @@ const CLEAN_MULTI_FILE_MAIN: &str = concat!( ); const BASIC_RULE: &str = concat!( env!("CARGO_MANIFEST_DIR"), - "/../../compatibility/fixtures/synthetic/basic-rule/source.opy" + "/../opy-rs/tests/fixtures/corpus/synthetic/basic-rule/source.opy" ); const UNSUPPORTED: &str = concat!( env!("CARGO_MANIFEST_DIR"), - "/../../compatibility/fixtures/synthetic/switch-break-unsupported/source.opy" + "/../opy-rs/tests/fixtures/corpus/synthetic/switch-break-unsupported/source.opy" ); const DIAGNOSTICS: &str = concat!( env!("CARGO_MANIFEST_DIR"), - "/../../compatibility/fixtures/synthetic/diagnostics/source.opy" + "/../opy-rs/tests/fixtures/corpus/synthetic/diagnostics/source.opy" ); struct Session { diff --git a/crates/opy-rs/src/compiler/mod.rs b/crates/opy-rs/src/compiler/mod.rs index f3180a0..7c4cacb 100644 --- a/crates/opy-rs/src/compiler/mod.rs +++ b/crates/opy-rs/src/compiler/mod.rs @@ -6889,7 +6889,7 @@ mod tests { fn compile_report_preserves_frontend_warnings_on_integration_failure() { let compiler = Compiler::new().unwrap(); let root = Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic/preprocessing"); + .join("tests/fixtures/corpus/synthetic/preprocessing"); let report = compiler.compile_source_report_with_locale( concat!( "#!include \"shared.opy\"\n", @@ -7421,7 +7421,7 @@ rule "allocation": fn compiler_structure_matches_the_pinned_oracle() { let compiler = Compiler::new().unwrap(); let fixture = Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic/compiler-structure"); + .join("tests/fixtures/corpus/synthetic/compiler-structure"); let source = std::fs::read_to_string(fixture.join("source.opy")).unwrap(); let hir = crate::compile(&source, "source.opy", &fixture).unwrap(); let artifact = compiler.compile_hir(&hir).unwrap(); @@ -7743,8 +7743,8 @@ rule "main": #[test] fn settings_lower_through_workshop_owned_emission() { let compiler = Compiler::new().unwrap(); - let fixture = Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic/settings"); + let fixture = + Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/corpus/synthetic/settings"); let source = std::fs::read_to_string(fixture.join("source.opy")).unwrap(); let hir = crate::compile(&source, "source.opy", &fixture).unwrap(); let artifact = compiler.compile_hir(&hir).unwrap(); diff --git a/crates/opy-rs/src/compiler/tests/catalog_lowering.rs b/crates/opy-rs/src/compiler/tests/catalog_lowering.rs index 58be90d..d39fa2b 100644 --- a/crates/opy-rs/src/compiler/tests/catalog_lowering.rs +++ b/crates/opy-rs/src/compiler/tests/catalog_lowering.rs @@ -8,7 +8,7 @@ use workshop_rs::roundtrip::equivalent; fn fixture_dir(name: &str) -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic") + .join("tests/fixtures/corpus/synthetic") .join(name) } @@ -24,7 +24,7 @@ fn compile_fixture(name: &str) -> crate::CompilationArtifact { fn compile_real_world(name: &str, source_name: &str) -> crate::CompilationArtifact { let dir = Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/real-world") + .join("tests/fixtures/corpus/real-world") .join(name); let source = std::fs::read_to_string(dir.join(source_name)).expect("source must be readable"); let hir = crate::compile(&source, source_name, &dir).expect("real-world source must resolve"); diff --git a/crates/opy-rs/src/compiler/tests/compiler_semantics.rs b/crates/opy-rs/src/compiler/tests/compiler_semantics.rs index 5180d33..3cdfc72 100644 --- a/crates/opy-rs/src/compiler/tests/compiler_semantics.rs +++ b/crates/opy-rs/src/compiler/tests/compiler_semantics.rs @@ -5,7 +5,7 @@ use workshop_rs::catalog::{Catalog, Locale}; fn fixture_dir(name: &str) -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic") + .join("tests/fixtures/corpus/synthetic") .join(name) } diff --git a/crates/opy-rs/src/compiler/tests/conditionals.rs b/crates/opy-rs/src/compiler/tests/conditionals.rs index bf49b71..290d223 100644 --- a/crates/opy-rs/src/compiler/tests/conditionals.rs +++ b/crates/opy-rs/src/compiler/tests/conditionals.rs @@ -25,7 +25,7 @@ fn conditional_calls(artifact: &CompilationArtifact) -> Vec PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic") + .join("tests/fixtures/corpus/synthetic") .join(name) } diff --git a/crates/opy-rs/src/compiler/tests/diagnostic_frontiers.rs b/crates/opy-rs/src/compiler/tests/diagnostic_frontiers.rs index ae9566c..a720f74 100644 --- a/crates/opy-rs/src/compiler/tests/diagnostic_frontiers.rs +++ b/crates/opy-rs/src/compiler/tests/diagnostic_frontiers.rs @@ -7,7 +7,7 @@ use workshop_rs::catalog::Locale; fn fixture_dir(name: &str) -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures") + .join("tests/fixtures/corpus") .join(name) } diff --git a/crates/opy-rs/src/compiler/tests/dictionary_lowering.rs b/crates/opy-rs/src/compiler/tests/dictionary_lowering.rs index 0962f7e..3acde78 100644 --- a/crates/opy-rs/src/compiler/tests/dictionary_lowering.rs +++ b/crates/opy-rs/src/compiler/tests/dictionary_lowering.rs @@ -8,7 +8,7 @@ use workshop_rs::roundtrip::equivalent; fn fixture_dir(name: &str) -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic") + .join("tests/fixtures/corpus/synthetic") .join(name) } diff --git a/crates/opy-rs/src/compiler/tests/directive_lowering.rs b/crates/opy-rs/src/compiler/tests/directive_lowering.rs index 5d051e1..d702d23 100644 --- a/crates/opy-rs/src/compiler/tests/directive_lowering.rs +++ b/crates/opy-rs/src/compiler/tests/directive_lowering.rs @@ -8,7 +8,7 @@ use workshop_rs::roundtrip::equivalent; fn fixture_dir(name: &str) -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic") + .join("tests/fixtures/corpus/synthetic") .join(name) } diff --git a/crates/opy-rs/src/compiler/tests/enum_members.rs b/crates/opy-rs/src/compiler/tests/enum_members.rs index d5eaafb..1f572d1 100644 --- a/crates/opy-rs/src/compiler/tests/enum_members.rs +++ b/crates/opy-rs/src/compiler/tests/enum_members.rs @@ -7,8 +7,7 @@ use workshop_rs::catalog::Locale; use workshop_rs::wir::Value; fn fixture_dir() -> PathBuf { - Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/real-world/overpy-parabola") + Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/corpus/real-world/overpy-parabola") } #[test] diff --git a/crates/opy-rs/src/compiler/tests/higher_order.rs b/crates/opy-rs/src/compiler/tests/higher_order.rs index df56e10..f85e24f 100644 --- a/crates/opy-rs/src/compiler/tests/higher_order.rs +++ b/crates/opy-rs/src/compiler/tests/higher_order.rs @@ -8,7 +8,7 @@ use workshop_rs::roundtrip::equivalent; fn fixture_dir(name: &str) -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic") + .join("tests/fixtures/corpus/synthetic") .join(name) } diff --git a/crates/opy-rs/src/compiler/tests/hud.rs b/crates/opy-rs/src/compiler/tests/hud.rs index 02ed0a4..aa4fdd3 100644 --- a/crates/opy-rs/src/compiler/tests/hud.rs +++ b/crates/opy-rs/src/compiler/tests/hud.rs @@ -8,8 +8,7 @@ use workshop_rs::roundtrip::equivalent; use workshop_rs::wir::{Action, Value}; fn fixture_dir() -> PathBuf { - Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic/hud-subheader") + Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/corpus/synthetic/hud-subheader") } fn oracle_workshop() -> String { diff --git a/crates/opy-rs/src/compiler/tests/hud_visibility.rs b/crates/opy-rs/src/compiler/tests/hud_visibility.rs index e5d9a8f..aebad08 100644 --- a/crates/opy-rs/src/compiler/tests/hud_visibility.rs +++ b/crates/opy-rs/src/compiler/tests/hud_visibility.rs @@ -8,8 +8,7 @@ use workshop_rs::roundtrip::equivalent; use workshop_rs::wir::{Action, Value}; fn fixture_dir() -> PathBuf { - Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic/hud-visibility") + Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/corpus/synthetic/hud-visibility") } fn oracle_workshop() -> String { diff --git a/crates/opy-rs/src/compiler/tests/indexed_assignments.rs b/crates/opy-rs/src/compiler/tests/indexed_assignments.rs index f0828d0..719c00b 100644 --- a/crates/opy-rs/src/compiler/tests/indexed_assignments.rs +++ b/crates/opy-rs/src/compiler/tests/indexed_assignments.rs @@ -8,7 +8,7 @@ use workshop_rs::roundtrip::equivalent; fn fixture_dir(name: &str) -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic") + .join("tests/fixtures/corpus/synthetic") .join(name) } diff --git a/crates/opy-rs/src/compiler/tests/macro_preprocessing.rs b/crates/opy-rs/src/compiler/tests/macro_preprocessing.rs index ad12643..2c20452 100644 --- a/crates/opy-rs/src/compiler/tests/macro_preprocessing.rs +++ b/crates/opy-rs/src/compiler/tests/macro_preprocessing.rs @@ -7,8 +7,7 @@ use workshop_rs::catalog::Locale; use workshop_rs::wir::{Action, RuleId, Value}; fn fixture_dir() -> PathBuf { - Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic/preprocessing") + Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/corpus/synthetic/preprocessing") } #[test] diff --git a/crates/opy-rs/src/compiler/tests/member_angles.rs b/crates/opy-rs/src/compiler/tests/member_angles.rs index 4d676de..9514b30 100644 --- a/crates/opy-rs/src/compiler/tests/member_angles.rs +++ b/crates/opy-rs/src/compiler/tests/member_angles.rs @@ -8,8 +8,7 @@ use workshop_rs::roundtrip::equivalent; use workshop_rs::wir::{Action, Value}; fn fixture_dir() -> PathBuf { - Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic/member-angle") + Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/corpus/synthetic/member-angle") } #[test] diff --git a/crates/opy-rs/src/compiler/tests/member_values.rs b/crates/opy-rs/src/compiler/tests/member_values.rs index a105bed..b4abbb0 100644 --- a/crates/opy-rs/src/compiler/tests/member_values.rs +++ b/crates/opy-rs/src/compiler/tests/member_values.rs @@ -8,8 +8,7 @@ use workshop_rs::roundtrip::equivalent; use workshop_rs::wir::Value; fn fixture_dir() -> PathBuf { - Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic/member-values") + Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/corpus/synthetic/member-values") } #[test] diff --git a/crates/opy-rs/src/compiler/tests/numeric_settings.rs b/crates/opy-rs/src/compiler/tests/numeric_settings.rs index e8f1355..a5f475c 100644 --- a/crates/opy-rs/src/compiler/tests/numeric_settings.rs +++ b/crates/opy-rs/src/compiler/tests/numeric_settings.rs @@ -9,7 +9,7 @@ use workshop_rs::wir::Value; fn fixture_dir() -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/real-world/overpy-broken-weapons") + .join("tests/fixtures/corpus/real-world/overpy-broken-weapons") } #[test] diff --git a/crates/opy-rs/src/compiler/tests/postfix_assignments.rs b/crates/opy-rs/src/compiler/tests/postfix_assignments.rs index fc976cf..4f6453f 100644 --- a/crates/opy-rs/src/compiler/tests/postfix_assignments.rs +++ b/crates/opy-rs/src/compiler/tests/postfix_assignments.rs @@ -8,7 +8,7 @@ use workshop_rs::roundtrip::equivalent; fn fixture_dir(name: &str) -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic") + .join("tests/fixtures/corpus/synthetic") .join(name) } diff --git a/crates/opy-rs/src/compiler/tests/primitive_lowering.rs b/crates/opy-rs/src/compiler/tests/primitive_lowering.rs index f20a775..083b455 100644 --- a/crates/opy-rs/src/compiler/tests/primitive_lowering.rs +++ b/crates/opy-rs/src/compiler/tests/primitive_lowering.rs @@ -14,7 +14,7 @@ use workshop_rs::roundtrip::equivalent; fn fixture_dir(name: &str) -> std::path::PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic") + .join("tests/fixtures/corpus/synthetic") .join(name) } diff --git a/crates/opy-rs/src/compiler/tests/range_bindings.rs b/crates/opy-rs/src/compiler/tests/range_bindings.rs index 740d211..39a135e 100644 --- a/crates/opy-rs/src/compiler/tests/range_bindings.rs +++ b/crates/opy-rs/src/compiler/tests/range_bindings.rs @@ -9,7 +9,7 @@ use workshop_rs::wir::{Action, Value}; fn fixture_dir(name: &str) -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic") + .join("tests/fixtures/corpus/synthetic") .join(name) } diff --git a/crates/opy-rs/src/compiler/tests/string_literals.rs b/crates/opy-rs/src/compiler/tests/string_literals.rs index 6ed0806..7f4cffb 100644 --- a/crates/opy-rs/src/compiler/tests/string_literals.rs +++ b/crates/opy-rs/src/compiler/tests/string_literals.rs @@ -7,8 +7,7 @@ use workshop_rs::catalog::Locale; use workshop_rs::wir::{Action, RuleId, Value}; fn fixture_dir() -> PathBuf { - Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/real-world/overpy-inputhud") + Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/corpus/real-world/overpy-inputhud") } #[test] diff --git a/crates/opy-rs/src/compiler/tests/string_modifiers.rs b/crates/opy-rs/src/compiler/tests/string_modifiers.rs index 79815fd..7f42fac 100644 --- a/crates/opy-rs/src/compiler/tests/string_modifiers.rs +++ b/crates/opy-rs/src/compiler/tests/string_modifiers.rs @@ -8,7 +8,7 @@ use workshop_rs::roundtrip::equivalent; fn fixture_dir(name: &str) -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic") + .join("tests/fixtures/corpus/synthetic") .join(name) } diff --git a/crates/opy-rs/src/compiler/tests/syntax_lowering.rs b/crates/opy-rs/src/compiler/tests/syntax_lowering.rs index 5fe4e21..d93f90a 100644 --- a/crates/opy-rs/src/compiler/tests/syntax_lowering.rs +++ b/crates/opy-rs/src/compiler/tests/syntax_lowering.rs @@ -6,7 +6,7 @@ use crate::Compiler; fn fixture_dir(name: &str) -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../compatibility/fixtures/synthetic") + .join("tests/fixtures/corpus/synthetic") .join(name) } diff --git a/crates/opy-rs/src/hir/types.rs b/crates/opy-rs/src/hir/types.rs index 82ae65e..5068c0b 100644 --- a/crates/opy-rs/src/hir/types.rs +++ b/crates/opy-rs/src/hir/types.rs @@ -24,7 +24,7 @@ pub const PROTOCOL_VERSION: &str = "2.0.0"; /// appear β€” including as a `for ... in range(...)` loop binder β€” and as player /// variables, without declarations, assigning each namespace its fixed slot. /// Names outside the table (lowercase, mixed case, longer spellings) stay -/// ordinary unresolved identifiers (see `docs/opy/support-matrix.md`). +/// ordinary unresolved identifiers (see `docs/language-support.md`). const DEFAULT_VAR_SLOTS: u32 = 128; /// The fixed Workshop slot for an OverPy default variable name (`A`–`Z`, diff --git a/crates/opy-rs/src/lib.rs b/crates/opy-rs/src/lib.rs index 7630e00..36986f8 100644 --- a/crates/opy-rs/src/lib.rs +++ b/crates/opy-rs/src/lib.rs @@ -42,7 +42,6 @@ pub mod manifest; pub mod parser; pub mod preprocess; pub mod settings; -pub mod support; pub mod tooling; use std::path::Path; diff --git a/crates/opy-rs/src/manifest/probes/validate.py b/crates/opy-rs/src/manifest/probes/validate.py index 7dcd391..d31d2f1 100644 --- a/crates/opy-rs/src/manifest/probes/validate.py +++ b/crates/opy-rs/src/manifest/probes/validate.py @@ -15,7 +15,7 @@ data (`../data/manifest.json`): every manifest entry records the probe (or probe batch) that validates it. A changed oracle pin or a behavioral drift fails here deterministically and requires a reviewed data update, mirroring -the `compatibility/` harness rules (`python3 compatibility/run_oracle.py`). +the OverPy evidence harness rules (`python3 tools/overpy/run_oracle.py`). Stdlib-only; run from anywhere: @@ -34,7 +34,7 @@ # crates/opy-rs/src/manifest/probes -> repository root (5 levels up). WORKSPACE = os.path.abspath(os.path.join(HERE, "..", "..", "..", "..", "..")) ORACLE = os.path.join( - WORKSPACE, "compatibility", "oracle", "node_modules", "overpy", "cli.js" + WORKSPACE, "tools", "overpy", "oracle", "node_modules", "overpy", "cli.js" ) PROBES_JSON = os.path.join(HERE, "probes.json") LANGUAGE = "en-US" @@ -105,7 +105,7 @@ def main(): if not os.path.isfile(ORACLE): print( f"oracle not installed at {ORACLE}; run " - f"`pnpm install --dir compatibility/oracle` first", + f"`pnpm install --dir tools/overpy/oracle` first", file=sys.stderr, ) return 2 diff --git a/crates/opy-rs/src/parser.rs b/crates/opy-rs/src/parser.rs index 99de78c..4363f70 100644 --- a/crates/opy-rs/src/parser.rs +++ b/crates/opy-rs/src/parser.rs @@ -923,7 +923,8 @@ impl Parser<'_> { }; if !params.is_empty() { self.error_at_current( - "subroutine parameters are outside the declared support matrix".to_string(), + "subroutine parameters are outside the declared language support surface" + .to_string(), ); return false; } diff --git a/crates/opy-rs/src/support.rs b/crates/opy-rs/src/support.rs deleted file mode 100644 index 8490b14..0000000 --- a/crates/opy-rs/src/support.rs +++ /dev/null @@ -1,268 +0,0 @@ -//! Compatibility support-matrix accessor (read-only). -//! -//! Loads the packaged `support-matrix.json` (copied from the evidence -//! workstream) and exposes feature-state queries by id and category, so -//! consumers and the CLI can report OPY support status without duplicating -//! the matrix. -//! -//! The matrix is embedded at build time via [`include_str!`] rather than -//! loaded at runtime: the shipped artifact always carries the exact matrix CI -//! validated, no runtime file lookup or dependency is required, and cargo -//! rebuilds the crate automatically when the file changes. The module is a -//! strict read-only consumer β€” it never writes, rewrites, or caches a -//! modified copy of the matrix. -//! -//! The five declared feature states (`planned`, `source-supported`, -//! `semantic-supported`, `lowering-dependent`, `end-to-end-supported`) are -//! documented in the matrix itself; Workshop-dependent items stay -//! `lowering-dependent` and are never approximated here (repo ownership -//! boundary: see `AGENTS.md`). - -use std::collections::BTreeMap; -use std::fmt; -use std::sync::OnceLock; - -use serde::{Deserialize, Serialize}; - -/// The embedded support matrix shipped with this crate. -const SUPPORT_MATRIX_JSON: &str = include_str!("../support-matrix.json"); - -/// The matrix schema version this module understands. -pub const SUPPORT_MATRIX_SCHEMA_VERSION: u32 = 1; - -/// The declared feature states (see the matrix's `states` map for wording). -pub const FEATURE_STATES: [&str; 5] = [ - "planned", - "source-supported", - "semantic-supported", - "lowering-dependent", - "end-to-end-supported", -]; - -/// The pinned reference identity recorded in the matrix. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct MatrixReference { - pub name: String, - pub version: String, - #[serde(rename = "contentCommit")] - pub content_commit: String, - pub integrity: String, -} - -/// The snapshot provenance recorded in the matrix. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct MatrixSnapshot { - pub date: String, - pub note: String, -} - -/// One support-matrix feature entry. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct Feature { - pub id: String, - pub name: String, - pub category: String, - pub state: String, - #[serde(default)] - pub evidence: Vec, - #[serde(default)] - pub notes: String, -} - -/// The matrix summary (counts by state and category). -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct MatrixSummary { - #[serde(rename = "byState")] - pub by_state: BTreeMap, - #[serde(rename = "byCategory")] - pub by_category: BTreeMap, -} - -/// The machine-readable support matrix, mirroring -/// `compatibility/support-matrix.json`. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct SupportMatrix { - #[serde(rename = "schemaVersion")] - pub schema_version: u32, - pub artifact: String, - pub reference: MatrixReference, - pub snapshot: MatrixSnapshot, - /// The declared state domain: state name β†’ description. - pub states: BTreeMap, - pub categories: Vec, - pub features: Vec, - pub summary: MatrixSummary, -} - -impl SupportMatrix { - /// Load and validate a matrix payload. Rejects an unknown schema version; - /// state/category consistency is additionally enforced by the evidence - /// workstream's harness test suite. - fn load(data: &str) -> Result { - let matrix: SupportMatrix = serde_json::from_str(data) - .map_err(|error| SupportMatrixError(format!("invalid support matrix JSON: {error}")))?; - if matrix.schema_version != SUPPORT_MATRIX_SCHEMA_VERSION { - return Err(SupportMatrixError(format!( - "unsupported support-matrix schema version {} \ - (this module understands v{SUPPORT_MATRIX_SCHEMA_VERSION})", - matrix.schema_version - ))); - } - Ok(matrix) - } - - /// The embedded support matrix, parsed once and cached. - /// - /// An embedded matrix that fails to parse or validate is a build/provenance - /// error in this repository, so this is a hard error rather than a - /// recoverable lookup failure. - pub fn builtin() -> Result<&'static SupportMatrix, SupportMatrixError> { - static MATRIX: OnceLock> = OnceLock::new(); - MATRIX - .get_or_init(|| SupportMatrix::load(SUPPORT_MATRIX_JSON)) - .as_ref() - .map_err(Clone::clone) - } - - /// The feature entry with `id`, when declared. - pub fn feature(&self, id: &str) -> Option<&Feature> { - self.features.iter().find(|feature| feature.id == id) - } - - /// The support state of a feature id (e.g. `planned`, - /// `semantic-supported`, `lowering-dependent`). - pub fn feature_state(&self, id: &str) -> Option<&str> { - self.feature(id).map(|feature| feature.state.as_str()) - } - - /// Every feature entry of a category (e.g. `syntax`, `semantics`). - pub fn features_by_category(&self, category: &str) -> Vec<&Feature> { - self.features - .iter() - .filter(|feature| feature.category == category) - .collect() - } - - /// Every feature entry in a state (e.g. `lowering-dependent`). - pub fn features_by_state(&self, state: &str) -> Vec<&Feature> { - self.features - .iter() - .filter(|feature| feature.state == state) - .collect() - } - - /// The declared categories. - pub fn categories(&self) -> &[String] { - &self.categories - } - - /// The declared state domain (state name β†’ description). - pub fn declared_states(&self) -> &BTreeMap { - &self.states - } - - /// The feature-count summary by state and category. - pub fn summary(&self) -> &MatrixSummary { - &self.summary - } -} - -/// A support-matrix load failure. -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct SupportMatrixError(pub String); - -impl fmt::Display for SupportMatrixError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.0) - } -} - -impl std::error::Error for SupportMatrixError {} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn embedded_matrix_loads_and_validates() { - let matrix = SupportMatrix::builtin().expect("embedded matrix must load"); - assert_eq!(matrix.schema_version, SUPPORT_MATRIX_SCHEMA_VERSION); - assert_eq!(matrix.reference.name, "overpy"); - assert!(matrix.reference.version.contains('.')); - assert!(!matrix.features.is_empty()); - } - - #[test] - fn feature_lookup_by_id_and_state() { - let matrix = SupportMatrix::builtin().unwrap(); - let lexing = matrix.feature("syntax/lexing").expect("declared feature"); - assert_eq!(lexing.category, "syntax"); - assert_eq!(lexing.state, "source-supported"); - assert_eq!( - matrix.feature_state("syntax/lexing"), - Some("source-supported") - ); - assert_eq!( - matrix.feature_state("compilation/workshop-lowering"), - Some("lowering-dependent") - ); - assert_eq!(matrix.feature("syntax/nope"), None); - assert_eq!(matrix.feature_state("syntax/nope"), None); - } - - #[test] - fn category_and_state_filters_match_the_summary() { - let matrix = SupportMatrix::builtin().unwrap(); - let syntax = matrix.features_by_category("syntax"); - assert_eq!(syntax.len(), 16); - assert!(syntax.iter().all(|feature| feature.category == "syntax")); - let lowering = matrix.features_by_state("lowering-dependent"); - assert_eq!( - lowering.len(), - matrix.summary().by_state["lowering-dependent"] as usize - ); - assert!( - lowering - .iter() - .all(|feature| feature.state == "lowering-dependent") - ); - assert_eq!(matrix.summary().by_state["planned"], 0); - assert_eq!(matrix.summary().by_category["semantics"], 14); - // Every feature id is unique. - let mut ids: Vec<&str> = matrix - .features - .iter() - .map(|feature| feature.id.as_str()) - .collect(); - ids.sort_unstable(); - ids.dedup(); - assert_eq!(ids.len(), matrix.features.len()); - } - - #[test] - fn declared_states_and_categories_are_exposed() { - let matrix = SupportMatrix::builtin().unwrap(); - assert_eq!(matrix.declared_states().len(), FEATURE_STATES.len()); - for state in FEATURE_STATES { - assert!( - matrix.declared_states().contains_key(state), - "declared state '{state}' missing from the matrix" - ); - } - assert!(matrix.categories().contains(&"syntax".to_string())); - assert!(matrix.categories().contains(&"decompilation".to_string())); - } - - #[test] - fn unknown_schema_version_is_rejected() { - let error = SupportMatrix::load( - r#"{"schemaVersion": 99, "artifact": "x", - "reference": {"name": "overpy", "version": "1", "contentCommit": "c", "integrity": "i"}, - "snapshot": {"date": "d", "note": "n"}, - "states": {}, "categories": [], "features": [], - "summary": {"byState": {}, "byCategory": {}}}"#, - ) - .unwrap_err(); - assert!(error.to_string().contains("schema version")); - } -} diff --git a/crates/opy-rs/support-matrix.json b/crates/opy-rs/support-matrix.json deleted file mode 100644 index 6fa0979..0000000 --- a/crates/opy-rs/support-matrix.json +++ /dev/null @@ -1,808 +0,0 @@ -{ - "schemaVersion": 1, - "visibility": "internal-engineering-metadata", - "artifact": "opy-rs OverPy feature inventory and support matrix", - "reference": { - "name": "overpy", - "version": "9.7.10", - "contentCommit": "889d9749d1def17f146548cbddb94ea1ab015847", - "integrity": "sha512-oX17nauJcPTaKIrRFY/rD0Rl8atqFUVv9Hg2TKH+A68/fC8+ZO344Mkd1A/Y0oOVp1hr5tktMBjzMEDDnMEYUw==" - }, - "snapshot": { - "date": "2026-08-29", - "note": "Readiness baseline through the #38 versioned compile API and CLI. Supported settings, catalog-declared locale emission, and post-compile hooks have explicit OPY -> HIR -> WIR -> validated Workshop emission evidence. Compiler and CLI failures remain structured and source-attributed; optimizer controls remain non-blocking presentation differences and semantic replacement directives remain explicit gaps. Canonical Workshop catalog data, settings tables, locale spellings, WIR, validation, and emission remain owned by workshop-rs.", - "asOfCommit": "9f7c62b1958a3804780a2de7d1bd55e2fb298533" - }, - "states": { - "planned": "Declared surface, not yet implemented in opy-rs; evidence/provenance recorded for the implementing issue.", - "source-supported": "Source implementation behavior (lex/parse/preprocess/macro expansion) implemented in opy-rs and corpus-evidenced.", - "semantic-supported": "Semantic resolution implemented in opy-rs (names, members, enums, call semantics covered by the semantic model).", - "lowering-dependent": "Completion requires canonical Workshop semantics/catalog/emission owned by workshop-rs; inventory-only until the integration stage.", - "end-to-end-supported": "A declared feature or bounded integration slice has explicit OPY -> HIR -> WIR -> validated Workshop emission evidence for that scope; this state does not imply full-language OPY-to-Workshop parity." - }, - "categories": [ - "syntax", - "semantics", - "preprocessing", - "macros", - "directives", - "translations", - "optimization", - "runtime", - "compilation", - "decompilation" - ], - "features": [ - { - "id": "syntax/lexing", - "name": "Lexer: identifiers, literals, strings, comments, #! directives, operators", - "category": "syntax", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/basic-rule", - "fixtures:synthetic/control-flow", - "fixtures:synthetic/expressions-values", - "fixtures:synthetic/diagnostics", - "fixtures:real-world/overpy-cake", - "upstream:src/tests/comments.opy", - "upstream:src/tests/operators.opy", - "upstream:src/tests/strings.opy", - "upstream:src/tests/arrays.opy" - ], - "notes": "Corpus-evidenced: differential suite runs 40 fixtures; upstream tokenizer surface probed." - }, - { - "id": "syntax/expressions", - "name": "Expression/postfix/member/call grammar, precedence, indexing, conditional values", - "category": "syntax", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/expressions-values", - "fixtures:synthetic/receiver-calls", - "fixtures:synthetic/postfix-assignment", - "fixtures:synthetic/postfix-prefix-invalid", - "fixtures:synthetic/postfix-embedded-invalid", - "fixtures:real-world/overpy-cake", - "upstream:src/tests/operators.opy", - "upstream:src/tests/arrays.opy", - "upstream:src/tests/strings_args.opy" - ], - "notes": "Corpus-evidenced: expression fixtures + receiver-calls fixture resolve through the semantic model; conditional values retain right-associative nesting and source spans. Postfix ++/-- are accepted only as statement-level assignments; prefix ++ and embedded postfix ++/-- remain stable parse diagnostics, while prefix --x remains valid consecutive unary-minus syntax." - }, - { - "id": "syntax/declarations", - "name": "Declarations: globalvar/playervar (index + initializer), subroutine, def, enum, macro constants", - "category": "syntax", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/declarations-rules", - "fixtures:synthetic/declarations-numbers", - "fixtures:synthetic/preprocessing", - "fixtures:real-world/overpy-cake", - "upstream:src/tests/variables.opy", - "upstream:src/tests/subroutines.opy", - "upstream:src/tests/enums.opy" - ], - "notes": "Corpus-evidenced: declarations fixtures + overpy-cake resolve; diagnostics for malformed declarations." - }, - { - "id": "syntax/assignments-control-flow", - "name": "Assignments and control flow: =, +=, -=, *=, /=, %=, **=, if/elif/else, for-in-range, while, pass", - "category": "syntax", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/control-flow", - "fixtures:synthetic/for-range-agentlab", - "fixtures:synthetic/chase-condition-agentlab", - "fixtures:synthetic/postfix-assignment", - "upstream:src/tests/loops.opy", - "upstream:src/tests/conditions.opy" - ], - "notes": "Corpus-evidenced: the supported augmented assignment subset is +=, -=, *=, /=, %=, and **=, plus statement-level postfix ++/--; control-flow fixtures resolve; parser rejects out-of-surface forms structurally. min=/max= remains an explicit follow-up (wrightkit/workshop-rs#95)." - }, - { - "id": "syntax/switch", - "name": "switch/case/default", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "fixtures:synthetic/switch-break", "upstream:src/tests/switches.opy"], - "notes": "Issue #28/#33: switch/case/default preserve source-order arms and fall through into subsequent arms; explicit break exits the innermost switch or loop. Workshop lowering remains out of scope." - }, - { - "id": "syntax/break", - "name": "break statements in switch and loops", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/switch-break", "upstream:src/tests/switches.opy", "upstream:src/tests/loops.opy"], - "notes": "Issue #33: break is a real HIR statement, validates its enclosing switch/loop context, and is retained without implicit arm exits." - }, - { - "id": "syntax/statement-surface", - "name": "del, continue, goto, labels, and dynamic loc+ targets", - "category": "syntax", - "state": "source-supported", - "evidence": ["tests:crates/opy-rs/tests/source_syntax.rs", "upstream:src/tests/loops.opy", "upstream:src/tests/gotos.opy"], - "notes": "Issue #141: audited statements lower to source HIR nodes with spans; continue context and malformed targets produce structured diagnostics. Canonical WIR lowering remains an explicit integration boundary." - }, - { - "id": "syntax/augmented-min-max", - "name": "min= and max= modification forms", - "category": "syntax", - "state": "source-supported", - "evidence": ["tests:crates/opy-rs/tests/source_syntax.rs", "upstream:src/tests/operators.opy"], - "notes": "Issue #141: min=/max= are retained as source-semantic binary modifications with provenance; Workshop support is not claimed." - }, - { - "id": "syntax/do-while", - "name": "do … while", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "upstream:src/tests/loops.opy"], - "notes": "Issue #28: the body executes before the condition and the condition is retained as an OPY HIR expression; malformed/truncated conditions remain structured parse errors." - }, - { - "id": "syntax/hex-literals", - "name": "Hexadecimal numeric literals (0x/0X)", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "upstream:src/tests/operators.opy"], - "notes": "Issue #28: hexadecimal source spelling is preserved in the numeric HIR text while the numeric value is decoded independently." - }, - { - "id": "syntax/membership", - "name": "Expression-level in/not in membership", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "upstream:src/tests/operators.opy"], - "notes": "Issue #28: in/not in are represented as source-semantic binary operators; no Workshop Array Contains catalog or lowering is copied here." - }, - { - "id": "syntax/string-modifiers", - "name": "String modifiers (f/w/l/b/c/t)", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/string-modifiers", "fixtures:synthetic/syntax-surface", "fixtures:synthetic/strings-and-lambda", "upstream:src/tests/strings.opy"], - "notes": "Issue #28/#33: f-string interpolation lowers to a semantic format node with source-spanned arguments; w/b/c remain semantic string modifiers and l/t remain syntax-carried without duplicating translation data." - }, - { - "id": "syntax/dicts", - "name": "Dictionary literals and keyed access", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "upstream:src/tests/dicts.opy"], - "notes": "Issue #28: dictionary entries and keyed access are represented in OPY HIR; bare dictionaries and malformed entries produce structured diagnostics." - }, - { - "id": "syntax/comprehensions", - "name": "List comprehensions (mapping/filtering, element and index binders)", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "upstream:src/tests/dicts.opy"], - "notes": "Issue #28: one-for-clause comprehensions with an optional filter and optional element/index binders preserve local scope in HIR." - }, - { - "id": "syntax/lambda", - "name": "Lambda expressions for array operations", - "category": "syntax", - "state": "source-supported", - "evidence": ["fixtures:synthetic/syntax-surface", "fixtures:synthetic/strings-and-lambda", "fixtures:synthetic/lambda-invalid", "upstream:src/tests/dicts.opy"], - "notes": "Issue #28/#33: lambda x: expr is accepted only in signature-approved positions (sorted index 1/key and array map/filter/all/any index 0); standalone and other argument positions produce a structured diagnostic." - }, - { - "id": "syntax/settings-blocks", - "name": "settings { ... } custom-game-settings blocks: JSONC parse into the typed HIR payload", - "category": "syntax", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/settings", - "fixtures:real-world/overpy-meipocalypse/settings.opy", - "fixtures:real-world/6v6-adjustments/lobby/lobby.opy", - "upstream:src/tests/customGameSettings.opy", - "upstream:src/tests/workshopSettings.opy" - ], - "notes": "Corpus-evidenced: settings fixtures parse into the typed HIR payload. Validation is structural only (group shape, span validity, non-empty key names); key-existence and leaf-kind settings validation was removed from the core and is lowering-dependent (#8). Emission lowering-dependent." - }, - { - "id": "semantics/declaration-resolution", - "name": "Name resolution: undeclared identifiers, subroutine and constant references, enum types", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/declarations-rules", - "fixtures:synthetic/expressions-values", - "upstream:src/tests/functions.opy", - "upstream:src/tests/subroutines.opy" - ], - "notes": "Resolved in Opy HIR with structured unknown-identifier/unsupported-member diagnostics; fixtures + tooling tests." - }, - { - "id": "semantics/for-binder", - "name": "for-loop binder: declared globalvar/playervar or implicit default variables A-Z … DA-DX", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/for-range-agentlab", - "fixtures:synthetic/range-player-variable", - "upstream:src/tests/loops.opy" - ], - "notes": "for-loop binders resolve to declared globals or player variables, including implicit default variables (A-Z .. DA-DX); player receivers such as eventPlayer, hostPlayer, and variable expressions are preserved in HIR." - }, - { - "id": "semantics/builtin-actions-values", - "name": "OPY builtin actions and values: manifest identities, signatures, aliases, and call semantics", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "probes:generic-builtins", - "probes:chase-over-time", - "probes:is-game-in-progress", - "probes:get-players-in-radius", - "probes:catalog-only-names", - "probes:unknown-function", - "probes:unknown-value", - "probes:action-in-value-position", - "probes:value-in-action-position", - "fixtures:synthetic/basic-rule", - "fixtures:synthetic/chase-condition-agentlab" - ], - "notes": "Issue #30. The manifest-declared OPY overlay is semantic-supported: source identities, action/value position, signatures, keyword binding, aliases, and canonical catalogId links are probe-validated against the pinned oracle. Canonical Workshop existence/content/emission breadth is tracked separately as lowering-dependent." - }, - { - "id": "semantics/workshop-builtin-catalog", - "name": "Canonical Workshop builtin action/value catalog existence, content, and emission", - "category": "semantics", - "state": "lowering-dependent", - "evidence": [ - "probes:catalog-only-names", - "fixtures:synthetic/receiver-calls", - "fixtures:synthetic/chase-condition-agentlab", - "upstream:src/data/opy/functions.ts" - ], - "notes": "Issue #42 closes a bounded catalog-backed slice: manifest catalogId links lower to canonical action/value ids and representative receiver/chase cases emit through workshop-rs with WIR and canonical-id validation. Full Workshop catalog breadth, content domains, localized spellings, and emission remain lowering-dependent; opy-rs does not copy the catalog or claim full 225/267 coverage." - }, - { - "id": "semantics/receiver-members", - "name": "OPY receiver/member semantics: receiver categories and explicit-argument signatures", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "probes:receiver-calls", - "probes:enum-gated-members", - "probes:invalid-arity-member", - "probes:generic-member-only-action", - "probes:member-value-in-action-position", - "probes:invalid-receiver-append", - "probes:invalid-receiver-format", - "fixtures:synthetic/receiver-calls", - "upstream:src/data/opy/memberFunctions.ts" - ], - "notes": "Issue #30. The manifest-declared OPY member overlay is semantic-supported: receiver syntax/category semantics, explicit-argument signatures, variable receiver rules, aliases, and catalogId links are probe-validated. Canonical member existence/content and Workshop emission remain lowering-dependent." - }, - { - "id": "semantics/workshop-receiver-catalog", - "name": "Canonical Workshop receiver/member catalog existence, content, and emission", - "category": "semantics", - "state": "lowering-dependent", - "evidence": [ - "probes:receiver-calls", - "fixtures:synthetic/receiver-calls", - "upstream:src/data/opy/memberFunctions.ts" - ], - "notes": "Issue #42 closes the evidenced receiver slice: member action/value catalogIds are lowered with the receiver as the canonical leading operand, and catalog-gap members remain explicit integration diagnostics. The OPY receiver/member source-language surface (names, aliases, receiver categories, and signatures) belongs to opy-rs; workshop-rs owns canonical Workshop target identities and semantics, content domains, localization, validation, and emission." - }, - { - "id": "semantics/receiver-playervar", - "name": "Bare playervar receiver member access (`A = B.C`)", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/receiver-playervar", - "upstream:src/tests/variables.opy", - "upstream:src/data/opy/memberFunctions.ts" - ], - "notes": "Issue #30 repair. The pinned oracle accepts this OPY-owned receiver form and the source implementation preserves its variable receiver and member identity in HIR with source provenance. Canonical member existence and emission remain Workshop-owned and lowering-dependent; #8 must not be used to claim the OPY expression incomplete." - }, - { - "id": "semantics/enum-domains", - "name": "OPY enum/domain semantics: declared domain identities and contextual dispatch", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "probes:unknown-enum", - "fixtures:synthetic/chase-enums", - "fixtures:synthetic/chase-keywords", - "upstream:src/tests/builtinenums.opy", - "upstream:src/data/opy/constants.ts" - ], - "notes": "Issue #30. Manifest parameter domains and contextual dispatch are semantic-supported OPY identity links with oracle/corpus evidence. Domain member lists, member existence, domain membership, localized spellings, and emission remain Workshop-owned and are never approximated in opy-rs." - }, - { - "id": "semantics/workshop-enum-domains", - "name": "Canonical Workshop enum/domain member lists, membership, and emission", - "category": "semantics", - "state": "lowering-dependent", - "evidence": [ - "probes:unknown-enum", - "fixtures:synthetic/chase-enums", - "fixtures:synthetic/chase-condition-agentlab", - "upstream:src/data/opy/constants.ts" - ], - "notes": "Issue #42 closes catalog validation for the representative declared and contextual enum slice: canonical domains/members are checked through workshop-rs and contextual chase dispatch reaches canonical action ids. Full Hero, Map, Gamemode, Team, and settings/content domain breadth remains Workshop-owned and lowering-dependent." - }, - { - "id": "semantics/aliases", - "name": "Source aliases: non-contextual (stopChasingVariable, getCurrentHero, hasStatusEffect) and the ChaseReeval contextual alias", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "probes:aliases", - "probes:member-aliases", - "probes:chase-reeval-context", - "probes:chase-reeval-outside" - ], - "notes": "Issue #4. Declared alias surface (3 non-contextual + ChaseReeval contextual) resolves; probes pass (chase-reeval-outside stays: it documents the contextual-domain identity rule). Wrong-domain member rejection is lowering-dependent (#8). Remaining alias surface legacy-quirk/demand-driven." - }, - { - "id": "semantics/modules", - "name": "Modules: random.{randint,uniform,choice,shuffle}", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "fixtures:real-world/overpy-cake", - "fixtures:real-world/overpy-zencopter/heli.opy", - "fixtures:real-world/overpy-meipocalypse/meipocalypse.opy", - "upstream:src/data/opy/modules.ts" - ], - "notes": "random.{uniform,choice} calls resolve; corpus-evidenced (overpy-cake, zencopter, meipocalypse)." - }, - { - "id": "semantics/keyword-arguments", - "name": "Named/keyword arguments: generic name=expr binding and the chase/ChaseReeval special form", - "category": "semantics", - "state": "semantic-supported", - "evidence": [ - "probes:chase-keywords", - "probes:chase-keyword-binding", - "probes:chase-arg3-keyword-required", - "probes:chase-duplicate-keyword", - "probes:chase-missing-argument", - "probes:chase-positional-after-keyword", - "probes:chase-unknown-keyword", - "probes:wait-keyword-names", - "probes:keyword-arguments-unsupported", - "fixtures:synthetic/chase-keywords" - ], - "notes": "Generic keyword binding + chase/ChaseReeval special form; probe-evidenced (chase-keywords set)." - }, - { - "id": "semantics/diagnostics", - "name": "Source identity and diagnostics: structured, source-located source implementation errors, wright-result/v1 envelope", - "category": "semantics", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/diagnostics", - "fixtures:synthetic/declarations-rules", - "upstream:runTests.mjs" - ], - "notes": "Structured stable-code diagnostics with 1-based spans; the stable-code contract is documented in docs/opy/tooling-api.md and tested in opy-rs tooling tests." - }, - { - "id": "semantics/settings-emission", - "name": "Workshop settings-section emission: key table, enum values, map/hero list elements", - "category": "semantics", - "state": "end-to-end-supported", - "evidence": [ - "fixtures:synthetic/settings", - "fixtures:real-world/6v6-adjustments/lobby/lobby.opy", - "test:opy-rs::compiler::integration_tests::preprocessing::included_settings_are_extracted_with_file_provenance", - "upstream:src/tests/customGameSettings.opy" - ], - "notes": "Settings lower directly into the neutral workshop-rs carrier, including when extracted from an included source; workshop-rs owns key/value validation, locale spellings, and emission. Emitted settings are deliberately not reparseable (round-trip boundary)." - }, - { - "id": "preprocessing/include", - "name": "#!include: including-file-relative resolution, duplicate suppression, cycle detection, missing-file diagnostics, file registry", - "category": "preprocessing", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/preprocessing", - "fixtures:real-world/ow1-emulator", - "fixtures:real-world/6v6-adjustments", - "test:opy-rs::preprocess::tests::alias_include_paths_are_distinct_imports", - "test:opy-rs::preprocess::tests::duplicate_include_is_skipped_without_redeclaring_macros", - "upstream:src/tests/include.opy", - "upstream:src/tests/include3.opy", - "upstream:src/tests/include5.opy" - ], - "notes": "Includes resolve from the declaring source file, including nested closures; repeated files are imported once while directive provenance is retained; cycle detection, missing-file diagnostics, file registry, and deterministic multi-file provenance are covered." - }, - { - "id": "preprocessing/define-undef", - "name": "#!define/#!defineMember (object- and function-like), #!undef, recursive expansion, recursion guard", - "category": "preprocessing", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/preprocessing", - "fixtures:real-world/overpy-cake", - "test:opy-rs::compiler::integration_tests::preprocessing::included_define_member_expands_with_definition_provenance", - "test:opy-rs::compiler::integration_tests::preprocessing::nested_includes_resolve_relative_to_the_including_file", - "upstream:src/tests/macros.opy", - "upstream:src/tests/builtinmacros.opy" - ], - "notes": "Object- and function-like #!define/#!defineMember, #!undef, recursive expansion with recursion guard; member defines share the pinned textual macro contract and retain definition-site provenance." - }, - { - "id": "preprocessing/advanced-directives", - "name": "#!mainFile, #!allowMacroRedeclaration, backend-only directive state, #!optimize*/#!replace0By* family, #!rulePrefix*", - "category": "preprocessing", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/directives", - "fixtures:synthetic/project-main-file", - "upstream:src/tests/rulePrefix.opy", - "upstream:src/tests/compression.opy", - "upstream:src/data/opy/preprocessing.ts", - "test:opy-rs::preprocess::tests::backend_only_directives_are_validated_and_recorded", - "test:opy-rs::preprocess::tests::extension_directive_rejects_unknown_schema_values", - "test:opy-rs::compiler::integration_tests::preprocessing::duplicate_include_warning_is_exposed_by_frontend_tooling" - ], - "notes": "Issue #29 plus #142: source implementation validates and records main-file provenance, duplicate-import and macro-redeclaration policy, backend-only directive state, canonical extension names, and rule-prefix application. Optimizer, localization, extension point accounting, output-file, compression, and generated Workshop effects remain separate." - }, - { - "id": "preprocessing/directive-effects", - "name": "Preprocessing directive effects on Workshop emission and optimization", - "category": "preprocessing", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic/directives", - "upstream:src/data/opy/preprocessing.ts" - ], - "notes": "Rule-prefix metadata is already reflected in HIR rule names. Optimizer controls remain non-blocking presentation differences. The compiler rejects replacement directives at their source anchor until a canonical lowering and corpus evidence exist; it does not silently drop or approximate semantic rewrites." - }, - { - "id": "macros/definitions", - "name": "macro name(params): statement bodies with MacroParam references, macro constants", - "category": "macros", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/preprocessing", - "fixtures:real-world/overpy-cake", - "fixtures:real-world/overpy-meipocalypse", - "fixtures:real-world/ow1-emulator/common/macro_functions.opy", - "upstream:src/tests/macros.opy", - "upstream:src/tests/astMacros.opy", - "upstream:src/tests/builtinmacros.opy" - ], - "notes": "macro name(params): statement bodies with MacroParam references expand; corpus-evidenced (cake, meipocalypse, ow1-emulator)." - }, - { - "id": "macros/javascript", - "name": "__script__ JavaScript macros (QuickJS runtime); #!postCompileHook parsed and recorded", - "category": "macros", - "state": "source-supported", - "evidence": [ - "upstream:runTests.mjs", - "upstream:src/tests/postCompileHook.opy", - "upstream:src/tests/quickjs-modern.js", - "upstream:src/tests/quickjs-invalid-return.js", - "upstream:src/tests/quickjs-runaway.js", - "upstream:src/quickjs.ts", - "test:opy-rs::macro_integration", - "test-fixture:crates/opy-rs/tests/fixtures/macros", - "test:opy-rs-differential", - "fixtures:real-world/overpy-meipocalypse" - ], - "notes": "Issue #6 + #7 part B. `#!define name(args) __script__(\"path.js\")` parsed (script resolution relative to the definition file, script-not-found at the define site like the reference's ENOENT), expanded through opy_macro_js::MacroRuntime with the reference's var-injection ABI, indentation rule, and string-only completion contract β€” compile-time expansion executes and is source-supported. `#!postCompileHook` is parsed, validated, and recorded (duplicate rejection); compiler execution against final Workshop text is tracked by hooks/post-compile-workshop. Structured script-* diagnostics carry script provenance. Catalog constants remain lowering-dependent; `#!require` does not exist in the pinned reference." - }, - { - "id": "hooks/post-compile-workshop", - "name": "Post-compile hook execution against the final Workshop text", - "category": "macros", - "state": "end-to-end-supported", - "evidence": [ - "upstream:src/tests/postCompileHook.opy", - "upstream:src/quickjs.ts", - "test:opy-rs::macro_js::tests::hooks", - "test:opy-rs-macro-integration", - "test:opy-rs::compiler" - ], - "notes": "The compiler runs the bounded internal macro runtime hook only after successful workshop-rs emission, passes the exact emitted Workshop text, and exposes the string completion as final output; hook failures retain both the directive anchor and structured script provenance." - }, - { - "id": "directives/rule-annotations", - "name": "Rule annotations: @Event, @Condition, bare @Team/@Slot", - "category": "directives", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/basic-rule", - "fixtures:synthetic/declarations-rules", - "fixtures:synthetic/control-flow", - "upstream:src/tests/rules.opy", - "upstream:README.md" - ], - "notes": "Core rule annotations and event/condition structure are source implementation-owned." - }, - { - "id": "directives/advanced-rule-annotations", - "name": "Rule annotations: @Team/@Slot args, @Name, @Hero, @Disabled, @Delimiter, @NewPage, @SuppressWarnings", - "category": "directives", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/directives", - "fixtures:synthetic/duplicate-rule-diagnostic", - "upstream:src/data/opy/annotations.ts" - ], - "notes": "Issue #29: annotation arguments, rule metadata, and source diagnostics are retained in OPY HIR; hero/team/slot domain validation and Workshop UI effects remain lowering-dependent." - }, - { - "id": "directives/rule-model", - "name": "Rule model: rule \"name\": with events (global, eachPlayer), conditions list, statements", - "category": "directives", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic/basic-rule", - "fixtures:synthetic/chase-condition-agentlab", - "fixtures:synthetic/control-flow", - "upstream:src/tests/rules.opy", - "upstream:src/tests/eventVars.opy" - ], - "notes": "rule \"name\": with global/eachPlayer events, conditions, statements; differential fixtures." - }, - { - "id": "translations/directive", - "name": "#!translations directive recognition and .po generation surface", - "category": "translations", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/directives", - "upstream:src/tests/translations.opy", - "upstream:src/tests/translations2.opy", - "upstream:src/tests/translations.es.po", - "upstream:src/tests/translations2.fr.po", - "upstream:src/compiler/translations.ts" - ], - "notes": "Issue #29: language-tag syntax, uniqueness/conflict validation, provenance, and translation state are source implementation-owned; locale availability, .po content, and generated Workshop helpers remain lowering-dependent." - }, - { - "id": "translations/locale-emission", - "name": "Localized Workshop output (--language flag, localizedStrings data)", - "category": "translations", - "state": "end-to-end-supported", - "evidence": [ - "upstream:src/data/localizedStrings.ts", - "oracle:CLI --language en-US invocation recorded in compatibility/run_oracle.py", - "test:opy-rs::compiler" - ], - "notes": "Compiler locale selection delegates to workshop-rs catalog coverage and rejects undeclared locales explicitly; missing per-identity mappings remain fail-explicit." - }, - { - "id": "optimization/controls", - "name": "#!optimize*/#!replace0By* family and compression controls", - "category": "optimization", - "state": "semantic-supported", - "evidence": [ - "fixtures:synthetic/directives", - "upstream:src/tests/compression.opy", - "upstream:src/data/opy/preprocessing.ts" - ], - "notes": "Issue #29: optimizer/replacement controls are parsed, validated, ordered, and exposed as source implementation state; transformation execution is not part of opy-rs." - }, - { - "id": "optimization/backend-effects", - "name": "Optimizer transformations and replacement rewrites", - "category": "optimization", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic/directives", - "upstream:src/data/opy/preprocessing.ts" - ], - "notes": "Optimizer transformations and replacement rewrites remain lowering-dependent. Optimizer controls remain non-blocking; replacement directives fail explicitly rather than silently changing Workshop output." - }, - { - "id": "optimization/emission-form", - "name": "Workshop text emission form (variable naming, enum spellings, formatting)", - "category": "optimization", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic/basic-rule/oracle.json", - "fixtures:real-world/overpy-cake/oracle.json" - ], - "notes": "Output-text identity is explicitly not the compatibility contract; exact-vs-normalized differences are presentation differences. Emission form is workshop-rs-owned." - }, - { - "id": "runtime/js-hooks", - "name": "QuickJS runtime for __script__ macro and hook execution (synthetic-content hook ABI)", - "category": "runtime", - "state": "source-supported", - "evidence": [ - "upstream:runTests.mjs", - "upstream:src/quickjs.ts", - "oracle:quickjs-ng.wasm shipped in the pinned npm package", - "test:opy-rs::macro_js::tests::macro_abi", - "test:opy-rs::macro_js::tests::hooks", - "test:opy-rs::macro_js::tests::limits", - "test:opy-rs::macro_integration" - ], - "notes": "Issue #6 + #7 part B. Bounded runtime surface wired into the source implementation: macro execution with argument injection, `vect` helper, empty constant objects, console capture, reference-compatible accept/reject and result semantics, resource limits defaulting to the pinned reference constants (1000 ms macro / 2000 ms hook budgets, 64 MiB memory, 512 KiB stack). The hook ABI runs against synthetic content in the internal macro runtime; hook execution against the Workshop output is lowering-dependent (see hooks/post-compile-workshop, issue #8). Browser/WASM execution remains unsupported (native embedding only), matching the declared boundary." - }, - { - "id": "compilation/source implementation-pipeline", - "name": "Source implementation pipeline: lexer -> preprocess -> CST/parser -> semantic resolution -> Opy HIR v2", - "category": "compilation", - "state": "source-supported", - "evidence": [ - "fixtures:synthetic", - "fixtures:real-world", - "docs:docs/hir/opy-hir-v2.md", - "test:opy-rs-differential" - ], - "notes": "Issues #3-#7, #25, and the #28/#29/#30/#33 readiness tracks. Fully Workshop-independent; the pinned differential corpus is the acceptance corpus. Differential harness runs every fixture through the native pipeline in cargo test with structural self-checks (HIR validation, wire round-trip, deterministic dump), status/rule-name parity against recorded oracle.json snapshots, explicit native evidence expectations, and a machine-readable report (target/opy-differential-report.json). The generated report records per-fixture matches and known gaps; no unexpected divergence or inconclusive result is a support claim." - }, - { - "id": "compilation/opy-integration-vertical-slice", - "name": "Minimal OPY -> canonical WIR -> Workshop emission vertical slice", - "category": "compilation", - "state": "end-to-end-supported", - "evidence": [ - "fixtures:synthetic/compiler-vertical-slice", - "test:opy-rs::compiler-vertical-slice", - "contract:workshop-rs-v0.1.18" - ], - "notes": "Issue #35. The internal compiler module consumes resolved OPY HIR, preserves source files/spans in workshop-rs WIR, cross-checks manifest catalogId/domain links against Catalog, validates canonical WIR, and emits deterministic en-US Workshop through the published workshop-rs v0.1.18 contract. This is a bounded first slice; broader OPY lowering remains lowering-dependent and is not reclassified by this fixture." - }, - { - "id": "compilation/opy-structural-lowering", - "name": "OPY structural HIR -> canonical WIR lowering: declarations, subroutines, rules, events, and provenance", - "category": "compilation", - "state": "end-to-end-supported", - "evidence": [ - "fixtures:synthetic/compiler-vertical-slice", - "fixtures:synthetic/compiler-structure", - "test:opy-rs::compiler-structural-lowering", - "contract:workshop-rs-v0.1.18" - ], - "notes": "Issue #40. Global/player variables and subroutines use deterministic canonical indices with source/name spans; subroutine definitions and calls, rule disabled state, conditions, supported event/filter identities, and source-file provenance lower directly into workshop-rs WIR. Unsupported settings, declarations, annotations, events, filters, and statement forms remain explicit source-attributed integration diagnostics. This does not claim full statement/expression, catalog/member/enum, settings, locale, optimizer, hook, or decompilation coverage." - }, - { - "id": "compilation/opy-assignment-lowering", - "name": "OPY assignment and modification HIR -> canonical WIR lowering", - "category": "compilation", - "state": "end-to-end-supported", - "evidence": [ - "fixtures:synthetic/primitive-lowering", - "fixtures:synthetic/postfix-assignment", - "fixtures:synthetic/indexed-assignment-nested", - "fixtures:synthetic/indexed-assignment-4d-invalid", - "test:opy-rs::compiler-primitive-lowering", - "test:opy-rs::compiler::integration_tests::postfix_assignments::postfix_assignments_match_the_pinned_oracle", - "test:opy-rs::compiler::integration_tests::indexed_assignments::nested_indexed_assignments_match_the_pinned_oracle", - "test:opy-rs::compiler::integration_tests::semantic_diagnostics::semantic_boundary_errors_are_reported_before_lowering", - "test:opy-rs::compiler::integration_tests::variable_initializers::null_initializers_are_dropped_but_float_zero_is_preserved", - "contract:workshop-rs-v0.1.18" - ], - "notes": "Issue #46/#59/#60/#145/#162. Global/player assignments and augmented assignments (+=, -=, *=, /=, %=, **=, ++, --), literal dictionary lookup folding, single-level and nested indexed variable assignments and modifications (setGlobalVariableAtIndex, modifyGlobalVariableAtIndex, setPlayerVariableAtIndex, modifyPlayerVariableAtIndex), and pass no-op statements lower into canonical workshop-rs WIR. Nested targets are rebuilt through canonical array slices, while four-dimensional assignments are rejected by source semantics at the pinned diagnostic frontier before lowering; null and integer-zero declaration initializers are omitted while float zero remains observable. Direct global/player modifications carry full statement and target-variable span provenance; indexed forms lower to canonical Call actions, which carry only the statement-level source span (the canonical WIR Call shape has no separate target-span field)." - }, - { - "id": "compilation/opy-implicit-default-variables", - "name": "OverPy implicit default global and player variables (A-DX) at fixed Workshop slots", - "category": "compilation", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic/primitive-lowering", - "test:opy-rs::compiler-implicit-default-variables", - "contract:workshop-rs-v0.1.18" - ], - "notes": "Issue #46. Undeclared A-Z, AA-AZ, ..., DA-DX global references and eventPlayer. player references resolve through the source implementation default_var_index contract and lower to separate Workshop variable namespaces at their fixed reference slots (A=0 ... DX=127); used implicit slots are reserved independently for declared global/player allocation, an explicit declared index colliding with a used implicit slot fails with the stable source-attributed index-collision diagnostic, and a declared name wins in its own namespace. The pinned oracle snapshot for the primitive-lowering fixture constrains global and player slots through structural equivalence." - }, - { - "id": "compilation/opy-literal-dict-lookup", - "name": "Literal dictionary lookup lowering to canonical WIR", - "category": "compilation", - "state": "end-to-end-supported", - "evidence": [ - "fixtures:synthetic/dictionary-lookup", - "test:opy-rs::compiler::integration_tests::dictionary_lowering::literal_dictionary_lookup_matches_the_pinned_oracle" - ], - "notes": "Issue #145. Literal dictionary lookups with literal keys are folded to the selected value, or to Null on a literal miss, and compared directly with the pinned oracle WIR. Dictionary-indexed assignment targets remain outside this bounded path and are not silently guessed." - }, - { - "id": "compilation/opy-expression-lowering", - "name": "OPY non-control-flow value expression HIR -> canonical WIR lowering", - "category": "compilation", - "state": "end-to-end-supported", - "evidence": [ - "fixtures:synthetic/primitive-lowering", - "test:opy-rs::compiler-primitive-lowering", - "test:opy-rs::compiler::integration_tests::conditionals", - "contract:workshop-rs-v0.1.18" - ], - "notes": "Issue #46/#100/#145. Literals (numbers, strings, booleans, null), arrays, vectors (vect), enum constants, global/player/eventPlayer variable references, literal dictionary lookup, array indexing (valueInArray; a literal zero index lowers to firstOf, matching the pinned oracle), string formatting (customString), f/w/b/c literal string modifiers, arithmetic/comparison/logical binary operations, unary operations (not, -; not on a comparison lowers to the negated comparison, matching the pinned oracle), right-associative conditional values (ifThenElse), and power operations lower into canonical workshop-rs WIR. Value-position power uses the canonical raiseToPower Value contract; direct and indexed power modifications use the canonical Workshop Operation contract." - }, - { - "id": "compilation/opy-control-flow-lowering", - "name": "OPY control-flow HIR -> canonical WIR lowering", - "category": "compilation", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic/control-flow-lowering", - "fixtures:synthetic/switch-break-unsupported", - "fixtures:synthetic/switch-order", - "fixtures:synthetic/switch-structured-target", - "fixtures:synthetic/switch-multiple-break", - "fixtures:synthetic/do-while-break", - "fixtures:synthetic/do-while-invalid", - "fixtures:synthetic/range-player-variable", - "fixtures:synthetic/range-invalid-binder", - "fixtures:synthetic/switch-break", - "test:opy-rs::compiler::integration_tests::control_flow::switch_lowering_matches_the_pinned_oracle", - "contract:workshop-rs-v0.1.18" - ], - "notes": "Issue #47/#65/#162. If/elif/else, while, global- and player-variable range-for, do-while expansion, source-ordered switch fallthrough/default, and direct loop/switch/do-while break lower into canonical workshop-rs WIR. Player-variable binders preserve their receiver and source span through HIR and use the existing For Player Variable contract; non-variable range binders are rejected by source semantics before lowering. Switch offsets and do-while distances use workshop-rs v0.1.18 canonical emitted action widths; direct, conditional, and nested do-while shapes are pinned and oracle-equivalent. Residual native-WIR differences in switch-break and switch-target shapes remain explicit compiler gaps; nested conditional switch break remains a stable source-attributed unsupported-integration-surface diagnostic, while multiple direct switch breaks use canonical nested exit layers with pinned action-trace evidence." - }, - { - "id": "compilation/workshop-lowering", - "name": "HIR -> Workshop lowering and emission through workshop-rs", - "category": "compilation", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic", - "fixtures:real-world" - ], - "notes": "Issue #38 exposes the bounded compiler/library/CLI surface over the released workshop-rs v0.1.18 contract. Full OPY statement/expression lowering, catalog/member/enum breadth, optimizer effects, and remaining real-project gaps stay explicit in compiler-expectations.json and the native corpus report; no temporary Workshop IR is introduced here." - }, - { - "id": "compilation/end-to-end", - "name": "End-to-end OPY -> Workshop compile parity", - "category": "compilation", - "state": "lowering-dependent", - "evidence": [ - "fixtures:synthetic", - "fixtures:real-world", - "fixtures:census/workshop-feature-census" - ], - "notes": "Full OPY-to-Workshop parity remains broader than the declared #38 baseline. compatibility/run_native.py compiles every fixture through the versioned CLI contract and compares it with the separate compiler-expectations.json baseline. Source/frontend expectations remain independent; entries are separately classified and no unverified case is counted as compiler parity." - }, - { - "id": "decompilation/workshop-to-opy", - "name": "Workshop -> OPY decompilation", - "category": "decompilation", - "state": "lowering-dependent", - "evidence": [ - "upstream:src/tests/decompiler", - "upstream:src/decompiler" - ], - "notes": "Deferred until the canonical Workshop semantic representation exists (workshop-rs integration); a non-goal before it. Upstream decompiler corpus (17 inputs) is the future reference." - }, - { - "id": "decompilation/roundtrip-boundary", - "name": "Round-trip boundary: emitted settings reparsing, .ws round-trip", - "category": "decompilation", - "state": "lowering-dependent", - "evidence": [ - "docs:docs/opy/support-matrix.md" - ], - "notes": "Documented boundary: emitted settings sections are deliberately not reparseable; a .ws decompiler is a non-goal. Reconstruction of arbitrary Workshop text is out of scope." - } - ], - "summary": { - "byState": { - "planned": 0, - "source-supported": 25, - "semantic-supported": 13, - "lowering-dependent": 12, - "end-to-end-supported": 8 - }, - "byCategory": { - "syntax": 16, - "semantics": 14, - "preprocessing": 4, - "macros": 3, - "directives": 3, - "translations": 2, - "optimization": 3, - "runtime": 1, - "compilation": 10, - "decompilation": 2 - } - } -} diff --git a/compatibility/differential-expectations.json b/crates/opy-rs/tests/differential-expectations.json similarity index 100% rename from compatibility/differential-expectations.json rename to crates/opy-rs/tests/differential-expectations.json diff --git a/crates/opy-rs/tests/differential.rs b/crates/opy-rs/tests/differential.rs index 4b45485..6c8499f 100644 --- a/crates/opy-rs/tests/differential.rs +++ b/crates/opy-rs/tests/differential.rs @@ -1,9 +1,9 @@ //! Native-vs-reference differential suite. //! //! Runs the declared compatibility corpus -//! (`compatibility/fixtures/**/fixture.json`) through the native frontend and +//! (`crates/opy-rs/tests/fixtures/corpus/**/fixture.json`) through the native frontend and //! compares the outcome against the recorded reference evidence -//! (`oracle.json`, produced by `compatibility/run_oracle.py` against the +//! (`oracle.json`, produced by `tools/overpy/run_oracle.py` against the //! pinned OverPy 9.7.10 oracle). //! //! # What is compared @@ -29,7 +29,8 @@ //! in the native HIR are compared against `rule ("…")` entries in the //! oracle Workshop text, after normalizing away reference-synthesized //! `Initialize …`/`Subroutine …` rules (their synthesis is -//! lowering-dependent in opy-rs; see the support matrix). Mismatches are +//! lowering-dependent in opy-rs; see the canonical language-support contract). +//! Mismatches are //! recorded in the report as explicit gap entries; they do not fail the //! suite because text-shape differences at the emission boundary are not //! the compatibility contract. @@ -61,8 +62,7 @@ //! `target/opy-differential-report.json` listing per-fixture native status and //! relationship classification (`match` / `known-gap` / //! `unexpected-divergence` / `inconclusive`), the native diagnostic code, the -//! reference status, rule-name comparison, and the support-matrix feature ids -//! the fixture evidences. A reference-success/native-failure case is never +//! reference status, and rule-name comparison. A reference-success/native-failure case is never //! classified as a match. //! //! # Current corpus state @@ -88,13 +88,13 @@ fn workspace_root() -> PathBuf { } fn fixtures_root() -> PathBuf { - workspace_root().join("compatibility").join("fixtures") + workspace_root().join("crates/opy-rs/tests/fixtures/corpus") } fn differential_expectations() -> Value { serde_json::from_str( &std::fs::read_to_string( - workspace_root().join("compatibility/differential-expectations.json"), + workspace_root().join("crates/opy-rs/tests/differential-expectations.json"), ) .expect("differential-expectations.json must be readable"), ) @@ -139,7 +139,7 @@ fn case(expect: Expect, rule_names: bool, note: &'static str) -> Case { } /// The declared corpus expectation table. Every fixture in -/// `compatibility/fixtures` must appear here; unknown fixtures fail the suite +/// `crates/opy-rs/tests/fixtures/corpus` must appear here; unknown fixtures fail the suite /// so new corpus entries are deliberate. fn declared_corpus() -> BTreeMap<&'static str, Case> { let mut cases = BTreeMap::new(); @@ -619,27 +619,6 @@ fn strip_spans(value: &mut Value) { } } -/// The support-matrix feature ids whose evidence cites `fixtures:`. -fn support_matrix_linkage(matrix: &Value, id: &str) -> Vec { - let fixtures_key = format!("fixtures:{id}"); - matrix["features"] - .as_array() - .map(|features| { - features - .iter() - .filter_map(|feature| { - let evidences = feature["evidence"].as_array(); - let cited = evidences.is_some_and(|list| { - list.iter() - .any(|entry| entry.as_str() == Some(&fixtures_key)) - }); - cited.then(|| feature["id"].as_str().unwrap().to_string()) - }) - .collect() - }) - .unwrap_or_default() -} - /// Run one fixture through the native frontend plus the structural /// self-checks, and emit its normalized native HIR JSON dump. fn run_native( @@ -685,11 +664,7 @@ fn run_native( fn native_and_reference_agree_on_the_declared_corpus() { let corpus = declared_corpus(); let expectations = differential_expectations(); - let matrix: Value = serde_json::from_str( - &std::fs::read_to_string(workspace_root().join("compatibility/support-matrix.json")) - .unwrap(), - ) - .expect("support-matrix.json must parse"); + let mut reference_identity = Value::Null; let mut fixtures = BTreeMap::::new(); let mut divergences: Vec = Vec::new(); @@ -765,6 +740,9 @@ fn native_and_reference_agree_on_the_declared_corpus() { let oracle: Value = serde_json::from_str(&std::fs::read_to_string(&snapshot_path).unwrap()) .expect("oracle.json must parse"); + if reference_identity.is_null() { + reference_identity = oracle["oracle"].clone(); + } oracle["compile"]["status"].as_str().map(str::to_string) } else { None @@ -883,7 +861,6 @@ fn native_and_reference_agree_on_the_declared_corpus() { "native": native_entry, "reference": reference_entry, "ruleNames": rule_names_entry, - "supportMatrix": support_matrix_linkage(&matrix, &id), "detail": detail, "referenceGap": reference_gap, "skip": skipped, @@ -967,7 +944,7 @@ fn native_and_reference_agree_on_the_declared_corpus() { .collect(); assert!( missing.is_empty(), - "declared corpus entries missing from compatibility/fixtures: {missing:?}" + "declared corpus entries missing from crates/opy-rs/tests/fixtures/corpus: {missing:?}" ); let extra_expectations: Vec<&str> = expectations["cases"] .as_array() @@ -986,7 +963,7 @@ fn native_and_reference_agree_on_the_declared_corpus() { "artifact": "opy-rs native-vs-reference differential report (issue #25)", "generatedBy": "crates/opy-rs/tests/differential.rs", "frontend": { "name": LANGUAGE_NAME, "version": LANGUAGE_VERSION }, - "reference": matrix["reference"], + "reference": reference_identity, "summary": { "total": counts["total"], "resolve": counts["resolve"], diff --git a/compatibility/fixtures/README.md b/crates/opy-rs/tests/fixtures/corpus/README.md similarity index 97% rename from compatibility/fixtures/README.md rename to crates/opy-rs/tests/fixtures/corpus/README.md index 23ad338..177570d 100644 --- a/compatibility/fixtures/README.md +++ b/crates/opy-rs/tests/fixtures/corpus/README.md @@ -2,9 +2,8 @@ This directory is the opy-rs compatibility corpus: OPY sources with their pinned-oracle snapshots (`oracle.json`), ported from the WrightKit project's -evidence base (wright `compatibility/fixtures/`) and re-verified against the -pinned OverPy 9.7.10 oracle (see -[`docs/compatibility/upstream-references.md`](../../docs/compatibility/upstream-references.md) +evidence base and re-verified against the pinned OverPy 9.7.10 oracle (see +[`docs/compatibility/upstream-references.md`](../../../../../docs/compatibility/upstream-references.md) for the dated verification record). Corpus policy: every fixture records provenance in its `fixture.json` @@ -12,14 +11,14 @@ Corpus policy: every fixture records provenance in its `fixture.json` fixtures β€” `sourceCommit`, `sourceUrl`, `licenseUrl`, `modifications`). No fixture is committed without a clear provenance record. The pinned reference identity and the clean-room policy are in -[`docs/compatibility/upstream-references.md`](../../docs/compatibility/upstream-references.md). +[`docs/compatibility/upstream-references.md`](../../../../../docs/compatibility/upstream-references.md). These files are oracle evidence, not core inputs: the core never imports them, and they are never bundled into core builds or release artifacts. ## Layout ```text -fixtures/// +corpus/// fixture.json # metadata and expected compile status source.opy # input (or the source path named by fixture.json; multi-file # fixtures name their main file via fixture.json "source") diff --git a/compatibility/fixtures/census/workshop-feature-census/fixture.json b/crates/opy-rs/tests/fixtures/corpus/census/workshop-feature-census/fixture.json similarity index 100% rename from compatibility/fixtures/census/workshop-feature-census/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/census/workshop-feature-census/fixture.json diff --git a/compatibility/fixtures/census/workshop-feature-census/oracle.json b/crates/opy-rs/tests/fixtures/corpus/census/workshop-feature-census/oracle.json similarity index 100% rename from compatibility/fixtures/census/workshop-feature-census/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/census/workshop-feature-census/oracle.json diff --git a/compatibility/fixtures/census/workshop-feature-census/workshop-feature-census.opy b/crates/opy-rs/tests/fixtures/corpus/census/workshop-feature-census/workshop-feature-census.opy similarity index 100% rename from compatibility/fixtures/census/workshop-feature-census/workshop-feature-census.opy rename to crates/opy-rs/tests/fixtures/corpus/census/workshop-feature-census/workshop-feature-census.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/constants/adj_constants.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/constants/adj_constants.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/constants/adj_constants.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/constants/adj_constants.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/constants/ow2_constants.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/constants/ow2_constants.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/constants/ow2_constants.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/constants/ow2_constants.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/fixture.json b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/fixture.json similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/fixture.json diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/ana/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/ana/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/ana/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/ana/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/ana/nade.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/ana/nade.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/ana/nade.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/ana/nade.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/ashe/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/ashe/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/ashe/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/ashe/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/baptiste/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/baptiste/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/baptiste/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/baptiste/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/baptiste/regen_burst.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/baptiste/regen_burst.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/baptiste/regen_burst.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/baptiste/regen_burst.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/bastion/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/bastion/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/bastion/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/bastion/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/bastion/reconfigure.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/bastion/reconfigure.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/bastion/reconfigure.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/bastion/reconfigure.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/brigitte/bash.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/brigitte/bash.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/brigitte/bash.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/brigitte/bash.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/brigitte/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/brigitte/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/brigitte/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/brigitte/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/brigitte/inspire.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/brigitte/inspire.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/brigitte/inspire.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/brigitte/inspire.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/brigitte/repair_pack.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/brigitte/repair_pack.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/brigitte/repair_pack.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/brigitte/repair_pack.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/brigitte/whipshot.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/brigitte/whipshot.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/brigitte/whipshot.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/brigitte/whipshot.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/doomfist/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/doomfist/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/doomfist/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/doomfist/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/doomfist/meteor_strike.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/doomfist/meteor_strike.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/doomfist/meteor_strike.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/doomfist/meteor_strike.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/doomfist/powerblock.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/doomfist/powerblock.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/doomfist/powerblock.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/doomfist/powerblock.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/doomfist/punch.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/doomfist/punch.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/doomfist/punch.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/doomfist/punch.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/doomfist/slam.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/doomfist/slam.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/doomfist/slam.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/doomfist/slam.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/dva/boosters.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/dva/boosters.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/dva/boosters.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/dva/boosters.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/dva/defense_matrix.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/dva/defense_matrix.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/dva/defense_matrix.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/dva/defense_matrix.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/dva/hp.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/dva/hp.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/dva/hp.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/dva/hp.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/dva/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/dva/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/dva/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/dva/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/echo/duplicate.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/echo/duplicate.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/echo/duplicate.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/echo/duplicate.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/echo/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/echo/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/echo/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/echo/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/freja/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/freja/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/freja/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/freja/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/genji/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/genji/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/genji/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/genji/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/hanzo/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/hanzo/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/hanzo/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/hanzo/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/hazard/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/hazard/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/hazard/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/hazard/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/illari/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/illari/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/illari/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/illari/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/illari/solar_rifle.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/illari/solar_rifle.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/illari/solar_rifle.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/illari/solar_rifle.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/junkerqueen/carnage.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkerqueen/carnage.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/junkerqueen/carnage.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkerqueen/carnage.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/junkerqueen/commanding_shout.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkerqueen/commanding_shout.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/junkerqueen/commanding_shout.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkerqueen/commanding_shout.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/junkerqueen/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkerqueen/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/junkerqueen/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkerqueen/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/junkerqueen/jagged_blade.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkerqueen/jagged_blade.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/junkerqueen/jagged_blade.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkerqueen/jagged_blade.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/junkerqueen/rampage.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkerqueen/rampage.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/junkerqueen/rampage.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkerqueen/rampage.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/junkrat/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkrat/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/junkrat/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkrat/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/junkrat/mayhem.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkrat/mayhem.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/junkrat/mayhem.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/junkrat/mayhem.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/juno/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/juno/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/juno/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/juno/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/juno/orbital_ray.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/juno/orbital_ray.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/juno/orbital_ray.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/juno/orbital_ray.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/juno/torpedoes.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/juno/torpedoes.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/juno/torpedoes.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/juno/torpedoes.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/kiriko/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/kiriko/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/kiriko/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/kiriko/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/kiriko/protection_suzu.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/kiriko/protection_suzu.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/kiriko/protection_suzu.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/kiriko/protection_suzu.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/kiriko/swift_step.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/kiriko/swift_step.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/kiriko/swift_step.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/kiriko/swift_step.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/lifeweaver/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/lifeweaver/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/lifeweaver/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/lifeweaver/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/lucio/aura.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/lucio/aura.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/lucio/aura.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/lucio/aura.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/lucio/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/lucio/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/lucio/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/lucio/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/mauga/cage_fight.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mauga/cage_fight.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/mauga/cage_fight.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mauga/cage_fight.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/mauga/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mauga/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/mauga/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mauga/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/mccree/deadeye.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mccree/deadeye.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/mccree/deadeye.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mccree/deadeye.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/mccree/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mccree/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/mccree/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mccree/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/mccree/peacekeeper.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mccree/peacekeeper.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/mccree/peacekeeper.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mccree/peacekeeper.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/mei/cryo_freeze.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mei/cryo_freeze.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/mei/cryo_freeze.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mei/cryo_freeze.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/mei/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mei/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/mei/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mei/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/mercy/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mercy/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/mercy/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/mercy/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/moira/coalescence.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/moira/coalescence.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/moira/coalescence.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/moira/coalescence.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/moira/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/moira/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/moira/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/moira/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/orisa/fortify.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/orisa/fortify.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/orisa/fortify.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/orisa/fortify.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/orisa/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/orisa/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/orisa/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/orisa/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/orisa/javelin.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/orisa/javelin.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/orisa/javelin.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/orisa/javelin.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/orisa/terra_surge.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/orisa/terra_surge.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/orisa/terra_surge.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/orisa/terra_surge.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/pharah/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/pharah/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/pharah/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/pharah/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/ramattra/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/ramattra/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/ramattra/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/ramattra/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/ramattra/nemesis_form.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/ramattra/nemesis_form.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/ramattra/nemesis_form.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/ramattra/nemesis_form.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/reaper/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/reaper/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/reaper/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/reaper/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/reinhardt/charge.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/reinhardt/charge.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/reinhardt/charge.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/reinhardt/charge.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/reinhardt/firestrike.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/reinhardt/firestrike.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/reinhardt/firestrike.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/reinhardt/firestrike.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/reinhardt/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/reinhardt/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/reinhardt/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/reinhardt/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/reinhardt/shatter.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/reinhardt/shatter.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/reinhardt/shatter.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/reinhardt/shatter.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/roadhog/breather.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/roadhog/breather.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/roadhog/breather.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/roadhog/breather.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/roadhog/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/roadhog/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/roadhog/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/roadhog/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/roadhog/wholehog.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/roadhog/wholehog.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/roadhog/wholehog.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/roadhog/wholehog.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/sigma/accretion.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/sigma/accretion.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/sigma/accretion.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/sigma/accretion.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/sigma/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/sigma/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/sigma/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/sigma/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/sigma/kinetic_grasp.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/sigma/kinetic_grasp.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/sigma/kinetic_grasp.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/sigma/kinetic_grasp.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/sojourn/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/sojourn/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/sojourn/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/sojourn/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/soldier/biotic_field.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/soldier/biotic_field.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/soldier/biotic_field.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/soldier/biotic_field.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/soldier/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/soldier/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/soldier/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/soldier/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/sombra/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/sombra/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/sombra/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/sombra/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/sombra/translocator.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/sombra/translocator.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/sombra/translocator.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/sombra/translocator.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/symmetra/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/symmetra/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/symmetra/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/symmetra/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/torbjorn/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/torbjorn/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/torbjorn/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/torbjorn/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/tracer/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/tracer/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/tracer/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/tracer/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/vendetta/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/vendetta/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/vendetta/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/vendetta/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/venture/burrow.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/venture/burrow.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/venture/burrow.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/venture/burrow.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/venture/clobber.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/venture/clobber.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/venture/clobber.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/venture/clobber.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/venture/drill_dash.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/venture/drill_dash.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/venture/drill_dash.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/venture/drill_dash.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/venture/excavator.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/venture/excavator.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/venture/excavator.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/venture/excavator.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/venture/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/venture/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/venture/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/venture/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/venture/tectonic_shock.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/venture/tectonic_shock.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/venture/tectonic_shock.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/venture/tectonic_shock.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/widowmaker/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/widowmaker/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/widowmaker/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/widowmaker/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/winston/barrier.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/winston/barrier.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/winston/barrier.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/winston/barrier.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/winston/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/winston/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/winston/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/winston/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/winston/primal.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/winston/primal.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/winston/primal.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/winston/primal.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/wreckingball/grapple.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/wreckingball/grapple.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/wreckingball/grapple.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/wreckingball/grapple.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/wreckingball/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/wreckingball/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/wreckingball/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/wreckingball/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/wreckingball/piledriver.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/wreckingball/piledriver.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/wreckingball/piledriver.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/wreckingball/piledriver.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/wreckingball/shields.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/wreckingball/shields.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/wreckingball/shields.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/wreckingball/shields.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/wuyang/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/wuyang/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/wuyang/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/wuyang/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/zarya/ally_bubble.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/zarya/ally_bubble.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/zarya/ally_bubble.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/zarya/ally_bubble.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/zarya/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/zarya/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/zarya/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/zarya/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/zarya/self_bubble.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/zarya/self_bubble.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/zarya/self_bubble.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/zarya/self_bubble.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/zenyatta/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/zenyatta/init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/zenyatta/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/zenyatta/init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/heroes/zenyatta/transc.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/zenyatta/transc.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/heroes/zenyatta/transc.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/heroes/zenyatta/transc.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/lobby/lobby.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/lobby/lobby.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/lobby/lobby.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/lobby/lobby.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/main.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/main.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/main.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/main.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/oracle.json b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/oracle.json similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/oracle.json diff --git a/compatibility/fixtures/real-world/6v6-adjustments/passives/damage/damage_passive.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/passives/damage/damage_passive.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/passives/damage/damage_passive.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/passives/damage/damage_passive.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/passives/support/self_heal.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/passives/support/self_heal.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/passives/support/self_heal.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/passives/support/self_heal.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/passives/tank/knockback.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/passives/tank/knockback.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/passives/tank/knockback.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/passives/tank/knockback.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/passives/tank/ult_charge.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/passives/tank/ult_charge.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/passives/tank/ult_charge.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/passives/tank/ult_charge.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/regressions/get-horizontal-facing-angle.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/regressions/get-horizontal-facing-angle.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/regressions/get-horizontal-facing-angle.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/regressions/get-horizontal-facing-angle.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/utilities/anti_crash.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/anti_crash.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/utilities/anti_crash.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/anti_crash.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/utilities/custom_hp.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/custom_hp.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/utilities/custom_hp.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/custom_hp.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/utilities/hero_init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/hero_init.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/utilities/hero_init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/hero_init.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/utilities/hero_reset.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/hero_reset.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/utilities/hero_reset.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/hero_reset.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/utilities/hero_switch.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/hero_switch.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/utilities/hero_switch.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/hero_switch.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/utilities/macro_functions.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/macro_functions.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/utilities/macro_functions.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/macro_functions.opy diff --git a/compatibility/fixtures/real-world/6v6-adjustments/utilities/watermark.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/watermark.opy similarity index 100% rename from compatibility/fixtures/real-world/6v6-adjustments/utilities/watermark.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/6v6-adjustments/utilities/watermark.opy diff --git a/compatibility/fixtures/real-world/overpy-broken-weapons/broken_weapons.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-broken-weapons/broken_weapons.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-broken-weapons/broken_weapons.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-broken-weapons/broken_weapons.opy diff --git a/compatibility/fixtures/real-world/overpy-broken-weapons/fixture.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-broken-weapons/fixture.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-broken-weapons/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-broken-weapons/fixture.json diff --git a/compatibility/fixtures/real-world/overpy-broken-weapons/oracle.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-broken-weapons/oracle.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-broken-weapons/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-broken-weapons/oracle.json diff --git a/compatibility/fixtures/real-world/overpy-broken-weapons/regressions/numeric-range-setting.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-broken-weapons/regressions/numeric-range-setting.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-broken-weapons/regressions/numeric-range-setting.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-broken-weapons/regressions/numeric-range-setting.opy diff --git a/compatibility/fixtures/real-world/overpy-cake/fixture.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cake/fixture.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-cake/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cake/fixture.json diff --git a/compatibility/fixtures/real-world/overpy-cake/oracle.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cake/oracle.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-cake/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cake/oracle.json diff --git a/compatibility/fixtures/real-world/overpy-cake/source.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cake/source.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-cake/source.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cake/source.opy diff --git a/compatibility/fixtures/real-world/overpy-client-to-server/clientToServer.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-client-to-server/clientToServer.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-client-to-server/clientToServer.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-client-to-server/clientToServer.opy diff --git a/compatibility/fixtures/real-world/overpy-client-to-server/fixture.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-client-to-server/fixture.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-client-to-server/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-client-to-server/fixture.json diff --git a/compatibility/fixtures/real-world/overpy-client-to-server/oracle.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-client-to-server/oracle.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-client-to-server/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-client-to-server/oracle.json diff --git a/compatibility/fixtures/real-world/overpy-client-to-server/regressions/chained-ternary.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-client-to-server/regressions/chained-ternary.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-client-to-server/regressions/chained-ternary.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-client-to-server/regressions/chained-ternary.opy diff --git a/compatibility/fixtures/real-world/overpy-client-to-server/regressions/get-horizontal-facing-angle.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-client-to-server/regressions/get-horizontal-facing-angle.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-client-to-server/regressions/get-horizontal-facing-angle.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-client-to-server/regressions/get-horizontal-facing-angle.opy diff --git a/compatibility/fixtures/real-world/overpy-client-to-server/regressions/is-dummy.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-client-to-server/regressions/is-dummy.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-client-to-server/regressions/is-dummy.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-client-to-server/regressions/is-dummy.opy diff --git a/compatibility/fixtures/real-world/overpy-cronch/cronch.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cronch/cronch.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-cronch/cronch.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cronch/cronch.opy diff --git a/compatibility/fixtures/real-world/overpy-cronch/fixture.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cronch/fixture.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-cronch/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cronch/fixture.json diff --git a/compatibility/fixtures/real-world/overpy-cronch/oracle.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cronch/oracle.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-cronch/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cronch/oracle.json diff --git a/compatibility/fixtures/real-world/overpy-cronch/regressions/postfix-increment.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cronch/regressions/postfix-increment.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-cronch/regressions/postfix-increment.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-cronch/regressions/postfix-increment.opy diff --git a/compatibility/fixtures/real-world/overpy-crosshair/crosshair.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-crosshair/crosshair.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-crosshair/crosshair.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-crosshair/crosshair.opy diff --git a/compatibility/fixtures/real-world/overpy-crosshair/fixture.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-crosshair/fixture.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-crosshair/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-crosshair/fixture.json diff --git a/compatibility/fixtures/real-world/overpy-crosshair/oracle.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-crosshair/oracle.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-crosshair/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-crosshair/oracle.json diff --git a/compatibility/fixtures/real-world/overpy-crosshair/regressions/byte-string-modifier.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-crosshair/regressions/byte-string-modifier.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-crosshair/regressions/byte-string-modifier.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-crosshair/regressions/byte-string-modifier.opy diff --git a/compatibility/fixtures/real-world/overpy-inputhud/fixture.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-inputhud/fixture.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-inputhud/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-inputhud/fixture.json diff --git a/compatibility/fixtures/real-world/overpy-inputhud/inputhud.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-inputhud/inputhud.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-inputhud/inputhud.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-inputhud/inputhud.opy diff --git a/compatibility/fixtures/real-world/overpy-inputhud/oracle.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-inputhud/oracle.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-inputhud/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-inputhud/oracle.json diff --git a/compatibility/fixtures/real-world/overpy-inputhud/regressions/implicit-string-concatenation.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-inputhud/regressions/implicit-string-concatenation.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-inputhud/regressions/implicit-string-concatenation.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-inputhud/regressions/implicit-string-concatenation.opy diff --git a/compatibility/fixtures/real-world/overpy-meipocalypse/barricades.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/barricades.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-meipocalypse/barricades.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/barricades.opy diff --git a/compatibility/fixtures/real-world/overpy-meipocalypse/debug.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/debug.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-meipocalypse/debug.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/debug.opy diff --git a/compatibility/fixtures/real-world/overpy-meipocalypse/debug_settings.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/debug_settings.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-meipocalypse/debug_settings.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/debug_settings.opy diff --git a/compatibility/fixtures/real-world/overpy-meipocalypse/fightforyourlife.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/fightforyourlife.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-meipocalypse/fightforyourlife.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/fightforyourlife.opy diff --git a/compatibility/fixtures/real-world/overpy-meipocalypse/fixture.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/fixture.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-meipocalypse/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/fixture.json diff --git a/compatibility/fixtures/real-world/overpy-meipocalypse/heroUnlock.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/heroUnlock.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-meipocalypse/heroUnlock.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/heroUnlock.opy diff --git a/compatibility/fixtures/real-world/overpy-meipocalypse/mei_types.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/mei_types.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-meipocalypse/mei_types.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/mei_types.opy diff --git a/compatibility/fixtures/real-world/overpy-meipocalypse/meipocalypse.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/meipocalypse.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-meipocalypse/meipocalypse.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/meipocalypse.opy diff --git a/compatibility/fixtures/real-world/overpy-meipocalypse/oracle.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/oracle.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-meipocalypse/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/oracle.json diff --git a/compatibility/fixtures/real-world/overpy-meipocalypse/settings.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/settings.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-meipocalypse/settings.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/settings.opy diff --git a/compatibility/fixtures/real-world/overpy-meipocalypse/shop.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/shop.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-meipocalypse/shop.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/shop.opy diff --git a/compatibility/fixtures/real-world/overpy-meipocalypse/waves.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/waves.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-meipocalypse/waves.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/waves.opy diff --git a/compatibility/fixtures/real-world/overpy-meipocalypse/zones.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/zones.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-meipocalypse/zones.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-meipocalypse/zones.opy diff --git a/compatibility/fixtures/real-world/overpy-parabola/fixture.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-parabola/fixture.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-parabola/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-parabola/fixture.json diff --git a/compatibility/fixtures/real-world/overpy-parabola/oracle.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-parabola/oracle.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-parabola/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-parabola/oracle.json diff --git a/compatibility/fixtures/real-world/overpy-parabola/parabola.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-parabola/parabola.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-parabola/parabola.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-parabola/parabola.opy diff --git a/compatibility/fixtures/real-world/overpy-parabola/regressions/numeric-enum-member.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-parabola/regressions/numeric-enum-member.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-parabola/regressions/numeric-enum-member.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-parabola/regressions/numeric-enum-member.opy diff --git a/compatibility/fixtures/real-world/overpy-pixelart/fixture.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-pixelart/fixture.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-pixelart/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-pixelart/fixture.json diff --git a/compatibility/fixtures/real-world/overpy-pixelart/oracle.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-pixelart/oracle.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-pixelart/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-pixelart/oracle.json diff --git a/compatibility/fixtures/real-world/overpy-pixelart/pixelart.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-pixelart/pixelart.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-pixelart/pixelart.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-pixelart/pixelart.opy diff --git a/compatibility/fixtures/real-world/overpy-santa/fixture.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-santa/fixture.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-santa/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-santa/fixture.json diff --git a/compatibility/fixtures/real-world/overpy-santa/oracle.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-santa/oracle.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-santa/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-santa/oracle.json diff --git a/compatibility/fixtures/real-world/overpy-santa/regressions/postfix-increment.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-santa/regressions/postfix-increment.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-santa/regressions/postfix-increment.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-santa/regressions/postfix-increment.opy diff --git a/compatibility/fixtures/real-world/overpy-santa/santa.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-santa/santa.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-santa/santa.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-santa/santa.opy diff --git a/compatibility/fixtures/real-world/overpy-zencopter/fixture.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-zencopter/fixture.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-zencopter/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-zencopter/fixture.json diff --git a/compatibility/fixtures/real-world/overpy-zencopter/heli.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-zencopter/heli.opy similarity index 100% rename from compatibility/fixtures/real-world/overpy-zencopter/heli.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-zencopter/heli.opy diff --git a/compatibility/fixtures/real-world/overpy-zencopter/oracle.json b/crates/opy-rs/tests/fixtures/corpus/real-world/overpy-zencopter/oracle.json similarity index 100% rename from compatibility/fixtures/real-world/overpy-zencopter/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/overpy-zencopter/oracle.json diff --git a/compatibility/fixtures/real-world/ow1-emulator/1v1_main.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/1v1_main.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/1v1_main.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/1v1_main.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/common/constants/ow1_constants.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/common/constants/ow1_constants.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/common/constants/ow1_constants.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/common/constants/ow1_constants.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/common/constants/ow2_constants.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/common/constants/ow2_constants.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/common/constants/ow2_constants.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/common/constants/ow2_constants.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/common/env.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/common/env.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/common/env.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/common/env.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/common/macro_functions.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/common/macro_functions.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/common/macro_functions.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/common/macro_functions.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/fixture.json b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/fixture.json similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/fixture.json diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/ana/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ana/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/ana/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ana/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/ana/nade.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ana/nade.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/ana/nade.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ana/nade.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/ashe/bob.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ashe/bob.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/ashe/bob.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ashe/bob.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/ashe/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ashe/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/ashe/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ashe/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/ashe/viper.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ashe/viper.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/ashe/viper.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ashe/viper.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/baptiste/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/baptiste/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/baptiste/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/baptiste/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/baptiste/regen_burst.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/baptiste/regen_burst.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/baptiste/regen_burst.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/baptiste/regen_burst.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/configuration.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/configuration.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/configuration.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/configuration.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/machine_gun.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/machine_gun.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/machine_gun.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/machine_gun.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/recon.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/recon.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/recon.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/recon.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/repair.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/repair.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/repair.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/repair.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/sentry.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/sentry.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/sentry.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/sentry.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/tank.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/tank.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/bastion/tank.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/bastion/tank.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/brigitte/bash.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/brigitte/bash.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/brigitte/bash.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/brigitte/bash.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/brigitte/flail.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/brigitte/flail.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/brigitte/flail.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/brigitte/flail.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/brigitte/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/brigitte/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/brigitte/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/brigitte/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/brigitte/inspire.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/brigitte/inspire.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/brigitte/inspire.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/brigitte/inspire.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/brigitte/rally.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/brigitte/rally.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/brigitte/rally.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/brigitte/rally.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/brigitte/repair_pack.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/brigitte/repair_pack.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/brigitte/repair_pack.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/brigitte/repair_pack.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/cassidy/deadeye.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/cassidy/deadeye.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/cassidy/deadeye.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/cassidy/deadeye.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/cassidy/flashbang.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/cassidy/flashbang.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/cassidy/flashbang.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/cassidy/flashbang.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/cassidy/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/cassidy/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/cassidy/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/cassidy/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/cassidy/peacekeeper.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/cassidy/peacekeeper.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/cassidy/peacekeeper.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/cassidy/peacekeeper.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/cassidy/roll.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/cassidy/roll.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/cassidy/roll.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/cassidy/roll.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/cannon.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/cannon.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/cannon.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/cannon.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/defense.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/defense.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/defense.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/defense.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/meteor.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/meteor.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/meteor.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/meteor.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/punch.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/punch.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/punch.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/punch.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/slam.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/slam.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/slam.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/slam.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/uppercut.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/uppercut.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/doomfist/uppercut.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/doomfist/uppercut.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/dva/bomb.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/dva/bomb.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/dva/bomb.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/dva/bomb.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/dva/booster.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/dva/booster.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/dva/booster.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/dva/booster.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/dva/gun.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/dva/gun.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/dva/gun.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/dva/gun.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/dva/hp.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/dva/hp.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/dva/hp.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/dva/hp.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/dva/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/dva/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/dva/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/dva/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/dva/micro_missiles.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/dva/micro_missiles.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/dva/micro_missiles.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/dva/micro_missiles.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/echo/duplicate.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/echo/duplicate.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/echo/duplicate.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/echo/duplicate.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/echo/focusing_beam.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/echo/focusing_beam.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/echo/focusing_beam.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/echo/focusing_beam.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/echo/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/echo/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/echo/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/echo/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/genji/blade.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/genji/blade.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/genji/blade.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/genji/blade.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/genji/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/genji/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/genji/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/genji/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/hanzo/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/hanzo/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/hanzo/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/hanzo/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/hanzo/storm.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/hanzo/storm.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/hanzo/storm.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/hanzo/storm.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/illari/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/illari/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/illari/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/illari/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/illari/solar_rifle.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/illari/solar_rifle.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/illari/solar_rifle.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/illari/solar_rifle.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/illari/sun.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/illari/sun.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/illari/sun.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/illari/sun.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/junkerqueen/carnage.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/junkerqueen/carnage.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/junkerqueen/carnage.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/junkerqueen/carnage.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/junkerqueen/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/junkerqueen/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/junkerqueen/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/junkerqueen/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/junkrat/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/junkrat/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/junkrat/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/junkrat/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/junkrat/trap.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/junkrat/trap.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/junkrat/trap.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/junkrat/trap.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/kiriko/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/kiriko/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/kiriko/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/kiriko/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/kiriko/kunai.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/kiriko/kunai.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/kiriko/kunai.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/kiriko/kunai.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/kiriko/swift_step.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/kiriko/swift_step.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/kiriko/swift_step.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/kiriko/swift_step.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/lifeweaver/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/lifeweaver/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/lifeweaver/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/lifeweaver/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/lucio/crossfade.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/lucio/crossfade.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/lucio/crossfade.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/lucio/crossfade.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/lucio/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/lucio/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/lucio/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/lucio/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/mauga/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/mauga/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/mauga/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/mauga/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/mei/blaster.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/mei/blaster.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/mei/blaster.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/mei/blaster.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/mei/cryo_freeze.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/mei/cryo_freeze.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/mei/cryo_freeze.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/mei/cryo_freeze.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/mei/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/mei/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/mei/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/mei/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/mercy/guardian.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/mercy/guardian.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/mercy/guardian.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/mercy/guardian.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/mercy/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/mercy/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/mercy/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/mercy/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/moira/biotic_grasp.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/moira/biotic_grasp.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/moira/biotic_grasp.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/moira/biotic_grasp.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/moira/coalescence.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/moira/coalescence.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/moira/coalescence.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/moira/coalescence.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/moira/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/moira/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/moira/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/moira/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/orisa/barrier.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/orisa/barrier.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/orisa/barrier.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/orisa/barrier.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/orisa/fortify.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/orisa/fortify.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/orisa/fortify.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/orisa/fortify.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/orisa/fusion_driver.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/orisa/fusion_driver.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/orisa/fusion_driver.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/orisa/fusion_driver.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/orisa/halt.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/orisa/halt.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/orisa/halt.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/orisa/halt.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/orisa/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/orisa/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/orisa/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/orisa/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/orisa/supercharger.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/orisa/supercharger.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/orisa/supercharger.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/orisa/supercharger.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/pharah/barrage.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/pharah/barrage.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/pharah/barrage.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/pharah/barrage.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/pharah/concussive.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/pharah/concussive.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/pharah/concussive.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/pharah/concussive.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/pharah/hover_jets.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/pharah/hover_jets.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/pharah/hover_jets.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/pharah/hover_jets.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/pharah/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/pharah/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/pharah/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/pharah/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/pharah/rocket_launcher.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/pharah/rocket_launcher.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/pharah/rocket_launcher.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/pharah/rocket_launcher.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/ramattra/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ramattra/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/ramattra/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ramattra/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/ramattra/nemesis.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ramattra/nemesis.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/ramattra/nemesis.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ramattra/nemesis.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/ramattra/vortex.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ramattra/vortex.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/ramattra/vortex.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/ramattra/vortex.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/reaper/blossom.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reaper/blossom.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/reaper/blossom.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reaper/blossom.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/reaper/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reaper/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/reaper/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reaper/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/reaper/shadowstep.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reaper/shadowstep.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/reaper/shadowstep.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reaper/shadowstep.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/reinhardt/charge.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reinhardt/charge.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/reinhardt/charge.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reinhardt/charge.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/reinhardt/firestrike.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reinhardt/firestrike.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/reinhardt/firestrike.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reinhardt/firestrike.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/reinhardt/hammer.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reinhardt/hammer.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/reinhardt/hammer.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reinhardt/hammer.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/reinhardt/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reinhardt/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/reinhardt/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reinhardt/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/reinhardt/shatter.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reinhardt/shatter.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/reinhardt/shatter.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/reinhardt/shatter.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/roadhog/breather.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/roadhog/breather.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/roadhog/breather.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/roadhog/breather.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/roadhog/hook.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/roadhog/hook.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/roadhog/hook.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/roadhog/hook.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/roadhog/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/roadhog/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/roadhog/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/roadhog/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/roadhog/wholehog.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/roadhog/wholehog.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/roadhog/wholehog.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/roadhog/wholehog.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/sigma/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sigma/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/sigma/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sigma/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/sojourn/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sojourn/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/sojourn/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sojourn/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/sojourn/railgun.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sojourn/railgun.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/sojourn/railgun.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sojourn/railgun.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/soldier/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/soldier/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/soldier/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/soldier/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/soldier/pulse_rifle.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/soldier/pulse_rifle.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/soldier/pulse_rifle.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/soldier/pulse_rifle.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/soldier/sprint.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/soldier/sprint.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/soldier/sprint.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/soldier/sprint.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/sombra/emp.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sombra/emp.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/sombra/emp.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sombra/emp.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/sombra/hack.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sombra/hack.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/sombra/hack.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sombra/hack.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/sombra/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sombra/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/sombra/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sombra/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/sombra/stealth.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sombra/stealth.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/sombra/stealth.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sombra/stealth.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/sombra/translocator.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sombra/translocator.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/sombra/translocator.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/sombra/translocator.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/symmetra/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/symmetra/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/symmetra/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/symmetra/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/symmetra/orb.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/symmetra/orb.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/symmetra/orb.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/symmetra/orb.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/symmetra/projector.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/symmetra/projector.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/symmetra/projector.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/symmetra/projector.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/symmetra/teleporter.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/symmetra/teleporter.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/symmetra/teleporter.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/symmetra/teleporter.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/torbjorn/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/torbjorn/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/torbjorn/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/torbjorn/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/torbjorn/overload.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/torbjorn/overload.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/torbjorn/overload.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/torbjorn/overload.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/tracer/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/tracer/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/tracer/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/tracer/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/tracer/pulse_pistol.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/tracer/pulse_pistol.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/tracer/pulse_pistol.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/tracer/pulse_pistol.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/venture/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/venture/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/venture/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/venture/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/widowmaker/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/widowmaker/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/widowmaker/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/widowmaker/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/winston/barrier.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/winston/barrier.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/winston/barrier.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/winston/barrier.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/winston/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/winston/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/winston/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/winston/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/winston/leap.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/winston/leap.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/winston/leap.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/winston/leap.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/wreckingball/adaptive_shield.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/wreckingball/adaptive_shield.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/wreckingball/adaptive_shield.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/wreckingball/adaptive_shield.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/wreckingball/grapple.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/wreckingball/grapple.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/wreckingball/grapple.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/wreckingball/grapple.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/wreckingball/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/wreckingball/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/wreckingball/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/wreckingball/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/zarya/ally_bubble.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/zarya/ally_bubble.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/zarya/ally_bubble.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/zarya/ally_bubble.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/zarya/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/zarya/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/zarya/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/zarya/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/zarya/self_bubble.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/zarya/self_bubble.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/zarya/self_bubble.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/zarya/self_bubble.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/heroes/zenyatta/init.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/zenyatta/init.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/heroes/zenyatta/init.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/heroes/zenyatta/init.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/misc/arena.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/misc/arena.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/misc/arena.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/misc/arena.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/oracle.json b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/oracle.json similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/oracle.json diff --git a/compatibility/fixtures/real-world/ow1-emulator/passives/global/global_passive.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/passives/global/global_passive.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/passives/global/global_passive.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/passives/global/global_passive.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/passives/support/self_heal.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/passives/support/self_heal.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/passives/support/self_heal.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/passives/support/self_heal.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/passives/tank/ult_charge.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/passives/tank/ult_charge.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/passives/tank/ult_charge.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/passives/tank/ult_charge.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/utilities/anti_crash.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/anti_crash.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/utilities/anti_crash.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/anti_crash.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/utilities/custom_hp.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/custom_hp.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/utilities/custom_hp.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/custom_hp.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/utilities/emu_helper.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/emu_helper.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/utilities/emu_helper.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/emu_helper.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/utilities/hero_roster.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/hero_roster.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/utilities/hero_roster.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/hero_roster.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/utilities/hero_switch.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/hero_switch.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/utilities/hero_switch.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/hero_switch.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/utilities/hit_detection.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/hit_detection.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/utilities/hit_detection.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/hit_detection.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/utilities/ready.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/ready.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/utilities/ready.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/ready.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/utilities/reset.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/reset.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/utilities/reset.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/reset.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/utilities/role_lock.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/role_lock.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/utilities/role_lock.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/role_lock.opy diff --git a/compatibility/fixtures/real-world/ow1-emulator/utilities/watermark.opy b/crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/watermark.opy similarity index 100% rename from compatibility/fixtures/real-world/ow1-emulator/utilities/watermark.opy rename to crates/opy-rs/tests/fixtures/corpus/real-world/ow1-emulator/utilities/watermark.opy diff --git a/compatibility/fixtures/synthetic/basic-rule/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/basic-rule/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/basic-rule/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/basic-rule/fixture.json diff --git a/compatibility/fixtures/synthetic/basic-rule/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/basic-rule/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/basic-rule/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/basic-rule/oracle.json diff --git a/compatibility/fixtures/synthetic/basic-rule/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/basic-rule/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/basic-rule/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/basic-rule/source.opy diff --git a/compatibility/fixtures/synthetic/chase-condition-agentlab/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/chase-condition-agentlab/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/chase-condition-agentlab/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/chase-condition-agentlab/fixture.json diff --git a/compatibility/fixtures/synthetic/chase-condition-agentlab/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/chase-condition-agentlab/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/chase-condition-agentlab/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/chase-condition-agentlab/oracle.json diff --git a/compatibility/fixtures/synthetic/chase-condition-agentlab/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/chase-condition-agentlab/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/chase-condition-agentlab/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/chase-condition-agentlab/source.opy diff --git a/compatibility/fixtures/synthetic/chase-enums/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/chase-enums/fixture.json similarity index 87% rename from compatibility/fixtures/synthetic/chase-enums/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/chase-enums/fixture.json index ae48239..c94213d 100644 --- a/compatibility/fixtures/synthetic/chase-enums/fixture.json +++ b/crates/opy-rs/tests/fixtures/corpus/synthetic/chase-enums/fixture.json @@ -11,5 +11,5 @@ "license": "AGPL-3.0-or-later", "redistributable": true }, - "provenanceNote": "Synthetic-original source authored by Wright for the corpus. It reproduces the ChaseTimeReeval.NONE usage discovered in wrightkit/agent-lab tools/test/fixtures/analyzer/chase-condition.opy (blob SHA 2938baff2bac77f8818309ac1e356cf5b9e15d56) in a fully supported native-source implementation context (assignments), because agent-lab declares no redistribution license and its source stays out of the corpus. Member spellings and emitted Workshop text were reference-validated against the pinned OverPy 9.7.10 oracle (see docs/opy/support-matrix.md and crates/wright-workshop/src/catalog/data/catalog.json provenance)." + "provenanceNote": "Synthetic-original source authored by Wright for the corpus. It reproduces the ChaseTimeReeval.NONE usage discovered in wrightkit/agent-lab tools/test/fixtures/analyzer/chase-condition.opy (blob SHA 2938baff2bac77f8818309ac1e356cf5b9e15d56) in a fully supported native-source implementation context (assignments), because agent-lab declares no redistribution license and its source stays out of the corpus. Member spellings and emitted Workshop text were reference-validated against the pinned OverPy 9.7.10 oracle (see docs/language-support.md and crates/wright-workshop/src/catalog/data/catalog.json provenance)." } diff --git a/compatibility/fixtures/synthetic/chase-enums/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/chase-enums/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/chase-enums/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/chase-enums/oracle.json diff --git a/compatibility/fixtures/synthetic/chase-enums/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/chase-enums/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/chase-enums/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/chase-enums/source.opy diff --git a/compatibility/fixtures/synthetic/chase-keywords/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/chase-keywords/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/chase-keywords/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/chase-keywords/fixture.json diff --git a/compatibility/fixtures/synthetic/chase-keywords/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/chase-keywords/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/chase-keywords/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/chase-keywords/oracle.json diff --git a/compatibility/fixtures/synthetic/chase-keywords/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/chase-keywords/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/chase-keywords/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/chase-keywords/source.opy diff --git a/compatibility/fixtures/synthetic/compiler-structure/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/compiler-structure/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/compiler-structure/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/compiler-structure/fixture.json diff --git a/compatibility/fixtures/synthetic/compiler-structure/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/compiler-structure/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/compiler-structure/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/compiler-structure/oracle.json diff --git a/compatibility/fixtures/synthetic/compiler-structure/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/compiler-structure/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/compiler-structure/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/compiler-structure/source.opy diff --git a/compatibility/fixtures/synthetic/compiler-vertical-slice/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/compiler-vertical-slice/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/compiler-vertical-slice/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/compiler-vertical-slice/fixture.json diff --git a/compatibility/fixtures/synthetic/compiler-vertical-slice/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/compiler-vertical-slice/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/compiler-vertical-slice/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/compiler-vertical-slice/oracle.json diff --git a/compatibility/fixtures/synthetic/compiler-vertical-slice/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/compiler-vertical-slice/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/compiler-vertical-slice/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/compiler-vertical-slice/source.opy diff --git a/compatibility/fixtures/synthetic/control-flow-lowering/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/control-flow-lowering/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/control-flow-lowering/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/control-flow-lowering/fixture.json diff --git a/compatibility/fixtures/synthetic/control-flow-lowering/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/control-flow-lowering/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/control-flow-lowering/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/control-flow-lowering/oracle.json diff --git a/compatibility/fixtures/synthetic/control-flow-lowering/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/control-flow-lowering/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/control-flow-lowering/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/control-flow-lowering/source.opy diff --git a/compatibility/fixtures/synthetic/control-flow/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/control-flow/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/control-flow/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/control-flow/fixture.json diff --git a/compatibility/fixtures/synthetic/control-flow/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/control-flow/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/control-flow/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/control-flow/oracle.json diff --git a/compatibility/fixtures/synthetic/control-flow/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/control-flow/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/control-flow/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/control-flow/source.opy diff --git a/compatibility/fixtures/synthetic/declarations-numbers/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/declarations-numbers/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/declarations-numbers/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/declarations-numbers/fixture.json diff --git a/compatibility/fixtures/synthetic/declarations-numbers/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/declarations-numbers/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/declarations-numbers/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/declarations-numbers/oracle.json diff --git a/compatibility/fixtures/synthetic/declarations-numbers/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/declarations-numbers/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/declarations-numbers/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/declarations-numbers/source.opy diff --git a/compatibility/fixtures/synthetic/declarations-rules/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/declarations-rules/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/declarations-rules/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/declarations-rules/fixture.json diff --git a/compatibility/fixtures/synthetic/declarations-rules/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/declarations-rules/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/declarations-rules/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/declarations-rules/oracle.json diff --git a/compatibility/fixtures/synthetic/declarations-rules/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/declarations-rules/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/declarations-rules/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/declarations-rules/source.opy diff --git a/compatibility/fixtures/synthetic/diagnostics/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/diagnostics/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/diagnostics/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/diagnostics/fixture.json diff --git a/compatibility/fixtures/synthetic/diagnostics/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/diagnostics/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/diagnostics/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/diagnostics/oracle.json diff --git a/compatibility/fixtures/synthetic/diagnostics/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/diagnostics/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/diagnostics/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/diagnostics/source.opy diff --git a/compatibility/fixtures/synthetic/dictionary-lookup/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/dictionary-lookup/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/dictionary-lookup/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/dictionary-lookup/fixture.json diff --git a/compatibility/fixtures/synthetic/dictionary-lookup/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/dictionary-lookup/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/dictionary-lookup/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/dictionary-lookup/oracle.json diff --git a/compatibility/fixtures/synthetic/dictionary-lookup/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/dictionary-lookup/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/dictionary-lookup/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/dictionary-lookup/source.opy diff --git a/compatibility/fixtures/synthetic/directives-scoped/child.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/directives-scoped/child.opy similarity index 100% rename from compatibility/fixtures/synthetic/directives-scoped/child.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/directives-scoped/child.opy diff --git a/compatibility/fixtures/synthetic/directives-scoped/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/directives-scoped/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/directives-scoped/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/directives-scoped/fixture.json diff --git a/compatibility/fixtures/synthetic/directives-scoped/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/directives-scoped/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/directives-scoped/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/directives-scoped/oracle.json diff --git a/compatibility/fixtures/synthetic/directives-scoped/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/directives-scoped/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/directives-scoped/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/directives-scoped/source.opy diff --git a/compatibility/fixtures/synthetic/directives/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/directives/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/directives/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/directives/fixture.json diff --git a/compatibility/fixtures/synthetic/directives/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/directives/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/directives/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/directives/oracle.json diff --git a/compatibility/fixtures/synthetic/directives/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/directives/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/directives/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/directives/source.opy diff --git a/compatibility/fixtures/synthetic/do-while-break/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/do-while-break/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/do-while-break/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/do-while-break/fixture.json diff --git a/compatibility/fixtures/synthetic/do-while-break/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/do-while-break/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/do-while-break/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/do-while-break/oracle.json diff --git a/compatibility/fixtures/synthetic/do-while-break/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/do-while-break/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/do-while-break/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/do-while-break/source.opy diff --git a/compatibility/fixtures/synthetic/do-while-invalid/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/do-while-invalid/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/do-while-invalid/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/do-while-invalid/fixture.json diff --git a/compatibility/fixtures/synthetic/do-while-invalid/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/do-while-invalid/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/do-while-invalid/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/do-while-invalid/oracle.json diff --git a/compatibility/fixtures/synthetic/do-while-invalid/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/do-while-invalid/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/do-while-invalid/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/do-while-invalid/source.opy diff --git a/compatibility/fixtures/synthetic/duplicate-rule-diagnostic/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/duplicate-rule-diagnostic/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/duplicate-rule-diagnostic/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/duplicate-rule-diagnostic/fixture.json diff --git a/compatibility/fixtures/synthetic/duplicate-rule-diagnostic/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/duplicate-rule-diagnostic/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/duplicate-rule-diagnostic/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/duplicate-rule-diagnostic/oracle.json diff --git a/compatibility/fixtures/synthetic/duplicate-rule-diagnostic/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/duplicate-rule-diagnostic/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/duplicate-rule-diagnostic/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/duplicate-rule-diagnostic/source.opy diff --git a/compatibility/fixtures/synthetic/expressions-values/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/expressions-values/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/expressions-values/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/expressions-values/fixture.json diff --git a/compatibility/fixtures/synthetic/expressions-values/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/expressions-values/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/expressions-values/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/expressions-values/oracle.json diff --git a/compatibility/fixtures/synthetic/expressions-values/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/expressions-values/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/expressions-values/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/expressions-values/source.opy diff --git a/compatibility/fixtures/synthetic/for-range-agentlab/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/for-range-agentlab/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/for-range-agentlab/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/for-range-agentlab/fixture.json diff --git a/compatibility/fixtures/synthetic/for-range-agentlab/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/for-range-agentlab/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/for-range-agentlab/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/for-range-agentlab/oracle.json diff --git a/compatibility/fixtures/synthetic/for-range-agentlab/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/for-range-agentlab/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/for-range-agentlab/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/for-range-agentlab/source.opy diff --git a/compatibility/fixtures/synthetic/hud-subheader/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/hud-subheader/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/hud-subheader/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/hud-subheader/fixture.json diff --git a/compatibility/fixtures/synthetic/hud-subheader/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/hud-subheader/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/hud-subheader/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/hud-subheader/oracle.json diff --git a/compatibility/fixtures/synthetic/hud-subheader/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/hud-subheader/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/hud-subheader/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/hud-subheader/source.opy diff --git a/compatibility/fixtures/synthetic/hud-visibility/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/hud-visibility/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/hud-visibility/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/hud-visibility/fixture.json diff --git a/compatibility/fixtures/synthetic/hud-visibility/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/hud-visibility/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/hud-visibility/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/hud-visibility/oracle.json diff --git a/compatibility/fixtures/synthetic/hud-visibility/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/hud-visibility/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/hud-visibility/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/hud-visibility/source.opy diff --git a/compatibility/fixtures/synthetic/include-scope/child.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/include-scope/child.opy similarity index 100% rename from compatibility/fixtures/synthetic/include-scope/child.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/include-scope/child.opy diff --git a/compatibility/fixtures/synthetic/include-scope/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/include-scope/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/include-scope/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/include-scope/fixture.json diff --git a/compatibility/fixtures/synthetic/include-scope/grandchild.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/include-scope/grandchild.opy similarity index 100% rename from compatibility/fixtures/synthetic/include-scope/grandchild.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/include-scope/grandchild.opy diff --git a/compatibility/fixtures/synthetic/include-scope/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/include-scope/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/include-scope/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/include-scope/oracle.json diff --git a/compatibility/fixtures/synthetic/include-scope/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/include-scope/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/include-scope/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/include-scope/source.opy diff --git a/compatibility/fixtures/synthetic/indexed-assignment-4d-invalid/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/indexed-assignment-4d-invalid/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/indexed-assignment-4d-invalid/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/indexed-assignment-4d-invalid/fixture.json diff --git a/compatibility/fixtures/synthetic/indexed-assignment-4d-invalid/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/indexed-assignment-4d-invalid/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/indexed-assignment-4d-invalid/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/indexed-assignment-4d-invalid/oracle.json diff --git a/compatibility/fixtures/synthetic/indexed-assignment-4d-invalid/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/indexed-assignment-4d-invalid/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/indexed-assignment-4d-invalid/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/indexed-assignment-4d-invalid/source.opy diff --git a/compatibility/fixtures/synthetic/indexed-assignment-nested/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/indexed-assignment-nested/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/indexed-assignment-nested/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/indexed-assignment-nested/fixture.json diff --git a/compatibility/fixtures/synthetic/indexed-assignment-nested/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/indexed-assignment-nested/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/indexed-assignment-nested/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/indexed-assignment-nested/oracle.json diff --git a/compatibility/fixtures/synthetic/indexed-assignment-nested/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/indexed-assignment-nested/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/indexed-assignment-nested/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/indexed-assignment-nested/source.opy diff --git a/compatibility/fixtures/synthetic/lambda-invalid/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/lambda-invalid/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/lambda-invalid/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/lambda-invalid/fixture.json diff --git a/compatibility/fixtures/synthetic/lambda-invalid/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/lambda-invalid/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/lambda-invalid/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/lambda-invalid/oracle.json diff --git a/compatibility/fixtures/synthetic/lambda-invalid/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/lambda-invalid/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/lambda-invalid/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/lambda-invalid/source.opy diff --git a/compatibility/fixtures/synthetic/member-angle/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/member-angle/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/member-angle/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/member-angle/fixture.json diff --git a/compatibility/fixtures/synthetic/member-angle/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/member-angle/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/member-angle/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/member-angle/oracle.json diff --git a/compatibility/fixtures/synthetic/member-angle/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/member-angle/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/member-angle/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/member-angle/source.opy diff --git a/compatibility/fixtures/synthetic/member-values/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/member-values/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/member-values/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/member-values/fixture.json diff --git a/compatibility/fixtures/synthetic/member-values/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/member-values/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/member-values/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/member-values/oracle.json diff --git a/compatibility/fixtures/synthetic/member-values/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/member-values/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/member-values/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/member-values/source.opy diff --git a/compatibility/fixtures/synthetic/postfix-assignment/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-assignment/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/postfix-assignment/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-assignment/fixture.json diff --git a/compatibility/fixtures/synthetic/postfix-assignment/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-assignment/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/postfix-assignment/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-assignment/oracle.json diff --git a/compatibility/fixtures/synthetic/postfix-assignment/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-assignment/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/postfix-assignment/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-assignment/source.opy diff --git a/compatibility/fixtures/synthetic/postfix-embedded-invalid/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-embedded-invalid/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/postfix-embedded-invalid/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-embedded-invalid/fixture.json diff --git a/compatibility/fixtures/synthetic/postfix-embedded-invalid/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-embedded-invalid/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/postfix-embedded-invalid/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-embedded-invalid/oracle.json diff --git a/compatibility/fixtures/synthetic/postfix-embedded-invalid/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-embedded-invalid/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/postfix-embedded-invalid/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-embedded-invalid/source.opy diff --git a/compatibility/fixtures/synthetic/postfix-prefix-invalid/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-prefix-invalid/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/postfix-prefix-invalid/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-prefix-invalid/fixture.json diff --git a/compatibility/fixtures/synthetic/postfix-prefix-invalid/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-prefix-invalid/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/postfix-prefix-invalid/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-prefix-invalid/oracle.json diff --git a/compatibility/fixtures/synthetic/postfix-prefix-invalid/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-prefix-invalid/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/postfix-prefix-invalid/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/postfix-prefix-invalid/source.opy diff --git a/compatibility/fixtures/synthetic/preprocessing/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/preprocessing/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/preprocessing/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/preprocessing/fixture.json diff --git a/compatibility/fixtures/synthetic/preprocessing/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/preprocessing/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/preprocessing/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/preprocessing/oracle.json diff --git a/compatibility/fixtures/synthetic/preprocessing/shared.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/preprocessing/shared.opy similarity index 100% rename from compatibility/fixtures/synthetic/preprocessing/shared.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/preprocessing/shared.opy diff --git a/compatibility/fixtures/synthetic/preprocessing/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/preprocessing/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/preprocessing/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/preprocessing/source.opy diff --git a/compatibility/fixtures/synthetic/primitive-lowering/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/primitive-lowering/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/primitive-lowering/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/primitive-lowering/fixture.json diff --git a/compatibility/fixtures/synthetic/primitive-lowering/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/primitive-lowering/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/primitive-lowering/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/primitive-lowering/oracle.json diff --git a/compatibility/fixtures/synthetic/primitive-lowering/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/primitive-lowering/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/primitive-lowering/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/primitive-lowering/source.opy diff --git a/compatibility/fixtures/synthetic/project-entry/child.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/project-entry/child.opy similarity index 100% rename from compatibility/fixtures/synthetic/project-entry/child.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/project-entry/child.opy diff --git a/compatibility/fixtures/synthetic/project-entry/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/project-entry/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/project-entry/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/project-entry/fixture.json diff --git a/compatibility/fixtures/synthetic/project-entry/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/project-entry/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/project-entry/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/project-entry/oracle.json diff --git a/compatibility/fixtures/synthetic/project-entry/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/project-entry/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/project-entry/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/project-entry/source.opy diff --git a/compatibility/fixtures/synthetic/project-main-file/child.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/project-main-file/child.opy similarity index 100% rename from compatibility/fixtures/synthetic/project-main-file/child.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/project-main-file/child.opy diff --git a/compatibility/fixtures/synthetic/project-main-file/entry.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/project-main-file/entry.opy similarity index 100% rename from compatibility/fixtures/synthetic/project-main-file/entry.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/project-main-file/entry.opy diff --git a/compatibility/fixtures/synthetic/project-main-file/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/project-main-file/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/project-main-file/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/project-main-file/fixture.json diff --git a/compatibility/fixtures/synthetic/project-main-file/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/project-main-file/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/project-main-file/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/project-main-file/oracle.json diff --git a/compatibility/fixtures/synthetic/project-main-file/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/project-main-file/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/project-main-file/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/project-main-file/source.opy diff --git a/compatibility/fixtures/synthetic/range-invalid-binder/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/range-invalid-binder/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/range-invalid-binder/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/range-invalid-binder/fixture.json diff --git a/compatibility/fixtures/synthetic/range-invalid-binder/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/range-invalid-binder/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/range-invalid-binder/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/range-invalid-binder/oracle.json diff --git a/compatibility/fixtures/synthetic/range-invalid-binder/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/range-invalid-binder/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/range-invalid-binder/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/range-invalid-binder/source.opy diff --git a/compatibility/fixtures/synthetic/range-player-variable/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/range-player-variable/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/range-player-variable/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/range-player-variable/fixture.json diff --git a/compatibility/fixtures/synthetic/range-player-variable/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/range-player-variable/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/range-player-variable/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/range-player-variable/oracle.json diff --git a/compatibility/fixtures/synthetic/range-player-variable/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/range-player-variable/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/range-player-variable/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/range-player-variable/source.opy diff --git a/compatibility/fixtures/synthetic/receiver-calls/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/receiver-calls/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/receiver-calls/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/receiver-calls/fixture.json diff --git a/compatibility/fixtures/synthetic/receiver-calls/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/receiver-calls/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/receiver-calls/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/receiver-calls/oracle.json diff --git a/compatibility/fixtures/synthetic/receiver-calls/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/receiver-calls/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/receiver-calls/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/receiver-calls/source.opy diff --git a/compatibility/fixtures/synthetic/receiver-playervar/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/receiver-playervar/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/receiver-playervar/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/receiver-playervar/fixture.json diff --git a/compatibility/fixtures/synthetic/receiver-playervar/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/receiver-playervar/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/receiver-playervar/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/receiver-playervar/oracle.json diff --git a/compatibility/fixtures/synthetic/receiver-playervar/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/receiver-playervar/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/receiver-playervar/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/receiver-playervar/source.opy diff --git a/compatibility/fixtures/synthetic/settings/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/settings/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/settings/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/settings/fixture.json diff --git a/compatibility/fixtures/synthetic/settings/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/settings/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/settings/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/settings/oracle.json diff --git a/compatibility/fixtures/synthetic/settings/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/settings/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/settings/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/settings/source.opy diff --git a/compatibility/fixtures/synthetic/string-modifiers/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/string-modifiers/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/string-modifiers/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/string-modifiers/fixture.json diff --git a/compatibility/fixtures/synthetic/string-modifiers/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/string-modifiers/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/string-modifiers/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/string-modifiers/oracle.json diff --git a/compatibility/fixtures/synthetic/string-modifiers/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/string-modifiers/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/string-modifiers/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/string-modifiers/source.opy diff --git a/compatibility/fixtures/synthetic/strings-and-lambda/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/strings-and-lambda/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/strings-and-lambda/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/strings-and-lambda/fixture.json diff --git a/compatibility/fixtures/synthetic/strings-and-lambda/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/strings-and-lambda/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/strings-and-lambda/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/strings-and-lambda/oracle.json diff --git a/compatibility/fixtures/synthetic/strings-and-lambda/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/strings-and-lambda/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/strings-and-lambda/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/strings-and-lambda/source.opy diff --git a/compatibility/fixtures/synthetic/switch-break-unsupported/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-break-unsupported/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/switch-break-unsupported/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-break-unsupported/fixture.json diff --git a/compatibility/fixtures/synthetic/switch-break-unsupported/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-break-unsupported/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/switch-break-unsupported/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-break-unsupported/oracle.json diff --git a/compatibility/fixtures/synthetic/switch-break-unsupported/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-break-unsupported/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/switch-break-unsupported/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-break-unsupported/source.opy diff --git a/compatibility/fixtures/synthetic/switch-break/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-break/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/switch-break/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-break/fixture.json diff --git a/compatibility/fixtures/synthetic/switch-break/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-break/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/switch-break/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-break/oracle.json diff --git a/compatibility/fixtures/synthetic/switch-break/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-break/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/switch-break/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-break/source.opy diff --git a/compatibility/fixtures/synthetic/switch-multiple-break/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-multiple-break/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/switch-multiple-break/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-multiple-break/fixture.json diff --git a/compatibility/fixtures/synthetic/switch-multiple-break/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-multiple-break/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/switch-multiple-break/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-multiple-break/oracle.json diff --git a/compatibility/fixtures/synthetic/switch-multiple-break/semantic-oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-multiple-break/semantic-oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/switch-multiple-break/semantic-oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-multiple-break/semantic-oracle.json diff --git a/compatibility/fixtures/synthetic/switch-multiple-break/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-multiple-break/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/switch-multiple-break/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-multiple-break/source.opy diff --git a/compatibility/fixtures/synthetic/switch-order/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-order/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/switch-order/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-order/fixture.json diff --git a/compatibility/fixtures/synthetic/switch-order/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-order/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/switch-order/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-order/oracle.json diff --git a/compatibility/fixtures/synthetic/switch-order/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-order/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/switch-order/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-order/source.opy diff --git a/compatibility/fixtures/synthetic/switch-structured-target/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-structured-target/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/switch-structured-target/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-structured-target/fixture.json diff --git a/compatibility/fixtures/synthetic/switch-structured-target/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-structured-target/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/switch-structured-target/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-structured-target/oracle.json diff --git a/compatibility/fixtures/synthetic/switch-structured-target/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/switch-structured-target/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/switch-structured-target/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/switch-structured-target/source.opy diff --git a/compatibility/fixtures/synthetic/syntax-invalid/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/syntax-invalid/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/syntax-invalid/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/syntax-invalid/fixture.json diff --git a/compatibility/fixtures/synthetic/syntax-invalid/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/syntax-invalid/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/syntax-invalid/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/syntax-invalid/oracle.json diff --git a/compatibility/fixtures/synthetic/syntax-invalid/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/syntax-invalid/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/syntax-invalid/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/syntax-invalid/source.opy diff --git a/compatibility/fixtures/synthetic/syntax-surface/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/syntax-surface/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/syntax-surface/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/syntax-surface/fixture.json diff --git a/compatibility/fixtures/synthetic/syntax-surface/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/syntax-surface/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/syntax-surface/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/syntax-surface/oracle.json diff --git a/compatibility/fixtures/synthetic/syntax-surface/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/syntax-surface/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/syntax-surface/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/syntax-surface/source.opy diff --git a/compatibility/fixtures/synthetic/translations-invalid/fixture.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/translations-invalid/fixture.json similarity index 100% rename from compatibility/fixtures/synthetic/translations-invalid/fixture.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/translations-invalid/fixture.json diff --git a/compatibility/fixtures/synthetic/translations-invalid/oracle.json b/crates/opy-rs/tests/fixtures/corpus/synthetic/translations-invalid/oracle.json similarity index 100% rename from compatibility/fixtures/synthetic/translations-invalid/oracle.json rename to crates/opy-rs/tests/fixtures/corpus/synthetic/translations-invalid/oracle.json diff --git a/compatibility/fixtures/synthetic/translations-invalid/source.opy b/crates/opy-rs/tests/fixtures/corpus/synthetic/translations-invalid/source.opy similarity index 100% rename from compatibility/fixtures/synthetic/translations-invalid/source.opy rename to crates/opy-rs/tests/fixtures/corpus/synthetic/translations-invalid/source.opy diff --git a/docs/README.md b/docs/README.md index df382d1..7969579 100644 --- a/docs/README.md +++ b/docs/README.md @@ -28,8 +28,8 @@ architecture, compatibility evidence, APIs, and internal contracts live here. oracle, failure-frontier, and canonical-WIR comparison contract. - [Upstream references](compatibility/upstream-references.md): pinned reference identity, provenance, licensing notes, and oracle boundaries. -- [Compatibility harness](../compatibility/README.md): fixtures, snapshots, - differential testing, and machine-readable support data. +- [OverPy evidence harness](../tools/overpy/README.md): oracle tooling, + snapshots, and differential testing. ## Internals diff --git a/docs/compatibility/upstream-references.md b/docs/compatibility/upstream-references.md index 8401d9b..34f8384 100644 --- a/docs/compatibility/upstream-references.md +++ b/docs/compatibility/upstream-references.md @@ -30,9 +30,9 @@ not legal advice and does not settle questions that require a qualified lawyer. | Repository | | | Pinned reference | npm `overpy@9.7.10` | | Content commit | `889d9749d1def17f146548cbddb94ea1ab015847` (git tag `v9.7.10`; byte-verified) | -| Registry integrity | `sha512-oX17nauJcPTaKIrRFY/rD0Rl8atqFUVv9Hg2TKH+A68/fC8+ZO344Mkd1A/Y0oOVp1hr5tktMBjzMEDDnMEYUw==` (recorded in `compatibility/oracle/oracle-metadata.json` and the lockfile) | +| Registry integrity | `sha512-oX17nauJcPTaKIrRFY/rD0Rl8atqFUVv9Hg2TKH+A68/fC8+ZO344Mkd1A/Y0oOVp1hr5tktMBjzMEDDnMEYUw==` (recorded in `tools/overpy/oracle/oracle-metadata.json` and the lockfile) | | Recorded `gitHead` | `1e2688954302a402d076944b46db07efb14d7b61`. npm's `gitHead` field lags the tarball content by one release; it is the `v9.7.9` tag commit and must **not** be treated as the content commit | -| License assumption | GPL-3.0-only (engineering assumption, not a legal conclusion; the npm `package.json` ships no `license` field, see `compatibility/oracle/oracle-metadata.json`) | +| License assumption | GPL-3.0-only (engineering assumption, not a legal conclusion; the npm `package.json` ships no `license` field, see `tools/overpy/oracle/oracle-metadata.json`) | | Language | en-US (Workshop locale for reference evidence) | The integrity hash pins the content. Reproduction uses the recorded identity, @@ -45,16 +45,16 @@ never `latest` or a range (see the pinning policy below). the pinned content commit `889d9749d1def17f146548cbddb94ea1ab015847` (tag `v9.7.10`). The durable record is the tarball integrity hash and the content commit, not any machine-specific extraction path. -* The npm package is installed separately into `compatibility/oracle/` via the +* The npm package is installed separately into `tools/overpy/oracle/` via the pinned `pnpm-lock.yaml`; `pnpm install` resolves `overpy@9.7.10` by its integrity hash. * The compatibility corpus was re-run against a fresh install of the pinned package on 2026-08-17; the fixture snapshots present at that date - (`compatibility/fixtures/**/oracle.json`) matched byte-for-byte. Each current + (`crates/opy-rs/tests/fixtures/corpus/**/oracle.json`) matched byte-for-byte. Each current fixture carries its own oracle snapshot from the same pinned package; rerun - `python3 compatibility/run_oracle.py` to re-verify the full corpus. + `python3 tools/overpy/run_oracle.py` to re-verify the full corpus. * The imported example fixtures were verified byte-identical to the pinned - tree's `examples/` content (see `compatibility/fixtures/README.md`). + tree's `examples/` content (see `crates/opy-rs/tests/fixtures/corpus/README.md`). ### Oracle role @@ -64,8 +64,8 @@ dependency of `opy-rs` and is never bundled into release artifacts. Concretely, it serves as: * the reference for S (syntax), D (diagnostic), and N (normalized-output) - evidence in the compatibility corpus (`compatibility/fixtures/**`, - `compatibility/oracle/`); + evidence in the compatibility corpus (`crates/opy-rs/tests/fixtures/corpus/**`, + `tools/overpy/oracle/`); * the source of systematic probe validation for the proactive compatibility baseline (see [`docs/opy/compatibility-baseline.md`](../opy/compatibility-baseline.md) and [`docs/opy/compat-manifest-spec.md`](../opy/compat-manifest-spec.md)); @@ -80,7 +80,7 @@ it serves as: The harness invokes the oracle only through documented, isolated entry points: -* **CLI** (`compatibility/run_oracle.py`, run with cwd = `compatibility/oracle/`): +* **CLI** (`tools/overpy/run_oracle.py`, run with cwd = `tools/overpy/oracle/`): ```sh pnpm exec overpy compile --input --output \ @@ -109,7 +109,7 @@ grounded in the pinned tree, specifically: * `README.md`: user-visible syntax tour (rules, annotations, subroutines, macros, enums, settings) and advertised feature surface; -* `examples/`: real-world OPY corpus (see `compatibility/fixtures/README.md` +* `examples/`: real-world OPY corpus (see `crates/opy-rs/tests/fixtures/corpus/README.md` for the ported subset and the per-file mapping); * `src/tests/`: 60 `.opy` compile tests with 50 pinned result files plus 17 decompiler inputs (16 pinned results) covering arrays, macros, enums, @@ -142,7 +142,7 @@ component boundary (wright `docs/licensing.md`) and reference pinning policy | --- | --- | --- | | `opy-rs` core (lexer, preprocess, CST/parser, semantic resolution, HIR, diagnostics) | No | Independently implemented code. It must not link to the reference, copy its source, import its internal AST/types, or compile against its generated artifacts. | | Compatibility harness / oracle tool | Yes, for isolated evaluation | It may invoke a separately installed/pinned reference and compare documented or generated results. It must remain separable from the core build and runtime distribution. | -| Compatibility fixtures (upstream example/test corpus) | Only after provenance review | Provenance/license/redistribution-reviewed upstream example and test fixture files (e.g. the GPL-3.0 OverPy `examples/*.opy` corpus) may be retained under `compatibility/fixtures/` as documented, isolated oracle evidence, with per-file origin, license, redistribution status, byte-identity against the pinned content commit, and SHA-256 records (see the fixture corpus policy below). They are never imported by core code and never bundled into core builds or release artifacts. | +| Compatibility fixtures (upstream example/test corpus) | Only after provenance review | Provenance/license/redistribution-reviewed upstream example and test fixture files (e.g. the GPL-3.0 OverPy `examples/*.opy` corpus) may be retained under `crates/opy-rs/tests/fixtures/corpus/` as documented, isolated oracle evidence, with per-file origin, license, redistribution status, byte-identity against the pinned content commit, and SHA-256 records (see the fixture corpus policy below). They are never imported by core code and never bundled into core builds or release artifacts. | | Generated reference artifacts (oracle snapshots, manifests) | Only after provenance review | Store identifiers, hashes, generators, or reviewable artifacts only when their license and redistribution status are recorded. Do not add reference implementation/data content or unclear third-party content. | | CI and development scripts | Yes, when isolated | They may install or invoke a pinned external oracle for a compatibility check, but must not silently turn it into a core dependency or bundled release component. | @@ -153,12 +153,12 @@ or README and linked from this document before it is used. ### Fixture corpus policy -`compatibility/fixtures/` may retain provenance/license/redistribution-reviewed +`crates/opy-rs/tests/fixtures/corpus/` may retain provenance/license/redistribution-reviewed upstream example and test fixture files, e.g. the GPL-3.0 OverPy `examples/*.opy` corpus, as documented, isolated oracle evidence. Each imported file carries its per-file record (origin, license, redistribution status, byte-identity against the pinned content commit, SHA-256) in -`compatibility/fixtures/README.md` and its `fixture.json`; that record is +`crates/opy-rs/tests/fixtures/corpus/README.md` and its `fixture.json`; that record is authoritative and is not duplicated here. The fixture corpus is oracle evidence, not a core input: core code never imports it, and it is never bundled into core builds or release artifacts. Content with unclear @@ -204,8 +204,8 @@ The oracle pin is **version-exact and content-pinned**, and it is changed only on **demonstrated behavioral need**, never on release recency: 1. **Version-exact.** The pin is an exact npm version plus its integrity hash, - recorded in `compatibility/oracle/package.json`, - `compatibility/oracle/pnpm-lock.yaml`, and `oracle-metadata.json`. No range + recorded in `tools/overpy/oracle/package.json`, + `tools/overpy/oracle/pnpm-lock.yaml`, and `oracle-metadata.json`. No range specifiers, no `latest`, no caret. 2. **Content-pinned.** The recorded identity includes the npm integrity hash and the byte-verified git content commit. A version bump alone is not an @@ -257,7 +257,7 @@ when the oracle is absent. * **Round-trip boundary.** Emitted `settings` sections are deliberately not reparseable by the Workshop source implementation; a `.ws` decompiler is a non-goal for `opy-rs` (Workshop β†’ OPY decompilation is deferred to the `workshop-rs` - integration stage; see `support-matrix.md`). + integration stage; see `../language-support.md`). ## Related documents @@ -265,6 +265,6 @@ when the oracle is absent. * [`docs/opy/compatibility-baseline.md`](../opy/compatibility-baseline.md): tiered planning baseline * [`docs/opy/compat-manifest-spec.md`](../opy/compat-manifest-spec.md): machine-readable semantic manifest specification * [`docs/opy/tooling-notes.md`](../opy/tooling-notes.md): harness usage -* [`compatibility/README.md`](../../compatibility/README.md): oracle and fixture layout -* [`compatibility/fixtures/README.md`](../../compatibility/fixtures/README.md): corpus provenance +* [`tools/overpy/README.md`](../../tools/overpy/README.md): oracle and fixture layout +* [`crates/opy-rs/tests/fixtures/corpus/README.md`](../../crates/opy-rs/tests/fixtures/corpus/README.md): corpus provenance * WrightKit's policy sources this document adapts: `wright/docs/licensing.md`, wright ADR-0004 (OverPy licensing and clean-room boundary), ADR-0007 (reference pinning policy) diff --git a/docs/hir/opy-hir-v1.md b/docs/hir/opy-hir-v1.md index 6cb7279..03f0cb3 100644 --- a/docs/hir/opy-hir-v1.md +++ b/docs/hir/opy-hir-v1.md @@ -495,7 +495,7 @@ reason to extend the schema silently. [`upstream-references.md`](../compatibility/upstream-references.md)). * Changes to the node grammar require a review of this document, the source implementation producer, the Rust consumer, and the corpus fixtures together (see - [`docs/opy/support-matrix.md`](../opy/support-matrix.md) and + [`docs/language-support.md`](../language-support.md) and [`docs/compatibility/upstream-references.md`](../compatibility/upstream-references.md)). ## 13. Version history diff --git a/docs/language-support.md b/docs/language-support.md index dc7a8c6..836e174 100644 --- a/docs/language-support.md +++ b/docs/language-support.md @@ -3,9 +3,9 @@ This is the canonical, human-readable compatibility contract for `opy-rs`. The detailed inventories linked here are part of the same contract. The machine-readable leaf inventory is -[`compatibility/feature-contracts.json`](../compatibility/feature-contracts.json). -Its completeness is checked against the independent pinned-source catalog in -[`compatibility/pinned-overpy-audit.json`](../compatibility/pinned-overpy-audit.json). +[`feature-contracts.json`](language-support/feature-contracts.json). Its +completeness is checked against the independent pinned-source catalog in +[`pinned-overpy-audit.json`](language-support/pinned-overpy-audit.json). ## Reference and audit boundary @@ -23,7 +23,7 @@ The inventory was audited from the pinned upstream tree, from outside the surfaces; `src/data/opy/` keyword, annotation, builtin, member, module, macro and preprocessing registries; `src/data/` Workshop domains; upstream compile, decompile, CLI and QuickJS tests; and the pinned executable oracle. Existing -`opy-rs` fixtures, HIR names, support matrix entries and issue lists were used +`opy-rs` fixtures, HIR names, historical issue lists, and implementation notes were used only to determine the second column, never to construct the audited set. ## Status vocabulary @@ -57,12 +57,6 @@ explicit instead of hiding them in a category-level green row. ## Contract maintenance -`compatibility/support-matrix.json` is retained as **internal engineering -metadata** for fixture relationships, provenance and implementation tracking. -It is not a public inventory and its internal states are not public support -states. `docs/opy/support-matrix.md` is retained as historical context and -must not introduce another public status vocabulary. - The feature-contract validator expands every registry key into a leaf, checks the inventory pin against the conformance manifest, and can compare registry keys with a local checkout of the pinned source. The inventory is not a fixed diff --git a/compatibility/conformance-manifest.json b/docs/language-support/conformance-manifest.json similarity index 99% rename from compatibility/conformance-manifest.json rename to docs/language-support/conformance-manifest.json index e168d2f..978ba5d 100644 --- a/compatibility/conformance-manifest.json +++ b/docs/language-support/conformance-manifest.json @@ -403,7 +403,7 @@ "owner": "opy-rs", "authority": [ "OverPy@9.7.10:examples/", - "compatibility/fixtures/README.md" + "crates/opy-rs/tests/fixtures/corpus/README.md" ], "contracts": [ { @@ -453,7 +453,7 @@ "owner": "workshop-rs", "authority": [ "workshop-rs#10 feature census contract", - "compatibility/fixtures/census/workshop-feature-census/fixture.json" + "crates/opy-rs/tests/fixtures/corpus/census/workshop-feature-census/fixture.json" ], "contracts": [ { diff --git a/compatibility/feature-contracts.json b/docs/language-support/feature-contracts.json similarity index 99% rename from compatibility/feature-contracts.json rename to docs/language-support/feature-contracts.json index 94f819e..837a556 100644 --- a/compatibility/feature-contracts.json +++ b/docs/language-support/feature-contracts.json @@ -799,7 +799,7 @@ "status": "partial", "coverage": "partial", "production": [ - "compatibility/fixtures/README.md" + "crates/opy-rs/tests/fixtures/corpus/README.md" ], "evidence": [ "fixture:real-world/overpy-cake" diff --git a/compatibility/pinned-overpy-audit.json b/docs/language-support/pinned-overpy-audit.json similarity index 100% rename from compatibility/pinned-overpy-audit.json rename to docs/language-support/pinned-overpy-audit.json diff --git a/docs/language-support/registries.md b/docs/language-support/registries.md index 29a0ad6..5a8a62f 100644 --- a/docs/language-support/registries.md +++ b/docs/language-support/registries.md @@ -1,7 +1,7 @@ # OverPy audited registry notes The exact leaf inventory for the named upstream registries lives in -[`compatibility/feature-contracts.json`](../../compatibility/feature-contracts.json). +[`feature-contracts.json`](feature-contracts.json). This page provides human-readable compatibility notes; grouped aliases or notes below must not be used to reconstruct the source set. The upstream registry supplies the full argument order, argument type/domain, defaults, return behavior and diff --git a/docs/opy/architecture.md b/docs/opy/architecture.md index 210cc7d..926f063 100644 --- a/docs/opy/architecture.md +++ b/docs/opy/architecture.md @@ -6,8 +6,8 @@ Status: accepted living architecture. document describes its internal stages and its boundary with the canonical raw Workshop implementation in `workshop-rs`. See [`implementation-role.md`](implementation-role.md) for repository/product -terminology and [`support-matrix.md`](support-matrix.md) for current executable -coverage. +terminology and [`../language-support.md`](../language-support.md) for current +executable coverage. ## Pipeline @@ -48,7 +48,7 @@ OPY source The source path is implemented for the documented bounded compiler surface; the reconstruction module remains an owner-facing advanced surface while -broader decompilation support stays explicit in the support matrix. The tests +broader decompilation support stays explicit in the language-support contract. The tests and real-project evidence are the authority for current support rather than the intended pipeline alone. @@ -159,8 +159,8 @@ reconstruction. temporary variables, optimizer internals, and text shape are evidence only unless they affect a declared observable contract. - **Corpus-defined support.** Current support is derived from fixtures, - real-project evidence, pinned reference observations, and machine-readable - support state. + real-project evidence, pinned reference observations, and the canonical + language-support inventories. - **No WrightKit-only OPY dialect.** `opy-rs` follows the OverPy language rather than inventing source syntax for Wright convenience. - **Source-aware edits by default.** Tooling uses semantic identities, @@ -183,8 +183,8 @@ compiler surface are implemented and corpus-backed. The reconstruction module is owned here, while broader Workshopβ†’OPY coverage remains explicit in the compatibility corpus report. -Do not infer a stronger claim from this document; use the support matrix and -current executable evidence. +Do not infer a stronger claim from this document; use the canonical +language-support contract and current executable evidence. ## Validation @@ -192,7 +192,7 @@ current executable evidence. cargo fmt --all -- --check cargo clippy --workspace --all-targets --all-features -- -D warnings cargo test --workspace --all-targets --all-features -python3 -m unittest discover -s compatibility/tests +python3 -m unittest discover -s tools/overpy/tests ``` Oracle-required compatibility probes run separately against the pinned @@ -203,9 +203,9 @@ addition to focused tests. - [`implementation-role.md`](implementation-role.md) β€” repository identity and relationship to Wright/workshop-rs. -- [`support-matrix.md`](support-matrix.md) β€” human-readable current support. -- [`../../compatibility/support-matrix.json`](../../compatibility/support-matrix.json) - β€” machine-readable support state. +- [`../language-support.md`](../language-support.md) β€” canonical current support. +- [`../language-support/feature-contracts.json`](../language-support/feature-contracts.json) + β€” exhaustive machine-readable feature inventory. - [`compat-manifest-spec.md`](compat-manifest-spec.md) β€” OPY semantic manifest. - [`../hir/opy-hir-v2.md`](../hir/opy-hir-v2.md) β€” current Opy HIR contract. - [`tooling-api.md`](tooling-api.md) β€” standalone semantic/tooling API. diff --git a/docs/opy/compat-manifest-spec.md b/docs/opy/compat-manifest-spec.md index 8eb076b..775e95f 100644 --- a/docs/opy/compat-manifest-spec.md +++ b/docs/opy/compat-manifest-spec.md @@ -204,9 +204,9 @@ hash, and, for rejections, the diagnostic category fragment). against the pinned oracle and must match its recorded accept/reject, normalized emission hash, and diagnostic category. The probe set and validator are source implementation-workstream-owned; the validator requires the pinned oracle (Node + - pnpm) and runs standalone like `compatibility/run_oracle.py`, so it is not + pnpm) and runs standalone like `tools/overpy/run_oracle.py`, so it is not part of the oracle-less harness suite. The probe names are recorded as - evidence references in `compatibility/support-matrix.json`, and the native + evidence references in the canonical language-support inventories, and the native differential suite (`crates/opy-rs/tests/differential.rs`, merged in PR #13) covers the same surface end-to-end in `cargo test`. * The source implementation consumes the manifest in `lower.rs`: unknown names, wrong diff --git a/docs/opy/compatibility-baseline.md b/docs/opy/compatibility-baseline.md index 118da9e..64ba43d 100644 --- a/docs/opy/compatibility-baseline.md +++ b/docs/opy/compatibility-baseline.md @@ -6,9 +6,9 @@ Scope: forward-looking, tiered inventory of the OPY language surface against the pinned OverPy 9.7.10 reference, classifying every category by implementation tier and by support dimension -This document is the planning counterpart to -[`support-matrix.md`](support-matrix.md): the support matrix records the -corpus-evidenced surface the opy-rs source implementation targets, while this baseline +This document is the planning counterpart to the +[canonical language-support contract](../language-support.md): that contract +records the corpus-evidenced surface the opy-rs source implementation targets, while this baseline records how the remaining surface is **tiered and sequenced**. A construct is not called supported merely because it parses; each row states parse, semantic, compilation, tooling/analysis, and reference coverage separately. @@ -20,9 +20,9 @@ for provenance. Evidence claims in this document were verified against the pinned oracle (the declared corpus now contains 42 provenance-linked snapshots). The opy-rs source implementation foundation and #7 readiness work are implemented on `main` (issues #3–#7, #28–#30, and #33); the category table is the -**tier assignment contract** for the remaining surface. The state column of -`compatibility/support-matrix.json` tracks actual implementation progress -against it, and rows marked `baseline-supported` in this document are +**tier assignment contract** for the remaining surface. The status and +coverage fields in the linked feature inventory track actual implementation +progress against it, and rows marked `baseline-supported` in this document are implemented unless the table says otherwise. ## Tier taxonomy @@ -84,10 +84,9 @@ rejected/documented-absent dimension, `β€”` an inapplicable dimension, and | 12a | `settings "file"`, richer settings expressions, hero/map/ability content beyond the pin | `legacy-quirk/demand-driven` / `reference-limited` | ❌/partial | ❌ | ❌ | ❌ | partial (data newer than pin unavailable per the pinning policy) | | 13 | **Source identity & diagnostics**: structured, source-located source implementation errors, `wright-result/v1` | `baseline-supported` | βœ… | βœ… | β€” | βœ… | βœ… S/D | -## Current `planned` entries +## Current planning notes -There are no remaining `planned` entries in -`compatibility/support-matrix.json`. The pinned OPY source implementation surface from +The pinned OPY source implementation surface from #28/#29/#30/#33 is represented as source implementation- or semantic-supported; Workshop catalog, emission, and runtime effects remain explicitly `lowering-dependent`. Their tiers above @@ -124,7 +123,7 @@ and remaining gaps stay classified rather than being filed per-symbol. * **No per-symbol issues.** These evidence items are grouped into semantic categories; none justifies a one-symbol implementation issue. * **No temporary Workshop IR.** Workshop-dependent features are classified - `lowering-dependent` in the support matrix and inventory-only until the + `lowering-dependent` in the language-support inventory and inventory-only until the `workshop-rs` integration stage (#8). Nothing here starts `workshop-rs` work or duplicates catalog/WIR/emitter data. * **Runtime content registry stays deferred.** This baseline is @@ -140,7 +139,6 @@ and remaining gaps stay classified rather than being filed per-symbol. ## Related documents * [`docs/compatibility/upstream-references.md`](../compatibility/upstream-references.md): pinned reference identity and provenance -* [`support-matrix.md`](support-matrix.md): corpus-evidenced declared surface * [`compat-manifest-spec.md`](compat-manifest-spec.md): machine-readable semantic manifest specification (data in `crates/opy-rs/src/manifest/`) -* [`compatibility/support-matrix.json`](../../compatibility/support-matrix.json): machine-readable state tracking -* [`compatibility/README.md`](../../compatibility/README.md): corpus and harness layout +* [`../language-support.md`](../language-support.md): canonical feature status and coverage +* [`tools/overpy/README.md`](../../tools/overpy/README.md): corpus and harness layout diff --git a/docs/opy/conformance-baseline.md b/docs/opy/conformance-baseline.md index 1d79de7..e7cd2f9 100644 --- a/docs/opy/conformance-baseline.md +++ b/docs/opy/conformance-baseline.md @@ -2,8 +2,8 @@ Issue #158 establishes the conformance boundary used before further OPY compatibility implementation. The durable machine-readable inventory is -[`compatibility/conformance-manifest.json`](../../compatibility/conformance-manifest.json); -the executable runner is [`compatibility/conformance.py`](../../compatibility/conformance.py). +[`docs/language-support/conformance-manifest.json`](../../docs/language-support/conformance-manifest.json); +the executable runner is [`tools/overpy/conformance.py`](../../tools/overpy/conformance.py). ## Independent inventory diff --git a/docs/opy/support-matrix.md b/docs/opy/support-matrix.md index 57980d7..d0b14ff 100644 --- a/docs/opy/support-matrix.md +++ b/docs/opy/support-matrix.md @@ -1,9 +1,5 @@ -# Support documentation redirect +# Support contract redirect The canonical public OverPy compatibility contract is [`../language-support.md`](../language-support.md). Its linked inventories are the complete audited support documentation for pinned OverPy `9.7.10`. - -`compatibility/support-matrix.json` remains internal engineering metadata for -fixture relationships and implementation evidence. Its internal states are -not public support statuses. diff --git a/docs/opy/tooling-api.md b/docs/opy/tooling-api.md index 2ad078e..973e9e3 100644 --- a/docs/opy/tooling-api.md +++ b/docs/opy/tooling-api.md @@ -45,7 +45,7 @@ input digests; the public compile report and `opy-cli compile` have no oracle input or compatibility-evidence field. The compatibility runner uses the separate -[`compatibility/compiler-expectations.json`](../../compatibility/compiler-expectations.json) +[`tools/overpy/compiler-expectations.json`](../../tools/overpy/compiler-expectations.json) baseline for compiler outcomes. The source/frontend expectation contract is kept in `differential-expectations.json`; it is not reused as compiler parity evidence. Compiler gaps must carry durable evidence and an owner, while @@ -145,25 +145,6 @@ semantic-resolution diagnostics follow the compile contract and report the first error. `check` and `compile` agree on the verdict; only the parse-stage reporting depth differs. -## Support-matrix accessor (`opy_rs::support`) - -`compatibility/support-matrix.json` is the repository's machine-readable -support state source (merged with the evidence base, PR #10) and is consumed -read-only. It is embedded at build time via `include_str!` (the -crate rebuilds when the file changes), parsed once, and exposed as -`SupportMatrix`: - -* `SupportMatrix::builtin() -> Result<&'static SupportMatrix, …>` -* `feature(id)` / `feature_state(id)`: feature lookup by id -* `features_by_category(category)` / `features_by_state(state)`: filtered - slices -* `categories()`, `declared_states()`, `summary()`: declared surface - -The five declared states (`planned`, `source-supported`, -`semantic-supported`, `lowering-dependent`, `end-to-end-supported`) are -documented in the matrix itself. Workshop-dependent items stay -`lowering-dependent`; nothing here approximates them. - ## CLI (`opy-cli`) ``` @@ -173,7 +154,6 @@ opy-cli compile # Workshop text β†’ stdout opy-cli compile --format json # versioned compile report β†’ stdout opy-cli compile --language zh-CN # catalog-declared locale opy-cli inspect # resolved model as JSON on stdout -opy-cli support [--json] [] # embedded matrix (or slice) as JSON opy-cli completion bash|zsh|fish|powershell # static completion from the command model opy-cli version # crate + source implementation protocol identity ``` @@ -221,6 +201,6 @@ stdout. declarations are queryable through `SemanticModel::enums`, not the HIR declaration list. * Broader Workshop emission, decompilation, and unsupported source constructs - remain explicit in the support matrix and the native corpus report. The + remain explicit in the canonical language-support inventories and native corpus report. The compile contract never counts an inconclusive normalized-output comparison as successful parity. diff --git a/docs/opy/tooling-notes.md b/docs/opy/tooling-notes.md index 2e28488..2464112 100644 --- a/docs/opy/tooling-notes.md +++ b/docs/opy/tooling-notes.md @@ -1,14 +1,13 @@ # opy-rs Compatibility Tooling Notes -Small operational notes for the compatibility harness -(`compatibility/`); the full layout contract is in -[`compatibility/README.md`](../../compatibility/README.md). +Small operational notes for the OverPy evidence harness; the full layout +contract is in [`tools/overpy/README.md`](../../tools/overpy/README.md). ## Prerequisites * Python 3 (stdlib only, no pip dependencies). * For oracle execution only: Node + pnpm - (`pnpm install --dir compatibility/oracle`, which resolves the pinned + (`pnpm install --dir tools/overpy/oracle`, which resolves the pinned `overpy@9.7.10` by integrity hash). No Node toolchain is needed to run the harness tests or the fixture snapshot checks, and the Rust crates are never required here. @@ -17,19 +16,19 @@ Small operational notes for the compatibility harness ```sh # Harness tests (no oracle needed) -python3 -m unittest discover -s compatibility/tests +python3 -m unittest discover -s tools/overpy/tests # Regenerate snapshots from the pinned oracle (only when intentionally # accepting a reference-behavior change; review the diff in the same commit) -python3 compatibility/run_oracle.py --update +python3 tools/overpy/run_oracle.py --update # Verify snapshots still match the pinned oracle (fails on any mismatch) -python3 compatibility/run_oracle.py +python3 tools/overpy/run_oracle.py # Compiler compatibility gate (public CLI plus internal evidence target) cargo build --locked -p opy-cli --bin opy-cli cargo build --locked -p opy-cli --features compatibility --bin opy-compat -python3 -B compatibility/run_native.py \ +python3 -B tools/overpy/run_native.py \ --binary target/debug/opy-cli \ --semantic-binary target/debug/opy-compat \ --results target/opy-rs-compiler-results \ @@ -37,28 +36,15 @@ python3 -B compatibility/run_native.py \ # Differential report against an external producer's results (generic # producer contract; the native Rust differential suite is the opy-rs -# producer side and runs in cargo test; see compatibility/README.md) -python3 compatibility/diff.py --results --report compatibility/report.json -python3 compatibility/diff.py --producer-command '' --report compatibility/report.json +# producer side and runs in cargo test; see tools/overpy/README.md) +python3 tools/overpy/diff.py --results --report target/opy-rs-differential-report.json +python3 tools/overpy/diff.py --producer-command '' --report target/opy-rs-differential-report.json ``` -## Machine-readable support matrix - -The canonical public support contract is [`../language-support.md`](../language-support.md). -`compatibility/support-matrix.json` is retained as internal, mechanically -checkable engineering metadata tracking the declared OverPy feature surface -(states `planned`, -`source-supported`, `semantic-supported`, `lowering-dependent`, -`end-to-end-supported`; see [`../language-support.md`](../language-support.md)). -The consistency check lives in `compatibility/tests/test_support_matrix.py` -and runs as part of the harness test suite: every feature id is unique, every -state/category is from the declared domains, and every `fixtures:` evidence -path exists in the corpus. - ## Changing the pinned oracle A pin change is an explicit, reviewed change: update -`compatibility/oracle/package.json` + `pnpm-lock.yaml` + +`tools/overpy/oracle/package.json` + `pnpm-lock.yaml` + `oracle-metadata.json`, re-run `run_oracle.py --update`, review every snapshot diff and fixture provenance note, and update the reference identity records in `docs/compatibility/upstream-references.md` (policy: changed only on diff --git a/docs/overpy-support.md b/docs/overpy-support.md deleted file mode 100644 index 357cde1..0000000 --- a/docs/overpy-support.md +++ /dev/null @@ -1,65 +0,0 @@ -# OverPy support - -This is the canonical, human-readable compatibility contract for `opy-rs`. -The detailed inventories linked here are part of the same contract. - -## Reference and audit boundary - -| Field | Value | -| --- | --- | -| OverPy package | `9.7.10` | -| Content commit | `889d9749d1def17f146548cbddb94ea1ab015847` (`v9.7.10`) | -| Repository | | -| Registry integrity | `sha512-oX17nauJcPTaKIrRFY/rD0Rl8atqFUVv9Hg2TKH+A68/fC8+ZO344Mkd1A/Y0oOVp1hr5tktMBjzMEDDnMEYUw==` | -| Audited language | `en-US` | - -The inventory was audited from the pinned upstream tree, from outside the -`opy-rs` implementation: the upstream README and public API declaration; -`src/compiler/` grammar, preprocessing, compiler, translation and decompiler -surfaces; `src/data/opy/` keyword, annotation, builtin, member, module, macro -and preprocessing registries; `src/data/` Workshop domains; upstream compile, -decompile, CLI and QuickJS tests; and the pinned executable oracle. Existing -`opy-rs` fixtures, HIR names, support matrix entries and issue lists were used -only to determine the second column, never to construct the audited set. - -## Status vocabulary - -Only these public states are used: - -- `βœ… Supported` β€” the claimed user-visible behavior works within the notes. -- `🚧 Coming soon` β€” the pinned capability is recognized, but current behavior - is incomplete. -- `❌ Unsupported` β€” the capability is outside the current contract. - -β€œSupported” is an end-to-end claim for the stated row. Parsing a construct or -having a name in a manifest is not enough to make a compilation row green. - -## Audited capability summary - -| Area | Status | Detailed inventory | -| --- | --- | --- | -| Source syntax, literals and expressions | 🚧 Coming soon | [syntax and project composition](overpy-support/syntax-and-projects.md) | -| Assignments, declarations, rules and control flow | 🚧 Coming soon | [syntax and project composition](overpy-support/syntax-and-projects.md) | -| Builtins, member functions, constants and contextual domains | 🚧 Coming soon | [callables and domains](overpy-support/callables-and-domains.md) | -| Preprocessing, includes, modules and macros | 🚧 Coming soon | [syntax and project composition](overpy-support/syntax-and-projects.md) | -| Strings, translations and custom-game settings | 🚧 Coming soon | [syntax and project composition](overpy-support/syntax-and-projects.md) | -| Compiler directives, optimization and post-compile hooks | 🚧 Coming soon | [tooling and backend](overpy-support/tooling-and-backend.md) | -| Standalone compiler and CLI | βœ… Supported | [tooling and backend](overpy-support/tooling-and-backend.md) | -| Workshop-to-OPY decompilation | ❌ Unsupported | [tooling and backend](overpy-support/tooling-and-backend.md) | - -The summary is intentionally conservative: the audited upstream surface is -larger than the currently evidenced `opy-rs` surface. Detailed rows make gaps -explicit instead of hiding them in a category-level green row. - -## Contract maintenance - -`compatibility/support-matrix.json` is retained as **internal engineering -metadata** for fixture relationships, provenance and implementation tracking. -It is not a public inventory and its internal states are not public support -states. `docs/opy/support-matrix.md` is retained as historical context and -must not introduce another public status vocabulary. - -The next step is a separate exhaustive conformance issue driven by the audited -leaf identities in these documents. This issue does not turn the inventory -into a fixed feature-count assertion or silently convert known gaps into -passing cases. diff --git a/docs/overpy-support/callables-and-domains.md b/docs/overpy-support/callables-and-domains.md deleted file mode 100644 index a598293..0000000 --- a/docs/overpy-support/callables-and-domains.md +++ /dev/null @@ -1,64 +0,0 @@ -# OverPy audited inventory: callables and domains - -Source: pinned OverPy `9.7.10`, content commit -`889d9749d1def17f146548cbddb94ea1ab015847`. The external callable registries -are `src/data/opy/functions.ts`, `memberFunctions.ts`, `constants.ts`, -`modules.ts`, and `macros.ts`; Workshop registries are `src/data/actions.ts`, -`values.ts`, `constants.ts`, `heroes.ts`, `maps.ts`, `gamemodes.ts`, -`localizedStrings.ts`, and `customGameSettings.ts`. - -The upstream registries are the audited inventory source and are not copied -into `opy-rs`. Each callable contract has a spelling, receiver (if any), -ordered arguments, argument type/domain, optional/default behavior, return -behavior, and dispatch rule. - -## Standalone functions and operators - -| Feature / representative leaf | Status | Audited contract | -| --- | --- | --- | -| `abs(value)` | βœ… Supported | One numeric value; numeric result. | -| `len(arrayOrString)` | βœ… Supported | One array/string value; integer result. | -| `range(stop)` / `range(start, stop[, step])` | βœ… Supported | Optional start and step have distinct defaults. | -| `wait(duration[, reevaluation])` | βœ… Supported | Reevaluation has an optional default. | -| `raiseToPower(base, exponent)` | βœ… Supported | Two numeric arguments in order; value operation. | -| `sorted(array[, key])` | βœ… Supported | Optional lambda key; element/index binder is contextual. | -| `all(array)` / `any(array)` | βœ… Supported | One boolean-array value. | -| `ceil(value)` / `floor(value)` / `round(value)` | βœ… Supported | Numeric rounding maps to the canonical `Rounding` domain. | -| `random.randint(min, max)` | βœ… Supported | Two inclusive integer bounds; integer result. | -| `random.uniform(min, max)` | βœ… Supported | Two float bounds; float result. | -| `random.choice(array)` | βœ… Supported | One array; returns an element or supplied non-array value. | -| `random.shuffle(array)` | βœ… Supported | One array; returns a copied array. | -| `_(contextOrString[, string])` | 🚧 Coming soon | One-argument and two-argument modes differ. | - -## Receiver/member functions - -| Feature / representative leaf | Status | Audited contract | -| --- | --- | --- | -| `array.append(value)` | βœ… Supported | Array receiver; mutating; arrays are extended. | -| `array.concat(value)` | βœ… Supported | Array receiver; returns a copy. | -| `array.filter(lambda)` | βœ… Supported | Lambda result selects elements; optional index binder. | -| `array.map(lambda)` | βœ… Supported | Lambda result replaces each element. | -| `array.all([lambda])` / `array.any([lambda])` | βœ… Supported | Optional lambda defaults to element truthiness. | -| `array[index]` and `array.slice(start, count)` | βœ… Supported | Indexing and slicing have different arguments. | -| `string.format(...)` | 🚧 Coming soon | Variadic formatting remains incomplete. | -| `player.setStatusEffect(player, assister, status, duration)` | 🚧 Coming soon | Receiver plus four ordered explicit arguments. | -| `vector.x`, `.y`, `.z` | βœ… Supported | Property-like vector access; numeric result. | -| `self` in member macros | 🚧 Coming soon | Dispatch target is the macro receiver. | - -## Constants, enums and contextual dispatch - -| Feature | Status | Notes | -| --- | --- | --- | -| `Hero`, `Map`, `Gamemode`, `Team`, `Slot`, `Color`, `Button` domains | 🚧 Coming soon | Membership and spelling are domain-specific. | -| `Vector.UP/DOWN/LEFT/RIGHT/FORWARD/BACKWARD` | βœ… Supported | Constants are separate from arbitrary vectors. | -| `Math.PI`, `Math.E`, `Math.INFINITY`, `Math.EPSILON` | 🚧 Coming soon | Numeric constants are distinct leaves. | -| User enum assignment and inferred increments | βœ… Supported | Separate from Workshop catalog domains. | -| Contextual `None`/reevaluation enum dispatch | 🚧 Coming soon | `ChaseTimeReeval`, `ChaseRateReeval` and `Invis` differ. | -| Alias resolution (`getCurrentHero`, `hasStatusEffect`, `ChaseReeval`) | βœ… Supported | Non-contextual and call-context aliases differ. | - -The pinned `functions.ts`, `actions.ts`, `memberFunctions.ts` and `values.ts` -registries contain the complete callable surface. The audit keeps families -separate because action/value position, receiver type, defaults, overloads and -return behavior differ. A name in the current internal manifest is evidence -for `opy-rs` only; it does not expand this inventory or make an incomplete -callable green. diff --git a/docs/overpy-support/syntax-and-projects.md b/docs/overpy-support/syntax-and-projects.md deleted file mode 100644 index aa49fa2..0000000 --- a/docs/overpy-support/syntax-and-projects.md +++ /dev/null @@ -1,72 +0,0 @@ -# OverPy audited inventory: syntax and project composition - -Source: pinned OverPy `9.7.10`, content commit -`889d9749d1def17f146548cbddb94ea1ab015847`. The source surfaces used are -`README.md`, `src/compiler/tokenizer.ts`, `parser.ts`, `astParser.ts`, -`src/data/opy/keywords.ts`, `annotations.ts`, `preprocessing.ts`, -`modules.ts`, `macros.ts`, and the upstream files under `src/tests/`. - -## Lexical and expression surface - -| Feature | Status | Notes | -| --- | --- | --- | -| `#` line comments and `/* ... */` block comments | βœ… Supported | Source parsing is covered by the native pipeline and corpus. | -| Identifiers, indentation and rule/subroutine blocks | βœ… Supported | Includes `rule "name":` and `def name():`. | -| Boolean, integer, float and `null` literals | βœ… Supported | Numeric edge cases remain conformance work. | -| Strings, escaped strings and implicit concatenation | βœ… Supported | String modifiers are separate rows. | -| f-string/interpolated strings | βœ… Supported | Supported formatting subset is fixture-covered. | -| String modifiers `f`, `w`, `l`, `b`, `c`, `t` | βœ… Supported | f/w/b/c have canonical lowering evidence; l/t retain source syntax without duplicating translation content. | -| Array literals and indexing | βœ… Supported | Includes nested arrays. | -| Dictionary literals and keyed access | partial | Literal-key lookup folds during canonical lowering; dictionary assignment targets remain outside the bounded compiler surface. | -| List comprehensions | βœ… Supported | Mapping and filtering are separate behaviors. | -| `lambda` with element/index binders | βœ… Supported | Valid positions are contextual. | -| Member access, calls and postfix expressions | βœ… Supported | Receiver and dispatch checks are contract-sensitive. | -| `del` array element statement | 🚧 Coming soon | Source syntax and HIR are supported; canonical compilation remains incomplete. | -| Conditional value `a if condition else b` | βœ… Supported | Chained forms are right-associative; distinct from statement `if`. | -| `in` and `not in` membership | βœ… Supported | String containment uses `strContains`. | -| Arithmetic, comparison, boolean and unary operators | βœ… Supported | Augmented forms are separate rows below. | -| `++` and `--` postfix assignment modifiers | βœ… Supported | Statement-level global, player and single-level indexed forms are covered by Issue #59; prefix `++` and embedded postfix `++`/`--` remain rejected, while prefix `--x` remains valid consecutive unary-minus syntax. | -| `0x`/`0X` hexadecimal literals | βœ… Supported | Case variants are one semantic capability. | - -## Assignments and declarations - -| Feature | Status | Notes | -| --- | --- | --- | -| Simple assignment `=` | βœ… Supported | Global, player and indexed forms differ at lowering. | -| `+=`, `-=`, `*=`, `/=`, `%=` | βœ… Supported | Each spelling is independently audited; postfix `++`/`--` forms lower to canonical Add/Subtract modifications. | -| `**=` augmented assignment | βœ… Supported | Separate from `**`; uses Raise To Power. | -| `min=` and `max=` modification forms | 🚧 Coming soon | Source syntax and HIR are supported; Workshop support is not claimed. | -| `globalvar name [index]` | βœ… Supported | Explicit and implicit index forms are distinct. | -| `playervar name [index]` | βœ… Supported | Explicit and implicit index forms are distinct. | -| Variable initializer `globalvar/playervar name = value` | βœ… Supported | Constant-zero behavior is observable. | -| `enum` declarations and inferred member values | βœ… Supported | Contextual enum use is separate. | -| `macro` constants and function macros | βœ… Supported | Member/default-parameter forms are separate contracts. | -| `def` subroutines, calls and `return` | βœ… Supported | Upstream subroutines have no parameters or returns. | - -## Rules, control flow and project composition - -| Feature | Status | Notes | -| --- | --- | --- | -| Rule events: `global`, `eachPlayer`, team/hero/slot domains | βœ… Supported | Event and domain arguments are distinct. | -| `@Condition` and multiple conditions | βœ… Supported | | -| `@Name`, `@Disabled`, `@Delimiter`, `@NewPage`, `@SuppressWarnings` | βœ… Supported | Each annotation has independent effects. | -| `if` / `elif` / `else` statements | βœ… Supported | Inline conditional values are separate. | -| `for ... in range(start, stop, step)` | βœ… Supported | Declared or implicit global binders and player-variable binders such as `hostPlayer.I` are supported; other iterable forms remain unsupported. | -| `while` and `do ... while` loops | βœ… Supported | Distinct entry-condition behavior. | -| `switch` / `case` / `default` | βœ… Supported | Fall-through and `break` are separate. | -| `break` in loops and switch arms | βœ… Supported | | -| `continue` in loops | 🚧 Coming soon | Source syntax and HIR are supported with loop-context diagnostics; canonical lowering is incomplete. | -| `goto`, labels and dynamic `loc+` targets | 🚧 Coming soon | Source syntax and HIR are supported; canonical lowering is incomplete. | -| `pass` and `return` statements | βœ… Supported | Context restrictions remain conformance work. | -| `#!include` root-relative composition | βœ… Supported | Missing files and cycles have distinct failures. | -| Nested include closure and main-file selection | βœ… Supported | Project behavior is not inferred from one-file tests. | - -## Settings, strings and translations - -| Feature | Status | Notes | -| --- | --- | --- | -| `settings { ... }` custom-game-settings block | βœ… Supported | May be provided by the main source or an included source; lowered through the canonical `workshop-rs` settings carrier and emitter with source provenance. | -| Schema keys, enum values and map/hero list settings | βœ… Supported (bounded) | Validation and spellings come from the Workshop-owned catalog; unsupported keys remain explicit failures. | -| `#!translations` and `.po` translation sources | 🚧 Coming soon | Declaration and output lifecycle are separate. | -| `_`, `__`, `___` translation functions | 🚧 Coming soon | One- and two-argument modes differ. | -| Localized output language selection | βœ… Supported (catalog-declared) | Undeclared locales and missing mappings fail explicitly; no guessed fallback. | diff --git a/docs/overpy-support/tooling-and-backend.md b/docs/overpy-support/tooling-and-backend.md deleted file mode 100644 index c2e6404..0000000 --- a/docs/overpy-support/tooling-and-backend.md +++ /dev/null @@ -1,47 +0,0 @@ -# OverPy audited inventory: tooling and backend behavior - -Source: pinned OverPy `9.7.10`, content commit -`889d9749d1def17f146548cbddb94ea1ab015847`. Evidence surfaces are the -upstream README, `overpy.d.ts`, `cli.js`, compiler/decompiler sources, -`runTests.mjs`, `runCliTests.mjs`, QuickJS fixtures and the executable oracle. - -## Preprocessing, macros and hooks - -| Feature | Status | Notes | -| --- | --- | --- | -| `#!define` object/function macros and `#!undef` | βœ… Supported | Expansion, precedence and recursion are distinct checks. | -| `#!allowMacroRedeclaration` | 🚧 Coming soon | Changes duplicate-definition failure behavior. | -| `#!mainFile`, `#!include`, `#!excludeVariablesInCompilation` | βœ… Supported | Selection and output filtering have separate effects. | -| Optimization controls (`#!enableOptimizations`, `#!disableOptimizations`, `#!optimize*`) | 🚧 Coming soon | Recognition is not backend-effect support. | -| Replacement directives (`#!replace0By*`, team/string replacements) | 🚧 Coming soon | Each replacement target has its own output contract. | -| `#!rulePrefix` and `#!rulePrefixTemplate` | 🚧 Coming soon | Prefix text and placeholders are separate. | -| `#!extension` and extension-point accounting | 🚧 Coming soon | Output metadata is part of the contract. | -| `macro name(params)` function/constant macros | βœ… Supported | Defaults, keywords and member macros differ. | -| `__script__` JavaScript macros | 🚧 Coming soon | QuickJS return ABI and limits are observable. | -| `#!postCompileHook` | βœ… Supported (compiler) | Runs after successful canonical Workshop emission against the exact emitted text; the string result is final output. | - -## Compilation, CLI and API - -| Feature | Status | Notes | -| --- | --- | --- | -| Standalone `.opy` compiler library | βœ… Supported | Supported within the documented source/compile scope. | -| CLI compile/check invocation and structured diagnostics | βœ… Supported | Exit behavior and source attribution are contractual. | -| Upstream JS `compile(content, language, rootPath, mainFileName)` API | 🚧 Coming soon | API shape audited; Rust parity is incomplete. | -| Compile metadata: variables, subroutines, warnings, translations, element count | 🚧 Coming soon | Fields have independent completeness requirements. | -| Localized Workshop text and custom settings emission | βœ… Supported (catalog-declared) | Canonical settings and locale semantics remain in `workshop-rs`. | -| Observable optimization/replacement effects | 🚧 Coming soon | Formatting is not a target unless observable. | - -## Decompilation and round trips - -| Feature | Status | Notes | -| --- | --- | --- | -| `decompileAllRules` Workshop-to-OPY reconstruction | ❌ Unsupported | Outside the current `opy-rs` contract. | -| `decompileActions` and `decompileConditions` | ❌ Unsupported | Same boundary as full decompilation. | -| Workshop settings decompilation | ❌ Unsupported | No claim of recovering original source abstractions. | -| Compile/decompile round trip preserving source identity | ❌ Unsupported | Comments, macros, names and formatting are not promised. | - -The upstream source is GPL-3.0-only and is used as an external audit -reference/oracle. Its implementation and data are not copied into `opy-rs`. -The exhaustive conformance follow-up should derive stable leaf cases from the -audited registries, preserve negative behavior, and compare observable -semantics rather than Workshop formatting or internal compiler structure. diff --git a/compatibility/README.md b/tools/overpy/README.md similarity index 87% rename from compatibility/README.md rename to tools/overpy/README.md index f6ad437..12136f4 100644 --- a/compatibility/README.md +++ b/tools/overpy/README.md @@ -1,7 +1,7 @@ -# Compatibility Oracle and Fixture Layout +# OverPy Evidence Harness -This directory contains the reproducible compatibility harness described by -[`docs/opy/tooling-notes.md`](../docs/opy/tooling-notes.md). It is evaluation +This directory contains the reproducible OverPy evidence harness described by +[`docs/opy/tooling-notes.md`](../../docs/opy/tooling-notes.md). It is evaluation tooling, not a dependency of the opy-rs core, and it is fully independent of the Rust crates: no Node toolchain and no source implementation crate is required to run the harness tests or the fixture snapshot checks. @@ -13,33 +13,33 @@ the harness tests or the fixture snapshot checks. `oracle-metadata.json` records the package's npm `gitHead`, repository, registry tarball, license assumption, and Workshop language. A change to any of these is an explicit oracle-version review (see -[`docs/compatibility/upstream-references.md`](../docs/compatibility/upstream-references.md)). +[`docs/compatibility/upstream-references.md`](../../docs/compatibility/upstream-references.md)). Install the oracle from the repository root: ```sh -pnpm install --dir compatibility/oracle +pnpm install --dir tools/overpy/oracle ``` The oracle is not bundled into opy-rs and is not imported by the Rust core. ## Pinned feature-contract inventory -[`feature-contracts.json`](feature-contracts.json) is the machine-readable +[`../../docs/language-support/feature-contracts.json`](../../docs/language-support/feature-contracts.json) is the machine-readable leaf inventory for the pinned OverPy source surface. It records the exact registry keys, materially distinct compiler/parser/tooling branches, status and coverage limits, production ownership, and executable or upstream -evidence. [`pinned-overpy-audit.json`](pinned-overpy-audit.json) is the +evidence. [`../../docs/language-support/pinned-overpy-audit.json`](../../docs/language-support/pinned-overpy-audit.json) is the independent pinned-source audit catalog used to detect omitted registry families or compiler branches. Both reference pins must match -`conformance-manifest.json`. +[`../../docs/language-support/conformance-manifest.json`](../../docs/language-support/conformance-manifest.json). The normal conformance run validates the inventory without requiring the upstream checkout. To additionally detect registry drift against a local checkout of the pinned OverPy content, pass its root explicitly: ```sh -python3 compatibility/conformance.py \ +python3 tools/overpy/conformance.py \ --binary target/debug/opy-cli \ --semantic-binary target/debug/opy-compat \ --upstream-root /path/to/overpy-at-889d974 @@ -54,7 +54,7 @@ repository. Inventory gaps remain visible in the report's Each fixture lives in its own directory: ```text -compatibility/fixtures/// +crates/opy-rs/tests/fixtures/corpus/// fixture.json # metadata and expected compile status source.opy # input, or the source path named by fixture.json oracle.json # normalized result snapshot generated by the runner @@ -74,7 +74,7 @@ Imported fixtures should also record an immutable `sourceCommit`, a direct contains WrightKit-authored synthetic cases, a census boundary fixture, and provenance-recorded real-world projects derived from the pinned OverPy `examples/` tree or independent BSD-2-Clause projects, with full include -closures. See `compatibility/fixtures/README.md` for the complete provenance +closures. See `crates/opy-rs/tests/fixtures/corpus/README.md` for the complete provenance record; the current inventory is the per-fixture metadata discovered and validated by [`run_oracle.py`](run_oracle.py). @@ -87,9 +87,10 @@ not remove Workshop operations or values. The project manifest covers every `.opy` file in the fixture directory except explicitly listed minimized regression snippets, so changes to included sources invalidate the snapshot. -`differential-expectations.json` is the independent native-side expectation -record. Each fixture has a native outcome, an expected relationship to the -oracle (`match`, `known-gap`, or `unsupported`), a rationale, and evidence. +[`crates/opy-rs/tests/differential-expectations.json`](../../crates/opy-rs/tests/differential-expectations.json) +is the independent native-side expectation record. Each fixture has a native +outcome, an expected relationship to the oracle (`match`, `known-gap`, or +`unsupported`), a rationale, and evidence. The differential runner derives `unexpected-divergence`, `regression`, and `inconclusive` results from those records; it never treats a reference-success / native-failure case as a match. @@ -136,15 +137,15 @@ definitions, and validation remain owned by `workshop-rs`. ## Commands ```sh -python3 -m unittest discover -s compatibility/tests -python3 compatibility/run_oracle.py --update -python3 compatibility/run_oracle.py +python3 -m unittest discover -s tools/overpy/tests +python3 tools/overpy/run_oracle.py --update +python3 tools/overpy/run_oracle.py cargo build --locked -p opy-cli --bin opy-cli cargo build --locked -p opy-cli --features compatibility --bin opy-compat -python3 compatibility/run_native.py \ +python3 tools/overpy/run_native.py \ --binary target/debug/opy-cli \ --semantic-binary target/debug/opy-compat -python3 compatibility/diff.py --results /path/to/results --report compatibility/report.json +python3 tools/overpy/diff.py --results /path/to/results --report target/opy-rs-differential-report.json ``` Use `--update` only when intentionally accepting a change from the pinned @@ -152,10 +153,9 @@ oracle. Review the resulting snapshot and fixture provenance in the same change. A normal run fails when a snapshot is missing, the expected status is wrong, or normalized output/diagnostics differ. -The harness tests (`compatibility/tests/`) run without the oracle installed: +The harness tests (`tools/overpy/tests/`) run without the oracle installed: `test_runner.py` (normalization + corpus metadata/snapshot validity), -`test_diff.py` (differential result contract), and `test_support_matrix.py` -(the machine-readable support matrix structure and evidence paths). +and `test_diff.py` (differential result contract). The wright-side npm-packaging tests are not ported (they test wright's release tooling). The manifest probe validator (`crates/opy-rs/src/manifest/probes/validate.py`) is source implementation-owned and @@ -203,9 +203,9 @@ table still run. per fixture: ```sh -python3 compatibility/diff.py \ +python3 tools/overpy/diff.py \ --producer-command 'your-producer --fixture {fixture_id} --input {source} --output {result}' \ - --report compatibility/report.json + --report target/opy-rs-differential-report.json ``` `your-producer` is a placeholder: this repository ships no producer for @@ -241,7 +241,7 @@ Use `--allow-inconclusive` only for local contract checks. ## Offline conformance baseline (issue #158) -`conformance-manifest.json` is the independent inventory for the pinned +`../../docs/language-support/conformance-manifest.json` is the independent inventory for the pinned OverPy source-language baseline. Its categories cite the pinned upstream registries or an accepted canonical-WIR contract. Each category declares structural contracts with a claim, probe kinds (`positive`, `negative`, @@ -253,7 +253,7 @@ text in their pinned oracle snapshot. Run the baseline after building both CLI targets: ```sh -python3 compatibility/conformance.py \ +python3 tools/overpy/conformance.py \ --binary target/debug/opy-cli \ --semantic-binary target/debug/opy-compat \ --report target/opy-rs-conformance-report.json diff --git a/compatibility/compiler-expectations.json b/tools/overpy/compiler-expectations.json similarity index 100% rename from compatibility/compiler-expectations.json rename to tools/overpy/compiler-expectations.json diff --git a/compatibility/conformance.py b/tools/overpy/conformance.py similarity index 99% rename from compatibility/conformance.py rename to tools/overpy/conformance.py index 5e45551..7b5da13 100644 --- a/compatibility/conformance.py +++ b/tools/overpy/conformance.py @@ -15,11 +15,11 @@ import input_identity -ROOT = Path(__file__).resolve().parents[1] -FIXTURES = ROOT / "compatibility" / "fixtures" -MANIFEST = ROOT / "compatibility" / "conformance-manifest.json" -INVENTORY = ROOT / "compatibility" / "feature-contracts.json" -PINNED_AUDIT = ROOT / "compatibility" / "pinned-overpy-audit.json" +ROOT = Path(__file__).resolve().parents[2] +FIXTURES = ROOT / "crates/opy-rs/tests/fixtures/corpus" +MANIFEST = ROOT / "docs/language-support/conformance-manifest.json" +INVENTORY = ROOT / "docs/language-support/feature-contracts.json" +PINNED_AUDIT = ROOT / "docs/language-support/pinned-overpy-audit.json" DEFAULT_REPORT = ROOT / "target" / "opy-rs-conformance-report.json" FRONTEND_CODES = { "lex-error": "lex", @@ -780,7 +780,7 @@ def run(args: argparse.Namespace) -> int: report = { "schemaVersion": 1, "artifact": "opy-rs offline OverPy conformance report", - "generatedBy": "compatibility/conformance.py", + "generatedBy": "tools/overpy/conformance.py", "contract": manifest["contract"], "reference": manifest["reference"], "featureInventory": { diff --git a/compatibility/diff.py b/tools/overpy/diff.py similarity index 97% rename from compatibility/diff.py rename to tools/overpy/diff.py index f46faf8..3260c70 100644 --- a/compatibility/diff.py +++ b/tools/overpy/diff.py @@ -17,11 +17,11 @@ import input_identity -ROOT = Path(__file__).resolve().parents[1] -DEFAULT_FIXTURES = ROOT / "compatibility" / "fixtures" -DEFAULT_REPORT = ROOT / "compatibility" / "report.json" -DEFAULT_EXPECTATIONS = ROOT / "compatibility" / "differential-expectations.json" -DEFAULT_COMPILER_EXPECTATIONS = ROOT / "compatibility" / "compiler-expectations.json" +ROOT = Path(__file__).resolve().parents[2] +DEFAULT_FIXTURES = ROOT / "crates/opy-rs/tests/fixtures/corpus" +DEFAULT_REPORT = ROOT / "target" / "opy-rs-differential-report.json" +DEFAULT_EXPECTATIONS = ROOT / "crates/opy-rs/tests/differential-expectations.json" +DEFAULT_COMPILER_EXPECTATIONS = ROOT / "tools/overpy/compiler-expectations.json" EXPECTED_NATIVE_STATUSES = {"success", "failure"} EXPECTED_CLASSIFICATIONS = {"match", "known-gap", "unsupported"} @@ -202,7 +202,7 @@ def load_compiler_expectations( f"{fixture}: non-match expectations require concrete evidence: " + ", ".join(missing_evidence) ) - fixtures_root = path.parent / "fixtures" + fixtures_root = DEFAULT_FIXTURES oracle_path = fixtures_root / fixture / "oracle.json" provenance_path = fixtures_root / fixture / "fixture.json" oracle = load_json(oracle_path) @@ -386,10 +386,7 @@ def compare_fixture( metadata_path = fixtures_root / fixture_id / "fixture.json" oracle_path = fixtures_root / fixture_id / "oracle.json" metadata = load_json(metadata_path) - expectations_path = fixtures_root.parent / "differential-expectations.json" - expectations = load_expectations( - expectations_path if expectations_path.is_file() else DEFAULT_EXPECTATIONS - ) + expectations = load_expectations(DEFAULT_EXPECTATIONS) expectation = expectations.get(fixture_id) if expectation is None: raise DiffError(f"missing differential expectation: {fixture_id}") @@ -732,10 +729,7 @@ def run( allow_inconclusive: bool, ) -> int: all_ids = fixture_ids(fixtures_root) - expectations_path = fixtures_root.parent / "differential-expectations.json" - expectations = load_expectations( - expectations_path if expectations_path.is_file() else DEFAULT_EXPECTATIONS - ) + expectations = load_expectations(DEFAULT_EXPECTATIONS) missing = sorted(set(all_ids) - set(expectations)) extra = sorted(set(expectations) - set(all_ids)) if missing or extra: diff --git a/compatibility/input_identity.py b/tools/overpy/input_identity.py similarity index 100% rename from compatibility/input_identity.py rename to tools/overpy/input_identity.py diff --git a/compatibility/oracle/oracle-metadata.json b/tools/overpy/oracle/oracle-metadata.json similarity index 100% rename from compatibility/oracle/oracle-metadata.json rename to tools/overpy/oracle/oracle-metadata.json diff --git a/compatibility/oracle/package.json b/tools/overpy/oracle/package.json similarity index 100% rename from compatibility/oracle/package.json rename to tools/overpy/oracle/package.json diff --git a/compatibility/oracle/pnpm-lock.yaml b/tools/overpy/oracle/pnpm-lock.yaml similarity index 100% rename from compatibility/oracle/pnpm-lock.yaml rename to tools/overpy/oracle/pnpm-lock.yaml diff --git a/compatibility/run_native.py b/tools/overpy/run_native.py similarity index 97% rename from compatibility/run_native.py rename to tools/overpy/run_native.py index 6545bab..afa9aad 100644 --- a/compatibility/run_native.py +++ b/tools/overpy/run_native.py @@ -14,9 +14,9 @@ import input_identity -ROOT = Path(__file__).resolve().parents[1] -FIXTURES = ROOT / "compatibility" / "fixtures" -COMPILER_EXPECTATIONS = ROOT / "compatibility" / "compiler-expectations.json" +ROOT = Path(__file__).resolve().parents[2] +FIXTURES = ROOT / "crates/opy-rs/tests/fixtures/corpus" +COMPILER_EXPECTATIONS = ROOT / "tools/overpy/compiler-expectations.json" DEFAULT_RESULTS = ROOT / "target" / "opy-rs-compiler-results" DEFAULT_REPORT = ROOT / "target" / "opy-rs-compiler-report.json" diff --git a/compatibility/run_oracle.py b/tools/overpy/run_oracle.py similarity index 98% rename from compatibility/run_oracle.py rename to tools/overpy/run_oracle.py index b774f8c..8ddc78f 100644 --- a/compatibility/run_oracle.py +++ b/tools/overpy/run_oracle.py @@ -17,9 +17,9 @@ import input_identity -ROOT = Path(__file__).resolve().parents[1] -DEFAULT_FIXTURES = ROOT / "compatibility" / "fixtures" -DEFAULT_ORACLE = ROOT / "compatibility" / "oracle" +ROOT = Path(__file__).resolve().parents[2] +DEFAULT_FIXTURES = ROOT / "crates/opy-rs/tests/fixtures/corpus" +DEFAULT_ORACLE = ROOT / "tools/overpy/oracle" SNAPSHOT_NAME = "oracle.json" @@ -203,7 +203,7 @@ def run_fixture( except FileNotFoundError as error: raise RunnerError( "pnpm is unavailable; install the pinned oracle dependencies with " - "pnpm install --dir compatibility/oracle" + "pnpm install --dir tools/overpy/oracle" ) from error # Recorded diagnostics must be checkout-path-independent: replace the diff --git a/compatibility/tests/test_conformance.py b/tools/overpy/tests/test_conformance.py similarity index 98% rename from compatibility/tests/test_conformance.py rename to tools/overpy/tests/test_conformance.py index 8c7cb2e..dbb146e 100644 --- a/compatibility/tests/test_conformance.py +++ b/tools/overpy/tests/test_conformance.py @@ -5,8 +5,8 @@ from pathlib import Path -COMPATIBILITY_DIR = Path(__file__).resolve().parents[1] -sys.path.insert(0, str(COMPATIBILITY_DIR)) +TOOLS_DIR = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(TOOLS_DIR)) import conformance # noqa: E402 @@ -129,7 +129,7 @@ def test_feature_contract_inventory_detects_pinned_registry_drift(self): ], "branches": [{"id": "branch/test", "source": "src/compiler/parser.ts"}], } - with tempfile.TemporaryDirectory(dir=COMPATIBILITY_DIR) as directory: + with tempfile.TemporaryDirectory(dir=TOOLS_DIR) as directory: source = Path(directory) / "src/data/opy/keywords.ts" source.parent.mkdir(parents=True) source.write_text('export const opyKeywords = {"and": 1, "or": 1};\n', encoding="utf-8") diff --git a/compatibility/tests/test_diff.py b/tools/overpy/tests/test_diff.py similarity index 91% rename from compatibility/tests/test_diff.py rename to tools/overpy/tests/test_diff.py index 5a1a019..6db3245 100644 --- a/compatibility/tests/test_diff.py +++ b/tools/overpy/tests/test_diff.py @@ -6,8 +6,9 @@ from pathlib import Path -COMPATIBILITY_DIR = Path(__file__).resolve().parents[1] -sys.path.insert(0, str(COMPATIBILITY_DIR)) +TOOLS_DIR = Path(__file__).resolve().parents[1] +CORPUS_DIR = TOOLS_DIR.parents[1] / "crates/opy-rs/tests/fixtures/corpus" +sys.path.insert(0, str(TOOLS_DIR)) import diff # noqa: E402 import run_oracle # noqa: E402 @@ -17,8 +18,7 @@ class DiffTests(unittest.TestCase): @classmethod def setUpClass(cls): snapshot = ( - COMPATIBILITY_DIR - / "fixtures" + CORPUS_DIR / "synthetic" / "basic-rule" / "oracle.json" @@ -27,7 +27,7 @@ def setUpClass(cls): def test_expectations_cover_every_fixture_with_evidence(self): expectations = diff.load_expectations() - fixtures = set(diff.fixture_ids(COMPATIBILITY_DIR / "fixtures")) + fixtures = set(diff.fixture_ids(CORPUS_DIR)) self.assertEqual(set(expectations), fixtures) for fixture, expectation in expectations.items(): self.assertTrue(expectation["evidence"], fixture) @@ -36,7 +36,7 @@ def test_expectations_cover_every_fixture_with_evidence(self): def test_compiler_expectations_are_separate_and_cover_every_fixture(self): source = diff.load_expectations() compiler = diff.load_compiler_expectations() - fixtures = set(diff.fixture_ids(COMPATIBILITY_DIR / "fixtures")) + fixtures = set(diff.fixture_ids(CORPUS_DIR)) self.assertEqual(set(compiler), fixtures) self.assertNotIn("comparison", source["synthetic/basic-rule"]) for fixture, expectation in compiler.items(): @@ -57,7 +57,7 @@ def test_matching_result_has_distinct_stages(self): root = Path(temporary) self.write_result(root, result) report_result = diff.compare_fixture( - COMPATIBILITY_DIR / "fixtures", + CORPUS_DIR, "synthetic/basic-rule", root, None, @@ -76,7 +76,7 @@ def test_exact_difference_can_still_have_normalized_match(self): root = Path(temporary) self.write_result(root, result) report_result = diff.compare_fixture( - COMPATIBILITY_DIR / "fixtures", + CORPUS_DIR, "synthetic/basic-rule", root, None, @@ -92,7 +92,7 @@ def test_normalized_difference_is_regression(self): root = Path(temporary) self.write_result(root, result) report_result = diff.compare_fixture( - COMPATIBILITY_DIR / "fixtures", + CORPUS_DIR, "synthetic/basic-rule", root, None, @@ -111,7 +111,7 @@ def test_reference_success_native_failure_is_not_match(self): root = Path(temporary) self.write_result(root, result) report_result = diff.compare_fixture( - COMPATIBILITY_DIR / "fixtures", + CORPUS_DIR, "synthetic/basic-rule", root, None, @@ -128,7 +128,7 @@ def test_diagnostic_difference_is_regression(self): root = Path(temporary) self.write_result(root, result) report_result = diff.compare_fixture( - COMPATIBILITY_DIR / "fixtures", + CORPUS_DIR, "synthetic/basic-rule", root, None, @@ -144,7 +144,7 @@ def test_input_hash_mismatch_is_rejected(self): self.write_result(root, result) with self.assertRaises(diff.DiffError): diff.compare_fixture( - COMPATIBILITY_DIR / "fixtures", + CORPUS_DIR, "synthetic/basic-rule", root, None, @@ -160,7 +160,7 @@ def test_compiler_status_mismatch_is_blocking(self): root = Path(temporary) self.write_result(root, result) report_result = diff.compare_compiler_fixture( - COMPATIBILITY_DIR / "fixtures", + CORPUS_DIR, "synthetic/basic-rule", root, diff.load_compiler_expectations(), @@ -176,7 +176,7 @@ def test_compiler_input_hash_mismatch_is_rejected(self): self.write_result(root, result) with self.assertRaises(diff.DiffError): diff.compare_compiler_fixture( - COMPATIBILITY_DIR / "fixtures", + CORPUS_DIR, "synthetic/basic-rule", root, diff.load_compiler_expectations(), @@ -192,8 +192,7 @@ def test_compiler_semantic_wir_rejects_stale_direct_evidence(self): fixture = "synthetic/expressions-values" oracle = json.loads( ( - COMPATIBILITY_DIR - / "fixtures" + CORPUS_DIR / fixture / "oracle.json" ).read_text(encoding="utf-8") @@ -213,7 +212,7 @@ def test_compiler_semantic_wir_rejects_stale_direct_evidence(self): root = Path(temporary) self.write_result(root, result) report_result = diff.compare_compiler_fixture( - COMPATIBILITY_DIR / "fixtures", + CORPUS_DIR, fixture, root, diff.load_compiler_expectations(), @@ -229,7 +228,7 @@ def test_compiler_semantic_wir_rejects_stale_direct_evidence(self): root = Path(temporary) self.write_result(root, result) report_result = diff.compare_compiler_fixture( - COMPATIBILITY_DIR / "fixtures", + CORPUS_DIR, fixture, root, diff.load_compiler_expectations(), @@ -246,7 +245,7 @@ def test_compiler_semantic_wir_rejects_stale_direct_evidence(self): root = Path(temporary) self.write_result(root, result) report_result = diff.compare_compiler_fixture( - COMPATIBILITY_DIR / "fixtures", + CORPUS_DIR, fixture, root, diff.load_compiler_expectations(), @@ -268,7 +267,7 @@ def test_compiler_report_declares_compiler_stages(self): def test_missing_producer_is_inconclusive(self): report_result = diff.compare_fixture( - COMPATIBILITY_DIR / "fixtures", + CORPUS_DIR, "synthetic/basic-rule", None, None, diff --git a/compatibility/tests/test_runner.py b/tools/overpy/tests/test_runner.py similarity index 92% rename from compatibility/tests/test_runner.py rename to tools/overpy/tests/test_runner.py index e0238c1..321fa24 100644 --- a/compatibility/tests/test_runner.py +++ b/tools/overpy/tests/test_runner.py @@ -5,8 +5,9 @@ from pathlib import Path -COMPATIBILITY_DIR = Path(__file__).resolve().parents[1] -sys.path.insert(0, str(COMPATIBILITY_DIR)) +TOOLS_DIR = Path(__file__).resolve().parents[1] +CORPUS_DIR = TOOLS_DIR.parents[1] / "crates/opy-rs/tests/fixtures/corpus" +sys.path.insert(0, str(TOOLS_DIR)) import run_oracle # noqa: E402 import input_identity # noqa: E402 @@ -58,7 +59,7 @@ def test_normalize_diagnostics_preserves_error_and_location_text(self): def test_repository_fixture_metadata_and_snapshots_are_valid(self): fixtures = run_oracle.discover_fixtures( - COMPATIBILITY_DIR / "fixtures" + CORPUS_DIR ) for fixture_path, fixture in fixtures: snapshot = fixture_path.parent / "oracle.json" @@ -89,7 +90,7 @@ def test_repository_fixture_metadata_and_snapshots_are_valid(self): self.assertEqual(overpy_cake["provenance"]["kind"], "imported-example") def test_real_world_gaps_have_minimized_provenance_linked_regressions(self): - fixtures = run_oracle.discover_fixtures(COMPATIBILITY_DIR / "fixtures") + fixtures = run_oracle.discover_fixtures(CORPUS_DIR) gaps = [ fixture for _, fixture in fixtures @@ -110,7 +111,7 @@ def test_real_world_gaps_have_minimized_provenance_linked_regressions(self): self.assertIsInstance(regressions, list, fixture["id"]) self.assertGreaterEqual(len(regressions), 1, fixture["id"]) for regression in regressions: - source = (COMPATIBILITY_DIR / "fixtures" / fixture["id"] / regression["source"]).resolve() + source = (CORPUS_DIR / fixture["id"] / regression["source"]).resolve() self.assertTrue(source.is_file(), regression["id"]) self.assertEqual(regression["derivedFrom"], fixture["source"]) self.assertEqual(regression["expectedReferenceStatus"], fixture["expectedStatus"]) @@ -120,7 +121,7 @@ def test_real_world_gaps_have_minimized_provenance_linked_regressions(self): def test_census_uses_opaque_workshop_owned_feature_ids(self): _, census = next( fixture - for fixture in run_oracle.discover_fixtures(COMPATIBILITY_DIR / "fixtures") + for fixture in run_oracle.discover_fixtures(CORPUS_DIR) if fixture[1]["id"] == "census/workshop-feature-census" ) self.assertEqual(census["censusContract"]["owner"], "workshop-rs")