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
{
33 var narrowPhase
: NarrowPhase
= null
39 narrowPhase
= new SimpleNarrowPhase
45 def verifyUsesContinuousCircleCircleTest
{
46 val simpleNarrowPhase
= new SimpleNarrowPhase
47 assertTrue(simpleNarrowPhase
.testCircleCircle
.isInstanceOf
[ContinuousCircleCircleTest
])
53 def verifyUsesContinuousCircleLineSegmentTest
{
54 val simpleNarrowPhase
= new SimpleNarrowPhase
55 assertTrue(simpleNarrowPhase
.testCircleLineSegment
.isInstanceOf
[ContinuousCircleLineSegmentTest
])
61 def inspectTwoNoShapesExpectNoCollision
{
67 assertEquals(None
, narrowPhase
.inspectCollision(0.0, b1
, b2
))
73 def inspectCircleAndNoShapeExpectNoCollision
{
75 b1
.position
= Vec2D(0, 0)
78 b2
.position
= Vec2D(0, 0.5)
81 assertEquals(None
, narrowPhase
.inspectCollision(0.0, b1
, b2
))
87 def inspectLineSegmentAndNoShapeExpectNoCollision
{
90 b1
.shape
= LineSegment(Vec2D(0, 0), Vec2D(1, 1))
93 assertEquals(None
, narrowPhase
.inspectCollision(0.0, b1
, b2
))
98 @Test { val expected
= classOf
[IllegalArgumentException
] }
99 def inspectUnsupportedShapeAndCircleExpectException
{
102 b1
.shape
= new Shape
{}
105 narrowPhase
.inspectCollision(0.0, b1
, b2
)
110 @Test { val expected
= classOf
[IllegalArgumentException
] }
111 def inspectCircleAndUnsupportedShapeExpectException
{
115 b2
.shape
= new Shape
{}
117 narrowPhase
.inspectCollision(0.0, b1
, b2
)
122 @Test { val expected
= classOf
[IllegalArgumentException
] }
123 def inspectLineSegmentAndUnsupportedShapeExpectException
{
126 b1
.shape
= LineSegment(Vec2D(0, 0), Vec2D(1, 0))
127 b2
.shape
= new Shape
{}
129 narrowPhase
.inspectCollision(0.0, b1
, b2
)
135 def inspectTwoCirclesVerifyParametersArePassed
{
136 val test
= new CircleCircleTest
{
137 var c1
: Circle
= null
138 var c2
: Circle
= null
143 def apply (_c1
: Circle
, _c2
: Circle
, _p1
: Vec2D
, _p2
: Vec2D
, _v1
: Vec2D
, _v2
: Vec2D
) = {
144 c1
= _c1
; c2
= _c2
; p1
= _p1
; p2
= _p2
; v1
= _v1
; v2
= _v2
149 val simpleNarrowPhase
= new SimpleNarrowPhase
150 simpleNarrowPhase
.testCircleCircle
= test
156 b1
.position
= Vec2D(1, 1)
157 b2
.position
= Vec2D(2, 2)
158 b1
.velocity
= Vec2D(3, 3)
159 b2
.velocity
= Vec2D(4, 4)
163 simpleNarrowPhase
.inspectCollision(delta
, b1
, b2
)
165 assertEquals(b1
.shape
, test
.c1
)
166 assertEquals(b2
.shape
, test
.c2
)
167 assertEquals(b1
.position
, test
.p1
)
168 assertEquals(b2
.position
, test
.p2
)
169 assertEquals(b1
.velocity
* delta
, test
.v1
)
170 assertEquals(b2
.velocity
* delta
, test
.v2
)
176 def inspectTwoCirclesExpectCollisionIsCorrect
{
177 val simpleNarrowPhase
= new SimpleNarrowPhase
178 simpleNarrowPhase
.testCircleCircle
= new CircleCircleTest
{
179 def apply(c1
: Circle
, c2
: Circle
, p1
: Vec2D
, p2
: Vec2D
, v1
: Vec2D
, v2
: Vec2D
) = {
180 Some(TestResult(0.5, Vec2D(5, 5), Vec2D(1, 0)))
189 val collision
= simpleNarrowPhase
.inspectCollision(2.0, b1
, b2
)
191 val expected
= Collision(0.5, Contact(b1
, Vec2D(5, 5), Vec2D(1, 0), b2
),
192 Contact(b2
, Vec2D(5, 5), Vec2D(-1, 0), b1
))
194 assertEquals(Some(expected
), collision
)
200 def inspectTwoCirclesExpectNone
{
201 val simpleNarrowPhase
= new SimpleNarrowPhase
202 simpleNarrowPhase
.testCircleCircle
= new CircleCircleTest
{
203 def apply(c1
: Circle
, c2
: Circle
, p1
: Vec2D
, p2
: Vec2D
, v1
: Vec2D
, v2
: Vec2D
) = {
213 val collision
= simpleNarrowPhase
.inspectCollision(2.0, b1
, b2
)
215 assertEquals(None
, collision
)
221 def inspectCircleLineSegmentVerifyParametersArePassed
{
222 val test
= new CircleLineSegmentTest
{
224 var ls
: LineSegment
= null
226 var pls
: Vec2D
= null
228 var vls
: Vec2D
= null
229 def apply (_c
: Circle
, _ls
: LineSegment
, _pc
: Vec2D
, _pls
: Vec2D
, _vc
: Vec2D
, _vls
: Vec2D
) = {
230 c
= _c
; ls
= _ls
; pc
= _pc
; pls
= _pls
; vc
= _vc
; vls
= _vls
235 val simpleNarrowPhase
= new SimpleNarrowPhase
236 simpleNarrowPhase
.testCircleLineSegment
= test
241 b2
.shape
= LineSegment(Vec2D(-1, -1), Vec2D(-2, -2))
242 b1
.position
= Vec2D(1, 1)
243 b2
.position
= Vec2D(2, 2)
244 b1
.velocity
= Vec2D(3, 3)
245 b2
.velocity
= Vec2D(4, 4)
249 simpleNarrowPhase
.inspectCollision(delta
, b1
, b2
)
251 assertEquals(b1
.shape
, test
.c
)
252 assertEquals(b2
.shape
, test
.ls
)
253 assertEquals(b1
.position
, test
.pc
)
254 assertEquals(b2
.position
, test
.pls
)
255 assertEquals(b1
.velocity
* delta
, test
.vc
)
256 assertEquals(b2
.velocity
* delta
, test
.vls
)
262 def inspectLineSegmentCircleVerifyParametersArePassed
{
263 val test
= new CircleLineSegmentTest
{
265 var ls
: LineSegment
= null
267 var pls
: Vec2D
= null
269 var vls
: Vec2D
= null
270 def apply (_c
: Circle
, _ls
: LineSegment
, _pc
: Vec2D
, _pls
: Vec2D
, _vc
: Vec2D
, _vls
: Vec2D
) = {
271 c
= _c
; ls
= _ls
; pc
= _pc
; pls
= _pls
; vc
= _vc
; vls
= _vls
276 val simpleNarrowPhase
= new SimpleNarrowPhase
277 simpleNarrowPhase
.testCircleLineSegment
= test
282 b2
.shape
= LineSegment(Vec2D(-1, -1), Vec2D(-2, -2))
283 b1
.position
= Vec2D(1, 1)
284 b2
.position
= Vec2D(2, 2)
285 b1
.velocity
= Vec2D(3, 3)
286 b2
.velocity
= Vec2D(4, 4)
290 simpleNarrowPhase
.inspectCollision(delta
, b2
, b1
)
292 assertEquals(b1
.shape
, test
.c
)
293 assertEquals(b2
.shape
, test
.ls
)
294 assertEquals(b1
.position
, test
.pc
)
295 assertEquals(b2
.position
, test
.pls
)
296 assertEquals(b1
.velocity
* delta
, test
.vc
)
297 assertEquals(b2
.velocity
* delta
, test
.vls
)
303 def inspectCircleLineSegmentExpectCollisionIsCorrect
{
304 val simpleNarrowPhase
= new SimpleNarrowPhase
305 simpleNarrowPhase
.testCircleLineSegment
= new CircleLineSegmentTest
{
306 def apply(c
: Circle
, ls
: LineSegment
, pc
: Vec2D
, pls
: Vec2D
, vc
: Vec2D
, vls
: Vec2D
) = {
307 Some(TestResult(0.5, Vec2D(5, 5), Vec2D(1, 0)))
314 b2
.shape
= LineSegment(Vec2D(1, 1), Vec2D(2, 2))
316 val collision
= simpleNarrowPhase
.inspectCollision(2.0, b1
, b2
)
318 val expected
= Collision(0.5, Contact(b1
, Vec2D(5, 5), Vec2D(1, 0), b2
),
319 Contact(b2
, Vec2D(5, 5), Vec2D(-1, 0), b1
))
321 assertEquals(Some(expected
), collision
)
327 def inspectCircleLineSegmentExpectNone
{
328 val simpleNarrowPhase
= new SimpleNarrowPhase
329 simpleNarrowPhase
.testCircleLineSegment
= new CircleLineSegmentTest
{
330 def apply(c
: Circle
, ls
: LineSegment
, pc
: Vec2D
, pls
: Vec2D
, vc
: Vec2D
, vls
: Vec2D
) = {
338 b2
.shape
= LineSegment(Vec2D(1, 1), Vec2D(2, 2))
340 val collision
= simpleNarrowPhase
.inspectCollision(2.0, b1
, b2
)
342 assertEquals(None
, collision
)
348 def inspectTwoLineSegmentsExpectNoCollisionEvenIfTheyCollide
{
350 b1
.position
= Vec2D(0, 1)
351 b1
.shape
= LineSegment(Vec2D(0, 0), Vec2D(2, -2))
353 b2
.position
= Vec2D(0, -1)
354 b2
.shape
= LineSegment(Vec2D(0, 0), Vec2D(2, 2))
356 assertEquals(None
, narrowPhase
.inspectCollision(2.0, b1
, b2
))