1// [Blend2D]
2// 2D Vector Graphics Powered by a JIT Compiler.
3//
4// [License]
5// Zlib - See LICENSE.md file in the package.
6
7#include "./blapi-build_p.h"
8#include "./blzoneallocator_p.h"
9#include "./blzonelist_p.h"
10
11// ============================================================================
12// [BLZoneList - Unit Tests]
13// ============================================================================
14
15#ifdef BL_TEST
16class MyListNode : public BLZoneListNode<MyListNode> {};
17
18UNIT(blend2d_zone_list) {
19 BLZoneAllocator zone(4096);
20 BLZoneList<MyListNode> list;
21
22 MyListNode* a = zone.newT<MyListNode>();
23 MyListNode* b = zone.newT<MyListNode>();
24 MyListNode* c = zone.newT<MyListNode>();
25 MyListNode* d = zone.newT<MyListNode>();
26
27 INFO("Append / Unlink");
28
29 // []
30 EXPECT(list.empty() == true);
31
32 // [A]
33 list.append(a);
34 EXPECT(list.empty() == false);
35 EXPECT(list.first() == a);
36 EXPECT(list.last() == a);
37 EXPECT(a->prev() == nullptr);
38 EXPECT(a->next() == nullptr);
39
40 // [A, B]
41 list.append(b);
42 EXPECT(list.first() == a);
43 EXPECT(list.last() == b);
44 EXPECT(a->prev() == nullptr);
45 EXPECT(a->next() == b);
46 EXPECT(b->prev() == a);
47 EXPECT(b->next() == nullptr);
48
49 // [A, B, C]
50 list.append(c);
51 EXPECT(list.first() == a);
52 EXPECT(list.last() == c);
53 EXPECT(a->prev() == nullptr);
54 EXPECT(a->next() == b);
55 EXPECT(b->prev() == a);
56 EXPECT(b->next() == c);
57 EXPECT(c->prev() == b);
58 EXPECT(c->next() == nullptr);
59
60 // [B, C]
61 list.unlink(a);
62 EXPECT(list.first() == b);
63 EXPECT(list.last() == c);
64 EXPECT(a->prev() == nullptr);
65 EXPECT(a->next() == nullptr);
66 EXPECT(b->prev() == nullptr);
67 EXPECT(b->next() == c);
68 EXPECT(c->prev() == b);
69 EXPECT(c->next() == nullptr);
70
71 // [B]
72 list.unlink(c);
73 EXPECT(list.first() == b);
74 EXPECT(list.last() == b);
75 EXPECT(b->prev() == nullptr);
76 EXPECT(b->next() == nullptr);
77 EXPECT(c->prev() == nullptr);
78 EXPECT(c->next() == nullptr);
79
80 // []
81 list.unlink(b);
82 EXPECT(list.empty() == true);
83 EXPECT(list.first() == nullptr);
84 EXPECT(list.last() == nullptr);
85 EXPECT(b->prev() == nullptr);
86 EXPECT(b->next() == nullptr);
87
88 INFO("Prepend / Unlink");
89
90 // [A]
91 list.prepend(a);
92 EXPECT(list.empty() == false);
93 EXPECT(list.first() == a);
94 EXPECT(list.last() == a);
95 EXPECT(a->prev() == nullptr);
96 EXPECT(a->next() == nullptr);
97
98 // [B, A]
99 list.prepend(b);
100 EXPECT(list.first() == b);
101 EXPECT(list.last() == a);
102 EXPECT(b->prev() == nullptr);
103 EXPECT(b->next() == a);
104 EXPECT(a->prev() == b);
105 EXPECT(a->next() == nullptr);
106
107 INFO("InsertAfter / InsertBefore");
108
109 // [B, A, C]
110 list.insertAfter(a, c);
111 EXPECT(list.first() == b);
112 EXPECT(list.last() == c);
113 EXPECT(b->prev() == nullptr);
114 EXPECT(b->next() == a);
115 EXPECT(a->prev() == b);
116 EXPECT(a->next() == c);
117 EXPECT(c->prev() == a);
118 EXPECT(c->next() == nullptr);
119
120 // [B, D, A, C]
121 list.insertBefore(a, d);
122 EXPECT(list.first() == b);
123 EXPECT(list.last() == c);
124 EXPECT(b->prev() == nullptr);
125 EXPECT(b->next() == d);
126 EXPECT(d->prev() == b);
127 EXPECT(d->next() == a);
128 EXPECT(a->prev() == d);
129 EXPECT(a->next() == c);
130 EXPECT(c->prev() == a);
131 EXPECT(c->next() == nullptr);
132
133 INFO("PopFirst / Pop");
134
135 // [D, A, C]
136 EXPECT(list.popFirst() == b);
137 EXPECT(b->prev() == nullptr);
138 EXPECT(b->next() == nullptr);
139
140 EXPECT(list.first() == d);
141 EXPECT(list.last() == c);
142 EXPECT(d->prev() == nullptr);
143 EXPECT(d->next() == a);
144 EXPECT(a->prev() == d);
145 EXPECT(a->next() == c);
146 EXPECT(c->prev() == a);
147 EXPECT(c->next() == nullptr);
148
149 // [D, A]
150 EXPECT(list.pop() == c);
151 EXPECT(c->prev() == nullptr);
152 EXPECT(c->next() == nullptr);
153
154 EXPECT(list.first() == d);
155 EXPECT(list.last() == a);
156 EXPECT(d->prev() == nullptr);
157 EXPECT(d->next() == a);
158 EXPECT(a->prev() == d);
159 EXPECT(a->next() == nullptr);
160}
161#endif
162