package org.mafagafogigante.dungeon.world;
import org.mafagafogigante.dungeon.date.Date;
import org.mafagafogigante.dungeon.entity.creatures.Observer;
import org.mafagafogigante.dungeon.game.Location;
import org.mafagafogigante.dungeon.game.World;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
public class WeatherConditionVisibilityCriterionTest {
private Observer observer = Mockito.mock(Observer.class);
private Location location = Mockito.mock(Location.class);
private World world = Mockito.mock(World.class);
private Weather weather = Mockito.mock(Weather.class);
/**
* Initialize the Mockito stubs.
*/
@Before
public void initialize() {
Mockito.when(observer.getObserverLocation()).thenReturn(location);
Mockito.when(location.getWorld()).thenReturn(world);
Mockito.when(world.getWeather()).thenReturn(weather);
}
@Test
public void testWeatherConditionVisibilityCriterionIsUnmetBelowMinimum() {
for (int i = 1; i < WeatherCondition.values().length; i++) {
WeatherCondition minimum = WeatherCondition.values()[i];
WeatherCondition maximum = WeatherCondition.values()[WeatherCondition.values().length - 1];
WeatherConditionVisibilityCriterion criterion = new WeatherConditionVisibilityCriterion(minimum, maximum);
for (int j = 0; j < i; j++) {
WeatherCondition belowMinimum = WeatherCondition.values()[j];
Mockito.when(weather.getCurrentCondition(Mockito.any(Date.class))).thenReturn(belowMinimum);
Assert.assertFalse(criterion.isMetBy(observer));
}
}
}
@Test
public void testWeatherConditionVisibilityCriterionIsMetAtMinimum() {
for (int i = 0; i < WeatherCondition.values().length; i++) {
for (int j = i; j < WeatherCondition.values().length; j++) {
WeatherCondition minimum = WeatherCondition.values()[i];
WeatherCondition maximum = WeatherCondition.values()[j];
WeatherConditionVisibilityCriterion criterion = new WeatherConditionVisibilityCriterion(minimum, maximum);
Mockito.when(weather.getCurrentCondition(Mockito.any(Date.class))).thenReturn(minimum);
Assert.assertTrue(criterion.isMetBy(observer));
}
}
}
@Test
public void testWeatherConditionVisibilityCriterionIsMetInBetweenMinimumAndMaximum() {
WeatherConditionVisibilityCriterion criterion =
new WeatherConditionVisibilityCriterion(WeatherCondition.CLEAR, WeatherCondition.STORM);
Mockito.when(weather.getCurrentCondition(Mockito.any(Date.class))).thenReturn(WeatherCondition.CLOUDY);
Assert.assertTrue(criterion.isMetBy(observer));
}
@Test
public void testWeatherConditionVisibilityCriterionIsMetAtMaximum() {
for (int i = 0; i < WeatherCondition.values().length; i++) {
for (int j = i; j < WeatherCondition.values().length; j++) {
WeatherCondition minimum = WeatherCondition.values()[i];
WeatherCondition maximum = WeatherCondition.values()[j];
WeatherConditionVisibilityCriterion criterion = new WeatherConditionVisibilityCriterion(minimum, maximum);
Mockito.when(weather.getCurrentCondition(Mockito.any(Date.class))).thenReturn(maximum);
Assert.assertTrue(criterion.isMetBy(observer));
}
}
}
@Test
public void testWeatherConditionVisibilityCriterionIsUnmetAboveMaximum() {
for (int i = 0; i < WeatherCondition.values().length - 1; i++) {
WeatherCondition minimum = WeatherCondition.values()[0];
WeatherCondition maximum = WeatherCondition.values()[i];
WeatherConditionVisibilityCriterion criterion = new WeatherConditionVisibilityCriterion(minimum, maximum);
for (int j = i + 1; j < WeatherCondition.values().length; j++) {
WeatherCondition aboveMaximum = WeatherCondition.values()[j];
Mockito.when(weather.getCurrentCondition(Mockito.any(Date.class))).thenReturn(aboveMaximum);
Assert.assertFalse(criterion.isMetBy(observer));
}
}
}
@Test
public void testWeatherConditionVisibilityCriterionConstructorAllowsForMinimumEqualToMaximum() {
for (WeatherCondition condition : WeatherCondition.values()) {
new WeatherConditionVisibilityCriterion(condition, condition);
}
}
@Test(expected = IllegalArgumentException.class)
public void testWeatherConditionVisibilityCriterionConstructorDoesNotAllowForMinimumHeavierThanMaximum() {
new WeatherConditionVisibilityCriterion(WeatherCondition.STORM, WeatherCondition.CLEAR);
}
}