OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2012 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 "SkTSet.h" | |
9 #include "Test.h" | |
10 | |
11 // Tests the SkTSet<T> class template. | |
12 // Functions that just call SkTDArray are not tested. | |
13 | |
14 static void TestTSet_basic(skiatest::Reporter* reporter) { | |
15 SkTSet<int> set0; | |
16 REPORTER_ASSERT(reporter, set0.isEmpty()); | |
17 REPORTER_ASSERT(reporter, !set0.contains(-1)); | |
18 REPORTER_ASSERT(reporter, !set0.contains(0)); | |
19 REPORTER_ASSERT(reporter, !set0.contains(1)); | |
20 REPORTER_ASSERT(reporter, set0.count() == 0); | |
21 | |
22 REPORTER_ASSERT(reporter, set0.add(0)); | |
23 REPORTER_ASSERT(reporter, !set0.isEmpty()); | |
24 REPORTER_ASSERT(reporter, !set0.contains(-1)); | |
25 REPORTER_ASSERT(reporter, set0.contains(0)); | |
26 REPORTER_ASSERT(reporter, !set0.contains(1)); | |
27 REPORTER_ASSERT(reporter, set0.count() == 1); | |
28 REPORTER_ASSERT(reporter, !set0.add(0)); | |
29 REPORTER_ASSERT(reporter, set0.count() == 1); | |
30 | |
31 #ifdef SK_DEBUG | |
32 set0.validate(); | |
33 #endif | |
34 } | |
35 | |
36 #define COUNT 1732 | |
37 #define PRIME1 10007 | |
38 #define PRIME2 1733 | |
39 | |
40 // Generates a series of positive unique pseudo-random numbers. | |
41 static int f(int i) { | |
42 return (long(i) * PRIME1) % PRIME2; | |
43 } | |
44 | |
45 // Will expose contains() too. | |
46 static void TestTSet_advanced(skiatest::Reporter* reporter) { | |
47 SkTSet<int> set0; | |
48 | |
49 for (int i = 0; i < COUNT; i++) { | |
50 REPORTER_ASSERT(reporter, !set0.contains(f(i))); | |
51 if (i > 0) { | |
52 REPORTER_ASSERT(reporter, set0.contains(f(0))); | |
53 REPORTER_ASSERT(reporter, set0.contains(f(i / 2))); | |
54 REPORTER_ASSERT(reporter, set0.contains(f(i - 1))); | |
55 } | |
56 REPORTER_ASSERT(reporter, !set0.contains(f(i))); | |
57 REPORTER_ASSERT(reporter, set0.count() == i); | |
58 REPORTER_ASSERT(reporter, set0.add(f(i))); | |
59 REPORTER_ASSERT(reporter, set0.contains(f(i))); | |
60 REPORTER_ASSERT(reporter, set0.count() == i + 1); | |
61 REPORTER_ASSERT(reporter, !set0.add(f(i))); | |
62 } | |
63 | |
64 // Test deterministic output | |
65 for (int i = 0; i < COUNT; i++) { | |
66 REPORTER_ASSERT(reporter, set0[i] == f(i)); | |
67 } | |
68 | |
69 // Test copy constructor too. | |
70 SkTSet<int> set1 = set0; | |
71 | |
72 REPORTER_ASSERT(reporter, set0.count() == set1.count()); | |
73 REPORTER_ASSERT(reporter, !set1.contains(-1000)); | |
74 | |
75 for (int i = 0; i < COUNT; i++) { | |
76 REPORTER_ASSERT(reporter, set1.contains(f(i))); | |
77 REPORTER_ASSERT(reporter, set1[i] == f(i)); | |
78 } | |
79 | |
80 // Test operator= too. | |
81 SkTSet<int> set2; | |
82 set2 = set0; | |
83 | |
84 REPORTER_ASSERT(reporter, set0.count() == set2.count()); | |
85 REPORTER_ASSERT(reporter, !set2.contains(-1000)); | |
86 | |
87 for (int i = 0; i < COUNT; i++) { | |
88 REPORTER_ASSERT(reporter, set2.contains(f(i))); | |
89 REPORTER_ASSERT(reporter, set2[i] == f(i)); | |
90 } | |
91 | |
92 #ifdef SK_DEBUG | |
93 set0.validate(); | |
94 set1.validate(); | |
95 set2.validate(); | |
96 #endif | |
97 } | |
98 | |
99 static void TestTSet_merge(skiatest::Reporter* reporter) { | |
100 SkTSet<int> set; | |
101 SkTSet<int> setOdd; | |
102 | |
103 for (int i = 0; i < COUNT; i++) { | |
104 REPORTER_ASSERT(reporter, set.add(2 * i)); | |
105 REPORTER_ASSERT(reporter, setOdd.add(2 * i + 1)); | |
106 } | |
107 // mergeInto returns the number of duplicates. Expected 0. | |
108 REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == 0); | |
109 REPORTER_ASSERT(reporter, set.count() == 2 * COUNT); | |
110 | |
111 // mergeInto should now find all new numbers duplicate. | |
112 REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == setOdd.count()); | |
113 REPORTER_ASSERT(reporter, set.count() == 2 * COUNT); | |
114 | |
115 for (int i = 0; i < 2 * COUNT; i++) { | |
116 REPORTER_ASSERT(reporter, set.contains(i)); | |
117 } | |
118 | |
119 // check deterministic output | |
120 for (int i = 0; i < COUNT; i++) { | |
121 REPORTER_ASSERT(reporter, set[i] == 2 * i); | |
122 REPORTER_ASSERT(reporter, set[COUNT + i] == 2 * i + 1); | |
123 } | |
124 | |
125 #ifdef SK_DEBUG | |
126 set.validate(); | |
127 setOdd.validate(); | |
128 #endif | |
129 } | |
130 | |
131 DEF_TEST(TSet, reporter) { | |
132 TestTSet_basic(reporter); | |
133 TestTSet_advanced(reporter); | |
134 TestTSet_merge(reporter); | |
135 } | |
OLD | NEW |