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