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 #include "SkRandom.h" | |
9 #include "Test.h" | |
10 // This is a GPU-backend specific test | |
11 #if SK_SUPPORT_GPU | |
12 #include "GrOrderedSet.h" | |
13 | |
14 typedef GrOrderedSet<int> Set; | |
15 typedef GrOrderedSet<const char*, GrStrLess> Set2; | |
16 | |
17 DEF_TEST(GrOrderedSet, reporter) { | |
18 Set set; | |
19 | |
20 REPORTER_ASSERT(reporter, set.empty()); | |
21 | |
22 SkRandom r; | |
23 | |
24 int count[1000] = {0}; | |
25 // add 10K ints | |
26 for (int i = 0; i < 10000; ++i) { | |
27 int x = r.nextU() % 1000; | |
28 Set::Iter xi = set.insert(x); | |
29 REPORTER_ASSERT(reporter, *xi == x); | |
30 REPORTER_ASSERT(reporter, !set.empty()); | |
31 count[x] = 1; | |
32 } | |
33 set.insert(0); | |
34 count[0] = 1; | |
35 set.insert(999); | |
36 count[999] = 1; | |
37 int totalCount = 0; | |
38 for (int i = 0; i < 1000; ++i) { | |
39 totalCount += count[i]; | |
40 } | |
41 REPORTER_ASSERT(reporter, *set.begin() == 0); | |
42 REPORTER_ASSERT(reporter, *set.last() == 999); | |
43 REPORTER_ASSERT(reporter, --(++set.begin()) == set.begin()); | |
44 REPORTER_ASSERT(reporter, --set.end() == set.last()); | |
45 REPORTER_ASSERT(reporter, set.count() == totalCount); | |
46 | |
47 int c = 0; | |
48 // check that we iterate through the correct number of | |
49 // elements and they are properly sorted. | |
50 for (Set::Iter a = set.begin(); set.end() != a; ++a) { | |
51 Set::Iter b = a; | |
52 ++b; | |
53 ++c; | |
54 REPORTER_ASSERT(reporter, b == set.end() || *a <= *b); | |
55 } | |
56 REPORTER_ASSERT(reporter, c == set.count()); | |
57 | |
58 // check that the set finds all ints and only ints added to set | |
59 for (int i = 0; i < 1000; ++i) { | |
60 bool existsFind = set.find(i) != set.end(); | |
61 bool existsCount = 0 != count[i]; | |
62 REPORTER_ASSERT(reporter, existsFind == existsCount); | |
63 } | |
64 // remove all the ints between 100 and 200. | |
65 for (int i = 100; i < 200; ++i) { | |
66 set.remove(set.find(i)); | |
67 if (1 == count[i]) { | |
68 count[i] = 0; | |
69 --totalCount; | |
70 } | |
71 REPORTER_ASSERT(reporter, set.count() == totalCount); | |
72 REPORTER_ASSERT(reporter, set.find(i) == set.end()); | |
73 } | |
74 // remove the 0 entry. (tests removing begin()) | |
75 REPORTER_ASSERT(reporter, *set.begin() == 0); | |
76 REPORTER_ASSERT(reporter, *(--set.end()) == 999); | |
77 set.remove(set.find(0)); | |
78 count[0] = 0; | |
79 --totalCount; | |
80 REPORTER_ASSERT(reporter, set.count() == totalCount); | |
81 REPORTER_ASSERT(reporter, set.find(0) == set.end()); | |
82 REPORTER_ASSERT(reporter, 0 < *set.begin()); | |
83 | |
84 // remove all the 999 entries (tests removing last()). | |
85 set.remove(set.find(999)); | |
86 count[999] = 0; | |
87 --totalCount; | |
88 REPORTER_ASSERT(reporter, set.count() == totalCount); | |
89 REPORTER_ASSERT(reporter, set.find(999) == set.end()); | |
90 REPORTER_ASSERT(reporter, 999 > *(--set.end())); | |
91 REPORTER_ASSERT(reporter, set.last() == --set.end()); | |
92 | |
93 // Make sure iteration still goes through correct number of entries | |
94 // and is still sorted correctly. | |
95 c = 0; | |
96 for (Set::Iter a = set.begin(); set.end() != a; ++a) { | |
97 Set::Iter b = a; | |
98 ++b; | |
99 ++c; | |
100 REPORTER_ASSERT(reporter, b == set.end() || *a <= *b); | |
101 } | |
102 REPORTER_ASSERT(reporter, c == set.count()); | |
103 | |
104 // repeat check that the set finds all ints and only ints added to set | |
105 for (int i = 0; i < 1000; ++i) { | |
106 bool existsFind = set.find(i) != set.end(); | |
107 bool existsCount = 0 != count[i]; | |
108 REPORTER_ASSERT(reporter, existsFind == existsCount); | |
109 } | |
110 | |
111 // remove all entries | |
112 while (!set.empty()) { | |
113 set.remove(set.begin()); | |
114 } | |
115 | |
116 // test reset on empty set. | |
117 set.reset(); | |
118 REPORTER_ASSERT(reporter, set.empty()); | |
119 | |
120 | |
121 // test using c strings | |
122 const char* char1 = "dog"; | |
123 const char* char2 = "cat"; | |
124 const char* char3 = "dog"; | |
125 | |
126 Set2 set2; | |
127 | |
128 set2.insert("ape"); | |
129 set2.insert(char1); | |
130 set2.insert(char2); | |
131 set2.insert(char3); | |
132 set2.insert("ant"); | |
133 set2.insert("cat"); | |
134 | |
135 REPORTER_ASSERT(reporter, set2.count() == 4); | |
136 REPORTER_ASSERT(reporter, set2.find("dog") == set2.last()); | |
137 REPORTER_ASSERT(reporter, set2.find("cat") != set2.end()); | |
138 REPORTER_ASSERT(reporter, set2.find("ant") == set2.begin()); | |
139 REPORTER_ASSERT(reporter, set2.find("bug") == set2.end()); | |
140 | |
141 set2.remove(set2.find("ant")); | |
142 REPORTER_ASSERT(reporter, set2.find("ant") == set2.end()); | |
143 REPORTER_ASSERT(reporter, set2.count() == 3); | |
144 | |
145 set2.reset(); | |
146 REPORTER_ASSERT(reporter, set2.empty()); | |
147 } | |
148 | |
149 #endif | |
OLD | NEW |