9 "github.com/alecthomas/chroma/v2/styles"
10 "github.com/charmbracelet/x/ansi"
11 "github.com/charmbracelet/x/exp/golden"
12 "github.com/opencode-ai/opencode/internal/exp/diffview"
15//go:embed testdata/TestDefault.before
16var TestDefaultBefore string
18//go:embed testdata/TestDefault.after
19var TestDefaultAfter string
21//go:embed testdata/TestMultipleHunks.before
22var TestMultipleHunksBefore string
24//go:embed testdata/TestMultipleHunks.after
25var TestMultipleHunksAfter string
27//go:embed testdata/TestNarrow.before
28var TestNarrowBefore string
30//go:embed testdata/TestNarrow.after
31var TestNarrowAfter string
33//go:embed testdata/TestTabs.before
34var TestTabsBefore string
36//go:embed testdata/TestTabs.after
37var TestTabsAfter string
40 TestFunc func(dv *diffview.DiffView) *diffview.DiffView
41 TestFuncs map[string]TestFunc
45 UnifiedFunc = func(dv *diffview.DiffView) *diffview.DiffView {
48 SplitFunc = func(dv *diffview.DiffView) *diffview.DiffView {
52 DefaultFunc = func(dv *diffview.DiffView) *diffview.DiffView {
54 Before("main.go", TestDefaultBefore).
55 After("main.go", TestDefaultAfter)
57 NoLineNumbersFunc = func(dv *diffview.DiffView) *diffview.DiffView {
59 Before("main.go", TestDefaultBefore).
60 After("main.go", TestDefaultAfter).
63 MultipleHunksFunc = func(dv *diffview.DiffView) *diffview.DiffView {
65 Before("main.go", TestMultipleHunksBefore).
66 After("main.go", TestMultipleHunksAfter)
68 CustomContextLinesFunc = func(dv *diffview.DiffView) *diffview.DiffView {
70 Before("main.go", TestMultipleHunksBefore).
71 After("main.go", TestMultipleHunksAfter).
74 NarrowFunc = func(dv *diffview.DiffView) *diffview.DiffView {
76 Before("text.txt", TestNarrowBefore).
77 After("text.txt", TestNarrowAfter)
79 SmallWidthFunc = func(dv *diffview.DiffView) *diffview.DiffView {
81 Before("main.go", TestMultipleHunksBefore).
82 After("main.go", TestMultipleHunksAfter).
85 LargeWidthFunc = func(dv *diffview.DiffView) *diffview.DiffView {
87 Before("main.go", TestMultipleHunksBefore).
88 After("main.go", TestMultipleHunksAfter).
91 NoSyntaxHighlightFunc = func(dv *diffview.DiffView) *diffview.DiffView {
93 Before("main.go", TestMultipleHunksBefore).
94 After("main.go", TestMultipleHunksAfter).
98 LightModeFunc = func(dv *diffview.DiffView) *diffview.DiffView {
100 Style(diffview.DefaultLightStyle).
101 ChromaStyle(styles.Get("catppuccin-latte"))
103 DarkModeFunc = func(dv *diffview.DiffView) *diffview.DiffView {
105 Style(diffview.DefaultDarkStyle).
106 ChromaStyle(styles.Get("catppuccin-macchiato"))
109 LayoutFuncs = TestFuncs{
110 "Unified": UnifiedFunc,
113 BehaviorFuncs = TestFuncs{
114 "Default": DefaultFunc,
115 "NoLineNumbers": NoLineNumbersFunc,
116 "MultipleHunks": MultipleHunksFunc,
117 "CustomContextLines": CustomContextLinesFunc,
118 "Narrow": NarrowFunc,
119 "SmallWidth": SmallWidthFunc,
120 "LargeWidth": LargeWidthFunc,
121 "NoSyntaxHighlight": NoSyntaxHighlightFunc,
123 ThemeFuncs = TestFuncs{
124 "LightMode": LightModeFunc,
125 "DarkMode": DarkModeFunc,
129func TestDiffView(t *testing.T) {
130 for layoutName, layoutFunc := range LayoutFuncs {
131 t.Run(layoutName, func(t *testing.T) {
132 for behaviorName, behaviorFunc := range BehaviorFuncs {
133 t.Run(behaviorName, func(t *testing.T) {
134 for themeName, themeFunc := range ThemeFuncs {
135 t.Run(themeName, func(t *testing.T) {
139 dv = behaviorFunc(dv)
141 output := dv.String()
142 golden.RequireEqual(t, []byte(output))
144 switch behaviorName {
146 assertLineWidth(t, 40, output)
148 assertLineWidth(t, 120, output)
158func TestDiffViewTabs(t *testing.T) {
159 for layoutName, layoutFunc := range LayoutFuncs {
160 t.Run(layoutName, func(t *testing.T) {
161 dv := diffview.New().
162 Before("main.go", TestTabsBefore).
163 After("main.go", TestTabsAfter).
164 Style(diffview.DefaultLightStyle).
165 ChromaStyle(styles.Get("catppuccin-latte"))
168 output := dv.String()
169 golden.RequireEqual(t, []byte(output))
174func TestDiffViewWidth(t *testing.T) {
175 for layoutName, layoutFunc := range LayoutFuncs {
176 t.Run(layoutName, func(t *testing.T) {
177 for width := 1; width <= 110; width++ {
178 if layoutName == "Unified" && width > 60 {
182 t.Run(fmt.Sprintf("WidthOf%03d", width), func(t *testing.T) {
183 dv := diffview.New().
184 Before("main.go", TestMultipleHunksBefore).
185 After("main.go", TestMultipleHunksAfter).
187 Style(diffview.DefaultLightStyle).
188 ChromaStyle(styles.Get("catppuccin-latte"))
191 output := dv.String()
192 golden.RequireEqual(t, []byte(output))
194 assertLineWidth(t, width, output)
201func TestDiffViewHeight(t *testing.T) {
202 for layoutName, layoutFunc := range LayoutFuncs {
203 t.Run(layoutName, func(t *testing.T) {
204 for height := 1; height <= 20; height++ {
205 t.Run(fmt.Sprintf("HeightOf%03d", height), func(t *testing.T) {
206 dv := diffview.New().
207 Before("main.go", TestMultipleHunksBefore).
208 After("main.go", TestMultipleHunksAfter).
210 Style(diffview.DefaultLightStyle).
211 ChromaStyle(styles.Get("catppuccin-latte"))
214 output := dv.String()
215 golden.RequireEqual(t, []byte(output))
217 assertHeight(t, height, output)
224func TestDiffViewXOffset(t *testing.T) {
225 for layoutName, layoutFunc := range LayoutFuncs {
226 t.Run(layoutName, func(t *testing.T) {
227 for xOffset := range 21 {
228 t.Run(fmt.Sprintf("XOffsetOf%02d", xOffset), func(t *testing.T) {
229 dv := diffview.New().
230 Before("main.go", TestDefaultBefore).
231 After("main.go", TestDefaultAfter).
232 Style(diffview.DefaultLightStyle).
233 ChromaStyle(styles.Get("catppuccin-latte")).
238 output := dv.String()
239 golden.RequireEqual(t, []byte(output))
241 assertLineWidth(t, 60, output)
248func TestDiffViewYOffset(t *testing.T) {
249 for layoutName, layoutFunc := range LayoutFuncs {
250 t.Run(layoutName, func(t *testing.T) {
251 for yOffset := range 17 {
252 t.Run(fmt.Sprintf("YOffsetOf%02d", yOffset), func(t *testing.T) {
253 dv := diffview.New().
254 Before("main.go", TestMultipleHunksBefore).
255 After("main.go", TestMultipleHunksAfter).
256 Style(diffview.DefaultLightStyle).
257 ChromaStyle(styles.Get("catppuccin-latte")).
262 output := dv.String()
263 golden.RequireEqual(t, []byte(output))
265 assertHeight(t, 5, output)
272func assertLineWidth(t *testing.T, expected int, output string) {
274 for line := range strings.SplitSeq(output, "\n") {
275 lineWidth = max(lineWidth, ansi.StringWidth(line))
277 if lineWidth != expected {
278 t.Errorf("expected output width to be == %d, got %d", expected, lineWidth)
282func assertHeight(t *testing.T, expected int, output string) {
283 output = strings.TrimSuffix(output, "\n")
284 lines := strings.Count(output, "\n") + 1
285 if lines != expected {
286 t.Errorf("expected output height to be == %d, got %d", expected, lines)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list