1 #include <msp/geometry/boundingbox.h>
2 #include <msp/strings/format.h>
3 #include <msp/test/test.h>
7 class BoundingBoxTests: public Test::RegisteredTest<BoundingBoxTests>
10 typedef Geometry::BoundingBox<double, 3> BoundingBox3;
11 typedef LinAl::Vector<double, 3> Vector3;
15 static const char *get_name() { return "BoundingBox"; }
19 void simple_intersection();
20 void union_with_empty();
21 void intersection_with_empty();
26 BoundingBoxTests::BoundingBoxTests()
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");
36 void BoundingBoxTests::simple_union()
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));
45 void BoundingBoxTests::simple_intersection()
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));
54 void BoundingBoxTests::union_with_empty()
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());
62 void BoundingBoxTests::intersection_with_empty()
64 BoundingBox3 bbox(Vector3(-1, -1, -1), Vector3(1, 1, 1));
65 BoundingBox3 bboxi = bbox&BoundingBox3();
66 EXPECT(bboxi.is_empty());
69 void BoundingBoxTests::subtraction()
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));
77 BoundingBox3 bbox3(Vector3(0, 0, -2), Vector3(2, 2, 2));
79 EXPECT_EQUAL(bboxs.get_minimum_point(), bbox1.get_minimum_point());
80 EXPECT_EQUAL(bboxs.get_maximum_point(), bbox1.get_maximum_point());
82 BoundingBox3 bbox4(Vector3(-2, -2, -2), Vector3(2, 2, 2));
84 EXPECT(bboxs.is_empty());
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());
91 void BoundingBoxTests::special_cases()
93 BoundingBox3 bbox = BoundingBox3()|BoundingBox3();
94 EXPECT(bbox.is_empty());
96 bbox = BoundingBox3()|~BoundingBox3();
97 EXPECT(bbox.is_space());
99 bbox = ~BoundingBox3()|BoundingBox3();
100 EXPECT(bbox.is_space());
102 bbox = ~BoundingBox3()|~BoundingBox3();
103 EXPECT(bbox.is_space());
105 bbox = BoundingBox3()&BoundingBox3();
106 EXPECT(bbox.is_empty());
108 bbox = BoundingBox3()&~BoundingBox3();
109 EXPECT(bbox.is_empty());
111 bbox = ~BoundingBox3()&BoundingBox3();
112 EXPECT(bbox.is_empty());
114 bbox = ~BoundingBox3()&~BoundingBox3();
115 EXPECT(bbox.is_space());