Rally X
ELEN3009 Project by Justin Wernick and David Schneider
|
00001 00055 #include <vector> 00056 #include <list> 00057 #include <utility> 00058 using namespace std; 00059 00060 #include <gtest/gtest.h> 00061 00062 #include "../source/logic/CollisionDetector.h" 00063 #include "../source/logic/PlayerCar.h" 00064 #include "../source/logic/EnemyCar.h" 00065 #include "../source/logic/Checkpoint.h" 00066 #include "../source/logic/Rock.h" 00067 #include "../source/logic/Smokescreen.h" 00068 #include "../source/logic/Maze.h" 00069 #include "../source/logic/MazeMath.h" 00070 #include "../source/logic/DestroyedObjectPopup.h" 00071 00075 TEST(Car, updateMovesPlayerUpInEmptyMaze) 00076 { 00077 Maze testMaze; 00078 vector<pair<int,int> > walls; 00079 testMaze.generateMaze(walls,5,5); 00080 00081 PlayerCar player(2,2,Maze::UP); 00082 00083 list<Smokescreen> smokescreens; 00084 player.update(testMaze, smokescreens); 00085 00086 double expectX = 2; 00087 double expectY = 2-player.speed(); 00088 EXPECT_FLOAT_EQ(expectX, player.x()); 00089 EXPECT_FLOAT_EQ(expectY, player.y()); 00090 } 00091 00095 TEST(Car, updateMovesPlayerDownInEmptyMaze) 00096 { 00097 Maze testMaze; 00098 vector<pair<int,int> > walls; 00099 testMaze.generateMaze(walls,5,5); 00100 00101 PlayerCar player(2,2,Maze::DOWN); 00102 00103 list<Smokescreen> smokescreens; 00104 player.update(testMaze, smokescreens); 00105 00106 double expectX = 2; 00107 double expectY = 2+player.speed(); 00108 EXPECT_FLOAT_EQ(expectX, player.x()); 00109 EXPECT_FLOAT_EQ(expectY, player.y()); 00110 } 00111 00115 TEST(Car, updateMovesPlayerLeftInEmptyMaze) 00116 { 00117 Maze testMaze; 00118 vector<pair<int,int> > walls; 00119 testMaze.generateMaze(walls,5,5); 00120 00121 PlayerCar player(2,2,Maze::LEFT); 00122 00123 list<Smokescreen> smokescreens; 00124 player.update(testMaze, smokescreens); 00125 00126 double expectX = 2-player.speed(); 00127 double expectY = 2; 00128 EXPECT_FLOAT_EQ(expectX, player.x()); 00129 EXPECT_FLOAT_EQ(expectY, player.y()); 00130 } 00131 00135 TEST(Car, updateMovesPlayerRightInEmptyMaze) 00136 { 00137 Maze testMaze; 00138 vector<pair<int,int> > walls; 00139 testMaze.generateMaze(walls,5,5); 00140 00141 PlayerCar player(2,2,Maze::RIGHT); 00142 00143 list<Smokescreen> smokescreens; 00144 player.update(testMaze, smokescreens); 00145 00146 double expectX = 2+player.speed(); 00147 double expectY = 2; 00148 EXPECT_FLOAT_EQ(expectX, player.x()); 00149 EXPECT_FLOAT_EQ(expectY, player.y()); 00150 } 00151 00155 TEST(Car, carNotMovedWhenPathUpBlocked) 00156 { 00157 Maze testMaze; 00158 vector<pair<int,int> > walls; 00159 walls.push_back(make_pair(3,3)); 00160 testMaze.generateMaze(walls,5,5); 00161 00162 PlayerCar player(3,4,Maze::UP); 00163 00164 list<Smokescreen> smokescreens; 00165 player.update(testMaze, smokescreens); 00166 00167 double expectX = 3; 00168 double expectY = 4; 00169 EXPECT_FLOAT_EQ(expectX, player.x()); 00170 EXPECT_FLOAT_EQ(expectY, player.y()); 00171 } 00175 TEST(Car, carNotMovedWhenPathDownBlocked) 00176 { 00177 Maze testMaze; 00178 vector<pair<int,int> > walls; 00179 walls.push_back(make_pair(3,3)); 00180 testMaze.generateMaze(walls,5,5); 00181 00182 PlayerCar player(3,2,Maze::DOWN); 00183 00184 list<Smokescreen> smokescreens; 00185 player.update(testMaze, smokescreens); 00186 00187 double expectX = 3; 00188 double expectY = 2; 00189 EXPECT_FLOAT_EQ(expectX, player.x()); 00190 EXPECT_FLOAT_EQ(expectY, player.y()); 00191 } 00195 TEST(Car, carNotMovedWhenPathLeftBlocked) 00196 { 00197 Maze testMaze; 00198 vector<pair<int,int> > walls; 00199 walls.push_back(make_pair(3,3)); 00200 testMaze.generateMaze(walls,5,5); 00201 00202 PlayerCar player(4,3,Maze::LEFT); 00203 00204 list<Smokescreen> smokescreens; 00205 player.update(testMaze, smokescreens); 00206 00207 double expectX = 4; 00208 double expectY = 3; 00209 EXPECT_FLOAT_EQ(expectX, player.x()); 00210 EXPECT_FLOAT_EQ(expectY, player.y()); 00211 } 00215 TEST(Car, carNotMovedWhenPathRightBlocked) 00216 { 00217 Maze testMaze; 00218 vector<pair<int,int> > walls; 00219 walls.push_back(make_pair(3,3)); 00220 testMaze.generateMaze(walls,5,5); 00221 00222 PlayerCar player(2,3,Maze::RIGHT); 00223 00224 list<Smokescreen> smokescreens; 00225 player.update(testMaze, smokescreens); 00226 00227 double expectX = 2; 00228 double expectY = 3; 00229 EXPECT_FLOAT_EQ(expectX, player.x()); 00230 EXPECT_FLOAT_EQ(expectY, player.y()); 00231 } 00232 00236 TEST(Car, carDoesNotMoveUpOutMaze) 00237 { 00238 Maze testMaze; 00239 vector<pair<int,int> > walls; 00240 testMaze.generateMaze(walls,5,5); 00241 00242 PlayerCar player(3,0,Maze::UP); 00243 00244 list<Smokescreen> smokescreens; 00245 player.update(testMaze, smokescreens); 00246 00247 double expectX = 3; 00248 double expectY = 0; 00249 EXPECT_FLOAT_EQ(expectX, player.x()); 00250 EXPECT_FLOAT_EQ(expectY, player.y()); 00251 } 00255 TEST(Car, carDoesNotMoveDownOutMaze) 00256 { 00257 Maze testMaze; 00258 vector<pair<int,int> > walls; 00259 testMaze.generateMaze(walls,5,5); 00260 00261 PlayerCar player(3,5,Maze::DOWN); 00262 00263 list<Smokescreen> smokescreens; 00264 player.update(testMaze, smokescreens); 00265 00266 double expectX = 3; 00267 double expectY = 5; 00268 EXPECT_FLOAT_EQ(expectX, player.x()); 00269 EXPECT_FLOAT_EQ(expectY, player.y()); 00270 } 00274 TEST(Car, carDoesNotMoveLeftOutMaze) 00275 { 00276 Maze testMaze; 00277 vector<pair<int,int> > walls; 00278 testMaze.generateMaze(walls,5,5); 00279 00280 PlayerCar player(0,3,Maze::LEFT); 00281 00282 list<Smokescreen> smokescreens; 00283 player.update(testMaze, smokescreens); 00284 00285 double expectX = 0; 00286 double expectY = 3; 00287 EXPECT_FLOAT_EQ(expectX, player.x()); 00288 EXPECT_FLOAT_EQ(expectY, player.y()); 00289 } 00293 TEST(Car, carDoesNotMoveRightOutMaze) 00294 { 00295 Maze testMaze; 00296 vector<pair<int,int> > walls; 00297 testMaze.generateMaze(walls,5,5); 00298 00299 PlayerCar player(5,3,Maze::RIGHT); 00300 00301 list<Smokescreen> smokescreens; 00302 player.update(testMaze, smokescreens); 00303 00304 double expectX = 5; 00305 double expectY = 3; 00306 EXPECT_FLOAT_EQ(expectX, player.x()); 00307 EXPECT_FLOAT_EQ(expectY, player.y()); 00308 } 00309 00313 TEST(Checkpoint, countIncrementsAndDecrements) 00314 { 00315 vector<Checkpoint> checkpoints; 00316 EXPECT_EQ(0, Checkpoint::checkpointCount()); 00317 00318 for (int i=0; i<1000; ++i) 00319 { 00320 checkpoints.push_back(Checkpoint(i,i)); 00321 } 00322 EXPECT_EQ(1000, Checkpoint::checkpointCount()); 00323 00324 //brackets to limit scope 00325 { 00326 Checkpoint extraCheck1(0,0); 00327 Checkpoint extraCheck2 = extraCheck1; 00328 EXPECT_EQ(1002, Checkpoint::checkpointCount()); 00329 extraCheck2 = extraCheck1; 00330 EXPECT_EQ(1002, Checkpoint::checkpointCount()); 00331 } 00332 EXPECT_EQ(1000, Checkpoint::checkpointCount()); 00333 00334 while(!checkpoints.empty()) 00335 { 00336 checkpoints.pop_back(); 00337 } 00338 EXPECT_EQ(0, Checkpoint::checkpointCount()); 00339 } 00340 00344 TEST(CollisionDetector, playerAndEnemyBothDestroyed) 00345 { 00346 list<PlayerCar> players; 00347 list<EnemyCar> enemies; 00348 list<Checkpoint> checkpoints; 00349 list<Rock> rocks; 00350 list<Smokescreen> smokescreens; 00351 CollisionDetector detector; 00352 00353 players.push_back(PlayerCar(5,5)); 00354 players.push_back(PlayerCar(5,6)); 00355 players.push_back(PlayerCar(6,5)); 00356 players.push_back(PlayerCar(7,7.5)); 00357 00358 enemies.push_back(EnemyCar(5,6)); 00359 enemies.push_back(EnemyCar(4,5)); 00360 enemies.push_back(EnemyCar(6,6)); 00361 enemies.push_back(EnemyCar(6.5,8)); 00362 00363 detector.checkCollisions(players, enemies, checkpoints, rocks, smokescreens); 00364 00365 list<PlayerCar>::const_iterator playerIter = players.begin(); 00366 EXPECT_FALSE(playerIter->destroyed()); 00367 ++playerIter; 00368 EXPECT_TRUE(playerIter->destroyed()); 00369 ++playerIter; 00370 EXPECT_FALSE(playerIter->destroyed()); 00371 ++playerIter; 00372 EXPECT_TRUE(playerIter->destroyed()); 00373 00374 list<EnemyCar>::const_iterator enemyIter = enemies.begin(); 00375 EXPECT_TRUE(enemyIter->destroyed()); 00376 ++enemyIter; 00377 EXPECT_FALSE(enemyIter->destroyed()); 00378 ++enemyIter; 00379 EXPECT_FALSE(enemyIter->destroyed()); 00380 ++enemyIter; 00381 EXPECT_TRUE(enemyIter->destroyed()); 00382 } 00383 00387 TEST(CollisionDetector, playerDestroyedByRock) 00388 { 00389 list<PlayerCar> players; 00390 list<EnemyCar> enemies; 00391 list<Checkpoint> checkpoints; 00392 list<Rock> rocks; 00393 list<Smokescreen> smokescreens; 00394 CollisionDetector detector; 00395 00396 players.push_back(PlayerCar(5,5)); 00397 players.push_back(PlayerCar(5,6)); 00398 players.push_back(PlayerCar(6,5)); 00399 players.push_back(PlayerCar(7,7.5)); 00400 00401 rocks.push_back(Rock(5,6)); 00402 rocks.push_back(Rock(4,5)); 00403 rocks.push_back(Rock(6,6)); 00404 rocks.push_back(Rock(6.5,8)); 00405 00406 detector.checkCollisions(players, enemies, checkpoints, rocks, smokescreens); 00407 00408 list<PlayerCar>::const_iterator playerIter = players.begin(); 00409 EXPECT_FALSE(playerIter->destroyed()); 00410 ++playerIter; 00411 EXPECT_TRUE(playerIter->destroyed()); 00412 ++playerIter; 00413 EXPECT_FALSE(playerIter->destroyed()); 00414 ++playerIter; 00415 EXPECT_TRUE(playerIter->destroyed()); 00416 00417 list<Rock>::const_iterator rockIter = rocks.begin(); 00418 EXPECT_FALSE(rockIter->destroyed()); 00419 ++rockIter; 00420 EXPECT_FALSE(rockIter->destroyed()); 00421 ++rockIter; 00422 EXPECT_FALSE(rockIter->destroyed()); 00423 ++rockIter; 00424 EXPECT_FALSE(rockIter->destroyed()); 00425 } 00426 00430 TEST(CollisionDetector, checkpointDestroyedByPlayer) 00431 { 00432 list<PlayerCar> players; 00433 list<EnemyCar> enemies; 00434 list<Checkpoint> checkpoints; 00435 list<Rock> rocks; 00436 list<Smokescreen> smokescreens; 00437 CollisionDetector detector; 00438 00439 players.push_back(PlayerCar(5,5)); 00440 players.push_back(PlayerCar(5,6)); 00441 players.push_back(PlayerCar(6,5)); 00442 players.push_back(PlayerCar(7,7.5)); 00443 00444 checkpoints.push_back(Checkpoint(5,6)); 00445 checkpoints.push_back(Checkpoint(4,5)); 00446 checkpoints.push_back(Checkpoint(6,6)); 00447 checkpoints.push_back(Checkpoint(6.5,8)); 00448 00449 detector.checkCollisions(players, enemies, checkpoints, rocks, smokescreens); 00450 00451 list<PlayerCar>::const_iterator playerIter = players.begin(); 00452 EXPECT_FALSE(playerIter->destroyed()); 00453 ++playerIter; 00454 EXPECT_FALSE(playerIter->destroyed()); 00455 ++playerIter; 00456 EXPECT_FALSE(playerIter->destroyed()); 00457 ++playerIter; 00458 EXPECT_FALSE(playerIter->destroyed()); 00459 00460 list<Checkpoint>::const_iterator checkpointIter = checkpoints.begin(); 00461 EXPECT_TRUE(checkpointIter->destroyed()); 00462 ++checkpointIter; 00463 EXPECT_FALSE(checkpointIter->destroyed()); 00464 ++checkpointIter; 00465 EXPECT_FALSE(checkpointIter->destroyed()); 00466 ++checkpointIter; 00467 EXPECT_TRUE(checkpointIter->destroyed()); 00468 } 00469 00473 TEST(CollisionDetector, enemyStoppedBySmokescreen) 00474 { 00475 list<PlayerCar> players; 00476 list<EnemyCar> enemies; 00477 list<Checkpoint> checkpoints; 00478 list<Rock> rocks; 00479 list<Smokescreen> smokescreens; 00480 CollisionDetector detector; 00481 00482 enemies.push_back(EnemyCar(5,5)); 00483 enemies.push_back(EnemyCar(5,6)); 00484 enemies.push_back(EnemyCar(6,5)); 00485 enemies.push_back(EnemyCar(7,7.5)); 00486 00487 smokescreens.push_back(Smokescreen(5,6)); 00488 smokescreens.push_back(Smokescreen(4,5)); 00489 smokescreens.push_back(Smokescreen(6,6)); 00490 smokescreens.push_back(Smokescreen(6.5,8)); 00491 00492 detector.checkCollisions(players, enemies, checkpoints, rocks, smokescreens); 00493 00494 list<EnemyCar>::const_iterator enemyIter = enemies.begin(); 00495 EXPECT_GT(enemyIter->speed(),0); 00496 ++enemyIter; 00497 EXPECT_FLOAT_EQ(0, enemyIter->speed()); 00498 ++enemyIter; 00499 EXPECT_GT(enemyIter->speed(),0); 00500 ++enemyIter; 00501 EXPECT_FLOAT_EQ(0, enemyIter->speed()); 00502 } 00503 00507 TEST(DestroyedObjectPopup, destroyedAfterSetTime) 00508 { 00509 DestroyedObjectPopup testPopup(3,2,BitmapStore::CRASHED_CAR); 00510 00511 int i=0; 00512 while (!testPopup.destroyed()) 00513 { 00514 testPopup.update(); 00515 ++i; 00516 } 00517 00518 EXPECT_EQ(30,i); 00519 } 00520 00524 TEST(Maze, queryOutsideBoundsReturnsSolid) 00525 { 00526 Maze testMaze; 00527 vector<pair<int,int> > walls; 00528 testMaze.generateMaze(walls,5,5); 00529 00530 EXPECT_FALSE(testMaze.getSolid(5,5)); 00531 EXPECT_FALSE(testMaze.getSolid(0,0)); 00532 EXPECT_TRUE(testMaze.getSolid(6,5)); 00533 EXPECT_TRUE(testMaze.getSolid(5,6)); 00534 EXPECT_TRUE(testMaze.getSolid(-1,3)); 00535 EXPECT_TRUE(testMaze.getSolid(3,-1)); 00536 } 00537 00541 TEST(Maze, generationWithWallsWithoutObjectMax) 00542 { 00543 Maze testMaze; 00544 vector<pair<int,int> > walls; 00545 walls.push_back(make_pair(1,2)); 00546 walls.push_back(make_pair(4,3)); 00547 testMaze.generateMaze(walls); 00548 00549 //test random empty blocks 00550 EXPECT_FALSE(testMaze.getSolid(2,1)); 00551 EXPECT_FALSE(testMaze.getSolid(0,0)); 00552 00553 //test wall blocks 00554 EXPECT_TRUE(testMaze.getSolid(1,2)); 00555 EXPECT_TRUE(testMaze.getSolid(4,3)); 00556 00557 //test bounds are being set right 00558 EXPECT_TRUE(testMaze.getSolid(4,4)); 00559 EXPECT_TRUE(testMaze.getSolid(5,3)); 00560 } 00561 00565 TEST(Maze, generationWithWallsWithObjectMax) 00566 { 00567 Maze testMaze; 00568 vector<pair<int,int> > walls; 00569 walls.push_back(make_pair(1,2)); 00570 walls.push_back(make_pair(4,3)); 00571 testMaze.generateMaze(walls,5,6); 00572 00573 //test random empty blocks 00574 EXPECT_FALSE(testMaze.getSolid(2,1)); 00575 EXPECT_FALSE(testMaze.getSolid(0,0)); 00576 00577 //test wall blocks 00578 EXPECT_TRUE(testMaze.getSolid(1,2)); 00579 EXPECT_TRUE(testMaze.getSolid(4,3)); 00580 00581 //test bounds are being set right 00582 EXPECT_FALSE(testMaze.getSolid(4,4)); 00583 EXPECT_FALSE(testMaze.getSolid(5,6)); 00584 EXPECT_TRUE(testMaze.getSolid(6,6)); 00585 EXPECT_TRUE(testMaze.getSolid(5,7)); 00586 } 00587 00591 TEST(MazeMath, distanceGivesExpectedResult) 00592 { 00593 //right angle triange with sides of length 3, 4, and 5 00594 double x1 = 1; 00595 double y1 = 1; 00596 double x2 = 4; 00597 double y2 = 5; 00598 00599 double expectedResult = 5; 00600 00601 EXPECT_DOUBLE_EQ(expectedResult, MazeMath::distance(x1,y1,x2,y2)); 00602 } 00603 00607 TEST(MazeMath, roundGivesExpectedResult) 00608 { 00609 //right angle triange with sides of length 3, 4, and 5 00610 double roundUp = 5.5; 00611 double roundDown = 5.49; 00612 00613 double expectUp = 6; 00614 double expectDown = 5; 00615 00616 EXPECT_DOUBLE_EQ(expectUp, MazeMath::round(roundUp)); 00617 EXPECT_DOUBLE_EQ(expectDown, MazeMath::round(roundDown)); 00618 } 00619 00626 TEST(PlayerCar, creationAndDestructionCanHappen) 00627 { 00628 EXPECT_NO_THROW({ 00629 vector<PlayerCar> players; 00630 for (int i=0; i<10; ++i) 00631 { 00632 players.push_back(PlayerCar(i,i)); 00633 } 00634 while(!players.empty()) 00635 { 00636 players.pop_back(); 00637 } 00638 }); 00639 00640 EXPECT_FALSE(al_is_system_installed()); 00641 } 00642 00648 TEST(PlayerCar, playerSpeedAffectedByPetrol) 00649 { 00650 Maze testMaze; 00651 vector<pair<int,int> > walls; 00652 testMaze.generateMaze(walls,5,5); 00653 00654 PlayerCar player(5,3,Maze::RIGHT); 00655 00656 list<Smokescreen> smokescreens; 00657 for (int i=0; i<1429; ++i) 00658 { 00659 player.update(testMaze, smokescreens); 00660 } 00661 00662 EXPECT_FLOAT_EQ(0, player.petrol()); 00663 EXPECT_FLOAT_EQ(0.05, player.speed()); 00664 00665 player.gotCheckpoint(); 00666 EXPECT_GT(player.petrol(), 0); 00667 EXPECT_FLOAT_EQ(0.1, player.speed()); 00668 } 00669 00673 TEST(Smokescreen, destroyedAfterSetTime) 00674 { 00675 Smokescreen testSmokescreen(3,2); 00676 00677 int i=0; 00678 while (!testSmokescreen.destroyed()) 00679 { 00680 testSmokescreen.update(); 00681 ++i; 00682 } 00683 00684 EXPECT_EQ(60,i); 00685 }