1package core_test
2
3import (
4 "fmt"
5 "image/color"
6 "testing"
7
8 "github.com/charmbracelet/crush/internal/tui/components/core"
9 "github.com/charmbracelet/x/exp/golden"
10)
11
12func TestStatus(t *testing.T) {
13 t.Parallel()
14
15 tests := []struct {
16 name string
17 opts core.StatusOpts
18 width int
19 }{
20 {
21 name: "Default",
22 opts: core.StatusOpts{
23 Title: "Status",
24 Description: "Everything is working fine",
25 },
26 width: 80,
27 },
28 {
29 name: "WithCustomIcon",
30 opts: core.StatusOpts{
31 Icon: "✓",
32 Title: "Success",
33 Description: "Operation completed successfully",
34 },
35 width: 80,
36 },
37 {
38 name: "NoIcon",
39 opts: core.StatusOpts{
40 NoIcon: true,
41 Title: "Info",
42 Description: "This status has no icon",
43 },
44 width: 80,
45 },
46 {
47 name: "WithColors",
48 opts: core.StatusOpts{
49 Icon: "⚠",
50 IconColor: color.RGBA{255, 165, 0, 255}, // Orange
51 Title: "Warning",
52 TitleColor: color.RGBA{255, 255, 0, 255}, // Yellow
53 Description: "This is a warning message",
54 DescriptionColor: color.RGBA{255, 0, 0, 255}, // Red
55 },
56 width: 80,
57 },
58 {
59 name: "WithExtraContent",
60 opts: core.StatusOpts{
61 Title: "Build",
62 Description: "Building project",
63 ExtraContent: "[2/5]",
64 },
65 width: 80,
66 },
67 {
68 name: "LongDescription",
69 opts: core.StatusOpts{
70 Title: "Processing",
71 Description: "This is a very long description that should be truncated when the width is too small to display it completely without wrapping",
72 },
73 width: 60,
74 },
75 {
76 name: "NarrowWidth",
77 opts: core.StatusOpts{
78 Icon: "●",
79 Title: "Status",
80 Description: "Short message",
81 },
82 width: 30,
83 },
84 {
85 name: "VeryNarrowWidth",
86 opts: core.StatusOpts{
87 Icon: "●",
88 Title: "Test",
89 Description: "This will be truncated",
90 },
91 width: 20,
92 },
93 {
94 name: "EmptyDescription",
95 opts: core.StatusOpts{
96 Icon: "●",
97 Title: "Title Only",
98 },
99 width: 80,
100 },
101 {
102 name: "AllFieldsWithExtraContent",
103 opts: core.StatusOpts{
104 Icon: "🚀",
105 IconColor: color.RGBA{0, 255, 0, 255}, // Green
106 Title: "Deployment",
107 TitleColor: color.RGBA{0, 0, 255, 255}, // Blue
108 Description: "Deploying to production environment",
109 DescriptionColor: color.RGBA{128, 128, 128, 255}, // Gray
110 ExtraContent: "v1.2.3",
111 },
112 width: 80,
113 },
114 }
115
116 for _, tt := range tests {
117 t.Run(tt.name, func(t *testing.T) {
118 t.Parallel()
119
120 output := core.Status(tt.opts, tt.width)
121 golden.RequireEqual(t, []byte(output))
122 })
123 }
124}
125
126func TestStatusTruncation(t *testing.T) {
127 t.Parallel()
128
129 opts := core.StatusOpts{
130 Icon: "●",
131 Title: "Very Long Title",
132 Description: "This is an extremely long description that definitely needs to be truncated",
133 ExtraContent: "[extra]",
134 }
135
136 // Test different widths to ensure truncation works correctly
137 widths := []int{20, 30, 40, 50, 60}
138
139 for _, width := range widths {
140 t.Run(fmt.Sprintf("Width%d", width), func(t *testing.T) {
141 t.Parallel()
142
143 output := core.Status(opts, width)
144 golden.RequireEqual(t, []byte(output))
145 })
146 }
147}