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 |
16 | class MyListNode : public BLZoneListNode<MyListNode> {}; |
17 | |
18 | UNIT(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 | |