• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "Test.h"
2 #include "SkDeque.h"
3 
assert_count(skiatest::Reporter * reporter,const SkDeque & deq,int count)4 static void assert_count(skiatest::Reporter* reporter, const SkDeque& deq, int count) {
5     if (0 == count) {
6         REPORTER_ASSERT(reporter, deq.empty());
7         REPORTER_ASSERT(reporter, 0 == deq.count());
8         REPORTER_ASSERT(reporter, sizeof(int) == deq.elemSize());
9         REPORTER_ASSERT(reporter, NULL == deq.front());
10         REPORTER_ASSERT(reporter, NULL == deq.back());
11     } else {
12         REPORTER_ASSERT(reporter, !deq.empty());
13         REPORTER_ASSERT(reporter, count == deq.count());
14         REPORTER_ASSERT(reporter, sizeof(int) == deq.elemSize());
15         REPORTER_ASSERT(reporter, NULL != deq.front());
16         REPORTER_ASSERT(reporter, NULL != deq.back());
17         if (1 == count) {
18             REPORTER_ASSERT(reporter, deq.back() == deq.front());
19         } else {
20             REPORTER_ASSERT(reporter, deq.back() != deq.front());
21         }
22     }
23 }
24 
assert_f2biter(skiatest::Reporter * reporter,const SkDeque & deq,int max,int min)25 static void assert_f2biter(skiatest::Reporter* reporter, const SkDeque& deq,
26                            int max, int min) {
27     SkDeque::F2BIter iter(deq);
28     void* ptr;
29 
30     int value = max;
31     while ((ptr = iter.next()) != NULL) {
32         REPORTER_ASSERT(reporter, value == *(int*)ptr);
33         value -= 1;
34     }
35     REPORTER_ASSERT(reporter, value+1 == min);
36 }
37 
TestDeque(skiatest::Reporter * reporter)38 static void TestDeque(skiatest::Reporter* reporter) {
39     SkDeque deq(sizeof(int));
40     int i;
41 
42     // test pushing on the front
43 
44     assert_count(reporter, deq, 0);
45     for (i = 1; i <= 10; i++) {
46         *(int*)deq.push_front() = i;
47     }
48     assert_count(reporter, deq, 10);
49     assert_f2biter(reporter, deq, 10, 1);
50 
51     for (i = 0; i < 5; i++) {
52         deq.pop_front();
53     }
54     assert_count(reporter, deq, 5);
55     assert_f2biter(reporter, deq, 5, 1);
56 
57     for (i = 0; i < 5; i++) {
58         deq.pop_front();
59     }
60     assert_count(reporter, deq, 0);
61 
62     // now test pushing on the back
63 
64     for (i = 10; i >= 1; --i) {
65         *(int*)deq.push_back() = i;
66     }
67     assert_count(reporter, deq, 10);
68     assert_f2biter(reporter, deq, 10, 1);
69 
70     for (i = 0; i < 5; i++) {
71         deq.pop_back();
72     }
73     assert_count(reporter, deq, 5);
74     assert_f2biter(reporter, deq, 10, 6);
75 
76     for (i = 0; i < 5; i++) {
77         deq.pop_back();
78     }
79     assert_count(reporter, deq, 0);
80 
81     // now tests pushing/poping on both ends
82 
83     *(int*)deq.push_front() = 5;
84     *(int*)deq.push_back() = 4;
85     *(int*)deq.push_front() = 6;
86     *(int*)deq.push_back() = 3;
87     *(int*)deq.push_front() = 7;
88     *(int*)deq.push_back() = 2;
89     *(int*)deq.push_front() = 8;
90     *(int*)deq.push_back() = 1;
91     assert_count(reporter, deq, 8);
92     assert_f2biter(reporter, deq, 8, 1);
93 }
94 
95 #include "TestClassDef.h"
96 DEFINE_TESTCLASS("Deque", TestDequeClass, TestDeque)
97