Rally X
ELEN3009 Project by Justin Wernick and David Schneider
tests/logicTests.cpp
Go to the documentation of this file.
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 }
 All Classes Files Functions Variables Typedefs Enumerations Enumerator