From 21bfb41bd615cf04c8a0fe83d4d45b4a26f59ea2 Mon Sep 17 00:00:00 2001 From: Doug Mealing Date: Sun, 14 Jun 2026 21:29:02 -0400 Subject: [PATCH] test(conformance): combined multi-package extends + overlay + cross-package references fixture MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase-3 conformance: a single realistic layered-project scenario that exercises the INTERACTION of mechanisms which existing fixtures only cover in isolation (cross-package extends, cross-file overlay, cross-package references). Combined fixtures of this shape have historically caught real cross-port bugs that the isolated fixtures missed (e.g. flattened-kitchen-sink surfaced broken cross-package-extends-over-merged-tree in C# + Python). Four files, three packages: - acme::common — abstract BaseEntity { id, createdAt, identity.primary } - acme::sales — Customer extends acme::common::BaseEntity (+ name) - acme::orders — Order extends acme::common::BaseEntity (+ customerId, total[currency], identity.reference @references acme::sales::Customer ← cross-package FK) - acme::orders overlay — Order overlay adds `notes` So one scenario gates: an abstract base extended cross-package by TWO entities in TWO different packages; a cross-package identity.reference @references target; overlay-merge across files composing with extends-resolution; and the field.currency @currency attr surviving the whole pipeline. expected.json (resolved) + expected-effective.json (extends inlined, overlay merged) are the canonicalSerialize / canonicalSerializeEffective goldens, derived from the reference loader. Verified green in all four loader ports (Kotlin runs this corpus transitively via the Java metadata module): TS 380 / Python 194 / Java 380 / C# 651. The corpus auto-discovers fixtures — no count guard to bump. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../expected-effective.json | 117 ++++++++++++++++++ .../expected.json | 81 ++++++++++++ .../input/meta.common.json | 18 +++ .../input/meta.orders.json | 18 +++ .../input/meta.orders.overlay.json | 16 +++ .../input/meta.sales.json | 16 +++ 6 files changed, 266 insertions(+) create mode 100644 fixtures/conformance/multi-package-extends-overlay-references/expected-effective.json create mode 100644 fixtures/conformance/multi-package-extends-overlay-references/expected.json create mode 100644 fixtures/conformance/multi-package-extends-overlay-references/input/meta.common.json create mode 100644 fixtures/conformance/multi-package-extends-overlay-references/input/meta.orders.json create mode 100644 fixtures/conformance/multi-package-extends-overlay-references/input/meta.orders.overlay.json create mode 100644 fixtures/conformance/multi-package-extends-overlay-references/input/meta.sales.json diff --git a/fixtures/conformance/multi-package-extends-overlay-references/expected-effective.json b/fixtures/conformance/multi-package-extends-overlay-references/expected-effective.json new file mode 100644 index 000000000..cc186c24d --- /dev/null +++ b/fixtures/conformance/multi-package-extends-overlay-references/expected-effective.json @@ -0,0 +1,117 @@ +{ + "metadata.root": { + "package": "acme::common", + "children": [ + { + "object.entity": { + "name": "BaseEntity", + "abstract": true, + "children": [ + { + "field.uuid": { + "name": "id" + } + }, + { + "field.timestamp": { + "name": "createdAt" + } + }, + { + "identity.primary": { + "name": "id", + "@fields": [ + "id" + ] + } + } + ] + } + }, + { + "object.entity": { + "name": "Order", + "extends": "acme::common::BaseEntity", + "children": [ + { + "field.uuid": { + "name": "id" + } + }, + { + "field.timestamp": { + "name": "createdAt" + } + }, + { + "identity.primary": { + "name": "id", + "@fields": [ + "id" + ] + } + }, + { + "field.uuid": { + "name": "customerId" + } + }, + { + "field.currency": { + "name": "total", + "@currency": "USD" + } + }, + { + "identity.reference": { + "name": "fkCustomer", + "@fields": [ + "customerId" + ], + "@references": "acme::sales::Customer" + } + }, + { + "field.string": { + "name": "notes" + } + } + ] + } + }, + { + "object.entity": { + "name": "Customer", + "extends": "acme::common::BaseEntity", + "children": [ + { + "field.uuid": { + "name": "id" + } + }, + { + "field.timestamp": { + "name": "createdAt" + } + }, + { + "identity.primary": { + "name": "id", + "@fields": [ + "id" + ] + } + }, + { + "field.string": { + "name": "name", + "@required": true + } + } + ] + } + } + ] + } +} + diff --git a/fixtures/conformance/multi-package-extends-overlay-references/expected.json b/fixtures/conformance/multi-package-extends-overlay-references/expected.json new file mode 100644 index 000000000..39bd77aec --- /dev/null +++ b/fixtures/conformance/multi-package-extends-overlay-references/expected.json @@ -0,0 +1,81 @@ +{ + "metadata.root": { + "package": "acme::common", + "children": [ + { + "object.entity": { + "name": "BaseEntity", + "abstract": true, + "children": [ + { + "field.uuid": { + "name": "id" + } + }, + { + "field.timestamp": { + "name": "createdAt" + } + }, + { + "identity.primary": { + "name": "id", + "@fields": [ + "id" + ] + } + } + ] + } + }, + { + "object.entity": { + "name": "Order", + "extends": "acme::common::BaseEntity", + "children": [ + { + "field.uuid": { + "name": "customerId" + } + }, + { + "field.currency": { + "name": "total", + "@currency": "USD" + } + }, + { + "identity.reference": { + "name": "fkCustomer", + "@fields": [ + "customerId" + ], + "@references": "acme::sales::Customer" + } + }, + { + "field.string": { + "name": "notes" + } + } + ] + } + }, + { + "object.entity": { + "name": "Customer", + "extends": "acme::common::BaseEntity", + "children": [ + { + "field.string": { + "name": "name", + "@required": true + } + } + ] + } + } + ] + } +} + diff --git a/fixtures/conformance/multi-package-extends-overlay-references/input/meta.common.json b/fixtures/conformance/multi-package-extends-overlay-references/input/meta.common.json new file mode 100644 index 000000000..8065c22b4 --- /dev/null +++ b/fixtures/conformance/multi-package-extends-overlay-references/input/meta.common.json @@ -0,0 +1,18 @@ +{ + "metadata.root": { + "package": "acme::common", + "children": [ + { + "object.entity": { + "name": "BaseEntity", + "abstract": true, + "children": [ + { "field.uuid": { "name": "id" } }, + { "field.timestamp": { "name": "createdAt" } }, + { "identity.primary": { "name": "id", "@fields": "id" } } + ] + } + } + ] + } +} diff --git a/fixtures/conformance/multi-package-extends-overlay-references/input/meta.orders.json b/fixtures/conformance/multi-package-extends-overlay-references/input/meta.orders.json new file mode 100644 index 000000000..c606e3bf9 --- /dev/null +++ b/fixtures/conformance/multi-package-extends-overlay-references/input/meta.orders.json @@ -0,0 +1,18 @@ +{ + "metadata.root": { + "package": "acme::orders", + "children": [ + { + "object.entity": { + "name": "Order", + "extends": "acme::common::BaseEntity", + "children": [ + { "field.uuid": { "name": "customerId" } }, + { "field.currency": { "name": "total", "@currency": "USD" } }, + { "identity.reference": { "name": "fkCustomer", "@fields": "customerId", "@references": "acme::sales::Customer" } } + ] + } + } + ] + } +} diff --git a/fixtures/conformance/multi-package-extends-overlay-references/input/meta.orders.overlay.json b/fixtures/conformance/multi-package-extends-overlay-references/input/meta.orders.overlay.json new file mode 100644 index 000000000..87fce36b6 --- /dev/null +++ b/fixtures/conformance/multi-package-extends-overlay-references/input/meta.orders.overlay.json @@ -0,0 +1,16 @@ +{ + "metadata.root": { + "package": "acme::orders", + "children": [ + { + "object.entity": { + "name": "Order", + "overlay": true, + "children": [ + { "field.string": { "name": "notes" } } + ] + } + } + ] + } +} diff --git a/fixtures/conformance/multi-package-extends-overlay-references/input/meta.sales.json b/fixtures/conformance/multi-package-extends-overlay-references/input/meta.sales.json new file mode 100644 index 000000000..7a000fd2d --- /dev/null +++ b/fixtures/conformance/multi-package-extends-overlay-references/input/meta.sales.json @@ -0,0 +1,16 @@ +{ + "metadata.root": { + "package": "acme::sales", + "children": [ + { + "object.entity": { + "name": "Customer", + "extends": "acme::common::BaseEntity", + "children": [ + { "field.string": { "name": "name", "@required": true } } + ] + } + } + ] + } +}