package me.moodcat.backend.rooms; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import me.moodcat.backend.BackendTest; import me.moodcat.backend.UnitOfWorkSchedulingService; import me.moodcat.database.controllers.SongDAO; import me.moodcat.database.entities.Song; import me.moodcat.util.JukitoRunnerSupportingMockAnnotations; import me.moodcat.util.MockedUnitOfWorkSchedulingService; import org.jukito.UseModules; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.Spy; import com.google.inject.AbstractModule; import com.google.inject.Inject; @RunWith(JukitoRunnerSupportingMockAnnotations.class) @UseModules(SongInstanceTest.SongInstanceTestModule.class) public class SongInstanceTest extends BackendTest { private static SongDAO songDAO = Mockito.mock(SongDAO.class); public static class SongInstanceTestModule extends AbstractModule { @Override protected void configure() { install(new RoomBackendModule()); bind(SongDAO.class).toInstance(songDAO); bind(UnitOfWorkSchedulingService.class).to(MockedUnitOfWorkSchedulingService.class); } } private static final int DURATION = 1; @Spy private Song song = createSong(); @Mock private SongInstance.StopObserver observer; @Inject private SongInstanceFactory songInstanceFactory; private SongInstance instance; @Inject private MockedUnitOfWorkSchedulingService unitOfWorkSchedulingService; @Before public void setUp() { when(song.getDuration()).thenReturn(DURATION); instance = songInstanceFactory.create(song); instance.addObserver(observer); verifyZeroInteractions(observer); } @Test public void canIncrementTime() throws InterruptedException { // Wait a little bit to trigger the changed. Thread.sleep(DURATION * 10); // Trigger changed instance.incrementTime(); // And verify it is changed now instance.incrementTime(); verify(observer).stopped(); assertTrue(instance.getTime() > DURATION); } @Test public void canStop() { instance.stop(); assertTrue(instance.isStopped()); } @Test public void canOnlyStopOnce() { instance.stop(); instance.stop(); verify(observer).stopped(); } @After public void tearDown() { unitOfWorkSchedulingService.shutdownNow(); } }