1 #include "tickit.h"
2 #include "taplib.h"
3
on_event_incr(TickitPen * pen,TickitEventFlags flags,void * _info,void * data)4 static int on_event_incr(TickitPen *pen, TickitEventFlags flags, void *_info, void *data) {
5 ((int *)data)[0]++;
6 return 1;
7 }
8
9 static int arr[2];
10 static int next_arr = 0;
11
on_event_push(TickitPen * pen,TickitEventFlags flags,void * _info,void * data)12 static int on_event_push(TickitPen *pen, TickitEventFlags flags, void *_info, void *data) {
13 arr[next_arr++] = *(int *)data;
14 return 1;
15 }
16
main(int argc,char * argv[])17 int main(int argc, char *argv[])
18 {
19 TickitPen *pen, *pen2;
20
21 pen = tickit_pen_new();
22
23 ok(!!pen, "tickit_pen_new");
24
25 int changed = 0;
26 tickit_pen_bind_event(pen, TICKIT_PEN_ON_CHANGE, 0, on_event_incr, &changed);
27
28 is_int(tickit_pen_attrtype(TICKIT_PEN_BOLD), TICKIT_PENTYPE_BOOL, "bold is a boolean attribute");
29
30 is_int(tickit_pen_lookup_attr("b"), TICKIT_PEN_BOLD, "lookup_attr \"b\" gives bold");
31 is_str(tickit_pen_attrname(TICKIT_PEN_BOLD), "b", "pen_attrname bold gives \"b\"");
32
33 is_int(changed, 0, "change counter 0 initially");
34
35 ok(!tickit_pen_has_attr(pen, TICKIT_PEN_BOLD), "pen lacks bold initially");
36 ok(!tickit_pen_nondefault_attr(pen, TICKIT_PEN_BOLD), "pen bold attr is default initially");
37 is_int(tickit_pen_get_bool_attr(pen, TICKIT_PEN_BOLD), 0, "bold 0 initially");
38
39 ok(!tickit_pen_is_nonempty(pen), "pen initially empty");
40 ok(!tickit_pen_is_nondefault(pen), "pen initially default");
41
42 tickit_pen_set_bool_attr(pen, TICKIT_PEN_BOLD, 1);
43
44 ok(tickit_pen_has_attr(pen, TICKIT_PEN_BOLD), "pen has bold after set");
45 ok(tickit_pen_nondefault_attr(pen, TICKIT_PEN_BOLD), "pen bold attr is nondefault after set");
46 is_int(tickit_pen_get_bool_attr(pen, TICKIT_PEN_BOLD), 1, "bold 1 after set");
47
48 ok(tickit_pen_is_nonempty(pen), "pen non-empty after set bold on");
49 ok(tickit_pen_is_nondefault(pen), "pen non-default after set bold on");
50
51 is_int(changed, 1, "change counter 1 after set bold on");
52
53 tickit_pen_set_bool_attr(pen, TICKIT_PEN_BOLD, 0);
54
55 ok(!tickit_pen_nondefault_attr(pen, TICKIT_PEN_BOLD), "pen bold attr is default after set bold off");
56
57 ok(tickit_pen_is_nonempty(pen), "pen non-empty after set bold off");
58 ok(!tickit_pen_is_nondefault(pen), "pen default after set bold off");
59
60 is_int(changed, 2, "change counter 2 after set bold off");
61
62 tickit_pen_clear_attr(pen, TICKIT_PEN_BOLD);
63
64 ok(!tickit_pen_has_attr(pen, TICKIT_PEN_BOLD), "pen lacks bold after clear");
65 is_int(tickit_pen_get_bool_attr(pen, TICKIT_PEN_BOLD), 0, "bold 0 after clear");
66
67 is_int(changed, 3, "change counter 3 after clear bold");
68
69 is_int(tickit_pen_attrtype(TICKIT_PEN_FG), TICKIT_PENTYPE_COLOUR, "foreground is a colour attribute");
70
71 ok(!tickit_pen_has_attr(pen, TICKIT_PEN_FG), "pen lacks foreground initially");
72 is_int(tickit_pen_get_colour_attr(pen, TICKIT_PEN_FG), -1, "foreground -1 initially");
73
74 tickit_pen_set_colour_attr(pen, TICKIT_PEN_FG, 4);
75
76 ok(tickit_pen_has_attr(pen, TICKIT_PEN_FG), "pen has foreground after set");
77 is_int(tickit_pen_get_colour_attr(pen, TICKIT_PEN_FG), 4, "foreground 4 after set");
78
79 ok(tickit_pen_set_colour_attr_desc(pen, TICKIT_PEN_FG, "12"), "pen set foreground '12'");
80 is_int(tickit_pen_get_colour_attr(pen, TICKIT_PEN_FG), 12, "foreground 12 after set '12'");
81
82 ok(tickit_pen_set_colour_attr_desc(pen, TICKIT_PEN_FG, "green"), "pen set foreground 'green'");
83 is_int(tickit_pen_get_colour_attr(pen, TICKIT_PEN_FG), 2, "foreground 2 after set 'green'");
84
85 ok(tickit_pen_set_colour_attr_desc(pen, TICKIT_PEN_FG, "hi-red"), "pen set foreground 'hi-red'");
86 is_int(tickit_pen_get_colour_attr(pen, TICKIT_PEN_FG), 8+1, "foreground 8+1 after set 'hi-red'");
87
88 tickit_pen_clear_attr(pen, TICKIT_PEN_FG);
89
90 ok(!tickit_pen_has_attr(pen, TICKIT_PEN_FG), "pen lacks foreground after clear");
91 is_int(tickit_pen_get_colour_attr(pen, TICKIT_PEN_FG), -1, "foreground -1 after clear");
92
93 pen2 = tickit_pen_new();
94
95 ok(tickit_pen_equiv_attr(pen, pen2, TICKIT_PEN_BOLD), "pens have equiv bold attribute initially");
96
97 tickit_pen_set_bool_attr(pen, TICKIT_PEN_BOLD, 1);
98
99 ok(!tickit_pen_equiv_attr(pen, pen2, TICKIT_PEN_BOLD), "pens have unequiv bold attribute after set");
100
101 ok(tickit_pen_equiv_attr(pen, pen2, TICKIT_PEN_ITALIC), "pens have equiv italic attribute");
102
103 tickit_pen_set_bool_attr(pen, TICKIT_PEN_ITALIC, 0);
104 ok(tickit_pen_equiv_attr(pen, pen2, TICKIT_PEN_ITALIC), "pens have equiv italic attribute after set 0");
105
106 tickit_pen_copy_attr(pen2, pen, TICKIT_PEN_BOLD);
107 ok(tickit_pen_equiv_attr(pen, pen2, TICKIT_PEN_BOLD), "pens have equiv bold attribute after copy attr");
108
109 tickit_pen_clear_attr(pen2, TICKIT_PEN_BOLD);
110 tickit_pen_copy(pen2, pen, 1);
111
112 ok(tickit_pen_equiv_attr(pen, pen2, TICKIT_PEN_BOLD), "pens have equiv bold attribute after copy");
113
114 tickit_pen_set_bool_attr(pen2, TICKIT_PEN_BOLD, 0);
115 tickit_pen_copy(pen2, pen, 0);
116
117 ok(!tickit_pen_equiv_attr(pen, pen2, TICKIT_PEN_BOLD), "pens have non-equiv bold attribute after copy no overwrite");
118
119 tickit_pen_set_int_attr(pen, TICKIT_PEN_UNDER, TICKIT_PEN_UNDER_NONE);
120 tickit_pen_clear_attr(pen2, TICKIT_PEN_UNDER);
121 tickit_pen_copy(pen2, pen, 1);
122
123 ok(tickit_pen_has_attr(pen2, TICKIT_PEN_UNDER), "pen copy still copies present but default-value attributes");
124
125 is_ptr(tickit_pen_ref(pen), pen, "tickit_pen_ref() returns same pen");
126
127 tickit_pen_bind_event(pen, TICKIT_PEN_ON_DESTROY, 0, on_event_push, (int []){1});
128 tickit_pen_bind_event(pen, TICKIT_PEN_ON_DESTROY, 0, on_event_push, (int []){2});
129
130 tickit_pen_unref(pen);
131 ok(!next_arr, "pen not destroyed after first unref");
132
133 tickit_pen_unref(pen);
134 is_int(next_arr, 2, "pen destroyed after second unref");
135
136 is_int(arr[0]*10 + arr[1], 21, "TICKIT_EV_DESTROY runs in reverse order");
137
138 tickit_pen_unref(pen2);
139
140 pen = tickit_pen_new_attrs(TICKIT_PEN_BOLD, 1, TICKIT_PEN_FG, 3, 0);
141 is_int(tickit_pen_get_bool_attr(pen, TICKIT_PEN_BOLD), 1, "pen bold attr for new_attrs");
142 is_int(tickit_pen_get_colour_attr(pen, TICKIT_PEN_FG), 3, "pen fg attr for new_attrs");
143
144 tickit_pen_unref(pen);
145
146 // UNDER bool back-compat
147 {
148 TickitPen *pen = tickit_pen_new();
149
150 ok(!tickit_pen_has_attr(pen, TICKIT_PEN_UNDER), "default pen has no UNDER");
151 is_int(tickit_pen_get_int_attr(pen, TICKIT_PEN_UNDER), TICKIT_PEN_UNDER_NONE,
152 "default pen UNDER is 0");
153 ok(!tickit_pen_get_bool_attr(pen, TICKIT_PEN_UNDER), "default pen has no UNDER bool");
154
155 tickit_pen_set_int_attr(pen, TICKIT_PEN_UNDER, TICKIT_PEN_UNDER_DOUBLE);
156
157 ok(tickit_pen_has_attr(pen, TICKIT_PEN_UNDER), "pen has UNDER");
158 is_int(tickit_pen_get_int_attr(pen, TICKIT_PEN_UNDER), TICKIT_PEN_UNDER_DOUBLE,
159 "pen UNDER is DOUBLE");
160 ok(tickit_pen_get_bool_attr(pen, TICKIT_PEN_UNDER), "pen has UNDER bool");
161
162 tickit_pen_unref(pen);
163 }
164
165 // RGB8 secondary colour attributes
166 {
167 TickitPen *pen = tickit_pen_new();
168 TickitPenRGB8 val;
169
170 ok(!tickit_pen_has_colour_attr_rgb8(pen, TICKIT_PEN_FG),
171 "new pen does not have FG RGB8");
172
173 tickit_pen_set_colour_attr(pen, TICKIT_PEN_FG, 15);
174 ok(!tickit_pen_has_colour_attr_rgb8(pen, TICKIT_PEN_FG),
175 "pen still does not have FG RGB after set index");
176
177 tickit_pen_set_colour_attr_rgb8(pen, TICKIT_PEN_FG, (TickitPenRGB8){230, 240, 250});
178 ok(tickit_pen_has_colour_attr_rgb8(pen, TICKIT_PEN_FG),
179 "pen now has FG RGB8 after set RGB8");
180
181 val = tickit_pen_get_colour_attr_rgb8(pen, TICKIT_PEN_FG);
182 is_int(val.r, 230, "val.r from get RGB8");
183 is_int(val.g, 240, "val.g from get RGB8");
184 is_int(val.b, 250, "val.b from get RGB8");
185
186 {
187 TickitPen *pen2 = tickit_pen_clone(pen);
188 ok(tickit_pen_has_colour_attr_rgb8(pen2, TICKIT_PEN_FG),
189 "tickit_pen_clone preserves RGB8 attributes");
190
191 ok(tickit_pen_equiv(pen, pen2), "cloned pen is equivalent");
192
193 tickit_pen_clear_attr(pen2, TICKIT_PEN_FG);
194 tickit_pen_set_colour_attr(pen2, TICKIT_PEN_FG, 15);
195 ok(!tickit_pen_equiv(pen, pen2), "pen not equivalent after clearing RGB8");
196
197 tickit_pen_set_colour_attr(pen, TICKIT_PEN_FG, 20);
198 ok(!tickit_pen_has_colour_attr_rgb8(pen, TICKIT_PEN_FG),
199 "pen does not have FG RGB after set new index");
200
201 tickit_pen_set_colour_attr_rgb8(pen, TICKIT_PEN_BG, (TickitPenRGB8){10, 20, 30});
202 ok(!tickit_pen_has_colour_attr_rgb8(pen, TICKIT_PEN_BG),
203 "pen does not have BG RGB8 with no index");
204
205 tickit_pen_unref(pen2);
206 }
207
208 tickit_pen_set_colour_attr_desc(pen, TICKIT_PEN_FG, "red #F01010");
209 is_int(tickit_pen_get_colour_attr(pen, TICKIT_PEN_FG), 1, "index from set_desc with RGB");
210 val = tickit_pen_get_colour_attr_rgb8(pen, TICKIT_PEN_FG);
211 is_int(val.r, 240, "val.r from get RGB8 for desc RGB");
212 is_int(val.g, 16, "val.g from get RGB8 for desc RGB");
213 is_int(val.b, 16, "val.b from get RGB8 for desc RGB");
214
215 tickit_pen_unref(pen);
216
217 pen = tickit_pen_new_attrs(TICKIT_PEN_FG_DESC, "green#20FF20", 0);
218 is_int(tickit_pen_get_colour_attr(pen, TICKIT_PEN_FG), 2, "index from new FG_DESC");
219 val = tickit_pen_get_colour_attr_rgb8(pen, TICKIT_PEN_FG);
220 is_int(val.r, 32, "val.r from get RGB8 for new FG_DESC");
221 is_int(val.g, 255, "val.g from get RGB8 for new FG_DESC");
222 is_int(val.b, 32, "val.b from get RGB8 for new FG_DESC");
223 }
224
225 return exit_status();
226 }
227