• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright 2010 Google Inc.
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 
10 
11 #include "GrBinHashKey.h"
12 #include "GrDrawTarget.h"
13 #include "GrMatrix.h"
14 #include "GrPath.h"
15 #include "GrRedBlackTree.h"
16 #include "GrTDArray.h"
17 
18 // If we aren't inheriting these as #defines from elsewhere,
19 // clang demands they be declared before we #include the template
20 // that relies on them.
LT(const int & elem,int value)21 static bool LT(const int& elem, int value) {
22     return elem < value;
23 }
EQ(const int & elem,int value)24 static bool EQ(const int& elem, int value) {
25     return elem == value;
26 }
27 #include "GrTBSearch.h"
28 
dump(const GrTDArray<int> & array)29 static void dump(const GrTDArray<int>& array) {
30 #if 0
31     for (int i = 0; i < array.count(); i++) {
32         printf(" %d", array[i]);
33     }
34     printf("\n");
35 #endif
36 }
37 
test_tdarray()38 static void test_tdarray() {
39     GrTDArray<int> array;
40 
41     *array.append() = 0; dump(array);
42     *array.append() = 2; dump(array);
43     *array.append() = 4; dump(array);
44     *array.append() = 6; dump(array);
45     GrAssert(array.count() == 4);
46 
47     *array.insert(0) = -1; dump(array);
48     *array.insert(2) = 1; dump(array);
49     *array.insert(4) = 3; dump(array);
50     *array.insert(7) = 7; dump(array);
51     GrAssert(array.count() == 8);
52     array.remove(3); dump(array);
53     array.remove(0); dump(array);
54     array.removeShuffle(4); dump(array);
55     array.removeShuffle(1); dump(array);
56     GrAssert(array.count() == 4);
57 }
58 
59 
test_bsearch()60 static void test_bsearch() {
61     const int array[] = {
62         1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99
63     };
64 
65     for (size_t n = 0; n < GR_ARRAY_COUNT(array); n++) {
66         for (size_t i = 0; i < n; i++) {
67             int index = GrTBSearch<int, int>(array, n, array[i]);
68             GrAssert(index == (int) i);
69             index = GrTBSearch<int, int>(array, n, -array[i]);
70             GrAssert(index < 0);
71         }
72     }
73 }
74 
75 // bogus empty class for GrBinHashKey
76 class BogusEntry {};
77 
test_binHashKey()78 static void test_binHashKey()
79 {
80     const char* testStringA_ = "abcdABCD";
81     const char* testStringB_ = "abcdBBCD";
82     const uint32_t* testStringA = reinterpret_cast<const uint32_t*>(testStringA_);
83     const uint32_t* testStringB = reinterpret_cast<const uint32_t*>(testStringB_);
84     enum {
85         kDataLenUsedForKey = 8
86     };
87 
88     GrBinHashKey<BogusEntry, kDataLenUsedForKey> keyA;
89     keyA.setKeyData(testStringA);
90     // test copy constructor and comparison
91     GrBinHashKey<BogusEntry, kDataLenUsedForKey> keyA2(keyA);
92     GrAssert(keyA.compare(keyA2) == 0);
93     GrAssert(keyA.getHash() == keyA2.getHash());
94     // test re-init
95     keyA2.setKeyData(testStringA);
96     GrAssert(keyA.compare(keyA2) == 0);
97     GrAssert(keyA.getHash() == keyA2.getHash());
98     // test sorting
99     GrBinHashKey<BogusEntry, kDataLenUsedForKey> keyB;
100     keyB.setKeyData(testStringB);
101     GrAssert(keyA.compare(keyB) < 0);
102     GrAssert(keyA.getHash() != keyB.getHash());
103 }
104 
test_convex()105 static void test_convex() {
106 #if 0
107     GrPath testPath;
108     GrPath::Iter testIter;
109 
110     GrPath pt;
111     pt.moveTo(0, 0);
112     pt.close();
113 
114     testIter.reset(pt);
115     testPath.resetFromIter(&testIter);
116     GrAssert(kConvex_ConvexHint == testPath.getConvexHint());
117 
118     GrPath line;
119     line.moveTo(GrIntToScalar(12), GrIntToScalar(20));
120     line.lineTo(GrIntToScalar(-12), GrIntToScalar(-20));
121     line.close();
122 
123     testIter.reset(line);
124     testPath.resetFromIter(&testIter);
125     GrAssert(kConvex_ConvexHint == testPath.getConvexHint());
126 
127     GrPath triLeft;
128     triLeft.moveTo(0, 0);
129     triLeft.lineTo(1, 0);
130     triLeft.lineTo(1, 1);
131     triLeft.close();
132 
133     testIter.reset(triLeft);
134     testPath.resetFromIter(&testIter);
135     GrAssert(kConvex_ConvexHint == testPath.getConvexHint());
136 
137     GrPath triRight;
138     triRight.moveTo(0, 0);
139     triRight.lineTo(-1, 0);
140     triRight.lineTo(1, 1);
141     triRight.close();
142 
143     testIter.reset(triRight);
144     testPath.resetFromIter(&testIter);
145     GrAssert(kConvex_ConvexHint == testPath.getConvexHint());
146 
147     GrPath square;
148     square.moveTo(0, 0);
149     square.lineTo(1, 0);
150     square.lineTo(1, 1);
151     square.lineTo(0, 1);
152     square.close();
153 
154     testIter.reset(square);
155     testPath.resetFromIter(&testIter);
156     GrAssert(kConvex_ConvexHint == testPath.getConvexHint());
157 
158     GrPath redundantSquare;
159     square.moveTo(0, 0);
160     square.lineTo(0, 0);
161     square.lineTo(0, 0);
162     square.lineTo(1, 0);
163     square.lineTo(1, 0);
164     square.lineTo(1, 0);
165     square.lineTo(1, 1);
166     square.lineTo(1, 1);
167     square.lineTo(1, 1);
168     square.lineTo(0, 1);
169     square.lineTo(0, 1);
170     square.lineTo(0, 1);
171     square.close();
172 
173     testIter.reset(redundantSquare);
174     testPath.resetFromIter(&testIter);
175     GrAssert(kConvex_ConvexHint == testPath.getConvexHint());
176 
177     GrPath bowTie;
178     bowTie.moveTo(0, 0);
179     bowTie.lineTo(0, 0);
180     bowTie.lineTo(0, 0);
181     bowTie.lineTo(1, 1);
182     bowTie.lineTo(1, 1);
183     bowTie.lineTo(1, 1);
184     bowTie.lineTo(1, 0);
185     bowTie.lineTo(1, 0);
186     bowTie.lineTo(1, 0);
187     bowTie.lineTo(0, 1);
188     bowTie.lineTo(0, 1);
189     bowTie.lineTo(0, 1);
190     bowTie.close();
191 
192     testIter.reset(bowTie);
193     testPath.resetFromIter(&testIter);
194     GrAssert(kConcave_ConvexHint == testPath.getConvexHint());
195 
196     GrPath spiral;
197     spiral.moveTo(0, 0);
198     spiral.lineTo(1, 0);
199     spiral.lineTo(1, 1);
200     spiral.lineTo(0, 1);
201     spiral.lineTo(0,.5);
202     spiral.lineTo(.5,.5);
203     spiral.lineTo(.5,.75);
204     spiral.close();
205 
206     testIter.reset(spiral);
207     testPath.resetFromIter(&testIter);
208     GrAssert(kConcave_ConvexHint == testPath.getConvexHint());
209 
210     GrPath dent;
211     dent.moveTo(0, 0);
212     dent.lineTo(1, 1);
213     dent.lineTo(0, 1);
214     dent.lineTo(-.5,2);
215     dent.lineTo(-2, 1);
216     dent.close();
217 
218     testIter.reset(dent);
219     testPath.resetFromIter(&testIter);
220     GrAssert(kConcave_ConvexHint == testPath.getConvexHint());
221 #endif
222 }
223 
gr_run_unittests()224 void gr_run_unittests() {
225     test_tdarray();
226     test_bsearch();
227     test_binHashKey();
228     test_convex();
229     GrRedBlackTree<int>::UnitTest();
230     GrDrawTarget::VertexLayoutUnitTest();
231 }
232