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