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 inspectTwoCirclesVerifyParametersArePassed
{
88 val test
= new CircleCircleTest
{
95 def apply (_c1
: Circle
, _c2
: Circle
, _p1
: Vec2D
, _p2
: Vec2D
, _v1
: Vec2D
, _v2
: Vec2D
) = {
96 c1
= _c1
; c2
= _c2
; p1
= _p1
; p2
= _p2
; v1
= _v1
; v2
= _v2
101 val simpleNarrowPhase
= new SimpleNarrowPhase
102 simpleNarrowPhase
.testCircleCircle
= test
108 b1
.position
= Vec2D(1, 1)
109 b2
.position
= Vec2D(2, 2)
110 b1
.velocity
= Vec2D(3, 3)
111 b2
.velocity
= Vec2D(4, 4)
115 simpleNarrowPhase
.inspectCollision(delta
, b1
, b2
)
117 assertEquals(b1
.shape
, test
.c1
)
118 assertEquals(b2
.shape
, test
.c2
)
119 assertEquals(b1
.position
, test
.p1
)
120 assertEquals(b2
.position
, test
.p2
)
121 assertEquals(b1
.velocity
* delta
, test
.v1
)
122 assertEquals(b2
.velocity
* delta
, test
.v2
)
128 def inspectTwoCirclesExpectCollisionIsCorrect
{
129 val simpleNarrowPhase
= new SimpleNarrowPhase
130 simpleNarrowPhase
.testCircleCircle
= new CircleCircleTest
{
131 def apply(c1
: Circle
, c2
: Circle
, p1
: Vec2D
, p2
: Vec2D
, v1
: Vec2D
, v2
: Vec2D
) = {
132 Some(TestResult(0.5, Vec2D(5, 5), Vec2D(1, 0)))
141 val collision
= simpleNarrowPhase
.inspectCollision(2.0, b1
, b2
)
143 val expected
= Collision(0.5, Contact(b1
, Vec2D(5, 5), Vec2D(1, 0), b2
),
144 Contact(b2
, Vec2D(5, 5), Vec2D(-1, 0), b1
))
146 assertEquals(Some(expected
), collision
)
152 def inspectTwoCirclesExpectNone
{
153 val simpleNarrowPhase
= new SimpleNarrowPhase
154 simpleNarrowPhase
.testCircleCircle
= new CircleCircleTest
{
155 def apply(c1
: Circle
, c2
: Circle
, p1
: Vec2D
, p2
: Vec2D
, v1
: Vec2D
, v2
: Vec2D
) = {
165 val collision
= simpleNarrowPhase
.inspectCollision(2.0, b1
, b2
)
167 assertEquals(None
, collision
)
173 def inspectCircleLineSegmentVerifyParametersArePassed
{
174 val test
= new CircleLineSegmentTest
{
176 var ls
: LineSegment
= null
178 var pls
: Vec2D
= null
180 var vls
: Vec2D
= null
181 def apply (_c
: Circle
, _ls
: LineSegment
, _pc
: Vec2D
, _pls
: Vec2D
, _vc
: Vec2D
, _vls
: Vec2D
) = {
182 c
= _c
; ls
= _ls
; pc
= _pc
; pls
= _pls
; vc
= _vc
; vls
= _vls
187 val simpleNarrowPhase
= new SimpleNarrowPhase
188 simpleNarrowPhase
.testCircleLineSegment
= test
193 b2
.shape
= LineSegment(Vec2D(-1, -1), Vec2D(-2, -2))
194 b1
.position
= Vec2D(1, 1)
195 b2
.position
= Vec2D(2, 2)
196 b1
.velocity
= Vec2D(3, 3)
197 b2
.velocity
= Vec2D(4, 4)
201 simpleNarrowPhase
.inspectCollision(delta
, b1
, b2
)
203 assertEquals(b1
.shape
, test
.c
)
204 assertEquals(b2
.shape
, test
.ls
)
205 assertEquals(b1
.position
, test
.pc
)
206 assertEquals(b2
.position
, test
.pls
)
207 assertEquals(b1
.velocity
* delta
, test
.vc
)
208 assertEquals(b2
.velocity
* delta
, test
.vls
)
214 def inspectLineSegmentCircleVerifyParametersArePassed
{
215 val test
= new CircleLineSegmentTest
{
217 var ls
: LineSegment
= null
219 var pls
: Vec2D
= null
221 var vls
: Vec2D
= null
222 def apply (_c
: Circle
, _ls
: LineSegment
, _pc
: Vec2D
, _pls
: Vec2D
, _vc
: Vec2D
, _vls
: Vec2D
) = {
223 c
= _c
; ls
= _ls
; pc
= _pc
; pls
= _pls
; vc
= _vc
; vls
= _vls
228 val simpleNarrowPhase
= new SimpleNarrowPhase
229 simpleNarrowPhase
.testCircleLineSegment
= test
234 b2
.shape
= LineSegment(Vec2D(-1, -1), Vec2D(-2, -2))
235 b1
.position
= Vec2D(1, 1)
236 b2
.position
= Vec2D(2, 2)
237 b1
.velocity
= Vec2D(3, 3)
238 b2
.velocity
= Vec2D(4, 4)
242 simpleNarrowPhase
.inspectCollision(delta
, b2
, b1
)
244 assertEquals(b1
.shape
, test
.c
)
245 assertEquals(b2
.shape
, test
.ls
)
246 assertEquals(b1
.position
, test
.pc
)
247 assertEquals(b2
.position
, test
.pls
)
248 assertEquals(b1
.velocity
* delta
, test
.vc
)
249 assertEquals(b2
.velocity
* delta
, test
.vls
)
255 def inspectCircleLineSegmentExpectCollisionIsCorrect
{
256 val simpleNarrowPhase
= new SimpleNarrowPhase
257 simpleNarrowPhase
.testCircleLineSegment
= new CircleLineSegmentTest
{
258 def apply(c
: Circle
, ls
: LineSegment
, pc
: Vec2D
, pls
: Vec2D
, vc
: Vec2D
, vls
: Vec2D
) = {
259 Some(TestResult(0.5, Vec2D(5, 5), Vec2D(1, 0)))
266 b2
.shape
= LineSegment(Vec2D(1, 1), Vec2D(2, 2))
268 val collision
= simpleNarrowPhase
.inspectCollision(2.0, b1
, b2
)
270 val expected
= Collision(0.5, Contact(b1
, Vec2D(5, 5), Vec2D(1, 0), b2
),
271 Contact(b2
, Vec2D(5, 5), Vec2D(-1, 0), b1
))
273 assertEquals(Some(expected
), collision
)
279 def inspectCircleLineSegmentExpectNone
{
280 val simpleNarrowPhase
= new SimpleNarrowPhase
281 simpleNarrowPhase
.testCircleLineSegment
= new CircleLineSegmentTest
{
282 def apply(c
: Circle
, ls
: LineSegment
, pc
: Vec2D
, pls
: Vec2D
, vc
: Vec2D
, vls
: Vec2D
) = {
290 b2
.shape
= LineSegment(Vec2D(1, 1), Vec2D(2, 2))
292 val collision
= simpleNarrowPhase
.inspectCollision(2.0, b1
, b2
)
294 assertEquals(None
, collision
)
300 def inspectTwoLineSegmentsExpectNoCollisionEvenIfTheyCollide
{
302 b1
.position
= Vec2D(0, 1)
303 b1
.shape
= LineSegment(Vec2D(0, 0), Vec2D(2, -2))
305 b2
.position
= Vec2D(0, -1)
306 b2
.shape
= LineSegment(Vec2D(0, 0), Vec2D(2, 2))
308 assertEquals(None
, narrowPhase
.inspectCollision(2.0, b1
, b2
))