2 Copyright (c) 2009 Hanno Braun <hanno@habraun.net>
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
8 http://www.apache.org/licenses/LICENSE-2.0
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
19 package net
.habraun
.sd
27 import org
.junit
.Assert
._
31 class SimpleNarrowPhaseTest
{
34 def verifyIsNarrowPhase
{
35 val narrowPhase
= new SimpleNarrowPhase
36 assertTrue(narrowPhase
.isInstanceOf
[NarrowPhase
])
42 def verifyUsesContinuousCircleCircleTest
{
43 val narrowPhase
= new SimpleNarrowPhase
44 assertTrue(narrowPhase
.testCircleCircle
.isInstanceOf
[ContinuousCircleCircleTest
])
50 def inspectTwoNoShapesExpectNoCollision
{
51 val narrowPhase
= new SimpleNarrowPhase
58 assertEquals(None
, narrowPhase
.inspectCollision(0.0, b1
, b2
))
64 def inspectCircleAndNoShapeExpectNoCollision
{
65 val narrowPhase
= new SimpleNarrowPhase
68 b1
.position
= Vec2D(0, 0)
71 b2
.position
= Vec2D(0, 0.5)
74 assertEquals(None
, narrowPhase
.inspectCollision(0.0, b1
, b2
))
80 def inspectTwoCirclesVerifyParametersArePassed
{
81 val test
= new CircleCircleTest
{
88 override def apply (_c1
: Circle
, _c2
: Circle
, _p1
: Vec2D
, _p2
: Vec2D
, _v1
: Vec2D
, _v2
: Vec2D
) = {
89 c1
= _c1
; c2
= _c2
; p1
= _p1
; p2
= _p2
; v1
= _v1
; v2
= _v2
94 val narrowPhase
= new SimpleNarrowPhase
95 narrowPhase
.testCircleCircle
= test
101 b1
.position
= Vec2D(1, 1)
102 b2
.position
= Vec2D(2, 2)
103 b1
.velocity
= Vec2D(3, 3)
104 b2
.velocity
= Vec2D(4, 4)
108 narrowPhase
.inspectCollision(delta
, b1
, b2
)
110 assertEquals(b1
.shape
, test
.c1
)
111 assertEquals(b2
.shape
, test
.c2
)
112 assertEquals(b1
.position
, test
.p1
)
113 assertEquals(b2
.position
, test
.p2
)
114 assertEquals(b1
.velocity
* delta
, test
.v1
)
115 assertEquals(b2
.velocity
* delta
, test
.v2
)
121 def inspectTwoCirclesExpectCollisionIsCorrect
{
122 val narrowPhase
= new SimpleNarrowPhase
123 narrowPhase
.testCircleCircle
= new CircleCircleTest
{
124 def apply(c1
: Circle
, c2
: Circle
, p1
: Vec2D
, p2
: Vec2D
, v1
: Vec2D
, v2
: Vec2D
) = {
125 Some(TestResult(0.5, Vec2D(5, 5), Vec2D(1, 0)))
134 val collision
= narrowPhase
.inspectCollision(2.0, b1
, b2
)
136 val expected
= Collision(0.5, Contact(b1
, b2
, Vec2D(1, 0), Vec2D(-1, 0), Vec2D(5, 5)))
138 assertEquals(Some(expected
), collision
)
144 def inspectTwoCirclesExpectNone
{
145 val narrowPhase
= new SimpleNarrowPhase
146 narrowPhase
.testCircleCircle
= new CircleCircleTest
{
147 def apply(c1
: Circle
, c2
: Circle
, p1
: Vec2D
, p2
: Vec2D
, v1
: Vec2D
, v2
: Vec2D
) = {
157 val collision
= narrowPhase
.inspectCollision(2.0, b1
, b2
)
159 assertEquals(None
, collision
)
165 def inspectStationaryCircleAndLineSegmentExpectNoCollision
{
166 val narrowPhase
= new SimpleNarrowPhase
169 b1
.position
= Vec2D(0, 0)
172 b2
.position
= Vec2D(0, 2)
173 b2
.shape
= LineSegment(Vec2D(-1, 0), Vec2D(2, 0))
175 assertEquals(None
, narrowPhase
.inspectCollision(2.0, b1
, b2
))
181 def inspectStationaryLineSegmentAndCircleExpectNoCollision
{
182 val narrowPhase
= new SimpleNarrowPhase
185 b1
.position
= Vec2D(0, 0)
188 b2
.position
= Vec2D(0, 2)
189 b2
.shape
= LineSegment(Vec2D(-1, 0), Vec2D(2, 0))
191 assertEquals(None
, narrowPhase
.inspectCollision(2.0, b2
, b1
))
197 def inspectStationaryCircleAndLineSegmentExpectCollision
{
198 val narrowPhase
= new SimpleNarrowPhase
201 b1
.position
= Vec2D(0, 0)
204 b2
.position
= Vec2D(0, 0.5)
205 b2
.shape
= LineSegment(Vec2D(-1, 0), Vec2D(2, 0))
207 val expectedCollision
= Collision(0.0, Contact(b1
, b2
, Vec2D(0, 1), Vec2D(0, -1), Vec2D(0, 0)))
209 assertEquals(Some(expectedCollision
), narrowPhase
.inspectCollision(2.0, b1
, b2
))
215 def inspectStationaryCircleAndLineSegmentWithCircleOnLineExpectNoCollision
{
216 val narrowPhase
= new SimpleNarrowPhase
219 b1
.position
= Vec2D(0, 0)
222 b2
.position
= Vec2D(2, 0)
223 b2
.shape
= LineSegment(Vec2D(0, 0), Vec2D(2, 0))
225 assertEquals(None
, narrowPhase
.inspectCollision(2.0, b1
, b2
))
231 def inspectStationaryLineSegmentAndCirlceExpectCollision
{
232 val narrowPhase
= new SimpleNarrowPhase
235 b1
.position
= Vec2D(0, 0)
238 b2
.position
= Vec2D(0, 0.5)
239 b2
.shape
= LineSegment(Vec2D(-1, 0), Vec2D(2, 0))
241 val expectedCollision
= Collision(0.0, Contact(b1
, b2
, Vec2D(0, 1), Vec2D(0, -1), Vec2D(0, 0)))
243 assertEquals(Some(expectedCollision
), narrowPhase
.inspectCollision(2.0, b2
, b1
))
249 def inspectMovingCircleAndStationaryLineSegmentExpectNoCollision1
{
250 // Circle moving parallel to the line segment.
251 val narrowPhase
= new SimpleNarrowPhase
253 val circle
= new Body
254 circle
.shape
= Circle(1)
255 circle
.position
= Vec2D(0, 0)
256 circle
.velocity
= Vec2D(1, 0)
257 val segment
= new Body
258 segment
.shape
= LineSegment(Vec2D(0, 0), Vec2D(5, 0))
259 segment
.position
= Vec2D(0, 2)
261 assertEquals(None
, narrowPhase
.inspectCollision(2.0, circle
, segment
))
267 def inspectMovingCircleAndStationaryLineSegmentExpectNoCollision2
{
268 // Circle moving away from the line segment.
269 val narrowPhase
= new SimpleNarrowPhase
271 val circle
= new Body
272 circle
.shape
= Circle(1)
273 circle
.position
= Vec2D(0, 0)
274 circle
.velocity
= Vec2D(0, -1)
275 val segment
= new Body
276 segment
.shape
= LineSegment(Vec2D(0, 0), Vec2D(5, 0))
277 segment
.position
= Vec2D(0, 2)
279 assertEquals(None
, narrowPhase
.inspectCollision(2.0, circle
, segment
))
285 def inspectMovingCircleAndStationaryLineSegmentExpectNoCollision3
{
286 // Circle stopping before reaching the line segment.
287 val narrowPhase
= new SimpleNarrowPhase
289 val circle
= new Body
290 circle
.shape
= Circle(1)
291 circle
.position
= Vec2D(0, -5)
292 circle
.velocity
= Vec2D(0, 1)
293 val segment
= new Body
294 segment
.shape
= LineSegment(Vec2D(0, 0), Vec2D(5, 0))
295 segment
.position
= Vec2D(0, 2)
297 assertEquals(None
, narrowPhase
.inspectCollision(2.0, circle
, segment
))
303 def inspectMovingCircleAndStationaryLineSegmentExpectNoCollision4
{
304 // Circle missing the line segment.
305 val narrowPhase
= new SimpleNarrowPhase
307 val circle
= new Body
308 circle
.shape
= Circle(1)
309 circle
.position
= Vec2D(-2, 0)
310 circle
.velocity
= Vec2D(0, 1)
311 val segment
= new Body
312 segment
.shape
= LineSegment(Vec2D(0, 0), Vec2D(5, 0))
313 segment
.position
= Vec2D(0, 2)
315 assertEquals(None
, narrowPhase
.inspectCollision(2.0, circle
, segment
))
321 def inspectMovingCircleAndStationaryLineSegmentExpectCollision
{
322 val narrowPhase
= new SimpleNarrowPhase
324 val circle
= new Body
325 circle
.shape
= Circle(1)
326 circle
.position
= Vec2D(2, 0)
327 circle
.velocity
= Vec2D(0, 1)
328 val segment
= new Body
329 segment
.shape
= LineSegment(Vec2D(0, 0), Vec2D(5, 0))
330 segment
.position
= Vec2D(0, 2)
332 val expectedCollision
= Collision(0.5, Contact(circle
, segment
, Vec2D(0, 1), Vec2D(0, -1),
335 assertEquals(Some(expectedCollision
), narrowPhase
.inspectCollision(2.0, circle
, segment
))
341 def inspectStationaryCircleAndMovingLineSegmentExpectNoCollision
{
342 val narrowPhase
= new SimpleNarrowPhase
344 val circle
= new Body
345 circle
.shape
= Circle(1)
346 circle
.position
= Vec2D(0, 0)
347 val segment
= new Body
348 segment
.shape
= LineSegment(Vec2D(0, 0), Vec2D(5, 0))
349 segment
.position
= Vec2D(0, 2)
350 segment
.velocity
= Vec2D(0, 1)
352 assertEquals(None
, narrowPhase
.inspectCollision(2.0, circle
, segment
))
358 def inspectStationaryCircleAndMovingLineSegmentExpectCollision
{
359 val narrowPhase
= new SimpleNarrowPhase
361 val circle
= new Body
362 circle
.shape
= Circle(1)
363 circle
.position
= Vec2D(2, 0)
364 val segment
= new Body
365 segment
.shape
= LineSegment(Vec2D(0, 0), Vec2D(5, 0))
366 segment
.position
= Vec2D(0, 2)
367 segment
.velocity
= Vec2D(0, -1)
369 val expectedCollision
= Collision(0.5, Contact(circle
, segment
, Vec2D(0, 1), Vec2D(0, -1),
372 assertEquals(Some(expectedCollision
), narrowPhase
.inspectCollision(2.0, circle
, segment
))
378 def inspectMovingCircleAndLineSegmentExpectNoCollision
{
379 val narrowPhase
= new SimpleNarrowPhase
381 val circle
= new Body
382 circle
.shape
= Circle(1)
383 circle
.position
= Vec2D(0, 0)
384 circle
.velocity
= Vec2D(1, 0)
385 val segment
= new Body
386 segment
.shape
= LineSegment(Vec2D(0, 0), Vec2D(5, 0))
387 segment
.position
= Vec2D(0, 2)
388 segment
.velocity
= Vec2D(-1, 0)
390 assertEquals(None
, narrowPhase
.inspectCollision(2.0, circle
, segment
))
396 def inspectMovingCircleAndLineSegmentExpectCollision
{
397 val narrowPhase
= new SimpleNarrowPhase
399 val circle
= new Body
400 circle
.shape
= Circle(1)
401 circle
.position
= Vec2D(2, -1)
402 circle
.velocity
= Vec2D(0, 1)
403 val segment
= new Body
404 segment
.shape
= LineSegment(Vec2D(0, 0), Vec2D(5, 0))
405 segment
.position
= Vec2D(0, 2)
406 segment
.velocity
= Vec2D(0, -1)
408 val expectedCollision
= Collision(0.5, Contact(circle
, segment
, Vec2D(0, 1), Vec2D(0, -1),
411 assertEquals(Some(expectedCollision
), narrowPhase
.inspectCollision(2.0, circle
, segment
))
417 def inspectTwoLineSegmentsExpectNoCollisionEvenIfTheyCollide
{
418 val narrowPhase
= new SimpleNarrowPhase
421 b1
.position
= Vec2D(0, 1)
422 b1
.shape
= LineSegment(Vec2D(0, 0), Vec2D(2, -2))
424 b2
.position
= Vec2D(0, -1)
425 b2
.shape
= LineSegment(Vec2D(0, 0), Vec2D(2, 2))
427 assertEquals(None
, narrowPhase
.inspectCollision(2.0, b1
, b2
))