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
39 DefaultFunc = func(dv *diffview.DiffView) *diffview.DiffView {
40 return dv.
41 Before("main.go", TestDefaultBefore).
42 After("main.go", TestDefaultAfter)
43 }
44 NoLineNumbersFunc = func(dv *diffview.DiffView) *diffview.DiffView {
45 return dv.
46 Before("main.go", TestDefaultBefore).
47 After("main.go", TestDefaultAfter).
48 LineNumbers(false)
49 }
50 MultipleHunksFunc = func(dv *diffview.DiffView) *diffview.DiffView {
51 return dv.
52 Before("main.go", TestMultipleHunksBefore).
53 After("main.go", TestMultipleHunksAfter)
54 }
55 CustomContextLinesFunc = func(dv *diffview.DiffView) *diffview.DiffView {
56 return dv.
57 Before("main.go", TestMultipleHunksBefore).
58 After("main.go", TestMultipleHunksAfter).
59 ContextLines(4)
60 }
61 NarrowFunc = func(dv *diffview.DiffView) *diffview.DiffView {
62 return dv.
63 Before("text.txt", TestNarrowBefore).
64 After("text.txt", TestNarrowAfter)
65 }
66
67 LightModeFunc = func(dv *diffview.DiffView) *diffview.DiffView {
68 return dv.Style(diffview.DefaultLightStyle)
69 }
70 DarkModeFunc = func(dv *diffview.DiffView) *diffview.DiffView {
71 return dv.Style(diffview.DefaultDarkStyle)
72 }
73
74 LayoutFuncs = TestFuncs{
75 "Unified": UnifiedFunc,
76 }
77 BehaviorFuncs = TestFuncs{
78 "Default": DefaultFunc,
79 "NoLineNumbers": NoLineNumbersFunc,
80 "MultipleHunks": MultipleHunksFunc,
81 "CustomContextLines": CustomContextLinesFunc,
82 "Narrow": NarrowFunc,
83 }
84 ThemeFuncs = TestFuncs{
85 "LightMode": LightModeFunc,
86 "DarkMode": DarkModeFunc,
87 }
88)
89
90func TestDiffView(t *testing.T) {
91 for layoutName, layoutFunc := range LayoutFuncs {
92 t.Run(layoutName, func(t *testing.T) {
93 for behaviorName, behaviorFunc := range BehaviorFuncs {
94 t.Run(behaviorName, func(t *testing.T) {
95 for themeName, themeFunc := range ThemeFuncs {
96 t.Run(themeName, func(t *testing.T) {
97 dv := diffview.New()
98 dv = layoutFunc(dv)
99 dv = behaviorFunc(dv)
100 dv = themeFunc(dv)
101 golden.RequireEqual(t, []byte(dv.String()))
102 })
103 }
104 })
105 }
106 })
107 }
108}