/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package project.latex.balloon.consumer; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; /** * * @author dgorst */ public class TransistorSwitchControllerTest { private static final double ARMING_HEIGHT = 500; private static final double SWITCHING_HEIGHT = 100; private static final String HEIGHT_KEY = "altitude"; private TransistorSwitchController controller; private TransistorSwitch mockSwitch; @Before public void setUp() { mockSwitch = mock(TransistorSwitch.class); controller = new TransistorSwitchController(mockSwitch, ARMING_HEIGHT, SWITCHING_HEIGHT, HEIGHT_KEY); } @Test public void testControllerArmedAfterConsecutiveReadingsOverThreshold() { for (int i = 0; i < TransistorSwitchController.NUMBER_OF_READINGS_FOR_CONFIDENCE; ++i) { assertFalse(controller.isArmed()); controller.processHeight(ARMING_HEIGHT + 5); } assertTrue(controller.isArmed()); } @Test public void testControllerNotArmedAfterNonConsecutiveReadingsOverThreshold() { for (int i = 0; i < TransistorSwitchController.NUMBER_OF_READINGS_FOR_CONFIDENCE - 1; ++i) { assertFalse(controller.isArmed()); controller.processHeight(ARMING_HEIGHT + 5); } // Break up the readings with one below the threshold controller.processHeight(ARMING_HEIGHT - 5); assertFalse(controller.isArmed()); controller.processHeight(ARMING_HEIGHT + 5); assertFalse(controller.isArmed()); } private void armController() { for (int i = 0; i < TransistorSwitchController.NUMBER_OF_READINGS_FOR_CONFIDENCE; ++i) { controller.processHeight(ARMING_HEIGHT + 5); } assertTrue(controller.isArmed()); } @Test public void testControllerSwitchesAfterConsecutiveReadingsUnderThresholdWhenArmed() { armController(); for (int i = 0; i < TransistorSwitchController.NUMBER_OF_READINGS_FOR_CONFIDENCE; ++i) { controller.processHeight(SWITCHING_HEIGHT - 5); } verify(mockSwitch).close(); } @Test public void testControllerDoesntSwitchWithoutConsecutiveReadingsWhenArmed() { armController(); for (int i = 0; i < TransistorSwitchController.NUMBER_OF_READINGS_FOR_CONFIDENCE - 1; ++i) { controller.processHeight(SWITCHING_HEIGHT - 5); } controller.processHeight(SWITCHING_HEIGHT + 5); controller.processHeight(SWITCHING_HEIGHT - 5); verify(mockSwitch, never()).close(); } @Test public void testControllerConsumesValidDataModelCorrectly() { Map<String, Object> validDataModel = new HashMap<>(); validDataModel.put(HEIGHT_KEY, ARMING_HEIGHT - 5); controller.consumeDataModel(validDataModel); assertFalse(controller.isArmed()); // Now set the height in the model to be over the arming height validDataModel.put(HEIGHT_KEY, ARMING_HEIGHT + 5); for (int i = 0; i < TransistorSwitchController.NUMBER_OF_READINGS_FOR_CONFIDENCE; ++i) { controller.consumeDataModel(validDataModel); } assertTrue(controller.isArmed()); } @Test public void testControllerConsumesDataModelWithoutReadingsWithoutThrowingException() { Map<String, Object> dataModel = new HashMap<>(); dataModel.put("OtherKey", "Other data"); controller.consumeDataModel(dataModel); } @Test public void testControllerConsumesNullDataModelWithoutThrowingException() { controller.consumeDataModel(null); } @Test public void testControllerConsumesDataModelWithReadingOfWrongTypeWithoutThrowingException() { Map<String, Object> dataModel = new HashMap<>(); dataModel.put(HEIGHT_KEY, "Invalid data"); controller.consumeDataModel(dataModel); } }