skipped 14 lines 15 15 package tcell 16 16 17 17 import ( 18 + "reflect" 18 19 "testing" 19 20 20 - "github.com/gdamore/tcell" 21 + tcell "github.com/gdamore/tcell/ v2 " 22 + "github.com/kylelemons/godebug/pretty" 21 23 "github.com/mum4k/termdash/cell" 22 24 "github.com/mum4k/termdash/terminal/terminalapi" 23 25 ) 24 26 25 - func TestCellColor(t *testing.T) { 26 - tests := []struct { 27 - color cell.Color 28 - want tcell.Color 29 - }{ 30 - {cell.ColorDefault, tcell.ColorDefault}, 31 - {cell.ColorBlack, tcell.ColorBlack}, 32 - {cell.ColorRed, tcell.ColorMaroon}, 33 - {cell.ColorGreen, tcell.ColorGreen}, 34 - {cell.ColorYellow, tcell.ColorOlive}, 35 - {cell.ColorBlue, tcell.ColorNavy}, 36 - {cell.ColorMagenta, tcell.ColorPurple}, 37 - {cell.ColorCyan, tcell.ColorTeal}, 38 - {cell.ColorWhite, tcell.ColorSilver}, 39 - {cell.ColorNumber(42), tcell.Color(42)}, 40 - } 41 - 42 - for _, tc := range tests { 43 - t.Run(tc.color.String(), func(t *testing.T) { 44 - got := cellColor(tc.color) 45 - if got != tc.want { 46 - t.Errorf("cellColor(%v) => got %v, want %v", tc.color, got, tc.want) 47 - } 48 - }) 49 - } 50 - } 51 - 52 - func TestFixColor(t *testing.T) { 53 - tests := []struct { 54 - colorMode terminalapi.ColorMode 55 - color cell.Color 56 - want tcell.Color 57 - }{ 58 - // See https://jonasjacek.github.io/colors/ for a good reference of all 256 xterm colors 59 - // All 256 colors 60 - {terminalapi.ColorMode256, cell.ColorDefault, tcell.ColorDefault}, 61 - {terminalapi.ColorMode256, cell.ColorBlack, tcell.ColorBlack}, 62 - {terminalapi.ColorMode256, cell.ColorRed, tcell.ColorMaroon}, 63 - {terminalapi.ColorMode256, cell.ColorGreen, tcell.ColorGreen}, 64 - {terminalapi.ColorMode256, cell.ColorYellow, tcell.ColorOlive}, 65 - {terminalapi.ColorMode256, cell.ColorBlue, tcell.ColorNavy}, 66 - {terminalapi.ColorMode256, cell.ColorMagenta, tcell.ColorPurple}, 67 - {terminalapi.ColorMode256, cell.ColorCyan, tcell.ColorTeal}, 68 - {terminalapi.ColorMode256, cell.ColorWhite, tcell.ColorSilver}, 69 - {terminalapi.ColorMode256, cell.ColorNumber(42), tcell.Color(42)}, 70 - // 8 system colors 71 - {terminalapi.ColorModeNormal, cell.ColorDefault, tcell.ColorDefault}, 72 - {terminalapi.ColorModeNormal, cell.ColorBlack, tcell.ColorBlack}, 73 - {terminalapi.ColorModeNormal, cell.ColorRed, tcell.ColorMaroon}, 74 - {terminalapi.ColorModeNormal, cell.ColorGreen, tcell.ColorGreen}, 75 - {terminalapi.ColorModeNormal, cell.ColorYellow, tcell.ColorOlive}, 76 - {terminalapi.ColorModeNormal, cell.ColorBlue, tcell.ColorNavy}, 77 - {terminalapi.ColorModeNormal, cell.ColorMagenta, tcell.ColorPurple}, 78 - {terminalapi.ColorModeNormal, cell.ColorCyan, tcell.ColorTeal}, 79 - {terminalapi.ColorModeNormal, cell.ColorWhite, tcell.ColorSilver}, 80 - {terminalapi.ColorModeNormal, cell.ColorNumber(42), tcell.Color(10)}, 81 - // Grayscale colors (all the grey colours from 231 to 255) 82 - {terminalapi.ColorModeGrayscale, cell.ColorDefault, tcell.ColorDefault}, 83 - {terminalapi.ColorModeGrayscale, cell.ColorBlack, tcell.Color232}, 84 - {terminalapi.ColorModeGrayscale, cell.ColorRed, tcell.Color233}, 85 - {terminalapi.ColorModeGrayscale, cell.ColorGreen, tcell.Color234}, 86 - {terminalapi.ColorModeGrayscale, cell.ColorYellow, tcell.Color235}, 87 - {terminalapi.ColorModeGrayscale, cell.ColorBlue, tcell.Color236}, 88 - {terminalapi.ColorModeGrayscale, cell.ColorMagenta, tcell.Color237}, 89 - {terminalapi.ColorModeGrayscale, cell.ColorCyan, tcell.Color238}, 90 - {terminalapi.ColorModeGrayscale, cell.ColorWhite, tcell.Color239}, 91 - {terminalapi.ColorModeGrayscale, cell.ColorNumber(42), tcell.Color(250)}, 92 - // 216 colors (16 to 231) 93 - {terminalapi.ColorMode216, cell.ColorDefault, tcell.ColorDefault}, 94 - {terminalapi.ColorMode216, cell.ColorBlack, tcell.Color16}, 95 - {terminalapi.ColorMode216, cell.ColorRed, tcell.Color17}, 96 - {terminalapi.ColorMode216, cell.ColorGreen, tcell.Color18}, 97 - {terminalapi.ColorMode216, cell.ColorYellow, tcell.Color19}, 98 - {terminalapi.ColorMode216, cell.ColorBlue, tcell.Color20}, 99 - {terminalapi.ColorMode216, cell.ColorMagenta, tcell.Color21}, 100 - {terminalapi.ColorMode216, cell.ColorCyan, tcell.Color22}, 101 - {terminalapi.ColorMode216, cell.ColorWhite, tcell.Color23}, 102 - {terminalapi.ColorMode216, cell.ColorNumber(42), tcell.Color(58)}, 103 - // Unknown color mode 104 - {-1, cell.ColorRed, tcell.ColorDefault}, 105 - } 106 - 107 - for _, tc := range tests { 108 - t.Run(tc.colorMode.String()+"_"+tc.color.String(), func(t *testing.T) { 109 - color := cellColor(tc.color) 110 - got := fixColor(color, tc.colorMode) 111 - if got != tc.want { 112 - t.Errorf("fixColor(%v_%v), => got %v, want %v", tc.colorMode, tc.color, got, tc.want) 113 - } 114 - }) 115 - } 116 - } 117 - 118 27 func TestCellOptsToStyle(t *testing.T) { 119 28 tests := []struct { 29 + desc string 120 30 colorMode terminalapi.ColorMode 121 31 opts cell.Options 122 32 want tcell.Style 123 33 }{ 124 34 { 35 + desc: "ColorMode256: ColorDefault and ColorBlack", 125 36 colorMode: terminalapi.ColorMode256, 126 - opts: cell.Options{FgColor: cell.ColorWhite, BgColor: cell.ColorBlack}, 127 - want: tcell.StyleDefault.Foreground(tcell.ColorSilver).Background(tcell.ColorBlack), 37 + opts: cell.Options{ 38 + FgColor: cell.ColorDefault, 39 + BgColor: cell.ColorBlack, 40 + }, 41 + want: tcell.StyleDefault. 42 + Foreground(tcell.ColorDefault). 43 + Background(tcell.ColorBlack), 44 + }, 45 + { 46 + desc: "ColorMode256: ColorMaroon and ColorGreen", 47 + colorMode: terminalapi.ColorMode256, 48 + opts: cell.Options{ 49 + FgColor: cell.ColorMaroon, 50 + BgColor: cell.ColorGreen, 51 + }, 52 + want: tcell.StyleDefault. 53 + Foreground(tcell.ColorMaroon). 54 + Background(tcell.ColorGreen), 55 + }, 56 + { 57 + desc: "ColorMode256: ColorOlive and ColorNavy", 58 + colorMode: terminalapi.ColorMode256, 59 + opts: cell.Options{ 60 + FgColor: cell.ColorOlive, 61 + BgColor: cell.ColorNavy, 62 + }, 63 + want: tcell.StyleDefault. 64 + Foreground(tcell.ColorOlive). 65 + Background(tcell.ColorNavy), 66 + }, 67 + { 68 + desc: "ColorMode256: ColorPurple and ColorTeal", 69 + colorMode: terminalapi.ColorMode256, 70 + opts: cell.Options{ 71 + FgColor: cell.ColorPurple, 72 + BgColor: cell.ColorTeal, 73 + }, 74 + want: tcell.StyleDefault. 75 + Foreground(tcell.ColorPurple). 76 + Background(tcell.ColorTeal), 77 + }, 78 + { 79 + desc: "ColorMode256: ColorSilver and ColorGray", 80 + colorMode: terminalapi.ColorMode256, 81 + opts: cell.Options{ 82 + FgColor: cell.ColorSilver, 83 + BgColor: cell.ColorGray, 84 + }, 85 + want: tcell.StyleDefault. 86 + Foreground(tcell.ColorSilver). 87 + Background(tcell.ColorGray), 88 + }, 89 + { 90 + desc: "ColorMode256: ColorRed and ColorLime", 91 + colorMode: terminalapi.ColorMode256, 92 + opts: cell.Options{ 93 + FgColor: cell.ColorRed, 94 + BgColor: cell.ColorLime, 95 + }, 96 + want: tcell.StyleDefault. 97 + Foreground(tcell.ColorRed). 98 + Background(tcell.ColorLime), 99 + }, 100 + { 101 + desc: "ColorMode256: ColorYellow and ColorBlue", 102 + colorMode: terminalapi.ColorMode256, 103 + opts: cell.Options{ 104 + FgColor: cell.ColorYellow, 105 + BgColor: cell.ColorBlue, 106 + }, 107 + want: tcell.StyleDefault. 108 + Foreground(tcell.ColorYellow). 109 + Background(tcell.ColorBlue), 110 + }, 111 + { 112 + desc: "ColorMode256: ColorFuchsia and ColorAqua", 113 + colorMode: terminalapi.ColorMode256, 114 + opts: cell.Options{ 115 + FgColor: cell.ColorFuchsia, 116 + BgColor: cell.ColorAqua, 117 + }, 118 + want: tcell.StyleDefault. 119 + Foreground(tcell.ColorFuchsia). 120 + Background(tcell.ColorAqua), 121 + }, 122 + { 123 + desc: "ColorMode256: ColorWhite and ColorDefault", 124 + colorMode: terminalapi.ColorMode256, 125 + opts: cell.Options{ 126 + FgColor: cell.ColorWhite, 127 + BgColor: cell.ColorDefault, 128 + }, 129 + want: tcell.StyleDefault. 130 + Foreground(tcell.ColorWhite). 131 + Background(tcell.ColorDefault), 132 + }, 133 + { 134 + desc: "ColorMode256: termbox compatibility colors ColorMagenta and ColorCyan", 135 + colorMode: terminalapi.ColorMode256, 136 + opts: cell.Options{ 137 + FgColor: cell.ColorMagenta, 138 + BgColor: cell.ColorCyan, 139 + }, 140 + want: tcell.StyleDefault. 141 + Foreground(tcell.ColorPurple). 142 + Background(tcell.ColorTeal), 143 + }, 144 + { 145 + desc: "ColorMode256: first(0) and last(255) numbered color", 146 + colorMode: terminalapi.ColorMode256, 147 + opts: cell.Options{ 148 + FgColor: cell.ColorNumber(0), 149 + BgColor: cell.ColorNumber(255), 150 + }, 151 + want: tcell.StyleDefault. 152 + Foreground(tcell.ColorBlack). 153 + Background(tcell.Color255), 154 + }, 155 + { 156 + desc: "ColorMode256: two numbered colors", 157 + colorMode: terminalapi.ColorMode256, 158 + opts: cell.Options{ 159 + FgColor: cell.ColorNumber(33), 160 + BgColor: cell.ColorNumber(200), 161 + }, 162 + want: tcell.StyleDefault. 163 + Foreground(tcell.Color33). 164 + Background(tcell.Color200), 165 + }, 166 + { 167 + desc: "ColorMode256: first and last RGB6 color", 168 + colorMode: terminalapi.ColorMode256, 169 + opts: cell.Options{ 170 + FgColor: cell.ColorRGB6(0, 0, 0), 171 + BgColor: cell.ColorRGB6(5, 5, 5), 172 + }, 173 + want: tcell.StyleDefault. 174 + Foreground(tcell.Color16). 175 + Background(tcell.Color231), 176 + }, 177 + { 178 + desc: "ColorMode256: first and last RGB24 color", 179 + colorMode: terminalapi.ColorMode256, 180 + opts: cell.Options{ 181 + FgColor: cell.ColorRGB24(0, 0, 0), 182 + BgColor: cell.ColorRGB24(255, 255, 255), 183 + }, 184 + want: tcell.StyleDefault. 185 + Foreground(tcell.Color16). 186 + Background(tcell.Color231), 128 187 }, 129 188 { 189 + desc: "ColorModeNormal: first and last color", 130 190 colorMode: terminalapi.ColorModeNormal, 131 - opts: cell.Options{FgColor: cell.ColorWhite, BgColor: cell.ColorBlack}, 132 - want: tcell.StyleDefault.Foreground(tcell.ColorSilver).Background(tcell.ColorBlack), 191 + opts: cell.Options{ 192 + FgColor: cell.ColorBlack, 193 + BgColor: cell.ColorWhite, 194 + }, 195 + want: tcell.StyleDefault. 196 + Foreground(tcell.ColorBlack). 197 + Background(tcell.ColorWhite), 133 198 }, 134 199 { 135 - colorMode: terminalapi.ColorModeGrayscale, 136 - opts: cell.Options{FgColor: cell.ColorWhite, BgColor: cell.ColorBlack}, 137 - want: tcell.StyleDefault.Foreground(tcell.Color239).Background(tcell.Color232), 200 + desc: "ColorModeNormal: colors in the middle", 201 + colorMode: terminalapi.ColorModeNormal, 202 + opts: cell.Options{ 203 + FgColor: cell.ColorGreen, 204 + BgColor: cell.ColorOlive, 205 + }, 206 + want: tcell.StyleDefault. 207 + Foreground(tcell.ColorGreen). 208 + Background(tcell.ColorOlive), 138 209 }, 139 210 { 211 + desc: "ColorModeNormal: colors above the range rotate back", 212 + colorMode: terminalapi.ColorModeNormal, 213 + opts: cell.Options{ 214 + FgColor: cell.ColorNumber(17), 215 + BgColor: cell.ColorNumber(18), 216 + }, 217 + want: tcell.StyleDefault. 218 + Foreground(tcell.ColorBlack). 219 + Background(tcell.ColorMaroon), 220 + }, 221 + { 222 + desc: "ColorMode216: first and last color", 140 223 colorMode: terminalapi.ColorMode216, 141 - opts: cell.Options{FgColor: cell.ColorWhite, BgColor: cell.ColorBlack}, 142 - want: tcell.StyleDefault.Foreground(tcell.Color23).Background(tcell.Color16), 224 + opts: cell.Options{ 225 + FgColor: cell.ColorNumber(0), 226 + BgColor: cell.ColorNumber(215), 227 + }, 228 + want: tcell.StyleDefault. 229 + Foreground(tcell.Color16). 230 + Background(tcell.Color231), 231 + }, 232 + { 233 + desc: "ColorMode216: colors in the middle", 234 + colorMode: terminalapi.ColorMode216, 235 + opts: cell.Options{ 236 + FgColor: cell.ColorNumber(1), 237 + BgColor: cell.ColorNumber(2), 238 + }, 239 + want: tcell.StyleDefault. 240 + Foreground(tcell.Color17). 241 + Background(tcell.Color18), 242 + }, 243 + { 244 + desc: "ColorMode216: colors above the range rotate back", 245 + colorMode: terminalapi.ColorMode216, 246 + opts: cell.Options{ 247 + FgColor: cell.ColorNumber(216), 248 + BgColor: cell.ColorNumber(217), 249 + }, 250 + want: tcell.StyleDefault. 251 + Foreground(tcell.Color16). 252 + Background(tcell.Color17), 253 + }, 254 + { 255 + desc: "ColorModeGrayscale: first and last color", 256 + colorMode: terminalapi.ColorModeGrayscale, 257 + opts: cell.Options{ 258 + FgColor: cell.ColorNumber(0), 259 + BgColor: cell.ColorNumber(23), 260 + }, 261 + want: tcell.StyleDefault. 262 + Foreground(tcell.Color232). 263 + Background(tcell.Color255), 264 + }, 265 + { 266 + desc: "ColorModeGrayscale: colors in the middle", 267 + colorMode: terminalapi.ColorModeGrayscale, 268 + opts: cell.Options{ 269 + FgColor: cell.ColorNumber(1), 270 + BgColor: cell.ColorNumber(2), 271 + }, 272 + want: tcell.StyleDefault. 273 + Foreground(tcell.Color233). 274 + Background(tcell.Color234), 275 + }, 276 + { 277 + desc: "ColorModeGrayscale: colors above the range rotate back", 278 + colorMode: terminalapi.ColorModeGrayscale, 279 + opts: cell.Options{ 280 + FgColor: cell.ColorNumber(24), 281 + BgColor: cell.ColorNumber(25), 282 + }, 283 + want: tcell.StyleDefault. 284 + Foreground(tcell.Color232). 285 + Background(tcell.Color233), 286 + }, 287 + { 288 + desc: "Unknown color mode converts to default color", 289 + colorMode: terminalapi.ColorMode(-1), 290 + opts: cell.Options{ 291 + FgColor: cell.ColorNumber(24), 292 + BgColor: cell.ColorNumber(25), 293 + }, 294 + want: tcell.StyleDefault. 295 + Foreground(tcell.ColorDefault). 296 + Background(tcell.ColorDefault), 297 + }, 298 + { 299 + colorMode: terminalapi.ColorModeNormal, 300 + opts: cell.Options{Bold: true}, 301 + want: tcell.StyleDefault.Bold(true), 302 + }, 303 + { 304 + colorMode: terminalapi.ColorModeNormal, 305 + opts: cell.Options{Italic: true}, 306 + want: tcell.StyleDefault.Italic(true), 307 + }, 308 + { 309 + colorMode: terminalapi.ColorModeNormal, 310 + opts: cell.Options{Underline: true}, 311 + want: tcell.StyleDefault.Underline(true), 312 + }, 313 + { 314 + colorMode: terminalapi.ColorModeNormal, 315 + opts: cell.Options{Strikethrough: true}, 316 + want: tcell.StyleDefault.StrikeThrough(true), 317 + }, 318 + { 319 + colorMode: terminalapi.ColorModeNormal, 320 + opts: cell.Options{Inverse: true}, 321 + want: tcell.StyleDefault.Reverse(true), 322 + }, 323 + { 324 + colorMode: terminalapi.ColorModeNormal, 325 + opts: cell.Options{Blink: true}, 326 + want: tcell.StyleDefault.Blink(true), 143 327 }, 144 328 } 145 329 146 330 for _, tc := range tests { 147 - t.Run(tc.opts . FgColor . String ( ) + " + " + tc . opts . BgColor . String ( ) , func(t *testing.T) { 331 + t.Run(tc.desc , func(t *testing.T) { 148 332 got := cellOptsToStyle(&tc.opts, tc.colorMode) 149 - if got != tc.want { 150 - fg, bg, _ := got.Decompose() 151 - wantFg, wantBg, _ := tc.want.Decompose() 152 - t.Errorf("cellOptsToStyle(%v, fg=%v, bg=%v) => got (fg=%X, bg=%X), want (fg=%X, bg=%X)", 153 - tc.colorMode, tc.opts.FgColor, tc.opts.BgColor, fg, bg, wantFg, wantBg) 333 + if !reflect.DeepEqual(got, tc.want) { 334 + diff := pretty.Compare(tc.want, got) 335 + t.Logf("opts: %+v\nstyle:%+v", tc.opts, got) 336 + t.Errorf("cellOptsToStyle => unexpected diff (-want, +got):\n%s", diff) 154 337 } 155 338 }) 156 339 } skipped 2 lines