Trace a render's read with the row it renders, none outside a table

This commit is contained in:
2026-09-29 12:12:42 +02:00
committed by Lillem4n
parent d50136223a
commit 4fcf45b5d0
2 changed files with 15 additions and 19 deletions
+5 -9
View File
@@ -24,16 +24,12 @@ type fenceRoot struct {
t *template t *template
} }
func fenceRoots(t *testing.T, f *Generator) ([]fenceRoot, map[string]*table) { func fenceRoots(t *testing.T, f *Generator) []fenceRoot {
t.Helper() t.Helper()
var roots []fenceRoot var roots []fenceRoot
tables := map[string]*table{}
_ = walkNodes(f.root.children, func(path string, n node) error { _ = walkNodes(f.root.children, func(path string, n node) error {
switch n := n.(type) { if tm, ok := n.(*template); ok {
case *template: roots = append(roots, fenceRoot{path, tm})
roots = append(roots, fenceRoot{path, n})
case *table:
tables[n.path] = n
} }
return nil return nil
}) })
@@ -51,12 +47,12 @@ func fenceRoots(t *testing.T, f *Generator) ([]fenceRoot, map[string]*table) {
} }
return nil return nil
}) })
return append(roots, fenceRoot{"inline record", record.template}), tables return append(roots, fenceRoot{"inline record", record.template})
} }
func TestReplayPairsFindsWhatAWholeReplayFinds(t *testing.T) { func TestReplayPairsFindsWhatAWholeReplayFinds(t *testing.T) {
corpus := fenceCorpus(t) corpus := fenceCorpus(t)
roots, _ := fenceRoots(t, corpus) roots := fenceRoots(t, corpus)
shipped, err := New() shipped, err := New()
if err != nil { if err != nil {
t.Fatalf("New() = %v", err) t.Fatalf("New() = %v", err)
+10 -10
View File
@@ -8,10 +8,10 @@ import (
func TestEveryReadARenderMakesIsGathered(t *testing.T) { func TestEveryReadARenderMakesIsGathered(t *testing.T) {
f := fenceCorpus(t) f := fenceCorpus(t)
roots, tables := fenceRoots(t, f) roots := fenceRoots(t, f)
traced := 0 traced := 0
for _, root := range roots { for _, root := range roots {
traced += wantGathered(t, tables, root.label, surveyRender(root.t).reads, func(trace renderTrace) { renderRoot(f.rand, root.t, trace) }) traced += wantGathered(t, root.label, surveyRender(root.t).reads, func(trace renderTrace) { renderRoot(f.rand, root.t, trace) })
if !root.t.isRecord || len(root.t.fields) == 0 { if !root.t.isRecord || len(root.t.fields) == 0 {
continue continue
} }
@@ -19,30 +19,30 @@ func TestEveryReadARenderMakesIsGathered(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("%s: recordOf = %v", root.label, err) t.Fatalf("%s: recordOf = %v", root.label, err)
} }
traced += wantGathered(t, tables, root.label+" as a record", surveyColumns(root.t, sortedNames(root.t.fields)).reads, func(trace renderTrace) { renderRecordRoot(f.rand, root.t, columns, trace) }) traced += wantGathered(t, root.label+" as a record", surveyColumns(root.t, sortedNames(root.t.fields)).reads, func(trace renderTrace) { renderRecordRoot(f.rand, root.t, columns, trace) })
} }
if traced == 0 { if traced == 0 {
t.Error("no render traced a reference read, so the comparison proved nothing") t.Error("no render traced a reference read, so the comparison proved nothing")
} }
} }
func wantGathered(t *testing.T, tables map[string]*table, label string, gathered []pathRead, renderWith func(renderTrace)) int { func wantGathered(t *testing.T, label string, gathered []pathRead, renderWith func(renderTrace)) int {
t.Helper() t.Helper()
var reads []pathRead var reads []pathRead
type traceKey struct { type traceKey struct {
group, path, table string group, path string
row int row renderedRow
} }
seen := map[traceKey]bool{} seen := map[traceKey]bool{}
trace := func(group, table string, row int, a arm) { trace := func(group string, row renderedRow, a arm) {
if !isRef(a.head) { if !isRef(a.head) {
return return
} }
r := pathRead{at: surveyAt{group: group}, a: a} r := pathRead{at: surveyAt{group: group}, a: a}
if table != "" { if row.t != nil {
r.at.pins.add(tables[table], row) r.at.pins.add(row.t, row.index)
} }
if k := (traceKey{group, a.path, table, row}); !seen[k] { if k := (traceKey{group, a.path, row}); !seen[k] {
seen[k] = true seen[k] = true
reads = append(reads, r) reads = append(reads, r)
} }