Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/src/common-tests/rectangle_tests.cpp
4214 views
1
// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <[email protected]>
2
// SPDX-License-Identifier: CC-BY-NC-ND-4.0
3
4
#include "common/gsvector.h"
5
6
#include <gtest/gtest.h>
7
8
TEST(Rectangle, AdjacentRectanglesNotIntersecting)
9
{
10
GSVector4i r1(0, 0, 10, 10);
11
GSVector4i r2(10, 10, 20, 20);
12
ASSERT_FALSE(r1.rintersects(r2));
13
}
14
15
TEST(Rectangle, IntersectingRectanglesIntersecting)
16
{
17
GSVector4i r1(0, 0, 10, 10);
18
GSVector4i r2(9, 9, 14, 14);
19
ASSERT_TRUE(r1.rintersects(r2));
20
ASSERT_TRUE(r2.rintersects(r1));
21
}
22
23
TEST(Rectangle, PointContainedInRectangle)
24
{
25
GSVector4i r1(0, 0, 10, 10);
26
GSVector4i r2(5, 5, 6, 6);
27
ASSERT_TRUE(r1.rcontains(r2));
28
}
29
30
TEST(Rectangle, PointOutsideRectangleNotContained)
31
{
32
GSVector4i r1(0, 0, 10, 10);
33
GSVector4i r2(10, 10, 11, 11);
34
ASSERT_FALSE(r1.rcontains(r2));
35
}
36
37
TEST(Rectangle, RectangleSize)
38
{
39
GSVector4i r(0, 0, 10, 10);
40
ASSERT_EQ(r.width(), 10);
41
ASSERT_EQ(r.height(), 10);
42
}
43
44
TEST(Rectangle, IncludeAfterInvalid)
45
{
46
GSVector4i r(0, 0, 1, 1);
47
GSVector4i r2(5, 5, 10, 10);
48
GSVector4i ru(0, 0, 10, 10);
49
ASSERT_TRUE(r.runion(r2).eq(ru));
50
}
51
52
TEST(Rectangle, EmptyRectangleHasNoExtents)
53
{
54
GSVector4i r(0, 0, 0, 0);
55
ASSERT_EQ(r.width(), 0);
56
ASSERT_EQ(r.height(), 0);
57
ASSERT_TRUE(r.rempty());
58
}
59
60
TEST(Rectangle, NonEmptyRectangleHasExtents)
61
{
62
GSVector4i r(0, 0, 1, 1);
63
ASSERT_EQ(r.width(), 1);
64
ASSERT_EQ(r.height(), 1);
65
ASSERT_FALSE(r.rempty());
66
}
67
68
TEST(Rectangle, RelationalOperators)
69
{
70
GSVector4i r1(0, 0, 1, 1);
71
GSVector4i r2(1, 1, 2, 2);
72
73
ASSERT_TRUE(r1.eq(r1));
74
ASSERT_TRUE(r1.lt32(r2).alltrue());
75
ASSERT_TRUE(r2.eq(r2));
76
ASSERT_TRUE(r2.gt32(r1).alltrue());
77
ASSERT_FALSE(r2.lt32(r1).alltrue());
78
ASSERT_FALSE(r1.eq(r2));
79
}
80
81
TEST(Rectangle, ValidRectangles)
82
{
83
static constexpr GSVector4i cases[] = {
84
GSVector4i::cxpr(1, 2, 3, 4),
85
GSVector4i::cxpr(-5, -10, -1, -2),
86
GSVector4i::cxpr(0, 0, 1, 1),
87
GSVector4i::cxpr(100, 200, 300, 400),
88
GSVector4i::cxpr(-1000, -2000, 500, 600),
89
GSVector4i::cxpr(5, 10, 6, 12),
90
GSVector4i::cxpr(-10, -20, -5, -15),
91
GSVector4i::cxpr(-5, 0, 5, 10),
92
GSVector4i::cxpr(-100, -200, 100, 200),
93
GSVector4i::cxpr(-1, -2, 0, 1),
94
};
95
96
for (GSVector4i tcase : cases)
97
{
98
ASSERT_TRUE(tcase.rvalid());
99
ASSERT_FALSE(tcase.rempty());
100
}
101
}
102
103
TEST(Rectangle, InvalidRectangles)
104
{
105
static constexpr GSVector4i cases[] = {
106
// left < right but not top < bottom
107
GSVector4i::cxpr(1, 4, 3, 2),
108
GSVector4i::cxpr(-5, -2, -1, -10),
109
GSVector4i::cxpr(0, 1, 1, 0),
110
GSVector4i::cxpr(100, 400, 300, 200),
111
GSVector4i::cxpr(-1000, 600, 500, -2000),
112
GSVector4i::cxpr(5, 12, 6, 10),
113
GSVector4i::cxpr(-10, -15, -5, -20),
114
GSVector4i::cxpr(-5, 10, 5, 0),
115
GSVector4i::cxpr(-100, 200, 100, -200),
116
GSVector4i::cxpr(-1, 1, 0, -2),
117
118
// not left < right but top < bottom
119
GSVector4i::cxpr(3, 2, 1, 4),
120
GSVector4i::cxpr(-1, -10, -5, -2),
121
GSVector4i::cxpr(1, 0, 0, 1),
122
GSVector4i::cxpr(300, 200, 100, 400),
123
GSVector4i::cxpr(500, -2000, -1000, 600),
124
GSVector4i::cxpr(6, 10, 5, 12),
125
GSVector4i::cxpr(-5, -20, -10, -15),
126
GSVector4i::cxpr(5, 0, -5, 10),
127
GSVector4i::cxpr(100, -200, -100, 200),
128
GSVector4i::cxpr(0, -2, -1, 1),
129
};
130
131
for (GSVector4i tcase : cases)
132
{
133
ASSERT_FALSE(tcase.rvalid());
134
ASSERT_TRUE(tcase.rempty());
135
}
136
}
137
138