1b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com/*
2b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com * Copyright 2012 Google Inc.
3b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com *
4b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com * Use of this source code is governed by a BSD-style license that can be
5b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com * found in the LICENSE file.
6b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com */
7b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
8b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com#include "Simplify.h"
9b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
10b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comnamespace SimplifyFindTopTest {
11b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
12b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com#include "Simplify.cpp"
13b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
14b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com} // end of SimplifyFindTopTest namespace
15b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
16b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com#include "Intersection_Tests.h"
17b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
18b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic const SimplifyFindTopTest::Segment* testCommon(
19b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com        SkTArray<SimplifyFindTopTest::Contour>& contours,
201577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com        int& index, int& end) {
21b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkTDArray<SimplifyFindTopTest::Contour*> contourList;
224eeda37a7456876cb8d509a4ea43c7f4c684477acaryclark@google.com    makeContourList(contours, contourList, false, false);
2365f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com    addIntersectTs(contourList[0], contourList[0]);
24b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    if (contours.count() > 1) {
25b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com        SkASSERT(contours.count() == 2);
2665f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com        addIntersectTs(contourList[0], contourList[1]);
2765f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com        addIntersectTs(contourList[1], contourList[1]);
28b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    }
29b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    fixOtherTIndex(contourList);
30fb51afb03e76c5701fffaa847584a8b7b2c18a7ecaryclark@google.com#if SORTABLE_CONTOURS // old way
31534aa5b9460639a09b9dc30d29e77782e44b8fffcaryclark@google.com    SimplifyFindTopTest::Segment* topStart = findTopContour(contourList);
32b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    const SimplifyFindTopTest::Segment* topSegment = topStart->findTop(index,
331577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com            end);
34fb51afb03e76c5701fffaa847584a8b7b2c18a7ecaryclark@google.com#else
35f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com    SkPoint bestXY = {SK_ScalarMin, SK_ScalarMin};
36db0b3e099f888213535c4ad4c785b84544309033caryclark@google.com    bool done, unsortable = false;
37f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com    const SimplifyFindTopTest::Segment* topSegment =
38db0b3e099f888213535c4ad4c785b84544309033caryclark@google.com            findSortableTop(contourList, index, end, bestXY, unsortable, done, true);
39fb51afb03e76c5701fffaa847584a8b7b2c18a7ecaryclark@google.com#endif
40b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    return topSegment;
41b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
42b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
43b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void test(const SkPath& path) {
44b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkTArray<SimplifyFindTopTest::Contour> contours;
45b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SimplifyFindTopTest::EdgeBuilder builder(path, contours);
461577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    int index, end;
4765f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com    testCommon(contours, index, end);
481577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    SkASSERT(index + 1 == end);
49b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
50b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
51b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void test(const SkPath& path, SkScalar x1, SkScalar y1,
52b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com        SkScalar x2, SkScalar y2) {
53b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkTArray<SimplifyFindTopTest::Contour> contours;
54b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SimplifyFindTopTest::EdgeBuilder builder(path, contours);
551577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    int index, end;
56b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    const SimplifyFindTopTest::Segment* topSegment =
5765f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com            testCommon(contours, index, end);
581577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    SkPoint pts[2];
591577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    double firstT = topSegment->t(index);
60a3f05facab01712a1b58e60a70b0dbdb90a39830caryclark@google.com    pts[0] = topSegment->xyAtT(&topSegment->span(index));
611577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    int direction = index < end ? 1 : -1;
621577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    do {
631577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com        index += direction;
641577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com        double nextT = topSegment->t(index);
651577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com        if (nextT == firstT) {
661577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com            continue;
671577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com        }
68a3f05facab01712a1b58e60a70b0dbdb90a39830caryclark@google.com        pts[1] = topSegment->xyAtT(&topSegment->span(index));
691577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com        if (pts[0] != pts[1]) {
701577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com            break;
711577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com        }
721577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    } while (true);
731577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    SkASSERT(pts[0].fX == x1);
741577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    SkASSERT(pts[0].fY == y1);
751577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    SkASSERT(pts[1].fX == x2);
761577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    SkASSERT(pts[1].fY == y2);
77b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
78b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
79b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void testLine1() {
80b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkPath path;
81b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.moveTo(2,0);
82b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.lineTo(1,1);
83b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.lineTo(0,0);
84b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.close();
85b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    test(path);
86b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
87b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
88b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void addInnerCWTriangle(SkPath& path) {
89b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.moveTo(3,0);
90b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.lineTo(4,1);
91b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.lineTo(2,1);
92b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.close();
93b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
94b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
95b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void addInnerCCWTriangle(SkPath& path) {
96b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.moveTo(3,0);
97b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.lineTo(2,1);
98b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.lineTo(4,1);
99b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.close();
100b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
101b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
102b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void addOuterCWTriangle(SkPath& path) {
103b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.moveTo(3,0);
104b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.lineTo(6,2);
105b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.lineTo(0,2);
106b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.close();
107b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
108b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
109b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void addOuterCCWTriangle(SkPath& path) {
110b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.moveTo(3,0);
111b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.lineTo(0,2);
112b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.lineTo(6,2);
113b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.close();
114b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
115b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
116b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void testLine2() {
117b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkPath path;
118b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addInnerCWTriangle(path);
119b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addOuterCWTriangle(path);
1201577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    test(path, 0, 2, 3, 0);
121b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
122b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
123b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void testLine3() {
124b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkPath path;
125b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addOuterCWTriangle(path);
126b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addInnerCWTriangle(path);
1271577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    test(path, 0, 2, 3, 0);
128b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
129b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
130b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void testLine4() {
131b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkPath path;
132b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addInnerCCWTriangle(path);
133b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addOuterCWTriangle(path);
1341577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    test(path, 0, 2, 3, 0);
135b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
136b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
137b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void testLine5() {
138b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkPath path;
139b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addOuterCWTriangle(path);
140b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addInnerCCWTriangle(path);
1411577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    test(path, 0, 2, 3, 0);
142b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
143b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
144b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void testLine6() {
145b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkPath path;
146b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addInnerCWTriangle(path);
147b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addOuterCCWTriangle(path);
1481577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    test(path, 0, 2, 3, 0);
149b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
150b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
151b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void testLine7() {
152b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkPath path;
153b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addOuterCCWTriangle(path);
154b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addInnerCWTriangle(path);
1551577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    test(path, 0, 2, 3, 0);
156b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
157b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
158b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void testLine8() {
159b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkPath path;
160b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addInnerCCWTriangle(path);
161b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addOuterCCWTriangle(path);
1621577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    test(path, 0, 2, 3, 0);
163b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
164b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
165b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void testLine9() {
166b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkPath path;
167b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addOuterCCWTriangle(path);
168b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    addInnerCCWTriangle(path);
1691577e8f9c5bc8436cc71d3438c6d0b9f02c38338caryclark@google.com    test(path, 0, 2, 3, 0);
170b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
171b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
172b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void testQuads() {
173b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkPath path;
174b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.moveTo(2,0);
175b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.quadTo(1,1, 0,0);
176b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.close();
177b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    test(path);
178b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
179b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
180b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void testCubics() {
181b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    SkPath path;
182b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.moveTo(2,0);
183b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.cubicTo(2,3, 1,1, 0,0);
184b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    path.close();
185b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    test(path);
186b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
187b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
188b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void (*tests[])() = {
189b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    testLine1,
190b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    testLine2,
191b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    testLine3,
192b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    testLine4,
193b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    testLine5,
194b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    testLine6,
195b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    testLine7,
196b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    testLine8,
197b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    testLine9,
198b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    testQuads,
199b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    testCubics
200b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com};
201b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
202b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic const size_t testCount = sizeof(tests) / sizeof(tests[0]);
203b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
204b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic void (*firstTest)() = 0;
205b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comstatic bool skipAll = false;
206b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
207b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.comvoid SimplifyFindTop_Test() {
208b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    if (skipAll) {
209b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com        return;
210b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    }
211b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    size_t index = 0;
212b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    if (firstTest) {
213b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com        while (index < testCount && tests[index] != firstTest) {
214b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com            ++index;
215b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com        }
216b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    }
217b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    bool firstTestComplete = false;
218b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    for ( ; index < testCount; ++index) {
219b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com        (*tests[index])();
220b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com        firstTestComplete = true;
221b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com    }
222b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com}
223