/** AirCasting - Share your Air! Copyright (C) 2011-2012 HabitatMap, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. You can contact the authors by email at <info@habitatmap.org> */ package pl.llp.aircasting.sensor.builtin; import pl.llp.aircasting.InjectedTestRunner; import pl.llp.aircasting.event.sensor.AudioReaderErrorEvent; import pl.llp.aircasting.helper.CalibrationHelper; import pl.llp.aircasting.helper.SettingsHelper; import pl.llp.aircasting.model.events.SensorEvent; import pl.llp.aircasting.model.internal.MeasurementLevel; import com.google.common.eventbus.EventBus; import com.google.inject.Inject; import org.hamcrest.core.IsEqual; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(InjectedTestRunner.class) public class SimpleAudioReaderTest { public static final int SAMPLE_RATE = 44100; @Inject SimpleAudioReader audioReader; @Before public void setup() { audioReader.audioReader = mock(AudioReader.class); audioReader.settingsHelper = mock(SettingsHelper.class); audioReader.signalPower = mock(SignalPower.class); audioReader.eventBus = mock(EventBus.class); audioReader.calibrationHelper = mock(CalibrationHelper.class); } private SensorEvent expected(double value) { return new SensorEvent(SimpleAudioReader.SENSOR_PACKAGE_NAME, SimpleAudioReader.SENSOR_NAME, SimpleAudioReader.MEASUREMENT_TYPE, SimpleAudioReader.SHORT_TYPE, SimpleAudioReader.UNIT, SimpleAudioReader.SYMBOL, SimpleAudioReader.VERY_LOW, SimpleAudioReader.LOW, SimpleAudioReader.MID, SimpleAudioReader.HIGH, SimpleAudioReader.VERY_HIGH, value); } @Test public void shouldStartReader() { audioReader.start(); verify(audioReader.audioReader).startReader(SAMPLE_RATE, SAMPLE_RATE / 2, audioReader); } @Test public void shouldStopReader() { audioReader.stop(); verify(audioReader.audioReader).stopReader(); } @Test public void shouldPassErrorsToListener() { audioReader.start(); audioReader.onReadError(102); verify(audioReader.eventBus).post(any(AudioReaderErrorEvent.class)); } @Test public void shouldProcessSamples() { when(audioReader.signalPower.calculatePowerDb(Mockito.any(short[].class))) .thenReturn(12.3) .thenReturn(12.4); when(audioReader.calibrationHelper.calibrate(12.3)).thenReturn(13.3); when(audioReader.calibrationHelper.calibrate(12.4)).thenReturn(13.4); audioReader.start(); audioReader.onReadComplete(new short[0]); audioReader.onReadComplete(new short[0]); SensorEvent expected1 = expected(13.3); SensorEvent expected2 = expected(13.4); verify(audioReader.eventBus).post(expected1); verify(audioReader.eventBus).post(expected2); } @Test public void shouldIgnoreBatchesOfFaultyData() { when(audioReader.signalPower.calculatePowerDb(Mockito.any(short[].class))) .thenReturn(null) .thenReturn(2.2); when(audioReader.calibrationHelper.calibrate(2.2)).thenReturn(2.2); audioReader.start(); audioReader.onReadComplete(new short[0]); audioReader.onReadComplete(new short[0]); SensorEvent expected = expected(2.2); verify(audioReader.eventBus).post(expected); } @Test public void shouldRecognizeIndistinctSounds() { assertThat(SimpleAudioReader.getSensor().level(-35), IsEqual.equalTo(MeasurementLevel.TOO_LOW)); } @Test public void shouldRecognizeQuietSounds() { assertThat(SimpleAudioReader.getSensor().level(51), IsEqual.equalTo(MeasurementLevel.VERY_LOW)); } @Test public void shouldRecognizeAverageSounds() { assertThat(SimpleAudioReader.getSensor().level(65), IsEqual.equalTo(MeasurementLevel.LOW)); } @Test public void shouldRecognizeLoudSounds() { assertThat(SimpleAudioReader.getSensor().level(75), IsEqual.equalTo(MeasurementLevel.MID)); } @Test public void shouldRecognizeVeryLoudSounds() { assertThat(SimpleAudioReader.getSensor().level(87), IsEqual.equalTo(MeasurementLevel.HIGH)); } @Test public void shouldRecognizeTooLoudSounds() { assertThat(SimpleAudioReader.getSensor().level(101), IsEqual.equalTo(MeasurementLevel.VERY_HIGH)); } }