1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkTInternalLList.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
12*c8dee2aaSAndroid Build Coastguard Worker
13*c8dee2aaSAndroid Build Coastguard Worker class ListElement {
14*c8dee2aaSAndroid Build Coastguard Worker public:
ListElement(int id)15*c8dee2aaSAndroid Build Coastguard Worker ListElement(int id) : fID(id) {
16*c8dee2aaSAndroid Build Coastguard Worker }
operator ==(const ListElement & other)17*c8dee2aaSAndroid Build Coastguard Worker bool operator== (const ListElement& other) { return fID == other.fID; }
18*c8dee2aaSAndroid Build Coastguard Worker
19*c8dee2aaSAndroid Build Coastguard Worker int fID;
20*c8dee2aaSAndroid Build Coastguard Worker
21*c8dee2aaSAndroid Build Coastguard Worker private:
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard Worker SK_DECLARE_INTERNAL_LLIST_INTERFACE(ListElement);
24*c8dee2aaSAndroid Build Coastguard Worker };
25*c8dee2aaSAndroid Build Coastguard Worker
check_list(const SkTInternalLList<ListElement> & list,skiatest::Reporter * reporter,bool empty,int numElements,bool in0,bool in1,bool in2,bool in3,ListElement elements[4])26*c8dee2aaSAndroid Build Coastguard Worker static void check_list(const SkTInternalLList<ListElement>& list,
27*c8dee2aaSAndroid Build Coastguard Worker skiatest::Reporter* reporter,
28*c8dee2aaSAndroid Build Coastguard Worker bool empty,
29*c8dee2aaSAndroid Build Coastguard Worker int numElements,
30*c8dee2aaSAndroid Build Coastguard Worker bool in0, bool in1, bool in2, bool in3,
31*c8dee2aaSAndroid Build Coastguard Worker ListElement elements[4]) {
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, empty == list.isEmpty());
34*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
35*c8dee2aaSAndroid Build Coastguard Worker list.validate();
36*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, numElements == list.countEntries());
37*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, in0 == list.isInList(&elements[0]));
38*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, in1 == list.isInList(&elements[1]));
39*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, in2 == list.isInList(&elements[2]));
40*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, in3 == list.isInList(&elements[3]));
41*c8dee2aaSAndroid Build Coastguard Worker #endif
42*c8dee2aaSAndroid Build Coastguard Worker }
43*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(InternalLList,reporter)44*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(InternalLList, reporter) {
45*c8dee2aaSAndroid Build Coastguard Worker SkTInternalLList<ListElement> list;
46*c8dee2aaSAndroid Build Coastguard Worker ListElement elements[4] = {
47*c8dee2aaSAndroid Build Coastguard Worker ListElement(0),
48*c8dee2aaSAndroid Build Coastguard Worker ListElement(1),
49*c8dee2aaSAndroid Build Coastguard Worker ListElement(2),
50*c8dee2aaSAndroid Build Coastguard Worker ListElement(3),
51*c8dee2aaSAndroid Build Coastguard Worker };
52*c8dee2aaSAndroid Build Coastguard Worker
53*c8dee2aaSAndroid Build Coastguard Worker // list should be empty to start with
54*c8dee2aaSAndroid Build Coastguard Worker check_list(list, reporter, true, 0, false, false, false, false, elements);
55*c8dee2aaSAndroid Build Coastguard Worker
56*c8dee2aaSAndroid Build Coastguard Worker list.addToHead(&elements[0]);
57*c8dee2aaSAndroid Build Coastguard Worker
58*c8dee2aaSAndroid Build Coastguard Worker check_list(list, reporter, false, 1, true, false, false, false, elements);
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker list.addToHead(&elements[1]);
61*c8dee2aaSAndroid Build Coastguard Worker list.addToHead(&elements[2]);
62*c8dee2aaSAndroid Build Coastguard Worker list.addToHead(&elements[3]);
63*c8dee2aaSAndroid Build Coastguard Worker
64*c8dee2aaSAndroid Build Coastguard Worker check_list(list, reporter, false, 4, true, true, true, true, elements);
65*c8dee2aaSAndroid Build Coastguard Worker
66*c8dee2aaSAndroid Build Coastguard Worker // test out iterators
67*c8dee2aaSAndroid Build Coastguard Worker typedef SkTInternalLList<ListElement>::Iter Iter;
68*c8dee2aaSAndroid Build Coastguard Worker Iter iter;
69*c8dee2aaSAndroid Build Coastguard Worker
70*c8dee2aaSAndroid Build Coastguard Worker ListElement* cur = iter.init(list, Iter::kHead_IterStart);
71*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; cur; ++i, cur = iter.next()) {
72*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, cur->fID == 3-i);
73*c8dee2aaSAndroid Build Coastguard Worker }
74*c8dee2aaSAndroid Build Coastguard Worker
75*c8dee2aaSAndroid Build Coastguard Worker cur = iter.init(list, Iter::kTail_IterStart);
76*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; cur; ++i, cur = iter.prev()) {
77*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, cur->fID == i);
78*c8dee2aaSAndroid Build Coastguard Worker }
79*c8dee2aaSAndroid Build Coastguard Worker
80*c8dee2aaSAndroid Build Coastguard Worker // remove middle, frontmost then backmost
81*c8dee2aaSAndroid Build Coastguard Worker list.remove(&elements[1]);
82*c8dee2aaSAndroid Build Coastguard Worker list.remove(&elements[3]);
83*c8dee2aaSAndroid Build Coastguard Worker list.remove(&elements[0]);
84*c8dee2aaSAndroid Build Coastguard Worker
85*c8dee2aaSAndroid Build Coastguard Worker check_list(list, reporter, false, 1, false, false, true, false, elements);
86*c8dee2aaSAndroid Build Coastguard Worker
87*c8dee2aaSAndroid Build Coastguard Worker // remove last element
88*c8dee2aaSAndroid Build Coastguard Worker list.remove(&elements[2]);
89*c8dee2aaSAndroid Build Coastguard Worker
90*c8dee2aaSAndroid Build Coastguard Worker // list should be empty again
91*c8dee2aaSAndroid Build Coastguard Worker check_list(list, reporter, true, 0, false, false, false, false, elements);
92*c8dee2aaSAndroid Build Coastguard Worker
93*c8dee2aaSAndroid Build Coastguard Worker // test out methods that add to the middle of the list.
94*c8dee2aaSAndroid Build Coastguard Worker list.addAfter(&elements[1], nullptr);
95*c8dee2aaSAndroid Build Coastguard Worker check_list(list, reporter, false, 1, false, true, false, false, elements);
96*c8dee2aaSAndroid Build Coastguard Worker
97*c8dee2aaSAndroid Build Coastguard Worker list.remove(&elements[1]);
98*c8dee2aaSAndroid Build Coastguard Worker
99*c8dee2aaSAndroid Build Coastguard Worker list.addBefore(&elements[1], nullptr);
100*c8dee2aaSAndroid Build Coastguard Worker check_list(list, reporter, false, 1, false, true, false, false, elements);
101*c8dee2aaSAndroid Build Coastguard Worker
102*c8dee2aaSAndroid Build Coastguard Worker list.addBefore(&elements[0], &elements[1]);
103*c8dee2aaSAndroid Build Coastguard Worker check_list(list, reporter, false, 2, true, true, false, false, elements);
104*c8dee2aaSAndroid Build Coastguard Worker
105*c8dee2aaSAndroid Build Coastguard Worker list.addAfter(&elements[3], &elements[1]);
106*c8dee2aaSAndroid Build Coastguard Worker check_list(list, reporter, false, 3, true, true, false, true, elements);
107*c8dee2aaSAndroid Build Coastguard Worker
108*c8dee2aaSAndroid Build Coastguard Worker list.addBefore(&elements[2], &elements[3]);
109*c8dee2aaSAndroid Build Coastguard Worker check_list(list, reporter, false, 4, true, true, true, true, elements);
110*c8dee2aaSAndroid Build Coastguard Worker
111*c8dee2aaSAndroid Build Coastguard Worker cur = iter.init(list, Iter::kHead_IterStart);
112*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; cur; ++i, cur = iter.next()) {
113*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, cur->fID == i);
114*c8dee2aaSAndroid Build Coastguard Worker }
115*c8dee2aaSAndroid Build Coastguard Worker while (!list.isEmpty()) {
116*c8dee2aaSAndroid Build Coastguard Worker list.remove(list.tail());
117*c8dee2aaSAndroid Build Coastguard Worker }
118*c8dee2aaSAndroid Build Coastguard Worker
119*c8dee2aaSAndroid Build Coastguard Worker // test concat.
120*c8dee2aaSAndroid Build Coastguard Worker SkTInternalLList<ListElement> listA, listB;
121*c8dee2aaSAndroid Build Coastguard Worker listA.concat(std::move(listB));
122*c8dee2aaSAndroid Build Coastguard Worker check_list(listA, reporter, true, 0, false, false, false, false, elements);
123*c8dee2aaSAndroid Build Coastguard Worker // NOLINTNEXTLINE(bugprone-use-after-move)
124*c8dee2aaSAndroid Build Coastguard Worker check_list(listB, reporter, true, 0, false, false, false, false, elements);
125*c8dee2aaSAndroid Build Coastguard Worker
126*c8dee2aaSAndroid Build Coastguard Worker listB.addToTail(&elements[0]);
127*c8dee2aaSAndroid Build Coastguard Worker listA.concat(std::move(listB));
128*c8dee2aaSAndroid Build Coastguard Worker check_list(listA, reporter, false, 1, true, false, false, false, elements);
129*c8dee2aaSAndroid Build Coastguard Worker // NOLINTNEXTLINE(bugprone-use-after-move)
130*c8dee2aaSAndroid Build Coastguard Worker check_list(listB, reporter, true, 0, false, false, false, false, elements);
131*c8dee2aaSAndroid Build Coastguard Worker
132*c8dee2aaSAndroid Build Coastguard Worker listB.addToTail(&elements[1]);
133*c8dee2aaSAndroid Build Coastguard Worker listA.concat(std::move(listB));
134*c8dee2aaSAndroid Build Coastguard Worker check_list(listA, reporter, false, 2, true, true, false, false, elements);
135*c8dee2aaSAndroid Build Coastguard Worker // NOLINTNEXTLINE(bugprone-use-after-move)
136*c8dee2aaSAndroid Build Coastguard Worker check_list(listB, reporter, true, 0, false, false, false, false, elements);
137*c8dee2aaSAndroid Build Coastguard Worker
138*c8dee2aaSAndroid Build Coastguard Worker listA.concat(std::move(listB));
139*c8dee2aaSAndroid Build Coastguard Worker check_list(listA, reporter, false, 2, true, true, false, false, elements);
140*c8dee2aaSAndroid Build Coastguard Worker // NOLINTNEXTLINE(bugprone-use-after-move)
141*c8dee2aaSAndroid Build Coastguard Worker check_list(listB, reporter, true, 0, false, false, false, false, elements);
142*c8dee2aaSAndroid Build Coastguard Worker
143*c8dee2aaSAndroid Build Coastguard Worker listB.addToTail(&elements[2]);
144*c8dee2aaSAndroid Build Coastguard Worker listB.addToTail(&elements[3]);
145*c8dee2aaSAndroid Build Coastguard Worker listA.concat(std::move(listB));
146*c8dee2aaSAndroid Build Coastguard Worker check_list(listA, reporter, false, 4, true, true, true, true, elements);
147*c8dee2aaSAndroid Build Coastguard Worker // NOLINTNEXTLINE(bugprone-use-after-move)
148*c8dee2aaSAndroid Build Coastguard Worker check_list(listB, reporter, true, 0, false, false, false, false, elements);
149*c8dee2aaSAndroid Build Coastguard Worker
150*c8dee2aaSAndroid Build Coastguard Worker cur = iter.init(listA, Iter::kHead_IterStart);
151*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; cur; ++i, cur = iter.next()) {
152*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, cur->fID == i);
153*c8dee2aaSAndroid Build Coastguard Worker }
154*c8dee2aaSAndroid Build Coastguard Worker }
155