1// 2// Copyright (c) 2016-2019 The Aurora Authors. All rights reserved. 3// This program is free software. It comes without any warranty, 4// to the extent permitted by applicable law. You can redistribute 5// it and/or modify it under the terms of the Do What The Fuck You 6// Want To Public License, Version 2, as published by Sam Hocevar. 7// See LICENSE file for more details or see below. 8// 9 10// 11// DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 12// Version 2, December 2004 13// 14// Copyright (C) 2004 Sam Hocevar <sam@hocevar.net> 15// 16// Everyone is permitted to copy and distribute verbatim or modified 17// copies of this license document, and changing it is allowed as long 18// as the name is changed. 19// 20// DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 21// TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 22// 23// 0. You just DO WHAT THE FUCK YOU WANT TO. 24// 25 26package aurora 27 28import ( 29 "fmt" 30 "testing" 31) 32 33func TestValue_String(t *testing.T) { 34 var v Value 35 // colorized 36 v = value{"x", 0, 0} 37 if x := v.String(); x != "x" { 38 t.Errorf("(value).String: want %q, got %q", "x", x) 39 } 40 v = value{"x", BlackFg, RedBg} 41 want := "\033[0;30mx\033[0;41m" 42 if got := v.String(); want != got { 43 t.Errorf("(value).String: want %q, got %q", want, got) 44 } 45 // clear 46 v = valueClear{"x"} 47 if x := v.String(); x != "x" { 48 t.Errorf("(value).String: want %q, got %q", "x", x) 49 } 50 51} 52 53func TestValue_Color(t *testing.T) { 54 // colorized 55 if (value{"", RedFg, 0}).Color() != RedFg { 56 t.Error("wrong color") 57 } 58 // clear 59 if (valueClear{0}).Color() != 0 { 60 t.Error("wrong color") 61 } 62} 63 64func TestValue_Value(t *testing.T) { 65 // colorized 66 if (value{"x", RedFg, BlueBg}).Value() != "x" { 67 t.Error("wrong value") 68 } 69 // clear 70 if (valueClear{"x"}).Value() != "x" { 71 t.Error("wrong value") 72 } 73} 74 75func TestValue_Bleach(t *testing.T) { 76 // colorized 77 if (value{"x", RedFg, BlueBg}).Bleach() != (value{value: "x"}) { 78 t.Error("wrong bleached") 79 } 80 // clear 81 if (valueClear{"x"}).Bleach() != (valueClear{"x"}) { 82 t.Error("wrong bleached") 83 } 84} 85 86func TestValue_Format(t *testing.T) { 87 var v Value 88 var want, got string 89 // 90 // colorized 91 // 92 v = value{3.14, RedFg, BlueBg} 93 got = fmt.Sprintf("%+1.3g", v) 94 want = "\033[0;31m" + fmt.Sprintf("%+1.3g", 3.14) + "\033[0;44m" 95 if want != got { 96 t.Errorf("Format: want %q, got %q", want, got) 97 } 98 // 99 var utf8Verb = "%+1.3世" // verb that fit more then 1 byte 100 got = fmt.Sprintf(utf8Verb, v) 101 want = "\033[0;31m" + fmt.Sprintf(utf8Verb, 3.14) + "\033[0;44m" 102 if want != got { 103 t.Errorf("Format: want %q, got %q", want, got) 104 } 105 // 106 // clear 107 // 108 v = valueClear{3.14} 109 got = fmt.Sprintf("%+1.3g", v) 110 want = fmt.Sprintf("%+1.3g", 3.14) 111 if want != got { 112 t.Errorf("Format: want %q, got %q", want, got) 113 } 114 // 115 got = fmt.Sprintf(utf8Verb, v) 116 want = fmt.Sprintf(utf8Verb, 3.14) 117 if want != got { 118 t.Errorf("Format: want %q, got %q", want, got) 119 } 120} 121 122func Test_tail(t *testing.T) { 123 // colorized 124 if (value{"x", 0, BlueBg}).tail() != BlueBg { 125 t.Error("wrong tail color") 126 } 127 // clear 128 if (valueClear{"x"}).tail() != 0 { 129 t.Error("wrong tail color") 130 } 131} 132 133func Test_setTail(t *testing.T) { 134 // colorized 135 if (value{"x", 0, 0}).setTail(RedFg) != (value{"x", 0, RedFg}) { 136 t.Error("wrong setTail behavior") 137 } 138 // clear 139 if (valueClear{"x"}).setTail(RedFg) != (valueClear{"x"}) { 140 t.Error("wrong setTail behavior") 141 } 142} 143 144func TestValue_colors(t *testing.T) { 145 test := func(name string, v Value, clr Color) { 146 t.Helper() 147 if c := v.Color(); c != clr { 148 t.Errorf("wrong color for %s: want %d, got %d", name, clr, c) 149 } 150 } 151 // colorized 152 test("Reset", Reset("x"), 0) 153 test("Bold", Bold("x"), BoldFm) 154 test("Faint", Faint("x"), FaintFm) 155 test("DoublyUnderline", DoublyUnderline("x"), DoublyUnderlineFm) 156 test("Fraktur & Yellow", Yellow(Fraktur("x")), FrakturFm|YellowFg) 157 test("Italic", Italic("x"), ItalicFm) 158 test("Underline", Underline("x"), UnderlineFm) 159 test("SlowBlink", SlowBlink("x"), SlowBlinkFm) 160 test("RapidBlink", RapidBlink("x"), RapidBlinkFm) 161 test("Blink", Blink("x"), BlinkFm) 162 test("Reverse", Reverse("x"), ReverseFm) 163 test("Inverse", Inverse("x"), InverseFm) 164 test("Conceal", Conceal("x"), ConcealFm) 165 test("Hidden", Hidden("x"), HiddenFm) 166 test("CrossedOut", CrossedOut("x"), CrossedOutFm) 167 test("StrikeThrough", StrikeThrough("x"), StrikeThroughFm) 168 test("Framed", Framed("x"), FramedFm) 169 test("Encircled", Encircled("x"), EncircledFm) 170 test("Overlined", Overlined("x"), OverlinedFm) 171 test("Black", Black("x"), BlackFg) 172 test("Red", Red("x"), RedFg) 173 test("Green", Green("x"), GreenFg) 174 test("Yellow", Yellow("x"), YellowFg) 175 test("Brown", Brown("x"), BrownFg) 176 test("Blue", Blue("x"), BlueFg) 177 test("Magenta", Magenta("x"), MagentaFg) 178 test("Cyan", Cyan("x"), CyanFg) 179 test("White", White("x"), WhiteFg) 180 test("BrightBlack", BrightBlack("x"), BrightFg|BlackFg) 181 test("BrightRed", BrightRed("x"), BrightFg|RedFg) 182 test("BrightGreen", BrightGreen("x"), BrightFg|GreenFg) 183 test("BrightYellow", BrightYellow("x"), BrightFg|YellowFg) 184 test("BrightBlue", BrightBlue("x"), BrightFg|BlueFg) 185 test("BrightMagenta", BrightMagenta("x"), BrightFg|MagentaFg) 186 test("BrightCyan", BrightCyan("x"), BrightFg|CyanFg) 187 test("BrightWhite", BrightWhite("x"), BrightFg|WhiteFg) 188 test("Index", Index(178, "x"), (Color(178)<<shiftFg)|flagFg) 189 test("Gray", Gray(14, "x"), (Color(14+232)<<shiftFg)|flagFg) 190 test("BgBlack", BgBlack("x"), BlackBg) 191 test("BgRed", BgRed("x"), RedBg) 192 test("BgGreen", BgGreen("x"), GreenBg) 193 test("BgYellow", BgYellow("x"), YellowBg) 194 test("BgBrown", BgBrown("x"), BrownBg) 195 test("BgBlue", BgBlue("x"), BlueBg) 196 test("BgMagenta", BgMagenta("x"), MagentaBg) 197 test("BgCyan", BgCyan("x"), CyanBg) 198 test("BgWhite", BgWhite("x"), WhiteBg) 199 test("BgBrightBlack", BgBrightBlack("x"), BrightBg|BlackBg) 200 test("BgBrightRed", BgBrightRed("x"), BrightBg|RedBg) 201 test("BgBrightGreen", BgBrightGreen("x"), BrightBg|GreenBg) 202 test("BgBrightYellow", BgBrightYellow("x"), BrightBg|YellowBg) 203 test("BgBrightBlue", BgBrightBlue("x"), BrightBg|BlueBg) 204 test("BgBrightMagenta", BgBrightMagenta("x"), BrightBg|MagentaBg) 205 test("BgBrightCyan", BgBrightCyan("x"), BrightBg|CyanBg) 206 test("BgBrightWhite", BgBrightWhite("x"), BrightBg|WhiteBg) 207 test("BgIndex", BgIndex(187, "x"), Color(187)<<shiftBg|flagBg) 208 test("BgGray", BgGray(15, "x"), Color(232+15)<<shiftBg|flagBg) 209 test("Colorize", Colorize("x", RedFg|BlueBg|BrightBg|BoldFm), 210 RedFg|BlueBg|BrightBg|BoldFm) 211 // clear 212 test("Reset", valueClear{"x"}.Reset(), 0) 213 test("Bold", valueClear{"x"}.Bold(), 0) 214 test("Faint", valueClear{"x"}.Faint(), 0) 215 test("DoublyUnderline", valueClear{"x"}.DoublyUnderline(), 0) 216 test("Fraktur & Yellow", valueClear{"x"}.Fraktur(), 0) 217 test("Italic", valueClear{"x"}.Italic(), 0) 218 test("Underline", valueClear{"x"}.Underline(), 0) 219 test("SlowBlink", valueClear{"x"}.SlowBlink(), 0) 220 test("RapidBlink", valueClear{"x"}.RapidBlink(), 0) 221 test("Blink", valueClear{"x"}.Blink(), 0) 222 test("Reverse", valueClear{"x"}.Reverse(), 0) 223 test("Inverse", valueClear{"x"}.Inverse(), 0) 224 test("Conceal", valueClear{"x"}.Conceal(), 0) 225 test("Hidden", valueClear{"x"}.Hidden(), 0) 226 test("CrossedOut", valueClear{"x"}.CrossedOut(), 0) 227 test("StrikeThrough", valueClear{"x"}.StrikeThrough(), 0) 228 test("Framed", valueClear{"x"}.Framed(), 0) 229 test("Encircled", valueClear{"x"}.Encircled(), 0) 230 test("Overlined", valueClear{"x"}.Overlined(), 0) 231 test("Black", valueClear{"x"}.Black(), 0) 232 test("Red", valueClear{"x"}.Red(), 0) 233 test("Green", valueClear{"x"}.Green(), 0) 234 test("Yellow", valueClear{"x"}.Yellow(), 0) 235 test("Brown", valueClear{"x"}.Brown(), 0) 236 test("Blue", valueClear{"x"}.Blue(), 0) 237 test("Magenta", valueClear{"x"}.Magenta(), 0) 238 test("Cyan", valueClear{"x"}.Cyan(), 0) 239 test("White", valueClear{"x"}.White(), 0) 240 test("BrightBlack", valueClear{"x"}.BrightBlack(), 0) 241 test("BrightRed", valueClear{"x"}.BrightRed(), 0) 242 test("BrightGreen", valueClear{"x"}.BrightGreen(), 0) 243 test("BrightYellow", valueClear{"x"}.BrightYellow(), 0) 244 test("BrightBlue", valueClear{"x"}.BrightBlue(), 0) 245 test("BrightMagenta", valueClear{"x"}.BrightMagenta(), 0) 246 test("BrightCyan", valueClear{"x"}.BrightCyan(), 0) 247 test("BrightWhite", valueClear{"x"}.BrightWhite(), 0) 248 test("Index", valueClear{"x"}.Index(178), 0) 249 test("Gray", valueClear{"x"}.Gray(14), 0) 250 test("BgBlack", valueClear{"x"}.BgBlack(), 0) 251 test("BgRed", valueClear{"x"}.BgRed(), 0) 252 test("BgGreen", valueClear{"x"}.BgGreen(), 0) 253 test("BgYellow", valueClear{"x"}.BgYellow(), 0) 254 test("BgBrown", valueClear{"x"}.BgBrown(), 0) 255 test("BgBlue", valueClear{"x"}.BgBlue(), 0) 256 test("BgMagenta", valueClear{"x"}.BgMagenta(), 0) 257 test("BgCyan", valueClear{"x"}.BgCyan(), 0) 258 test("BgWhite", valueClear{"x"}.BgWhite(), 0) 259 test("BgBrightBlack", valueClear{"x"}.BgBrightBlack(), 0) 260 test("BgBrightRed", valueClear{"x"}.BgBrightRed(), 0) 261 test("BgBrightGreen", valueClear{"x"}.BgBrightGreen(), 0) 262 test("BgBrightYellow", valueClear{"x"}.BgBrightYellow(), 0) 263 test("BgBrightBlue", valueClear{"x"}.BgBrightBlue(), 0) 264 test("BgBrightMagenta", valueClear{"x"}.BgBrightMagenta(), 0) 265 test("BgBrightCyan", valueClear{"x"}.BgBrightCyan(), 0) 266 test("BgBrightWhite", valueClear{"x"}.BgBrightWhite(), 0) 267 test("BgIndex", valueClear{"x"}.BgIndex(187), 0) 268 test("BgGray", valueClear{"x"}.BgGray(15), 0) 269 test("Colorize", valueClear{"x"}.Colorize(RedFg|BlueBg|BrightBg|BoldFm), 0) 270 // change 271 test("Reset", Bold("x").Reset(), 0) 272 test("Bold", Faint("x").Bold(), BoldFm) 273 test("Faint", Bold("x").Faint(), FaintFm) 274 test("DoublyUnderline", Reset("x").DoublyUnderline(), DoublyUnderlineFm) 275 test("Fraktur & Yellow", Reset("x").Yellow().Fraktur(), FrakturFm|YellowFg) 276 test("Italic", Reset("x").Italic(), ItalicFm) 277 test("Underline", Reset("x").Underline(), UnderlineFm) 278 test("SlowBlink", RapidBlink("x").SlowBlink(), SlowBlinkFm) 279 test("RapidBlink", SlowBlink("x").RapidBlink(), RapidBlinkFm) 280 test("Blink", Reset("x").Blink(), BlinkFm) 281 test("Reverse", Reset("x").Reverse(), ReverseFm) 282 test("Inverse", Reset("x").Inverse(), InverseFm) 283 test("Conceal", Reset("x").Conceal(), ConcealFm) 284 test("Hidden", Reset("x").Hidden(), HiddenFm) 285 test("CrossedOut", Reset("x").CrossedOut(), CrossedOutFm) 286 test("StrikeThrough", Reset("x").StrikeThrough(), StrikeThroughFm) 287 test("Framed", Reset("x").Framed(), FramedFm) 288 test("Encircled", Reset("x").Encircled(), EncircledFm) 289 test("Overlined", Reset("x").Overlined(), OverlinedFm) 290 test("Black", Reset("x").Black(), BlackFg) 291 test("Red", Reset("x").Red(), RedFg) 292 test("Green", Reset("x").Green(), GreenFg) 293 test("Yellow", Reset("x").Yellow(), YellowFg) 294 test("Brown", Reset("x").Brown(), BrownFg) 295 test("Blue", Reset("x").Blue(), BlueFg) 296 test("Magenta", Reset("x").Magenta(), MagentaFg) 297 test("Cyan", Reset("x").Cyan(), CyanFg) 298 test("White", Reset("x").White(), WhiteFg) 299 test("BrightBlack", Reset("x").BrightBlack(), BrightFg|BlackFg) 300 test("BrightRed", Reset("x").BrightRed(), BrightFg|RedFg) 301 test("BrightGreen", Reset("x").BrightGreen(), BrightFg|GreenFg) 302 test("BrightYellow", Reset("x").BrightYellow(), BrightFg|YellowFg) 303 test("BrightBlue", Reset("x").BrightBlue(), BrightFg|BlueFg) 304 test("BrightMagenta", Reset("x").BrightMagenta(), BrightFg|MagentaFg) 305 test("BrightCyan", Reset("x").BrightCyan(), BrightFg|CyanFg) 306 test("BrightWhite", Reset("x").BrightWhite(), BrightFg|WhiteFg) 307 test("Index", Reset("x").Index(178), (Color(178)<<shiftFg)|flagFg) 308 test("Gray", Reset("x").Gray(14), (Color(14+232)<<shiftFg)|flagFg) 309 test("BgBlack", Reset("x").BgBlack(), BlackBg) 310 test("BgRed", Reset("x").BgRed(), RedBg) 311 test("BgGreen", Reset("x").BgGreen(), GreenBg) 312 test("BgYellow", Reset("x").BgYellow(), YellowBg) 313 test("BgBrown", Reset("x").BgBrown(), BrownBg) 314 test("BgBlue", Reset("x").BgBlue(), BlueBg) 315 test("BgMagenta", Reset("x").BgMagenta(), MagentaBg) 316 test("BgCyan", Reset("x").BgCyan(), CyanBg) 317 test("BgWhite", Reset("x").BgWhite(), WhiteBg) 318 test("BgBrightBlack", Reset("x").BgBrightBlack(), BrightBg|BlackBg) 319 test("BgBrightRed", Reset("x").BgBrightRed(), BrightBg|RedBg) 320 test("BgBrightGreen", Reset("x").BgBrightGreen(), BrightBg|GreenBg) 321 test("BgBrightYellow", Reset("x").BgBrightYellow(), BrightBg|YellowBg) 322 test("BgBrightBlue", Reset("x").BgBrightBlue(), BrightBg|BlueBg) 323 test("BgBrightMagenta", Reset("x").BgBrightMagenta(), BrightBg|MagentaBg) 324 test("BgBrightCyan", Reset("x").BgBrightCyan(), BrightBg|CyanBg) 325 test("BgBrightWhite", Reset("x").BgBrightWhite(), BrightBg|WhiteBg) 326 test("BgIndex", Reset("x").BgIndex(187), Color(187)<<shiftBg|flagBg) 327 test("BgGray", Reset("x").BgGray(15), Color(232+15)<<shiftBg|flagBg) 328 test("Colorize", Reset("x").Colorize(RedFg|BlueBg|BrightBg|BoldFm), 329 RedFg|BlueBg|BrightBg|BoldFm) 330 // overflow 331 test("Gray", Reset("x").Gray(151), Color(232+23)<<shiftFg|flagFg) 332 test("BgGray", Reset("x").BgGray(115), Color(232+23)<<shiftBg|flagBg) 333} 334