package org.iilab.pb; import android.content.Intent; import android.widget.Button; import android.widget.TextView; import org.iilab.pb.alert.PanicAlert; import org.iilab.pb.common.AppConstants; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Mockito; import org.robolectric.RobolectricTestRunner; import org.robolectric.shadows.ShadowActivity; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.MockitoAnnotations.initMocks; import static org.robolectric.Robolectric.shadowOf; @RunWith(RobolectricTestRunner.class) public class CalculatorActivityTest { private CalculatorActivity calculatorActivity; private Button equalsButton, zeroButton; private ShadowActivity shadowActivity; @Mock private PanicAlert mockPanicAlert; @Before public void setUp() { initMocks(this); calculatorActivity = new CalculatorActivity() { @Override PanicAlert getPanicAlert() { return mockPanicAlert; } }; calculatorActivity.onCreate(null); equalsButton = (Button) calculatorActivity.findViewById(R.id.equals_sign); zeroButton = (Button) calculatorActivity.findViewById(R.id.zero); shadowActivity = shadowOf(calculatorActivity); } @Test public void shouldNavigateToLoginScreenOnButtonLongPress() { equalsButton.performLongClick(); Intent startedIntent = shadowActivity.getNextStartedActivity(); // assertThat(startedIntent.getComponent().getClassName(), equalTo(LoginActivity.class.getName())); } @Test public void shouldVibrateOnPressingButtonRepeatedlyFourTimes() { for (int i = 0; i < 4; i++) { equalsButton.performClick(); } verify(mockPanicAlert).vibrate(); } @Test public void shouldActivateAlertOnPressingButtonFifthTime() { for (int i = 0; i < 4; i++) { equalsButton.performClick(); } try { Thread.sleep(AppConstants.HAPTIC_FEEDBACK_DURATION + 1000); } catch (InterruptedException e) { e.printStackTrace(); } equalsButton.performClick(); verify(mockPanicAlert).vibrate(); verify(mockPanicAlert).activate(); } @Test public void shouldVibrateOnPressingButtonRepeatedlyFourTimesAfterOtherButtons() { zeroButton.performClick(); for (int i = 0; i < 4; i++) { equalsButton.performClick(); } verify(mockPanicAlert).vibrate(); } @Test public void shouldNotVibrateOnPressingButtonRepeatedlyLessThanFiveTimes() { for (int i = 0; i < 3; i++) { equalsButton.performClick(); } verifyNoMoreInteractions(mockPanicAlert); } @Test public void shouldNotVibrateOnPressingButtonRepeatedlyLessThanFiveTimesAfterOtherButtons() { zeroButton.performClick(); for (int i = 0; i < 3; i++) { equalsButton.performClick(); } verifyNoMoreInteractions(mockPanicAlert); } @Test public void shouldNotVibrateOnPressingButtonRepeatedlyMixedWithOtherButtons() { for (int i = 0; i < 4; i++) { equalsButton.performClick(); zeroButton.performClick(); } verifyNoMoreInteractions(mockPanicAlert); } @Test public void testPressingCalculatorButtonsAffectsDisplay() { // 123 + 456 - 78 * 90 = 45090 int[] ids = { R.id.one, R.id.two, R.id.three, R.id.plus, R.id.four, R.id.five, R.id.six, R.id.minus, R.id.seven, R.id.eight, R.id.multiply, R.id.nine, R.id.zero, R.id.equals_sign }; for(int id : ids) { Button button = (Button) calculatorActivity.findViewById(id); button.performClick(); } TextView display = (TextView) calculatorActivity.findViewById(R.id.display); assertEquals("45090", display.getText()); } /* @Test public void shouldStartHardwareTriggerServiceOnApplicationCreation() { Intent startedIntent = shadowActivity.getNextStartedService(); ShadowIntent shadowIntent = shadowOf(startedIntent); assertNotNull(startedIntent); assertEquals(HardwareTriggerService.class, shadowIntent.getIntentClass()); } */ @Test public void shouldCreateNewPanicAlert() { assertNotNull(new CalculatorActivity().getPanicAlert()); } }