package pl.llp.aircasting.model; import pl.llp.aircasting.InjectedTestRunner; import pl.llp.aircasting.New; import pl.llp.aircasting.activity.ApplicationState; import pl.llp.aircasting.activity.events.SessionChangeEvent; import pl.llp.aircasting.event.ui.ViewStreamEvent; import pl.llp.aircasting.model.events.SensorEvent; import pl.llp.aircasting.sensor.builtin.SimpleAudioReader; import com.google.common.eventbus.EventBus; import com.google.inject.Inject; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import java.util.ArrayList; import java.util.List; import static com.google.common.collect.Lists.newArrayList; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; import static org.junit.matchers.JUnitMatchers.hasItem; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @RunWith(InjectedTestRunner.class) public class SensorManagerTest { @Inject SensorManager sensorManager; @Mock SessionManager sessionManager; private Sensor SOME_SENSOR; private SensorEvent sensorEvent; private SessionChangeEvent SESSION_CHANGED; @Before public void setup() { SESSION_CHANGED = new SessionChangeEvent(new Session()); sensorManager.eventBus = mock(EventBus.class); sensorManager.sessionManager = sessionManager; sessionManager.state = new ApplicationState(); sensorEvent = New.sensorEvent(); SOME_SENSOR = new Sensor(sensorEvent); sensorManager.onEvent(sensorEvent); } @Test public void shouldStoreSensorInformation() { assertThat(sensorManager.getSensors(), hasItem(SOME_SENSOR)); } @Test public void shouldNotOverwriteSensors() { sensorManager.onEvent(sensorEvent); SOME_SENSOR = sensorManager.getSensorByName("LHC"); assertThat(SOME_SENSOR.getMeasurementType(), equalTo("Hadrons")); } @Test public void shouldReturnSensorsByName() { assertThat(sensorManager.getSensorByName(SOME_SENSOR.getSensorName()), equalTo(SOME_SENSOR)); } @Test public void shouldStoreInformationAboutCurrentVisibleSensor() { sensorManager.onEvent(new ViewStreamEvent(SOME_SENSOR)); assertThat(sensorManager.getVisibleSensor(), equalTo(SOME_SENSOR)); } @Test public void should_clear_sensor_info_on_session_change() { when(sessionManager.getMeasurementStreams()).thenReturn(new ArrayList<MeasurementStream>()); sensorManager.onEvent(SESSION_CHANGED); org.fest.assertions.Assertions.assertThat(sensorManager.getSensors()).isEmpty(); } @Test public void should_read_sensor_info_from_new_session() { MeasurementStream stream1 = New.stream(); MeasurementStream stream2 = spy(New.stream()); when(stream2.getSensorName()).thenReturn("Some random name"); SESSION_CHANGED.getSession().add(stream1); SESSION_CHANGED.getSession().add(stream2); sensorManager.onEvent(SESSION_CHANGED); Sensor expected1 = new Sensor(stream1); Sensor expected2 = new Sensor(stream2); List<Sensor> sensors = sensorManager.getSensors(); org.fest.assertions.Assertions.assertThat(sensors).contains(expected1, expected2); } @Test public void should_not_update_sensors_when_viewing_a_session() { sessionManager.state = sensorManager.state; sessionManager.state.recording().startShowingOldSession(); when(sessionManager.getMeasurementStreams()).thenReturn(new ArrayList<MeasurementStream>()); sensorManager.onEvent(SESSION_CHANGED); sensorManager.onEvent(sensorEvent); org.fest.assertions.Assertions.assertThat(sensorManager.getSensors()).isEmpty(); } @Test public void should_use_one_of_the_sensors_as_visible_when_viewing_a_session() { sessionManager.state.recording().startShowingOldSession(); MeasurementStream stream = New.stream(); when(sessionManager.getMeasurementStreams()).thenReturn(newArrayList(stream)); sensorManager.onEvent(SESSION_CHANGED); org.fest.assertions.Assertions.assertThat(sensorManager.getVisibleSensor()).isEqualTo(SimpleAudioReader.getSensor()); } @Test public void should_not_lose_sensor_enabled_state() { sensorManager.onEvent(sensorEvent); sensorManager.onEvent(SESSION_CHANGED); sensorManager.onEvent(sensorEvent); Sensor sensor1 = sensorManager.getSensorByName(SOME_SENSOR.getSensorName()); org.fest.assertions.Assertions.assertThat(sensor1.isEnabled()).isTrue(); } @Test public void should_not_lose_sensor_disabled_state() { sensorManager.onEvent(sensorEvent); sensorManager.toggleSensor(SOME_SENSOR); sensorManager.onEvent(SESSION_CHANGED); sensorManager.onEvent(sensorEvent); Sensor sensor1 = sensorManager.getSensorByName(SOME_SENSOR.getSensorName()); org.fest.assertions.Assertions.assertThat(sensor1.isEnabled()).isFalse(); } }