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 TimeVisibilityCriterionTest { private static final int HOURS_IN_DAY = 24; private Observer observer = Mockito.mock(Observer.class); private Location location = Mockito.mock(Location.class); private World world = Mockito.mock(World.class); /** * Initialize the Mockito stubs. */ @Before public void initialize() { Mockito.when(observer.getObserverLocation()).thenReturn(location); Mockito.when(location.getWorld()).thenReturn(world); } @Test public void testIsMetByShouldReturnTrueWhenTheCriterionIsMet() throws Exception { TimeVisibilityCriterion criterion = new TimeVisibilityCriterion(6, 18); for (int i = 0; i < 12; i++) { Mockito.when(world.getWorldDate()).thenReturn(new Date(1, 1, 1, i + 6, 0, 0)); Assert.assertTrue(criterion.isMetBy(observer)); } } @Test public void testIsMetByShouldReturnFalseWhenTheCriterionIsUnmet() throws Exception { TimeVisibilityCriterion criterion = new TimeVisibilityCriterion(6, 18); for (int i = 0; i < 12; i++) { Mockito.when(world.getWorldDate()).thenReturn(new Date(1, 1, 1, (i + 18) % HOURS_IN_DAY, 0, 0)); Assert.assertFalse(criterion.isMetBy(observer)); } } @Test public void testIsMetByShouldReturnTrueWhenTheCriterionIsMetEvenForCriteriaThatCrossMidnight() throws Exception { for (int begin = 1; begin < HOURS_IN_DAY; begin++) { for (int end = 0; end < begin; end++) { TimeVisibilityCriterion criterion = new TimeVisibilityCriterion(begin, end); for (int hour = begin; hour != end; hour = (hour + 1) % HOURS_IN_DAY) { Date date = new Date(1, 1, 1, hour, 0, 0); Mockito.when(world.getWorldDate()).thenReturn(date); Assert.assertTrue(criterion.isMetBy(observer)); } } } } @Test public void testIsMetByShouldReturnFalseWhenTheCriterionIsUnmetEvenForCriteriaThatCrossMidnight() throws Exception { for (int begin = 1; begin < HOURS_IN_DAY; begin++) { for (int end = 0; end < begin; end++) { TimeVisibilityCriterion criterion = new TimeVisibilityCriterion(begin, end); for (int hour = end; hour != begin; hour = (hour + 1) % HOURS_IN_DAY) { Date date = new Date(1, 1, 1, hour, 0, 0); Mockito.when(world.getWorldDate()).thenReturn(date); Assert.assertFalse(criterion.isMetBy(observer)); } } } } @Test(expected = IllegalArgumentException.class) public void testConstructorDoesNotAllowEqualStartAndEnd() throws Exception { new TimeVisibilityCriterion(0, 0); } @Test(expected = IllegalArgumentException.class) public void testConstructorDoesNotAllowHoursEqualToTheMaximumHour() throws Exception { new TimeVisibilityCriterion(0, 24); } @Test(expected = IllegalArgumentException.class) public void testConstructorDoesNotAllowHoursBiggerThanTheMaximumHour() throws Exception { new TimeVisibilityCriterion(0, 100); } }