blob: e7b061b971e7c03b3d888f711605c9ee909dc616 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 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 */
reed@android.com3abec1d2009-03-02 05:36:20 +00008#include "Test.h"
9#include "SkPath.h"
reed@google.com04863fa2011-05-15 04:08:24 +000010#include "SkParse.h"
reed@android.com60bc6d52010-02-11 11:09:39 +000011#include "SkSize.h"
reed@android.com3abec1d2009-03-02 05:36:20 +000012
bsalomon@google.comb3b8dfa2011-07-13 17:44:36 +000013static void check_close(skiatest::Reporter* reporter, const SkPath& path) {
14 for (int i = 0; i < 2; ++i) {
15 SkPath::Iter iter(path, (bool)i);
16 SkPoint mv;
17 SkPoint pts[4];
18 SkPath::Verb v;
19 int nMT = 0;
20 int nCL = 0;
tomhudson@google.com221db3c2011-07-28 21:10:29 +000021 mv.set(0, 0);
bsalomon@google.comb3b8dfa2011-07-13 17:44:36 +000022 while (SkPath::kDone_Verb != (v = iter.next(pts))) {
23 switch (v) {
24 case SkPath::kMove_Verb:
25 mv = pts[0];
26 ++nMT;
27 break;
28 case SkPath::kClose_Verb:
29 REPORTER_ASSERT(reporter, mv == pts[0]);
30 ++nCL;
31 break;
32 default:
33 break;
34 }
35 }
36 // if we force a close on the interator we should have a close
37 // for every moveTo
38 REPORTER_ASSERT(reporter, !i || nMT == nCL);
39 }
40}
41
42static void test_close(skiatest::Reporter* reporter) {
43 SkPath closePt;
44 closePt.moveTo(0, 0);
45 closePt.close();
46 check_close(reporter, closePt);
47
48 SkPath openPt;
49 openPt.moveTo(0, 0);
50 check_close(reporter, openPt);
51
52 SkPath empty;
53 check_close(reporter, empty);
54 empty.close();
55 check_close(reporter, empty);
56
57 SkPath rect;
58 rect.addRect(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1);
59 check_close(reporter, rect);
60 rect.close();
61 check_close(reporter, rect);
62
63 SkPath quad;
64 quad.quadTo(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1);
65 check_close(reporter, quad);
66 quad.close();
67 check_close(reporter, quad);
68
69 SkPath cubic;
70 quad.cubicTo(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1,
71 10*SK_Scalar1, 20 * SK_Scalar1, 20*SK_Scalar1);
72 check_close(reporter, cubic);
73 cubic.close();
74 check_close(reporter, cubic);
75
76 SkPath line;
77 line.moveTo(SK_Scalar1, SK_Scalar1);
78 line.lineTo(10 * SK_Scalar1, 10*SK_Scalar1);
79 check_close(reporter, line);
80 line.close();
81 check_close(reporter, line);
82
83 SkPath rect2;
84 rect2.addRect(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1);
85 rect2.close();
86 rect2.addRect(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1);
87 check_close(reporter, rect2);
88 rect2.close();
89 check_close(reporter, rect2);
90
91 SkPath oval3;
92 oval3.addOval(SkRect::MakeWH(SK_Scalar1*100,SK_Scalar1*100));
93 oval3.close();
94 oval3.addOval(SkRect::MakeWH(SK_Scalar1*200,SK_Scalar1*200));
95 check_close(reporter, oval3);
96 oval3.close();
97 check_close(reporter, oval3);
98
99 SkPath moves;
100 moves.moveTo(SK_Scalar1, SK_Scalar1);
101 moves.moveTo(5 * SK_Scalar1, SK_Scalar1);
102 moves.moveTo(SK_Scalar1, 10 * SK_Scalar1);
103 moves.moveTo(10 *SK_Scalar1, SK_Scalar1);
104 check_close(reporter, moves);
105}
106
reed@google.com7c424812011-05-15 04:38:34 +0000107static void check_convexity(skiatest::Reporter* reporter, const SkPath& path,
108 SkPath::Convexity expected) {
109 SkPath::Convexity c = SkPath::ComputeConvexity(path);
110 REPORTER_ASSERT(reporter, c == expected);
111}
112
113static void test_convexity2(skiatest::Reporter* reporter) {
114 SkPath pt;
115 pt.moveTo(0, 0);
116 pt.close();
reed@google.comb54455e2011-05-16 14:16:04 +0000117 check_convexity(reporter, pt, SkPath::kConvex_Convexity);
reed@google.com7c424812011-05-15 04:38:34 +0000118
119 SkPath line;
120 line.moveTo(12, 20);
121 line.lineTo(-12, -20);
122 line.close();
reed@google.comb54455e2011-05-16 14:16:04 +0000123 check_convexity(reporter, pt, SkPath::kConvex_Convexity);
reed@google.com7c424812011-05-15 04:38:34 +0000124
125 SkPath triLeft;
126 triLeft.moveTo(0, 0);
127 triLeft.lineTo(1, 0);
128 triLeft.lineTo(1, 1);
129 triLeft.close();
130 check_convexity(reporter, triLeft, SkPath::kConvex_Convexity);
131
132 SkPath triRight;
133 triRight.moveTo(0, 0);
134 triRight.lineTo(-1, 0);
135 triRight.lineTo(1, 1);
136 triRight.close();
137 check_convexity(reporter, triRight, SkPath::kConvex_Convexity);
138
139 SkPath square;
140 square.moveTo(0, 0);
141 square.lineTo(1, 0);
142 square.lineTo(1, 1);
143 square.lineTo(0, 1);
144 square.close();
145 check_convexity(reporter, square, SkPath::kConvex_Convexity);
146
147 SkPath redundantSquare;
148 redundantSquare.moveTo(0, 0);
149 redundantSquare.lineTo(0, 0);
150 redundantSquare.lineTo(0, 0);
151 redundantSquare.lineTo(1, 0);
152 redundantSquare.lineTo(1, 0);
153 redundantSquare.lineTo(1, 0);
154 redundantSquare.lineTo(1, 1);
155 redundantSquare.lineTo(1, 1);
156 redundantSquare.lineTo(1, 1);
157 redundantSquare.lineTo(0, 1);
158 redundantSquare.lineTo(0, 1);
159 redundantSquare.lineTo(0, 1);
160 redundantSquare.close();
161 check_convexity(reporter, redundantSquare, SkPath::kConvex_Convexity);
162
163 SkPath bowTie;
164 bowTie.moveTo(0, 0);
165 bowTie.lineTo(0, 0);
166 bowTie.lineTo(0, 0);
167 bowTie.lineTo(1, 1);
168 bowTie.lineTo(1, 1);
169 bowTie.lineTo(1, 1);
170 bowTie.lineTo(1, 0);
171 bowTie.lineTo(1, 0);
172 bowTie.lineTo(1, 0);
173 bowTie.lineTo(0, 1);
174 bowTie.lineTo(0, 1);
175 bowTie.lineTo(0, 1);
176 bowTie.close();
177 check_convexity(reporter, bowTie, SkPath::kConcave_Convexity);
178
179 SkPath spiral;
180 spiral.moveTo(0, 0);
epoger@google.com2047f002011-05-17 17:36:59 +0000181 spiral.lineTo(100, 0);
182 spiral.lineTo(100, 100);
183 spiral.lineTo(0, 100);
184 spiral.lineTo(0, 50);
185 spiral.lineTo(50, 50);
186 spiral.lineTo(50, 75);
reed@google.com7c424812011-05-15 04:38:34 +0000187 spiral.close();
reed@google.com85b6e392011-05-15 20:25:17 +0000188 check_convexity(reporter, spiral, SkPath::kConcave_Convexity);
reed@google.com7c424812011-05-15 04:38:34 +0000189
190 SkPath dent;
epoger@google.com1f753992011-05-18 20:23:30 +0000191 dent.moveTo(SkIntToScalar(0), SkIntToScalar(0));
192 dent.lineTo(SkIntToScalar(100), SkIntToScalar(100));
193 dent.lineTo(SkIntToScalar(0), SkIntToScalar(100));
194 dent.lineTo(SkIntToScalar(-50), SkIntToScalar(200));
195 dent.lineTo(SkIntToScalar(-200), SkIntToScalar(100));
reed@google.com7c424812011-05-15 04:38:34 +0000196 dent.close();
197 check_convexity(reporter, dent, SkPath::kConcave_Convexity);
198}
199
reed@android.com6b82d1a2009-06-03 02:35:01 +0000200static void check_convex_bounds(skiatest::Reporter* reporter, const SkPath& p,
201 const SkRect& bounds) {
202 REPORTER_ASSERT(reporter, p.isConvex());
203 REPORTER_ASSERT(reporter, p.getBounds() == bounds);
reed@google.com62047cf2011-02-07 19:39:09 +0000204
reed@android.com6b82d1a2009-06-03 02:35:01 +0000205 SkPath p2(p);
206 REPORTER_ASSERT(reporter, p2.isConvex());
207 REPORTER_ASSERT(reporter, p2.getBounds() == bounds);
208
209 SkPath other;
210 other.swap(p2);
211 REPORTER_ASSERT(reporter, other.isConvex());
212 REPORTER_ASSERT(reporter, other.getBounds() == bounds);
213}
214
reed@google.com04863fa2011-05-15 04:08:24 +0000215static void setFromString(SkPath* path, const char str[]) {
216 bool first = true;
217 while (str) {
218 SkScalar x, y;
219 str = SkParse::FindScalar(str, &x);
220 if (NULL == str) {
221 break;
222 }
223 str = SkParse::FindScalar(str, &y);
224 SkASSERT(str);
225 if (first) {
226 path->moveTo(x, y);
227 first = false;
228 } else {
229 path->lineTo(x, y);
230 }
231 }
232}
233
234static void test_convexity(skiatest::Reporter* reporter) {
reed@google.com04863fa2011-05-15 04:08:24 +0000235 static const SkPath::Convexity C = SkPath::kConcave_Convexity;
236 static const SkPath::Convexity V = SkPath::kConvex_Convexity;
237
238 SkPath path;
239
reed@google.comb54455e2011-05-16 14:16:04 +0000240 REPORTER_ASSERT(reporter, V == SkPath::ComputeConvexity(path));
reed@google.com04863fa2011-05-15 04:08:24 +0000241 path.addCircle(0, 0, 10);
242 REPORTER_ASSERT(reporter, V == SkPath::ComputeConvexity(path));
243 path.addCircle(0, 0, 10); // 2nd circle
244 REPORTER_ASSERT(reporter, C == SkPath::ComputeConvexity(path));
245 path.reset();
246 path.addRect(0, 0, 10, 10, SkPath::kCCW_Direction);
247 REPORTER_ASSERT(reporter, V == SkPath::ComputeConvexity(path));
248 path.reset();
249 path.addRect(0, 0, 10, 10, SkPath::kCW_Direction);
250 REPORTER_ASSERT(reporter, V == SkPath::ComputeConvexity(path));
251
252 static const struct {
253 const char* fPathStr;
254 SkPath::Convexity fExpectedConvexity;
255 } gRec[] = {
reed@google.comb54455e2011-05-16 14:16:04 +0000256 { "", SkPath::kConvex_Convexity },
257 { "0 0", SkPath::kConvex_Convexity },
258 { "0 0 10 10", SkPath::kConvex_Convexity },
reed@google.com85b6e392011-05-15 20:25:17 +0000259 { "0 0 10 10 20 20 0 0 10 10", SkPath::kConcave_Convexity },
reed@google.com04863fa2011-05-15 04:08:24 +0000260 { "0 0 10 10 10 20", SkPath::kConvex_Convexity },
261 { "0 0 10 10 10 0", SkPath::kConvex_Convexity },
262 { "0 0 10 10 10 0 0 10", SkPath::kConcave_Convexity },
263 { "0 0 10 0 0 10 -10 -10", SkPath::kConcave_Convexity },
264 };
265
266 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) {
267 SkPath path;
268 setFromString(&path, gRec[i].fPathStr);
269 SkPath::Convexity c = SkPath::ComputeConvexity(path);
270 REPORTER_ASSERT(reporter, c == gRec[i].fExpectedConvexity);
271 }
272}
273
caryclark@google.comf1316942011-07-26 19:54:45 +0000274// Simple isRect test is inline TestPath, below.
275// test_isRect provides more extensive testing.
276static void test_isRect(skiatest::Reporter* reporter) {
277 // passing tests (all moveTo / lineTo...
278 SkPoint r1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}};
279 SkPoint r2[] = {{1, 0}, {1, 1}, {0, 1}, {0, 0}};
280 SkPoint r3[] = {{1, 1}, {0, 1}, {0, 0}, {1, 0}};
281 SkPoint r4[] = {{0, 1}, {0, 0}, {1, 0}, {1, 1}};
282 SkPoint r5[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}};
283 SkPoint r6[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}};
284 SkPoint r7[] = {{1, 1}, {1, 0}, {0, 0}, {0, 1}};
285 SkPoint r8[] = {{1, 0}, {0, 0}, {0, 1}, {1, 1}};
286 SkPoint r9[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}};
287 SkPoint ra[] = {{0, 0}, {0, .5f}, {0, 1}, {.5f, 1}, {1, 1}, {1, .5f},
288 {1, 0}, {.5f, 0}};
289 SkPoint rb[] = {{0, 0}, {.5f, 0}, {1, 0}, {1, .5f}, {1, 1}, {.5f, 1},
290 {0, 1}, {0, .5f}};
291 SkPoint rc[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}};
292 SkPoint rd[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}};
293 SkPoint re[] = {{0, 0}, {1, 0}, {1, 0}, {1, 1}, {0, 1}};
294
295 // failing tests
296 SkPoint f1[] = {{0, 0}, {1, 0}, {1, 1}}; // too few points
297 SkPoint f2[] = {{0, 0}, {1, 1}, {0, 1}, {1, 0}}; // diagonal
298 SkPoint f3[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}}; // wraps
299 SkPoint f4[] = {{0, 0}, {1, 0}, {0, 0}, {1, 0}, {1, 1}, {0, 1}}; // backs up
300 SkPoint f5[] = {{0, 0}, {1, 0}, {1, 1}, {2, 0}}; // end overshoots
301 SkPoint f6[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 2}}; // end overshoots
302 SkPoint f7[] = {{0, 0}, {1, 0}, {1, 1}, {0, 2}}; // end overshoots
303 SkPoint f8[] = {{0, 0}, {1, 0}, {1, 1}, {1, 0}}; // 'L'
304
305 // failing, no close
306 SkPoint c1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; // close doesn't match
307 SkPoint c2[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, 1}}; // ditto
308
309 size_t testLen[] = {
310 sizeof(r1), sizeof(r2), sizeof(r3), sizeof(r4), sizeof(r5), sizeof(r6),
311 sizeof(r7), sizeof(r8), sizeof(r9), sizeof(ra), sizeof(rb), sizeof(rc),
312 sizeof(rd), sizeof(re),
313 sizeof(f1), sizeof(f2), sizeof(f3), sizeof(f4), sizeof(f5), sizeof(f6),
314 sizeof(f7), sizeof(f8),
315 sizeof(c1), sizeof(c2)
316 };
317 SkPoint* tests[] = {
318 r1, r2, r3, r4, r5, r6, r7, r8, r9, ra, rb, rc, rd, re,
319 f1, f2, f3, f4, f5, f6, f7, f8,
320 c1, c2
321 };
322 SkPoint* lastPass = re;
323 SkPoint* lastClose = f8;
324 bool fail = false;
325 bool close = true;
326 const size_t testCount = sizeof(tests) / sizeof(tests[0]);
327 size_t index;
328 for (size_t testIndex = 0; testIndex < testCount; ++testIndex) {
329 SkPath path;
330 path.moveTo(tests[testIndex][0].fX, tests[testIndex][0].fY);
331 for (index = 1; index < testLen[testIndex] / sizeof(SkPoint); ++index) {
332 path.lineTo(tests[testIndex][index].fX, tests[testIndex][index].fY);
333 }
334 if (close) {
335 path.close();
336 }
337 REPORTER_ASSERT(reporter, fail ^ path.isRect(0));
338 if (tests[testIndex] == lastPass) {
339 fail = true;
340 }
341 if (tests[testIndex] == lastClose) {
342 close = false;
343 }
344 }
345
346 // fail, close then line
347 SkPath path1;
348 path1.moveTo(r1[0].fX, r1[0].fY);
349 for (index = 1; index < testLen[0] / sizeof(SkPoint); ++index) {
350 path1.lineTo(r1[index].fX, r1[index].fY);
351 }
352 path1.close();
353 path1.lineTo(1, 0);
354 REPORTER_ASSERT(reporter, fail ^ path1.isRect(0));
355
356 // fail, move in the middle
357 path1.reset();
358 path1.moveTo(r1[0].fX, r1[0].fY);
359 for (index = 1; index < testLen[0] / sizeof(SkPoint); ++index) {
360 if (index == 2) {
361 path1.moveTo(1, .5f);
362 }
363 path1.lineTo(r1[index].fX, r1[index].fY);
364 }
365 path1.close();
366 REPORTER_ASSERT(reporter, fail ^ path1.isRect(0));
367
368 // fail, move on the edge
369 path1.reset();
370 for (index = 1; index < testLen[0] / sizeof(SkPoint); ++index) {
371 path1.moveTo(r1[index - 1].fX, r1[index - 1].fY);
372 path1.lineTo(r1[index].fX, r1[index].fY);
373 }
374 path1.close();
375 REPORTER_ASSERT(reporter, fail ^ path1.isRect(0));
376
377 // fail, quad
378 path1.reset();
379 path1.moveTo(r1[0].fX, r1[0].fY);
380 for (index = 1; index < testLen[0] / sizeof(SkPoint); ++index) {
381 if (index == 2) {
382 path1.quadTo(1, .5f, 1, .5f);
383 }
384 path1.lineTo(r1[index].fX, r1[index].fY);
385 }
386 path1.close();
387 REPORTER_ASSERT(reporter, fail ^ path1.isRect(0));
388
389 // fail, cubic
390 path1.reset();
391 path1.moveTo(r1[0].fX, r1[0].fY);
392 for (index = 1; index < testLen[0] / sizeof(SkPoint); ++index) {
393 if (index == 2) {
394 path1.cubicTo(1, .5f, 1, .5f, 1, .5f);
395 }
396 path1.lineTo(r1[index].fX, r1[index].fY);
397 }
398 path1.close();
399 REPORTER_ASSERT(reporter, fail ^ path1.isRect(0));
400}
401
reed@google.com04863fa2011-05-15 04:08:24 +0000402void TestPath(skiatest::Reporter* reporter);
403void TestPath(skiatest::Reporter* reporter) {
reed@android.com60bc6d52010-02-11 11:09:39 +0000404 {
405 SkSize size;
406 size.fWidth = 3.4f;
407 size.width();
408 size = SkSize::Make(3,4);
409 SkISize isize = SkISize::Make(3,4);
410 }
411
412 SkTSize<SkScalar>::Make(3,4);
413
reed@android.com3abec1d2009-03-02 05:36:20 +0000414 SkPath p, p2;
415 SkRect bounds, bounds2;
reed@android.com80e39a72009-04-02 16:59:40 +0000416
reed@android.com3abec1d2009-03-02 05:36:20 +0000417 REPORTER_ASSERT(reporter, p.isEmpty());
reed@google.comb54455e2011-05-16 14:16:04 +0000418 REPORTER_ASSERT(reporter, p.isConvex());
reed@android.com3abec1d2009-03-02 05:36:20 +0000419 REPORTER_ASSERT(reporter, p.getFillType() == SkPath::kWinding_FillType);
420 REPORTER_ASSERT(reporter, !p.isInverseFillType());
421 REPORTER_ASSERT(reporter, p == p2);
422 REPORTER_ASSERT(reporter, !(p != p2));
423
reed@android.comd252db02009-04-01 18:31:44 +0000424 REPORTER_ASSERT(reporter, p.getBounds().isEmpty());
reed@android.com80e39a72009-04-02 16:59:40 +0000425
reed@android.com3abec1d2009-03-02 05:36:20 +0000426 bounds.set(0, 0, SK_Scalar1, SK_Scalar1);
reed@android.com6b82d1a2009-06-03 02:35:01 +0000427
reed@android.com6b82d1a2009-06-03 02:35:01 +0000428 p.addRoundRect(bounds, SK_Scalar1, SK_Scalar1);
429 check_convex_bounds(reporter, p, bounds);
reed@google.com62047cf2011-02-07 19:39:09 +0000430
reed@android.com6b82d1a2009-06-03 02:35:01 +0000431 p.reset();
reed@android.com6b82d1a2009-06-03 02:35:01 +0000432 p.addOval(bounds);
433 check_convex_bounds(reporter, p, bounds);
reed@google.com62047cf2011-02-07 19:39:09 +0000434
reed@android.com6b82d1a2009-06-03 02:35:01 +0000435 p.reset();
reed@android.com3abec1d2009-03-02 05:36:20 +0000436 p.addRect(bounds);
reed@android.com6b82d1a2009-06-03 02:35:01 +0000437 check_convex_bounds(reporter, p, bounds);
reed@android.com3abec1d2009-03-02 05:36:20 +0000438
439 REPORTER_ASSERT(reporter, p != p2);
440 REPORTER_ASSERT(reporter, !(p == p2));
441
442 // does getPoints return the right result
443 REPORTER_ASSERT(reporter, p.getPoints(NULL, 5) == 4);
444 SkPoint pts[4];
445 int count = p.getPoints(pts, 4);
446 REPORTER_ASSERT(reporter, count == 4);
447 bounds2.set(pts, 4);
448 REPORTER_ASSERT(reporter, bounds == bounds2);
reed@android.com80e39a72009-04-02 16:59:40 +0000449
reed@android.com3abec1d2009-03-02 05:36:20 +0000450 bounds.offset(SK_Scalar1*3, SK_Scalar1*4);
451 p.offset(SK_Scalar1*3, SK_Scalar1*4);
reed@android.comd252db02009-04-01 18:31:44 +0000452 REPORTER_ASSERT(reporter, bounds == p.getBounds());
reed@android.com3abec1d2009-03-02 05:36:20 +0000453
reed@android.com3abec1d2009-03-02 05:36:20 +0000454 REPORTER_ASSERT(reporter, p.isRect(NULL));
caryclark@google.comf1316942011-07-26 19:54:45 +0000455 bounds2.setEmpty();
reed@android.com3abec1d2009-03-02 05:36:20 +0000456 REPORTER_ASSERT(reporter, p.isRect(&bounds2));
457 REPORTER_ASSERT(reporter, bounds == bounds2);
reed@android.com80e39a72009-04-02 16:59:40 +0000458
reed@android.com3abec1d2009-03-02 05:36:20 +0000459 // now force p to not be a rect
460 bounds.set(0, 0, SK_Scalar1/2, SK_Scalar1/2);
461 p.addRect(bounds);
462 REPORTER_ASSERT(reporter, !p.isRect(NULL));
caryclark@google.comf1316942011-07-26 19:54:45 +0000463 test_isRect(reporter);
reed@android.com3abec1d2009-03-02 05:36:20 +0000464
465 SkPoint pt;
466
467 p.moveTo(SK_Scalar1, 0);
468 p.getLastPt(&pt);
469 REPORTER_ASSERT(reporter, pt.fX == SK_Scalar1);
reed@google.com62047cf2011-02-07 19:39:09 +0000470
reed@google.com04863fa2011-05-15 04:08:24 +0000471 test_convexity(reporter);
reed@google.com7c424812011-05-15 04:38:34 +0000472 test_convexity2(reporter);
bsalomon@google.comb3b8dfa2011-07-13 17:44:36 +0000473 test_close(reporter);
reed@android.com3abec1d2009-03-02 05:36:20 +0000474}
475
476#include "TestClassDef.h"
477DEFINE_TESTCLASS("Path", PathTestClass, TestPath)