]> git.tdb.fi Git - libs/math.git/blob - tests/boundingbox.cpp
Add formatted output operators for vector and matrix classes
[libs/math.git] / tests / boundingbox.cpp
1 #include <msp/geometry/boundingbox.h>
2 #include <msp/strings/format.h>
3 #include <msp/test/test.h>
4
5 using namespace Msp;
6
7 class BoundingBoxTests: public Test::RegisteredTest<BoundingBoxTests>
8 {
9 private:
10         typedef Geometry::BoundingBox<double, 3> BoundingBox3;
11         typedef LinAl::Vector<double, 3> Vector3;
12 public:
13         BoundingBoxTests();
14
15         static const char *get_name() { return "BoundingBox"; }
16
17 private:
18         void simple_union();
19         void simple_intersection();
20         void union_with_empty();
21         void intersection_with_empty();
22         void subtraction();
23         void special_cases();
24 };
25
26 BoundingBoxTests::BoundingBoxTests()
27 {
28         add(&BoundingBoxTests::simple_union, "Union");
29         add(&BoundingBoxTests::simple_intersection, "Intersection");
30         add(&BoundingBoxTests::union_with_empty, "Union with empty");
31         add(&BoundingBoxTests::intersection_with_empty, "Intersection with empty");
32         add(&BoundingBoxTests::subtraction, "Subtraction");
33         add(&BoundingBoxTests::special_cases, "Special cases");
34 }
35
36 void BoundingBoxTests::simple_union()
37 {
38         BoundingBox3 bbox1(Vector3(-1, 0, -1), Vector3(1, 2, 1));
39         BoundingBox3 bbox2(Vector3(0, -1, 0), Vector3(2, 1, 2));
40         BoundingBox3 bboxu = bbox1|bbox2;
41         EXPECT_EQUAL(bboxu.get_minimum_point(), Vector3(-1, -1, -1));
42         EXPECT_EQUAL(bboxu.get_maximum_point(), Vector3(2, 2, 2));
43 }
44
45 void BoundingBoxTests::simple_intersection()
46 {
47         BoundingBox3 bbox1(Vector3(-1, 0, -1), Vector3(1, 2, 1));
48         BoundingBox3 bbox2(Vector3(0, -1, 0), Vector3(2, 1, 2));
49         BoundingBox3 bboxi = bbox1&bbox2;
50         EXPECT_EQUAL(bboxi.get_minimum_point(), Vector3(0, 0, 0));
51         EXPECT_EQUAL(bboxi.get_maximum_point(), Vector3(1, 1, 1));
52 }
53
54 void BoundingBoxTests::union_with_empty()
55 {
56         BoundingBox3 bbox(Vector3(-1, -1, -1), Vector3(1, 1, 1));
57         BoundingBox3 bboxu = bbox|BoundingBox3();
58         EXPECT_EQUAL(bboxu.get_minimum_point(), bbox.get_minimum_point());
59         EXPECT_EQUAL(bboxu.get_maximum_point(), bbox.get_maximum_point());
60 }
61
62 void BoundingBoxTests::intersection_with_empty()
63 {
64         BoundingBox3 bbox(Vector3(-1, -1, -1), Vector3(1, 1, 1));
65         BoundingBox3 bboxi = bbox&BoundingBox3();
66         EXPECT(bboxi.is_empty());
67 }
68
69 void BoundingBoxTests::subtraction()
70 {
71         BoundingBox3 bbox1(Vector3(-1, -1, -1), Vector3(1, 1, 1));
72         BoundingBox3 bbox2(Vector3(0, -2, -2), Vector3(2, 2, 2));
73         BoundingBox3 bboxs = bbox1&~bbox2;
74         EXPECT_EQUAL(bboxs.get_minimum_point(), Vector3(-1, -1, -1));
75         EXPECT_EQUAL(bboxs.get_maximum_point(), Vector3(0, 1, 1));
76
77         BoundingBox3 bbox3(Vector3(0, 0, -2), Vector3(2, 2, 2));
78         bboxs = bbox1&~bbox3;
79         EXPECT_EQUAL(bboxs.get_minimum_point(), bbox1.get_minimum_point());
80         EXPECT_EQUAL(bboxs.get_maximum_point(), bbox1.get_maximum_point());
81
82         BoundingBox3 bbox4(Vector3(-2, -2, -2), Vector3(2, 2, 2));
83         bboxs = bbox1&~bbox4;
84         EXPECT(bboxs.is_empty());
85
86         bboxs = bbox1&~BoundingBox3();
87         EXPECT_EQUAL(bboxs.get_minimum_point(), bbox1.get_minimum_point());
88         EXPECT_EQUAL(bboxs.get_maximum_point(), bbox1.get_maximum_point());
89 }
90
91 void BoundingBoxTests::special_cases()
92 {
93         BoundingBox3 bbox = BoundingBox3()|BoundingBox3();
94         EXPECT(bbox.is_empty());
95
96         bbox = BoundingBox3()|~BoundingBox3();
97         EXPECT(bbox.is_space());
98
99         bbox = ~BoundingBox3()|BoundingBox3();
100         EXPECT(bbox.is_space());
101
102         bbox = ~BoundingBox3()|~BoundingBox3();
103         EXPECT(bbox.is_space());
104
105         bbox = BoundingBox3()&BoundingBox3();
106         EXPECT(bbox.is_empty());
107
108         bbox = BoundingBox3()&~BoundingBox3();
109         EXPECT(bbox.is_empty());
110
111         bbox = ~BoundingBox3()&BoundingBox3();
112         EXPECT(bbox.is_empty());
113
114         bbox = ~BoundingBox3()&~BoundingBox3();
115         EXPECT(bbox.is_space());
116 }