Index: tests/GrTRecorderTest.cpp |
diff --git a/tests/GrTRecorderTest.cpp b/tests/GrTRecorderTest.cpp |
index fde70ac8e8dc56b4914cb1c1811d8b5c19669a17..cef870fa90a008a5660835f393a5aed94abc9a28 100644 |
--- a/tests/GrTRecorderTest.cpp |
+++ b/tests/GrTRecorderTest.cpp |
@@ -5,14 +5,15 @@ |
* found in the LICENSE file. |
*/ |
-#if SK_SUPPORT_GPU |
- |
-#include "GrTRecorder.h" |
#include "SkMatrix.h" |
#include "SkRandom.h" |
#include "SkString.h" |
#include "Test.h" |
+#if SK_SUPPORT_GPU |
+ |
+#include "GrTRecorder.h" |
+ |
//////////////////////////////////////////////////////////////////////////////// |
static int activeRecorderItems = 0; |
@@ -101,6 +102,15 @@ static void test_extra_data(skiatest::Reporter* reporter) { |
} |
REPORTER_ASSERT(reporter, !iter.next()); |
+ ExtraData::Recorder::ReverseIter reverseIter(recorder); |
+ for (int i = 99; i >= 0; --i) { |
+ REPORTER_ASSERT(reporter, i == reverseIter->fData); |
+ for (int j = 0; j < i; j++) { |
+ REPORTER_ASSERT(reporter, i == reverseIter->extraData()[j]); |
+ } |
+ REPORTER_ASSERT(reporter, reverseIter.previous() == !!i); |
+ } |
+ |
recorder.reset(); |
REPORTER_ASSERT(reporter, 0 == activeRecorderItems); |
} |
@@ -197,19 +207,20 @@ public: |
virtual ClassType getType() { return kSubclassEmpty_ClassType; } |
}; |
+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; |
+}; |
+static void test_subclasses_iters(skiatest::Reporter*, Order&, Base::Recorder::Iter&, |
+ Base::Recorder::ReverseIter&, int = 0); |
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; |
- }; |
- |
Base::Recorder recorder(1024); |
Order order; |
@@ -244,15 +255,33 @@ static void test_subclasses(skiatest::Reporter* reporter) { |
order.reset(); |
Base::Recorder::Iter iter(recorder); |
- for (int i = 0; i < 1000; ++i) { |
- REPORTER_ASSERT(reporter, iter.next()); |
- REPORTER_ASSERT(reporter, order.next() == iter->getType()); |
- iter->validate(reporter); |
- } |
+ Base::Recorder::ReverseIter reverseIter(recorder); |
+ |
+ test_subclasses_iters(reporter, order, iter, reverseIter); |
+ |
REPORTER_ASSERT(reporter, !iter.next()); |
// Don't reset the recorder. It should automatically destruct all its items. |
} |
+static void test_subclasses_iters(skiatest::Reporter* reporter, Order& order, |
+ Base::Recorder::Iter& iter, |
+ Base::Recorder::ReverseIter& reverseIter, int i) { |
+ if (i >= 1000) { |
+ return; |
+ } |
+ |
+ ClassType classType = order.next(); |
+ |
+ REPORTER_ASSERT(reporter, iter.next()); |
+ REPORTER_ASSERT(reporter, classType == iter->getType()); |
+ iter->validate(reporter); |
+ |
+ test_subclasses_iters(reporter, order, iter, reverseIter, i + 1); |
+ |
+ REPORTER_ASSERT(reporter, classType == reverseIter->getType()); |
+ reverseIter->validate(reporter); |
+ REPORTER_ASSERT(reporter, reverseIter.previous() == !!i); |
+} |
DEF_GPUTEST(GrTRecorder, reporter, factory) { |
test_empty_back_and_pop(reporter); |