| Index: tests/TBaseListTest.cpp
|
| diff --git a/tests/TBaseListTest.cpp b/tests/TBaseListTest.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3607f8f0c8c4da1d9233b36083333c4935440915
|
| --- /dev/null
|
| +++ b/tests/TBaseListTest.cpp
|
| @@ -0,0 +1,227 @@
|
| +/*
|
| + * Copyright 2014 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#if SK_SUPPORT_GPU
|
| +
|
| +#include "SkMatrix.h"
|
| +#include "SkString.h"
|
| +#include "GrTBaseList.h"
|
| +#include "Test.h"
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +
|
| +static int activeListItems = 0;
|
| +
|
| +static void test_empty_back(skiatest::Reporter* reporter) {
|
| + GrTBaseList<int, int> list(0);
|
| +
|
| + REPORTER_ASSERT(reporter, list.empty());
|
| +
|
| + for (int i = 0; i < 100; ++i) {
|
| + REPORTER_ASSERT(reporter, i == *GrNEW_APPEND_TO_TBASELIST(list, int, (i)));
|
| + REPORTER_ASSERT(reporter, !list.empty());
|
| + REPORTER_ASSERT(reporter, i == list.back());
|
| + }
|
| +
|
| + REPORTER_ASSERT(reporter, !list.empty());
|
| +
|
| + list.reset();
|
| +
|
| + REPORTER_ASSERT(reporter, list.empty());
|
| +}
|
| +
|
| +struct ExtraData {
|
| + ExtraData(int i) : fData(i) {
|
| + for (int j = 0; j < i; j++) {
|
| + fExtraData[j] = i;
|
| + }
|
| + ++activeListItems;
|
| + }
|
| + ~ExtraData() {
|
| + --activeListItems;
|
| + }
|
| + int fData;
|
| + int fExtraData[0];
|
| +};
|
| +
|
| +static void test_extra_data(skiatest::Reporter* reporter) {
|
| + GrTBaseList<ExtraData, int> list(0);
|
| + for (int i = 0; i < 100; ++i) {
|
| + GrNEW_APPEND_WITH_DATA_TO_TBASELIST(list, ExtraData, (i), i * sizeof(int));
|
| + }
|
| + REPORTER_ASSERT(reporter, 100 == activeListItems);
|
| +
|
| + GrTBaseList<ExtraData, int>::Iter iter(list);
|
| + for (int i = 0; i < 100; ++i) {
|
| + REPORTER_ASSERT(reporter, iter.next());
|
| + REPORTER_ASSERT(reporter, i == iter->fData);
|
| + for (int j = 0; j < i; j++) {
|
| + REPORTER_ASSERT(reporter, i == iter->fExtraData[j]);
|
| + }
|
| + }
|
| + REPORTER_ASSERT(reporter, !iter.next());
|
| +
|
| + list.reset();
|
| + REPORTER_ASSERT(reporter, 0 == activeListItems);
|
| +}
|
| +
|
| +enum ClassType {
|
| + kBase_ClassType,
|
| + kSubclass_ClassType,
|
| + kSubSubclass_ClassType,
|
| + kSubclassExtraData_ClassType,
|
| + kSubclassEmpty_ClassType,
|
| +
|
| + kNumClassTypes
|
| +};
|
| +
|
| +class Base {
|
| +public:
|
| + Base() {
|
| + fMatrix.reset();
|
| + ++activeListItems;
|
| + }
|
| +
|
| + virtual ~Base() { --activeListItems; }
|
| +
|
| + virtual ClassType getType() { return kBase_ClassType; }
|
| +
|
| + virtual void validate(skiatest::Reporter* reporter) {
|
| + REPORTER_ASSERT(reporter, fMatrix.isIdentity());
|
| + }
|
| +
|
| +private:
|
| + SkMatrix fMatrix;
|
| +};
|
| +
|
| +class Subclass : public Base {
|
| +public:
|
| + Subclass() : fString("Lorem ipsum dolor sit amet") {}
|
| +
|
| + virtual ClassType getType() { return kSubclass_ClassType; }
|
| +
|
| + virtual void validate(skiatest::Reporter* reporter) {
|
| + Base::validate(reporter);
|
| + REPORTER_ASSERT(reporter, !strcmp("Lorem ipsum dolor sit amet", fString.c_str()));
|
| + }
|
| +
|
| +private:
|
| + SkString fString;
|
| +};
|
| +
|
| +class SubSubclass : public Subclass {
|
| +public:
|
| + SubSubclass() : fInt(1234), fFloat(1.234f) {}
|
| +
|
| + virtual ClassType getType() { return kSubSubclass_ClassType; }
|
| +
|
| + virtual void validate(skiatest::Reporter* reporter) {
|
| + Subclass::validate(reporter);
|
| + REPORTER_ASSERT(reporter, 1234 == fInt);
|
| + REPORTER_ASSERT(reporter, 1.234f == fFloat);
|
| + }
|
| +
|
| +private:
|
| + int fInt;
|
| + float fFloat;
|
| +};
|
| +
|
| +class SubclassExtraData : public Base {
|
| +public:
|
| + SubclassExtraData(int length) : fLength(length) {
|
| + for (int i = 0; i < fLength; ++i) {
|
| + fArray[i] = 123456789 + 987654321 * i;
|
| + }
|
| + }
|
| +
|
| + virtual ClassType getType() { return kSubclassExtraData_ClassType; }
|
| +
|
| + virtual void validate(skiatest::Reporter* reporter) {
|
| + Base::validate(reporter);
|
| + for (int i = 0; i < fLength; ++i) {
|
| + REPORTER_ASSERT(reporter, 123456789 + 987654321 * i == fArray[i]);
|
| + }
|
| + }
|
| +
|
| +private:
|
| + int fLength;
|
| + int fArray[0];
|
| +};
|
| +
|
| +class SubclassEmpty : public Base {
|
| +public:
|
| + virtual ClassType getType() { return kSubclassEmpty_ClassType; }
|
| +};
|
| +
|
| +static void test_subclasses(skiatest::Reporter* reporter) {
|
| + class Order {
|
| + public:
|
| + Order() { this->reset(); }
|
| + void reset() { fCurrent = 0; }
|
| + ClassType next() {
|
| + fCurrent = 1664525 * fCurrent + 1013904223;
|
| + return static_cast<ClassType>(fCurrent % kNumClassTypes);
|
| + }
|
| + private:
|
| + uint32_t fCurrent;
|
| + };
|
| +
|
| + GrTBaseList<Base, void*> list(1024);
|
| +
|
| + Order order;
|
| + for (int i = 0; i < 1000; i++) {
|
| + switch (order.next()) {
|
| + case kBase_ClassType:
|
| + GrNEW_APPEND_TO_TBASELIST(list, Base, ());
|
| + break;
|
| +
|
| + case kSubclass_ClassType:
|
| + GrNEW_APPEND_TO_TBASELIST(list, Subclass, ());
|
| + break;
|
| +
|
| + case kSubSubclass_ClassType:
|
| + GrNEW_APPEND_TO_TBASELIST(list, SubSubclass, ());
|
| + break;
|
| +
|
| + case kSubclassExtraData_ClassType:
|
| + GrNEW_APPEND_WITH_DATA_TO_TBASELIST(list, SubclassExtraData, (i), sizeof(int) * i);
|
| + break;
|
| +
|
| + case kSubclassEmpty_ClassType:
|
| + GrNEW_APPEND_TO_TBASELIST(list, SubclassEmpty, ());
|
| + break;
|
| +
|
| + default:
|
| + reporter->reportFailed(SkString("Invalid class type"));
|
| + break;
|
| + }
|
| + }
|
| + REPORTER_ASSERT(reporter, 1000 == activeListItems);
|
| +
|
| + order.reset();
|
| + GrTBaseList<Base, void*>::Iter iter(list);
|
| + for (int i = 0; i < 1000; ++i) {
|
| + REPORTER_ASSERT(reporter, iter.next());
|
| + REPORTER_ASSERT(reporter, order.next() == iter->getType());
|
| + iter->validate(reporter);
|
| + }
|
| + REPORTER_ASSERT(reporter, !iter.next());
|
| +
|
| + // Don't reset the list. It should automatically destruct all its items.
|
| +}
|
| +
|
| +DEF_GPUTEST(TBaseList, reporter, factory) {
|
| + test_empty_back(reporter);
|
| +
|
| + test_extra_data(reporter);
|
| + REPORTER_ASSERT(reporter, 0 == activeListItems); // test_extra_data should call reset().
|
| +
|
| + test_subclasses(reporter);
|
| + REPORTER_ASSERT(reporter, 0 == activeListItems); // Ensure ~GrTBaseList invokes dtors.
|
| +}
|
| +
|
| +#endif
|
|
|