001 /**
002 * Tests the functionality of GamePhysics -- moving objects around
003 */
004 package test;
005
006 import java.util.ArrayList;
007 import java.util.List;
008
009 import junit.framework.TestCase;
010 import physics3d.GamePhysics;
011 import physics3d.PhysicsShape;
012 import physics3d.Vect3;
013
014 import components.Ball;
015 import components.GameObject;
016 import components.GameSettings;
017 import components.GameSpace;
018 import components.SquareBumper;
019
020 /**
021 * @author ruthdhan
022 *
023 */
024 public class TestGamePhysics extends TestCase {
025
026 //fields
027 GameSpace gs;
028 Ball b;
029
030 /**
031 * @param name
032 */
033 public TestGamePhysics(String name) {
034 super(name);
035 }
036
037 /* (non-Javadoc)
038 * @see junit.framework.TestCase#setUp()
039 */
040 protected void setUp() throws Exception {
041 super.setUp();
042 gs = new GameSpace(new GameSettings());
043 gs.getSettings().setFPS(1);
044 b = new Ball(new Vect3(0, 5, 0), Vect3.ZERO, "test ball", gs);
045 gs.add(b);
046 }
047
048 /* (non-Javadoc)
049 * @see junit.framework.TestCase#tearDown()
050 */
051 protected void tearDown() throws Exception {
052 super.tearDown();
053 }
054
055 /** test whether willCollideWithBound works in an empty gs **/
056 public void testWillCollideWithBoundEmpty() {
057 assertEquals(7, gs.getObjects().size());
058 assertNotNull("b is null!", b);
059 assertNotNull("gs is null!", gs);
060 List<GameObject> lst = GamePhysics.willCollideWithBound(b, gs.getObjects(), 1); //1 second
061 assertEquals(0, lst.size());
062 }
063
064 /** test a ball that should simply float in space **/
065 public void testMoveBallFloating() {
066 gs.getSettings().setGravity(Vect3.ZERO);
067 Vect3 x_i = b.getCenter();
068 Vect3 v_i = b.getVelocity();
069 GamePhysics.moveBall(b);
070 //with no gravity, no initial velocity, the ball should stay put
071 assertEquals(x_i, b.getCenter());
072 assertEquals(v_i, b.getVelocity());
073 }
074
075 /** test a ball that should fall down (y-direction) **/
076 public void testMoveBallFallingNoDrag() {
077 gs.getSettings().setGravity(Vect3.Y_HAT.neg()); //-1 in y direction
078 gs.getSettings().setMu2(0.0); //no drag
079
080 Vect3 x_i = b.getCenter();
081 Vect3 v_i = b.getVelocity();
082 GamePhysics.moveBall(b);
083 //GamePhysics.freeMove(b, 1.0);
084 assertEquals(Vect3.Y_HAT.neg(), b.getVelocity());
085 assertEquals(new Vect3(0, 4.5, 0), b.getCenter());
086
087 x_i = b.getCenter();
088 v_i = b.getVelocity();
089 GamePhysics.moveBall(b);
090 //GamePhysics.freeMove(b, 1.0);
091 assertEquals(new Vect3(0, 3.0, 0), b.getCenter());
092 assertEquals(new Vect3(0, -2, 0), b.getVelocity());
093 }
094
095 /** test whether it detects about-to-collide stuff using bound check **/
096 public void testCollideWithBoundNotEmpty() {
097 b.setCenter(Vect3.Y_HAT.times(2.5)); // start ball at 2.5 in y direction
098 gs.getSettings().setGravity(Vect3.Y_HAT.neg()); //-1 in y direction
099 gs.getSettings().setMu2(0.0); //no drag
100 SquareBumper bumper = new SquareBumper(new Vect3(0, -0.5, 0), "sq bumper", gs);
101 gs.add(bumper);
102
103 GamePhysics.moveBall(b);
104 assertEquals(b.getCenter(), new Vect3(0, 2.0, 0));
105 assertEquals(b.getVelocity(), new Vect3(0, -1.0, 0));
106 //now (0, 2.0, 0), v=-1
107 GamePhysics.moveBall(b);
108 assertEquals(new Vect3(0, 0.5, 0), b.getCenter());
109 assertEquals(new Vect3(0, -2.0, 0), b.getVelocity());
110 //now (0, 0.5, 0), with v=2
111
112 assertEquals(8, gs.getObjects().size());
113 List<GameObject> cands = GamePhysics.willCollideWithBound(b, gs.getObjects(), 1.0);
114 assertEquals(2, cands.size()); //there's also the wall
115 }
116
117 /** test whether the ball collides with the square bumper **/
118 public void testMoveBallBounce() {
119 b.setCenter(Vect3.Y_HAT.times(2.5)); // start ball at 2.5 in y direction
120 gs.getSettings().setGravity(Vect3.Y_HAT.neg()); //-1 in y direction
121 gs.getSettings().setMu2(0.0); //no drag
122 SquareBumper bumper = new SquareBumper(new Vect3(0, -0.5, 0), "sq bumper", gs);
123 gs.add(bumper);
124
125 GamePhysics.moveBall(b);
126 assertEquals(b.getCenter(), new Vect3(0, 2.0, 0));
127 assertEquals(b.getVelocity(), new Vect3(0, -1.0, 0));
128 //now (0, 2.0, 0), v=-1
129
130 GamePhysics.moveBall(b);
131 assertEquals(new Vect3(0, 0.5, 0), b.getCenter());
132 assertEquals(new Vect3(0, -2.0, 0), b.getVelocity());
133 //now (0, 0.5, 0), with v=2
134
135 GamePhysics.moveBall(b);
136 assertEquals(b.getVelocity(), new Vect3(0, 1.0, 0));
137 assertEquals(b.getCenter(), new Vect3(0, 2.0, 0));
138 //new (0, 2, 0) with v=1 bouncing upward... i think...?
139 }
140 }