1/*
2 * Copyright 2021 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 "experimental/graphite/src/geom/IntersectionTree.h"
9#include "include/utils/SkRandom.h"
10#include "tests/Test.h"
11
12namespace skgpu {
13
14class SimpleIntersectionTree {
15public:
16    bool add(SkRect rect) {
17        for (const SkRect& r : fRects) {
18            if (r.intersects(rect)) {
19                return false;
20            }
21        }
22        fRects.push_back(rect);
23        return true;
24    }
25
26private:
27    std::vector<SkRect> fRects;
28};
29
30#define CHECK(A) REPORTER_ASSERT(reporter, A)
31
32DEF_GRAPHITE_TEST(skgpu_IntersectionTree, reporter) {
33    SkRandom rand;
34    {
35        SimpleIntersectionTree simpleTree;
36        IntersectionTree tree;
37        for (int i = 0; i < 1000; ++i) {
38            Rect rect = Rect::XYWH(rand.nextRangeF(0, 500),
39                                   rand.nextRangeF(0, 500),
40                                   rand.nextRangeF(0, 70),
41                                   rand.nextRangeF(0, 70));
42            CHECK(tree.add(rect) == simpleTree.add({rect.left(),
43                                                   rect.top(),
44                                                   rect.right(),
45                                                   rect.bot()}));
46        }
47    }
48    {
49        SimpleIntersectionTree simpleTree;
50        IntersectionTree tree;
51        for (int i = 0; i < 100; ++i) {
52            Rect rect = Rect::XYWH(rand.nextRangeF(0, 500),
53                                   rand.nextRangeF(0, 500),
54                                   rand.nextRangeF(0, 200),
55                                   rand.nextRangeF(0, 200));
56            CHECK(tree.add(rect) == simpleTree.add({rect.left(),
57                                                   rect.top(),
58                                                   rect.right(),
59                                                   rect.bot()}));
60        }
61    }
62    {
63        SimpleIntersectionTree simpleTree;
64        IntersectionTree tree;
65        CHECK(tree.add(Rect(float2(-std::numeric_limits<float>::infinity()),
66                                   float2(std::numeric_limits<float>::infinity()))));
67        CHECK(!tree.add(Rect::WH(1,1)));
68        CHECK(!tree.add(Rect::WH(1,std::numeric_limits<float>::infinity())));
69        CHECK(tree.add(Rect::WH(0, 0)));
70        CHECK(tree.add(Rect::WH(-1, 1)));
71        CHECK(tree.add(Rect::WH(1, std::numeric_limits<float>::quiet_NaN())));
72    }
73}
74
75}  // namespace skgpu
76