diffview_test.go

  1package diffview_test
  2
  3import (
  4	_ "embed"
  5	"testing"
  6
  7	"github.com/charmbracelet/x/exp/golden"
  8	"github.com/opencode-ai/opencode/internal/exp/diffview"
  9)
 10
 11//go:embed testdata/TestDefault.before
 12var TestDefaultBefore string
 13
 14//go:embed testdata/TestDefault.after
 15var TestDefaultAfter string
 16
 17//go:embed testdata/TestMultipleHunks.before
 18var TestMultipleHunksBefore string
 19
 20//go:embed testdata/TestMultipleHunks.after
 21var TestMultipleHunksAfter string
 22
 23//go:embed testdata/TestNarrow.before
 24var TestNarrowBefore string
 25
 26//go:embed testdata/TestNarrow.after
 27var TestNarrowAfter string
 28
 29type (
 30	TestFunc  func(dv *diffview.DiffView) *diffview.DiffView
 31	TestFuncs map[string]TestFunc
 32)
 33
 34var (
 35	UnifiedFunc = func(dv *diffview.DiffView) *diffview.DiffView {
 36		return dv.Unified()
 37	}
 38	SplitFunc = func(dv *diffview.DiffView) *diffview.DiffView {
 39		return dv.Split()
 40	}
 41
 42	DefaultFunc = func(dv *diffview.DiffView) *diffview.DiffView {
 43		return dv.
 44			Before("main.go", TestDefaultBefore).
 45			After("main.go", TestDefaultAfter)
 46	}
 47	NoLineNumbersFunc = func(dv *diffview.DiffView) *diffview.DiffView {
 48		return dv.
 49			Before("main.go", TestDefaultBefore).
 50			After("main.go", TestDefaultAfter).
 51			LineNumbers(false)
 52	}
 53	MultipleHunksFunc = func(dv *diffview.DiffView) *diffview.DiffView {
 54		return dv.
 55			Before("main.go", TestMultipleHunksBefore).
 56			After("main.go", TestMultipleHunksAfter)
 57	}
 58	CustomContextLinesFunc = func(dv *diffview.DiffView) *diffview.DiffView {
 59		return dv.
 60			Before("main.go", TestMultipleHunksBefore).
 61			After("main.go", TestMultipleHunksAfter).
 62			ContextLines(4)
 63	}
 64	NarrowFunc = func(dv *diffview.DiffView) *diffview.DiffView {
 65		return dv.
 66			Before("text.txt", TestNarrowBefore).
 67			After("text.txt", TestNarrowAfter)
 68	}
 69
 70	LightModeFunc = func(dv *diffview.DiffView) *diffview.DiffView {
 71		return dv.Style(diffview.DefaultLightStyle)
 72	}
 73	DarkModeFunc = func(dv *diffview.DiffView) *diffview.DiffView {
 74		return dv.Style(diffview.DefaultDarkStyle)
 75	}
 76
 77	LayoutFuncs = TestFuncs{
 78		"Unified": UnifiedFunc,
 79		"Split":   SplitFunc,
 80	}
 81	BehaviorFuncs = TestFuncs{
 82		"Default":            DefaultFunc,
 83		"NoLineNumbers":      NoLineNumbersFunc,
 84		"MultipleHunks":      MultipleHunksFunc,
 85		"CustomContextLines": CustomContextLinesFunc,
 86		"Narrow":             NarrowFunc,
 87	}
 88	ThemeFuncs = TestFuncs{
 89		"LightMode": LightModeFunc,
 90		"DarkMode":  DarkModeFunc,
 91	}
 92)
 93
 94func TestDiffView(t *testing.T) {
 95	for layoutName, layoutFunc := range LayoutFuncs {
 96		t.Run(layoutName, func(t *testing.T) {
 97			for behaviorName, behaviorFunc := range BehaviorFuncs {
 98				t.Run(behaviorName, func(t *testing.T) {
 99					for themeName, themeFunc := range ThemeFuncs {
100						t.Run(themeName, func(t *testing.T) {
101							dv := diffview.New()
102							dv = layoutFunc(dv)
103							dv = behaviorFunc(dv)
104							dv = themeFunc(dv)
105							golden.RequireEqual(t, []byte(dv.String()))
106						})
107					}
108				})
109			}
110		})
111	}
112}