package oop13.space.testing;
import java.lang.reflect.Field;
import oop13.space.model.Alien;
import oop13.space.model.AlienMotherShip;
import oop13.space.model.AlienShot;
import oop13.space.model.AlienType;
import oop13.space.model.IModel;
import oop13.space.model.Individual;
import oop13.space.model.Model;
import oop13.space.model.Ship;
import oop13.space.model.ShipShot;
import oop13.space.model.Statistics;
import oop13.space.model.Wall;
import oop13.space.utilities.GameStrings;
import org.junit.Assert;
import org.junit.Test;
public class TestModel {
@Test
public void testInit() {
IModel model = new Model();
String[] achievements = new String[]{GameStrings.ACH_100_ALIENS, GameStrings.ACH_SURVIVOR,
GameStrings.ACH_3_LEVELS, GameStrings.ACH_5_MOTHERSHIPS};
model.initIndividuals();
model.initAchievements();
Assert.assertEquals(model.getList().size(), 65);
Assert.assertEquals(model.getAliens().getAlienList().size(), 55);
Assert.assertEquals(model.getWalls().getList().size(), 9);
Assert.assertEquals(model.getAchievementsName().length, 4);
Assert.assertArrayEquals(model.getAchievementsName(), achievements);
Assert.assertTrue(model.getList().contains(model.getShip()));
for (Field f : model.getStatistics().getClass().getDeclaredFields()) {
f.setAccessible(true);
try {
Assert.assertTrue(f.getInt(model.getStatistics()) == 0);
} catch (IllegalArgumentException e) {
System.err.println(GameStrings.ILLEGAL_ARG_ERROR);
} catch (IllegalAccessException e) {
System.err.println(GameStrings.ILLEGAL_ACC_ERROR);
}
}
}
@Test
public void testAddIndividuals() {
IModel model = new Model();
model.initIndividuals();
for (int i = 0; i < 10; i++) {
ShipShot shot = model.addShot();
Assert.assertTrue(model.getList().contains(shot));
}
Assert.assertEquals(model.getList().size(), 75);
AlienMotherShip motherShip = model.addMotherShip();
Assert.assertEquals(model.getList().size(), 76);
for (int i = 0; i < 5; i++) {
AlienShot alienShot = model.addAlienShot(new AlienShot(10, i));
Assert.assertTrue(model.getList().contains(alienShot));
}
Assert.assertEquals(model.getList().size(), 81);
Assert.assertTrue(model.getList().contains(motherShip));
}
@Test
public void testRemoveIndividuals() {
IModel model = new Model();
model.initIndividuals();
Ship spaceShip = model.getShip();
ShipShot shot = model.addShot();
model.removeIndividual(shot);
model.removeIndividual(spaceShip);
Assert.assertTrue(model.getList().size() == 64);
for (Individual ind : model.getList()) {
model.removeIndividual(ind);
}
Assert.assertTrue(model.getList().isEmpty());
Assert.assertTrue(model.getStatistics().getScore() == 990);
}
@Test
public void testChangesInModel() {
IModel model = new Model();
model.initIndividuals();
model.initAchievements();
Ship spaceShip = model.getShip();
Statistics statistics = model.getStatistics();
//Testing adding and resetting statistics
statistics.setLevelsCompleted(3);
statistics.setMotherShipsKilled(5);
statistics.setScore(300);
statistics.setAliensKilled(100);
Assert.assertTrue(statistics.getLevelsCompleted() == 3);
Assert.assertTrue(statistics.getMotherShipsKilled() == 5);
Assert.assertTrue(statistics.getScore() == 300);
Assert.assertTrue(statistics.getAliensKilled() == 100);
statistics.resetStatistics();
for (Field f : statistics.getClass().getDeclaredFields()) {
f.setAccessible(true);
try {
Assert.assertTrue(f.getInt(statistics) == 0);
} catch (IllegalArgumentException e) {
System.err.println(GameStrings.ILLEGAL_ARG_ERROR);
} catch (IllegalAccessException e) {
System.err.println(GameStrings.ILLEGAL_ACC_ERROR);
}
}
//Testing movement and some methods of ship
spaceShip.moveIndividual(spaceShip.getPositionX() + 10, spaceShip.getPositionY());
Assert.assertTrue(spaceShip.getPositionX() == 280);
spaceShip.moveIndividual(spaceShip.getPositionX() - 260, spaceShip.getPositionY());
Assert.assertTrue(model.getShip().getPositionX() == 20);
spaceShip.moveIndividual(spaceShip.getPositionX() - 10, spaceShip.getPositionY());
Assert.assertTrue(spaceShip.getPositionX() == 20); //reached minimum left movement, the ship position doesn't change
spaceShip.moveIndividual(spaceShip.getPositionX() + 520, spaceShip.getPositionY());
Assert.assertTrue(spaceShip.getPositionX() == 540);
spaceShip.moveIndividual(spaceShip.getPositionX() + 10, spaceShip.getPositionY());
Assert.assertTrue(spaceShip.getPositionX() == 540); // reached maximum right movement, the ship position doesn't change
spaceShip.decreaseLives();
spaceShip.decreaseLives();
Assert.assertTrue(spaceShip.getLives() == 1);
spaceShip.increaseLives();
Assert.assertTrue(spaceShip.getLives() == 2);
spaceShip.decreaseLives();
//Testing collisions AlienShot -> Ship and Shot -> Alien
model.getList().add(new AlienShot(spaceShip.getPositionX(), spaceShip.getPositionY()));
ShipShot shot = new ShipShot(10, 50);
model.getList().add(shot);
shot.collideWith(model.getList());
spaceShip.collideWith(model.getList());
Assert.assertTrue(spaceShip.isDead());
Assert.assertTrue(shot.isDead());
int individualsKilled = 0;
for (Individual ind : model.getList()) {
if (ind.isDead()) {
individualsKilled++;
}
}
Assert.assertTrue(individualsKilled == 4); //Individuals dead: alienShot, shot, ship and an alien
for (Individual ind : model.getList()) {
if (ind.getPositionX() == 10 && ind.getPositionY() == 50) {
Assert.assertTrue(ind.isDead());
}
}
//Testing collisions Shot -> Wall and Alien shot -> Wall
ShipShot shipShot = new ShipShot(40, 450);
Wall wallKicked = null;
model.getList().add(shipShot);
for (Wall wall : model.getWalls().getList()) {
wall.collideWith(model.getList());
}
for (Wall wall : model.getWalls().getList()) {
if (wall.getPositionX() == 40 && wall.getPositionY() == 450) {
wallKicked = wall;
}
}
Assert.assertTrue(wallKicked.getLives() == 1);
model.getList().remove(shipShot);
AlienShot alienShot = new AlienShot(35, 450);
model.getList().add(alienShot);
wallKicked.collideWith(model.getList());
Assert.assertTrue(wallKicked.getLives() == 0);
Assert.assertTrue(wallKicked.isDead());
//Testing collisions Shot -> Alien Shot
model.getList().add(shipShot);
alienShot.collideWith(model.getList());
Assert.assertTrue(shipShot.isDead());
Assert.assertTrue(alienShot.isDead());
//Testing score when aliens die
model.resetStatistics();
Alien alien1 = new Alien(new AlienType(1), 50, 30);
Alien alien2 = new Alien(new AlienType(2), 80, 30);
Alien alien3 = new Alien(new AlienType(3), 100, 30);
model.getList().add(alien1);
model.getList().add(alien2);
model.getList().add(alien3);
model.removeIndividual(alien1);
Assert.assertTrue(model.getStatistics().getScore() == 10);
model.removeIndividual(alien2);
Assert.assertTrue(model.getStatistics().getScore() == 30);
model.removeIndividual(alien3);
Assert.assertTrue(model.getStatistics().getScore() == 60);
}
}