refactor(lexicon): shared SyntheticBannedStrings() helper (REQ-029, G-014)

Add lexicon.SyntheticBannedStrings() — single source for the synthetic
self-test table consumed by BOTH meta-tests. Refactor
TestLexiconMetaSelfTestTable (lexicon_meta) and TestLexiconMetaDocsSelfTestTable
(lexicon_meta_docs) to consume the helper; remove the byte-identical
duplicated 10-string table from both. Closes the G-014 drift risk.

test(hub): cross-package const-equality test (REQ-030, A-304, G-015)

Add x/hub/types/cross_const_test.go: test-only import of x/bond/types
(G-003 test-exempt). TestLendingCouponCapMatchesBondCap + TestLendingCoupon-
FloorMatchesBondFloor assert cross-equality; TestConstsAreMissionLocked800And0
(G-015) asserts absolute 800/0 values — catches paired drift. Closes A-304.

Verification: go test ./... green; old synthetic table gone (grep 0);
go.mod unchanged; G-003 production firewall intact.

---ci---
project: oy
phase: 1
milestone: v0.4
status: execute
tag_base: v0.3.x
milestone_type: nfr
reqs: [REQ-029, REQ-030]
---/ci---
This commit is contained in:
2026-08-17 23:30:30 +00:00
parent cc0940d9f8
commit 2ca0e1aa4b
4 changed files with 128 additions and 50 deletions
+11 -31
View File
@@ -128,22 +128,14 @@ func TestLexiconMetaDocsNoBannedTermsInDocs(t *testing.T) {
// breaks, this test fails before the firewall silently passes a real
// violation in a docs page.
//
// G-014 self-test drift: this table is the docs mirror of the
// TestLexiconMetaSelfTestTable in lexicon_meta_test.go (package lexicon_meta).
// Both reuse lexicon.BannedTerms() as the single source for the 10 terms, so
// a future addition updates both firewalls from one place. The synthetic
// strings are assembled from lexicon.BannedTerms() fragments so this file
// does not contain any banned term as a literal substring (it would otherwise
// trip its own scan; the meta-test file is also excluded from its own scan,
// but the self-test keeps the source clean for readability/searchability).
//
// CROSS-REFERENCE: keep this table aligned with
//
// lexicon_meta_test.go :: TestLexiconMetaSelfTestTable
//
// Any change to the synthetic-string construction must be mirrored in both
// files (or, preferably, add a shared helper in the lexicon package — see
// G-014 minimum-viable: cross-reference comment + shared BannedTerms()).
// REQ-029 (GRILL G-014): the synthetic strings are sourced from
// lexicon.SyntheticBannedStrings(), the single source of truth shared with
// lexicon_meta_test.go :: TestLexiconMetaSelfTestTable. Before REQ-029, this
// file DUPLICATED its own 10-string table (byte-identical to the x/ meta-
// test), creating a drift risk; the shared helper closes it. This file no
// longer builds its own synthetic table — both meta-tests consume the same
// helper, so a future banned-term addition updates both firewalls from one
// place.
func TestLexiconMetaDocsSelfTestTable(t *testing.T) {
terms := lexicon.BannedTerms()
// The spec lists 10 banned terms (plan docs say "9", counting dollar/euro
@@ -152,22 +144,10 @@ func TestLexiconMetaDocsSelfTestTable(t *testing.T) {
if len(terms) != 10 {
t.Fatalf("BannedTerms() len = %d, want 10", len(terms))
}
// Each synthetic string embeds exactly one banned term in a plausible
// sentence context. Each must be detected.
synthetic := []string{
"open a " + terms[0] + " here", // bank
"make a " + terms[1] + " now", // deposit
"compounding " + terms[2] + " rate", // interest
"the " + terms[3] + " is 5pct", // yield
"foreign " + terms[4] + " pair", // currency
"price in " + terms[5], // dollar
"price in " + terms[6], // euro
"freeze the " + terms[7], // account
"move to " + terms[8] + " now", // savings
"the " + terms[9] + " lost money", // depositor
}
// REQ-029: consume the shared synthetic-string helper (G-014 single source).
synthetic := lexicon.SyntheticBannedStrings()
if len(synthetic) != len(terms) {
t.Fatalf("synthetic table len = %d, want %d", len(synthetic), len(terms))
t.Fatalf("SyntheticBannedStrings() len = %d, want %d (must match BannedTerms())", len(synthetic), len(terms))
}
for i, s := range synthetic {
found, ok := lexicon.FindBannedTerm(s)