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}