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