diff --git a/hold.go b/hold.go index a1eddb3..ef96774 100644 --- a/hold.go +++ b/hold.go @@ -274,8 +274,7 @@ func readField(s *session, t *template, held, shared *draws, a arm) string { } return renderShared(s, t.fields[a.key], shared) } - // A reference names a shared source, so a record shares its draw across the - // columns; a sibling field is drawn per expansion as always. + // A reference shares its draw across a record's columns; a sibling is per expansion. d := held if isRef(a.key) && shared != nil { d = shared diff --git a/record_test.go b/record_test.go index 8c0b638..472fb56 100644 --- a/record_test.go +++ b/record_test.go @@ -200,6 +200,32 @@ func TestRecordSharesAReferenceIntoAColumnRepeat(t *testing.T) { } } +func TestRecordBareReferenceStaysIndependent(t *testing.T) { + dir := writeData(t, map[string]string{ + "currency": `[{"format":"{code}","code":"AUD"},{"format":"{code}","code":"EUR"}]`, + "order": `{"format":"","whole":"{/currency}","code":"{/currency.code}"}`, + }) + f := newGenerator(t, dir, WithSeed(1)) + sawMismatch := false + for i := 0; i < 100; i++ { + r, err := f.Record("order") + if err != nil { + t.Fatal(err) + } + m := map[string]string{} + for _, c := range r.Fields() { + m[c.Name] = c.Value + } + if m["whole"] != m["code"] { + sawMismatch = true + break + } + } + if !sawMismatch { + t.Fatal("a bare {/currency} column never disagreed with a tailed {/currency.code} column; a bare reference should draw independently") + } +} + func TestRecordSQLQuotesIdentifiers(t *testing.T) { dir := writeData(t, map[string]string{ "row": `{"format": "", "postal-code": "1", "street-number": "2"}`, diff --git a/render.go b/render.go index b930cac..3dabd45 100644 --- a/render.go +++ b/render.go @@ -56,8 +56,7 @@ func render(s *session, n node) string { } // renderShared is render with a shared draw context: the draws a record shares -// across its columns. A nil shared means a standalone render, where a reference -// is drawn per expansion as it always has been. +// across its columns; a nil shared is a standalone render. func renderShared(s *session, n node, shared *draws) string { switch n := n.(type) { case *choice: