package org.mafagafogigante.dungeon.achievements;
import org.mafagafogigante.dungeon.entity.creatures.Creature;
import org.mafagafogigante.dungeon.entity.creatures.CreaturePreset;
import org.mafagafogigante.dungeon.game.Id;
import org.mafagafogigante.dungeon.game.PartOfDay;
import org.mafagafogigante.dungeon.game.Point;
import org.mafagafogigante.dungeon.stats.CauseOfDeath;
import org.mafagafogigante.dungeon.stats.Statistics;
import org.mafagafogigante.dungeon.util.CounterMap;
import org.mafagafogigante.dungeon.util.Percentage;
import org.junit.Assert;
import org.junit.Test;
public class AchievementTest {
@Test
public void testBattleAchievementShouldBeFulfilled() throws Exception {
AchievementBuilder achievementBuilder = new AchievementBuilder();
achievementBuilder.setId("TWO_COWS");
achievementBuilder.setName("Two Cows");
BattleStatisticsQuery cowQuery = new BattleStatisticsQuery();
cowQuery.setId(new Id("COW"));
achievementBuilder.addBattleStatisticsRequirement(new BattleStatisticsRequirement(cowQuery, 2));
CreaturePreset cowPreset = new CreaturePreset();
cowPreset.setId(new Id("COW"));
cowPreset.setType("BEAST");
cowPreset.setHealth(1);
cowPreset.setVisibility(Percentage.fromString("80%"));
Achievement achievement = achievementBuilder.createAchievement();
CauseOfDeath unarmedCauseOfDeath = CauseOfDeath.getUnarmedCauseOfDeath();
Statistics statistics = new Statistics();
Assert.assertFalse(achievement.isFulfilled(statistics));
statistics.getBattleStatistics().addBattle(new Creature(cowPreset), unarmedCauseOfDeath, PartOfDay.DAWN);
Assert.assertFalse(achievement.isFulfilled(statistics));
statistics.getBattleStatistics().addBattle(new Creature(cowPreset), unarmedCauseOfDeath, PartOfDay.DAWN);
Assert.assertTrue(achievement.isFulfilled(statistics));
}
@Test
public void testVisitedLocationsBasedAchievementsShouldWorkAsExpected() throws Exception {
AchievementBuilder achievementBuilder = new AchievementBuilder();
achievementBuilder.setId("VISIT_TWO_DIFFERENT_DESERTS");
achievementBuilder.setName("Visit Two Different Deserts");
CounterMap<Id> visitedLocations = new CounterMap<>();
visitedLocations.incrementCounter(new Id("DESERT"), 2);
achievementBuilder.setVisitedLocations(visitedLocations);
Achievement achievement = achievementBuilder.createAchievement();
Statistics statistics = new Statistics();
Assert.assertFalse(achievement.isFulfilled(statistics));
statistics.getExplorationStatistics().addVisit(new Point(0, 0, 0), new Id("DESERT"));
Assert.assertFalse(achievement.isFulfilled(statistics));
statistics.getExplorationStatistics().addVisit(new Point(0, 0, 0), new Id("DESERT"));
Assert.assertFalse(achievement.isFulfilled(statistics));
statistics.getExplorationStatistics().addVisit(new Point(1, 1, 1), new Id("DESERT"));
Assert.assertTrue(achievement.isFulfilled(statistics));
}
@Test
public void testMaximumVisitsAchievementsShouldWorkAsExpected() throws Exception {
AchievementBuilder achievementBuilder = new AchievementBuilder();
achievementBuilder.setId("VISIT_ANY_DESERT_TWICE");
achievementBuilder.setName("Visit Any Desert Twice");
CounterMap<Id> maximumVisits = new CounterMap<>();
maximumVisits.incrementCounter(new Id("DESERT"), 2);
achievementBuilder.setMaximumNumberOfVisits(maximumVisits);
Achievement achievement = achievementBuilder.createAchievement();
Statistics statistics = new Statistics();
Assert.assertFalse(achievement.isFulfilled(statistics));
statistics.getExplorationStatistics().addVisit(new Point(0, 0, 0), new Id("DESERT"));
Assert.assertFalse(achievement.isFulfilled(statistics));
statistics.getExplorationStatistics().addVisit(new Point(1, 1, 1), new Id("DESERT"));
Assert.assertFalse(achievement.isFulfilled(statistics));
statistics.getExplorationStatistics().addVisit(new Point(0, 0, 0), new Id("DESERT"));
Assert.assertTrue(achievement.isFulfilled(statistics));
}
}