22 TEST_CASE(
"ConstructorTest_ShouldZeroForStartAndEnd")
25 const LineSegment2 line;
27 CHECK_EQ(line.start, Vector2(0.0f, 0.0f));
28 CHECK_EQ(line.end, Vector2(0.0f, 0.0f));
31 TEST_CASE(
"ConstructorTest_ShouldSetStartAndEnd")
35 const LineSegment2 line(Vector2(1.0f, 2.0f), Vector2(3.0f, 4.0f));
37 CHECK_EQ(line.start, Vector2(1.0f, 2.0f));
38 CHECK_EQ(line.end, Vector2(3.0f, 4.0f));
43 const LineSegment2 line(1.0f, 2.0f, 3.0f, 4.0f);
45 CHECK_EQ(line.start, Vector2(1.0f, 2.0f));
46 CHECK_EQ(line.end, Vector2(3.0f, 4.0f));
50 TEST_CASE(
"IsParallelTest_WhenParallel_ReturnTrue")
52 struct { LineSegment2 line1; LineSegment2 line2; }
54 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(0.0f, 1.0f, 1.0f, 2.0f) },
55 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(1.0f, 1.0f, 2.0f, 2.0f) },
56 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(-1.0f, -1.0f, 0.0f, 0.0f) },
57 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(-2.0f, -2.0f, -1.0f, -1.0f) },
60 for (
const auto& t : test_table)
62 INFO(
"line1 start : " << t.line1.start <<
", end : " << t.line1.end);
63 INFO(
"line2 start : " << t.line2.start <<
", end : " << t.line2.end);
64 CHECK(t.line1.IsParallel(t.line2));
68 TEST_CASE(
"IsParallelTest_WhenNotParallel_ReturnFalse")
70 struct { LineSegment2 line1; LineSegment2 line2; }
72 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(0.0f, 1.0f, 1.0f, 0.0f) },
73 { LineSegment2(0.0f, 0.0f, 1.0f, 0.0f), LineSegment2(0.0f, 0.0f, 0.0f, 1.0f) },
74 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(0.0f, 0.0f, 1.0f, 2.0f) },
77 for (
const auto& t : test_table)
79 INFO(
"line1 start : " << t.line1.start <<
", end : " << t.line1.end);
80 INFO(
"line2 start : " << t.line2.start <<
", end : " << t.line2.end);
81 CHECK_FALSE(t.line1.IsParallel(t.line2));
85 TEST_CASE(
"GetLengthTest")
87 struct { LineSegment2 line;
float expected; }
89 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), std::sqrt(2.0f) },
90 { LineSegment2(0.0f, 0.0f, 2.0f, -2.0f), std::sqrt(8.0f) },
91 { LineSegment2(0.0f, 0.0f, -4.0f, 4.0f), std::sqrt(32.0f) },
92 { LineSegment2(2.0f, -3.0f, 7.0f, 2.0f), std::sqrt(50.0f) },
93 { LineSegment2(10.0f, 10.0f, 13.0f, 13.0f), std::sqrt(18.0f) },
96 for (
const auto& t : test_table)
98 const auto length = t.line.GetLength();
100 INFO(
"line: " << t.line.start <<
", " << t.line.end);
102 CHECK_EQ(length, t.expected);
106 TEST_CASE(
"GetIntersectionTest_WhenHasIntersection_ReturnIntersection")
108 struct { LineSegment2 line1; LineSegment2 line2; Vector2 expected; }
110 { LineSegment2(0.f, 0.f, 1.f, 1.f), LineSegment2(0.f, 1.f, 1.f, 0.f), Vector2(0.5f, 0.5f) },
111 { LineSegment2(1.f, 0.f, 1.f, 1.f), LineSegment2(0.f, 1.f, 1.f, 1.f), Vector2(1.0f, 1.f) },
112 { LineSegment2(0.f, 0.f, 1.f, 3.f), LineSegment2(0.f, 3.f, 1.f, 0.f), Vector2(0.5f, 1.5f) },
113 { LineSegment2(0.f, 0.f, 2.f, 2.f), LineSegment2(0.f, 2.f, 2.f, 0.f), Vector2(1.0f, 1.0f) },
116 for (
const auto& t : test_table)
118 const auto intersection = t.line1.GetIntersection(t.line2);
120 INFO(
"line1 start : " << t.line1.start <<
", end : " << t.line1.end);
121 INFO(
"line2 start : " << t.line2.start <<
", end : " << t.line2.end);
123 CHECK_EQ(intersection, t.expected);
127 TEST_CASE(
"GetIntersectionTest_WhenNotHasIntersection_ReturnZeroVector")
129 struct { LineSegment2 line1; LineSegment2 line2; }
131 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(1.0f, 0.0f, 2.0f, 1.0f) },
132 { LineSegment2(1.0f, 0.0f, 1.0f, 1.0f), LineSegment2(2.0f, 0.0f, 2.0f, 1.0f) },
133 { LineSegment2(1.0f, 0.0f, 0.0f, 1.0f), LineSegment2(0.0f, 0.0f, 0.4f, 0.4f) },
134 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(-2.0f, -2.0f, -3.0f, -3.0f) },
137 for (
const auto& t : test_table)
139 const auto intersection = t.line1.GetIntersection(t.line2);
141 INFO(
"line1 start : " << t.line1.start <<
", end : " << t.line1.end);
142 INFO(
"line2 start : " << t.line2.start <<
", end : " << t.line2.end);
144 CHECK_EQ(intersection, Vector2(0.0f, 0.0f));
148 TEST_CASE(
"GetIntersectionTest_WhenParallel_ReturnZeroVector")
150 struct { LineSegment2 line1; LineSegment2 line2; }
152 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(0.0f, 1.0f, 1.0f, 2.0f) },
153 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(1.0f, 1.0f, 2.0f, 2.0f) },
154 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(-1.0f, -1.0f, 0.0f, 0.0f) },
155 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(-2.0f, -2.0f, -1.0f, -1.0f) },
158 for (
const auto& t : test_table)
160 const auto intersection = t.line1.GetIntersection(t.line2);
162 INFO(
"line1 start : " << t.line1.start <<
", end : " << t.line1.end);
163 INFO(
"line2 start : " << t.line2.start <<
", end : " << t.line2.end);
165 CHECK_EQ(intersection, Vector2(0.0f, 0.0f));
169 TEST_CASE(
"HasIntersectionTest_WhenHasIntersection_ReturnTrue")
171 struct { LineSegment2 line1; LineSegment2 line2; }
173 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(0.0f, 1.0f, 1.0f, 0.0f) },
174 { LineSegment2(0.0f, 0.0f, 1.0f, 0.0f), LineSegment2(0.0f, 0.0f, 0.0f, 1.0f) },
175 { LineSegment2(0.0f, 0.0f, 1.0f, 1.0f), LineSegment2(0.0f, 0.0f, 1.0f, 2.0f) },
176 { LineSegment2(0.0f, 0.0f, 2.0f, 2.0f), LineSegment2(0.0f, 2.0f, 2.0f, 0.0f) },
179 for (
const auto& t : test_table)
181 INFO(
"line1 start : " << t.line1.start <<
", end : " << t.line1.end);
182 INFO(
"line2 start : " << t.line2.start <<
", end : " << t.line2.end);
184 CHECK(t.line1.HasIntersection(t.line2));