OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright 2014 Google Inc. |
| 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. |
| 6 */ |
| 7 |
| 8 #if SK_SUPPORT_GPU |
| 9 |
| 10 #include "SkMatrix.h" |
| 11 #include "SkString.h" |
| 12 #include "GrTBaseList.h" |
| 13 #include "Test.h" |
| 14 |
| 15 //////////////////////////////////////////////////////////////////////////////// |
| 16 |
| 17 static int activeListItems = 0; |
| 18 |
| 19 static void test_empty_back(skiatest::Reporter* reporter) { |
| 20 GrTBaseList<int, int> list(0); |
| 21 |
| 22 REPORTER_ASSERT(reporter, list.empty()); |
| 23 |
| 24 for (int i = 0; i < 100; ++i) { |
| 25 REPORTER_ASSERT(reporter, i == *GrNEW_APPEND_TO_TBASELIST(list, int, (i)
)); |
| 26 REPORTER_ASSERT(reporter, !list.empty()); |
| 27 REPORTER_ASSERT(reporter, i == list.back()); |
| 28 } |
| 29 |
| 30 REPORTER_ASSERT(reporter, !list.empty()); |
| 31 |
| 32 list.reset(); |
| 33 |
| 34 REPORTER_ASSERT(reporter, list.empty()); |
| 35 } |
| 36 |
| 37 struct ExtraData { |
| 38 ExtraData(int i) : fData(i) { |
| 39 for (int j = 0; j < i; j++) { |
| 40 fExtraData[j] = i; |
| 41 } |
| 42 ++activeListItems; |
| 43 } |
| 44 ~ExtraData() { |
| 45 --activeListItems; |
| 46 } |
| 47 int fData; |
| 48 int fExtraData[0]; |
| 49 }; |
| 50 |
| 51 static void test_extra_data(skiatest::Reporter* reporter) { |
| 52 GrTBaseList<ExtraData, int> list(0); |
| 53 for (int i = 0; i < 100; ++i) { |
| 54 GrNEW_APPEND_WITH_DATA_TO_TBASELIST(list, ExtraData, (i), i * sizeof(int
)); |
| 55 } |
| 56 REPORTER_ASSERT(reporter, 100 == activeListItems); |
| 57 |
| 58 GrTBaseList<ExtraData, int>::Iter iter(list); |
| 59 for (int i = 0; i < 100; ++i) { |
| 60 REPORTER_ASSERT(reporter, iter.next()); |
| 61 REPORTER_ASSERT(reporter, i == iter->fData); |
| 62 for (int j = 0; j < i; j++) { |
| 63 REPORTER_ASSERT(reporter, i == iter->fExtraData[j]); |
| 64 } |
| 65 } |
| 66 REPORTER_ASSERT(reporter, !iter.next()); |
| 67 |
| 68 list.reset(); |
| 69 REPORTER_ASSERT(reporter, 0 == activeListItems); |
| 70 } |
| 71 |
| 72 enum ClassType { |
| 73 kBase_ClassType, |
| 74 kSubclass_ClassType, |
| 75 kSubSubclass_ClassType, |
| 76 kSubclassExtraData_ClassType, |
| 77 kSubclassEmpty_ClassType, |
| 78 |
| 79 kNumClassTypes |
| 80 }; |
| 81 |
| 82 class Base { |
| 83 public: |
| 84 Base() { |
| 85 fMatrix.reset(); |
| 86 ++activeListItems; |
| 87 } |
| 88 |
| 89 virtual ~Base() { --activeListItems; } |
| 90 |
| 91 virtual ClassType getType() { return kBase_ClassType; } |
| 92 |
| 93 virtual void validate(skiatest::Reporter* reporter) { |
| 94 REPORTER_ASSERT(reporter, fMatrix.isIdentity()); |
| 95 } |
| 96 |
| 97 private: |
| 98 SkMatrix fMatrix; |
| 99 }; |
| 100 |
| 101 class Subclass : public Base { |
| 102 public: |
| 103 Subclass() : fString("Lorem ipsum dolor sit amet") {} |
| 104 |
| 105 virtual ClassType getType() { return kSubclass_ClassType; } |
| 106 |
| 107 virtual void validate(skiatest::Reporter* reporter) { |
| 108 Base::validate(reporter); |
| 109 REPORTER_ASSERT(reporter, !strcmp("Lorem ipsum dolor sit amet", fString.
c_str())); |
| 110 } |
| 111 |
| 112 private: |
| 113 SkString fString; |
| 114 }; |
| 115 |
| 116 class SubSubclass : public Subclass { |
| 117 public: |
| 118 SubSubclass() : fInt(1234), fFloat(1.234f) {} |
| 119 |
| 120 virtual ClassType getType() { return kSubSubclass_ClassType; } |
| 121 |
| 122 virtual void validate(skiatest::Reporter* reporter) { |
| 123 Subclass::validate(reporter); |
| 124 REPORTER_ASSERT(reporter, 1234 == fInt); |
| 125 REPORTER_ASSERT(reporter, 1.234f == fFloat); |
| 126 } |
| 127 |
| 128 private: |
| 129 int fInt; |
| 130 float fFloat; |
| 131 }; |
| 132 |
| 133 class SubclassExtraData : public Base { |
| 134 public: |
| 135 SubclassExtraData(int length) : fLength(length) { |
| 136 for (int i = 0; i < fLength; ++i) { |
| 137 fArray[i] = 123456789 + 987654321 * i; |
| 138 } |
| 139 } |
| 140 |
| 141 virtual ClassType getType() { return kSubclassExtraData_ClassType; } |
| 142 |
| 143 virtual void validate(skiatest::Reporter* reporter) { |
| 144 Base::validate(reporter); |
| 145 for (int i = 0; i < fLength; ++i) { |
| 146 REPORTER_ASSERT(reporter, 123456789 + 987654321 * i == fArray[i]); |
| 147 } |
| 148 } |
| 149 |
| 150 private: |
| 151 int fLength; |
| 152 int fArray[0]; |
| 153 }; |
| 154 |
| 155 class SubclassEmpty : public Base { |
| 156 public: |
| 157 virtual ClassType getType() { return kSubclassEmpty_ClassType; } |
| 158 }; |
| 159 |
| 160 static void test_subclasses(skiatest::Reporter* reporter) { |
| 161 class Order { |
| 162 public: |
| 163 Order() { this->reset(); } |
| 164 void reset() { fCurrent = 0; } |
| 165 ClassType next() { |
| 166 fCurrent = 1664525 * fCurrent + 1013904223; |
| 167 return static_cast<ClassType>(fCurrent % kNumClassTypes); |
| 168 } |
| 169 private: |
| 170 uint32_t fCurrent; |
| 171 }; |
| 172 |
| 173 GrTBaseList<Base, void*> list(1024); |
| 174 |
| 175 Order order; |
| 176 for (int i = 0; i < 1000; i++) { |
| 177 switch (order.next()) { |
| 178 case kBase_ClassType: |
| 179 GrNEW_APPEND_TO_TBASELIST(list, Base, ()); |
| 180 break; |
| 181 |
| 182 case kSubclass_ClassType: |
| 183 GrNEW_APPEND_TO_TBASELIST(list, Subclass, ()); |
| 184 break; |
| 185 |
| 186 case kSubSubclass_ClassType: |
| 187 GrNEW_APPEND_TO_TBASELIST(list, SubSubclass, ()); |
| 188 break; |
| 189 |
| 190 case kSubclassExtraData_ClassType: |
| 191 GrNEW_APPEND_WITH_DATA_TO_TBASELIST(list, SubclassExtraData, (i)
, sizeof(int) * i); |
| 192 break; |
| 193 |
| 194 case kSubclassEmpty_ClassType: |
| 195 GrNEW_APPEND_TO_TBASELIST(list, SubclassEmpty, ()); |
| 196 break; |
| 197 |
| 198 default: |
| 199 reporter->reportFailed(SkString("Invalid class type")); |
| 200 break; |
| 201 } |
| 202 } |
| 203 REPORTER_ASSERT(reporter, 1000 == activeListItems); |
| 204 |
| 205 order.reset(); |
| 206 GrTBaseList<Base, void*>::Iter iter(list); |
| 207 for (int i = 0; i < 1000; ++i) { |
| 208 REPORTER_ASSERT(reporter, iter.next()); |
| 209 REPORTER_ASSERT(reporter, order.next() == iter->getType()); |
| 210 iter->validate(reporter); |
| 211 } |
| 212 REPORTER_ASSERT(reporter, !iter.next()); |
| 213 |
| 214 // Don't reset the list. It should automatically destruct all its items. |
| 215 } |
| 216 |
| 217 DEF_GPUTEST(TBaseList, reporter, factory) { |
| 218 test_empty_back(reporter); |
| 219 |
| 220 test_extra_data(reporter); |
| 221 REPORTER_ASSERT(reporter, 0 == activeListItems); // test_extra_data should c
all reset(). |
| 222 |
| 223 test_subclasses(reporter); |
| 224 REPORTER_ASSERT(reporter, 0 == activeListItems); // Ensure ~GrTBaseList invo
kes dtors. |
| 225 } |
| 226 |
| 227 #endif |
OLD | NEW |