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
.kong
.physics
24 import org
.junit
.Assert
._
31 def addBodyStepExpectBodyMoved
{
34 body
.velocity
= Vec2D(1, 0)
37 assertEquals(Vec2D(2, 0), body
.position
)
43 def addAndRemoveBodyExpectBodyNotMoved
{
46 body
.velocity
= Vec2D(1, 0)
50 assertEquals(Vec2D(0, 0), body
.position
)
56 def addBodyApplyForceCheckVelocity
{
60 body
.applyForce(Vec2D(5, 0))
63 assertEquals(Vec2D(2, 0), body
.velocity
)
69 def addBodyApplyForceStepTwiceCheckVelocity
{
73 body
.applyForce(Vec2D(5, 0))
77 assertEquals(Vec2D(2, 0), body
.velocity
)
83 def addBodyApplyForceStepCheckPosition
{
87 body
.applyForce(Vec2D(5, 0))
90 assertEquals(Vec2D(4, 0), body
.position
)
96 def addBodyApplyImpulseCheckVelocity
{
100 body
.velocity
= Vec2D(3, 0)
101 body
.applyImpulse(Vec2D(5, 0))
104 assertEquals(Vec2D(4, 0), body
.velocity
)
110 def addBodyApplyImpulseCheckVelocity2
{
111 val world
= new World
114 body
.velocity
= Vec2D(3, 0)
115 body
.applyImpulse(Vec2D(5, 0))
118 assertEquals(Vec2D(4, 0), body
.velocity
)
124 def addBodyApplyImpulseCheckImpulse
{
125 val world
= new World
127 body
.applyImpulse(Vec2D(10, 10))
130 assertEquals(Vec2D(0, 0), body
.appliedImpulse
)
136 def addBodyDisallowXMovementStepCheckPosition
{
137 val world
= new World
139 body
.allowXMovement(false)
140 body
.applyForce(Vec2D(1, 1))
143 assertEquals(Vec2D(0, 4), body
.position
)
149 def addBodyDisallowYMovementStepCheckPosition
{
150 val world
= new World
152 body
.allowYMovement(false)
153 body
.applyForce(Vec2D(1, 1))
156 assertEquals(Vec2D(4, 0), body
.position
)
162 def verifyInitialBroadPhase
{
163 val world
= new World
164 assertTrue(world
.broadPhase
.isInstanceOf
[SimpleBroadPhase
])
170 def verifyInitialNarrowPhase
{
171 val world
= new World
172 assertTrue(world
.narrowPhase
.isInstanceOf
[SimpleNarrowPhase
])
177 @Test { val expected
= classOf
[NullPointerException
] }
178 def setBroadPhaseNullExpectException
{
179 val world
= new World
180 world
.broadPhase
= null
185 @Test { val expected
= classOf
[NullPointerException
] }
186 def setNarrowPhaseNullExpectException
{
187 val world
= new World
188 world
.narrowPhase
= null
194 def addBodyVerifyItIsPassedToBroadPhase
{
195 val world
= new World
197 val broadPhase
= new BroadPhase
{
198 var passedBodies
: List
[Body
] = null
199 def detectPossibleCollisions(bodies
: List
[Body
]) = { passedBodies
= bodies
; Nil
}
201 world
.broadPhase
= broadPhase
207 assertEquals(body
::Nil
, broadPhase
.passedBodies
)
213 def addBroadPhaseReturningBodyPairsVerifyTheyArePassedToNarrowPhase
{
214 val world
= new World
221 world
.broadPhase
= new BroadPhase
{
222 def detectPossibleCollisions(bodies
: List
[Body
]) = (b1
, b2
)::(b3
, b4
)::Nil
225 val narrowPhase
= new NarrowPhase
{
226 var passedPairs
: List
[(Body
, Body
)] = Nil
227 def inspectCollision(b1
: Body
, b2
: Body
) = { passedPairs
= passedPairs
:::List((b1
, b2
)); None
}
229 world
.narrowPhase
= narrowPhase
233 assertEquals((b1
, b2
)::(b3
, b4
)::Nil
, narrowPhase
.passedPairs
)
239 def verifyCollisionEffects
{
240 val world
= new World
243 b1
.position
= Vec2D(0, 1)
245 b1
.velocity
= Vec2D(-10, -10)
247 b2
.position
= Vec2D(0, -1)
249 b2
.velocity
= Vec2D(5, 5)
251 world
.narrowPhase
= new NarrowPhase
{
252 def inspectCollision(b1
: Body
, b2
: Body
) = {
253 Some(Collision(1.0, Contact(b1
, b2
, Vec2D(0, -1), Vec2D(0, 1), Vec2D(0, 0))))
261 assertEquals(Vec2D(0, 80), b1
.appliedImpulse
)
262 assertEquals(Vec2D(0, -80), b2
.appliedImpulse
)
268 def verifyCollisionEffectsWithBody1Static
{
269 val world
= new World
272 b1
.mass
= Double
.PositiveInfinity
275 b2
.velocity
= Vec2D(1, 1)
277 world
.narrowPhase
= new NarrowPhase
{
278 def inspectCollision(b1
: Body
, b2
: Body
) = {
279 Some(Collision(1.0, Contact(b1
, b2
, Vec2D(0, -1), Vec2D(0, 1), Vec2D(0, 0))))
287 assertEquals(Vec2D(0, 0), b1
.appliedImpulse
)
288 assertEquals(Vec2D(0, -10), b2
.appliedImpulse
)
294 def verifyCollisionEffectsWithBody2Static
{
295 val world
= new World
299 b1
.velocity
= Vec2D(1, 1)
301 b2
.mass
= Double
.PositiveInfinity
303 world
.narrowPhase
= new NarrowPhase
{
304 def inspectCollision(b1
: Body
, b2
: Body
) = {
305 Some(Collision(1.0, Contact(b1
, b2
, Vec2D(0, 1), Vec2D(0, -1), Vec2D(0, 0))))
313 assertEquals(Vec2D(0, -10), b1
.appliedImpulse
)
314 assertEquals(Vec2D(0, 0), b2
.appliedImpulse
)
320 def verifyForceIsAppliedBeforeCollisionDetection
{
321 val world
= new World
323 val broadPhase
= new BroadPhase
{
325 def detectPossibleCollisions(bodies
: List
[Body
]) = {
326 v
= bodies(0).velocity
330 world
.broadPhase
= broadPhase
334 body
.applyForce(Vec2D(10, 0))
339 assertEquals(Vec2D(4, 0), broadPhase
.v
)
345 def verifyImpulseIsAppliedBeforeCollisionDetection
{
346 val world
= new World
348 val broadPhase
= new BroadPhase
{
350 def detectPossibleCollisions(bodies
: List
[Body
]) = {
351 v
= bodies(0).velocity
355 world
.broadPhase
= broadPhase
359 body
.applyImpulse(Vec2D(10, 0))
364 assertEquals(Vec2D(2, 0), broadPhase
.v
)