diff --git a/android-app-core/src/main/java/org/solovyev/android/calculator/CalculatorReceiver.java b/android-app-core/src/main/java/org/solovyev/android/calculator/CalculatorReceiver.java index 22702083..17c019c8 100644 --- a/android-app-core/src/main/java/org/solovyev/android/calculator/CalculatorReceiver.java +++ b/android-app-core/src/main/java/org/solovyev/android/calculator/CalculatorReceiver.java @@ -15,8 +15,8 @@ public final class CalculatorReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); - if (CalculatorReceiver.ACTION_BUTTON_PRESSED.equals(action)) { - final int buttonId = intent.getIntExtra(CalculatorReceiver.ACTION_BUTTON_ID_EXTRA, 0); + if (ACTION_BUTTON_PRESSED.equals(action)) { + final int buttonId = intent.getIntExtra(ACTION_BUTTON_ID_EXTRA, 0); final CalculatorButton button = CalculatorButton.getById(buttonId); if (button != null) { @@ -27,9 +27,9 @@ public final class CalculatorReceiver extends BroadcastReceiver { @Nonnull public static Intent newButtonClickedIntent(@Nonnull Context context, @Nonnull CalculatorButton button) { - final Intent onButtonClickIntent = new Intent(context, CalculatorReceiver.class); - onButtonClickIntent.setAction(ACTION_BUTTON_PRESSED); - onButtonClickIntent.putExtra(ACTION_BUTTON_ID_EXTRA, button.getButtonId()); - return onButtonClickIntent; + final Intent intent = new Intent(context, CalculatorReceiver.class); + intent.setAction(ACTION_BUTTON_PRESSED); + intent.putExtra(ACTION_BUTTON_ID_EXTRA, button.getButtonId()); + return intent; } } diff --git a/android-app-core/src/main/test/org/solovyev/android/calculator/CalculatorBroadcasterTest.java b/android-app-core/src/main/test/org/solovyev/android/calculator/CalculatorBroadcasterTest.java new file mode 100644 index 00000000..e5b8920f --- /dev/null +++ b/android-app-core/src/main/test/org/solovyev/android/calculator/CalculatorBroadcasterTest.java @@ -0,0 +1,71 @@ +package org.solovyev.android.calculator; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; + +import javax.annotation.Nonnull; + +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import static org.mockito.Matchers.argThat; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.robolectric.Robolectric.application; +import static org.solovyev.android.calculator.CalculatorBroadcaster.ACTION_DISPLAY_STATE_CHANGED; +import static org.solovyev.android.calculator.CalculatorBroadcaster.ACTION_EDITOR_STATE_CHANGED; +import static org.solovyev.android.calculator.CalculatorEventType.display_state_changed; +import static org.solovyev.android.calculator.CalculatorEventType.editor_state_changed; +import static org.solovyev.android.calculator.CalculatorEventType.editor_state_changed_light; + +@Config(manifest = Config.NONE) +@RunWith(RobolectricTestRunner.class) +public class CalculatorBroadcasterTest { + + @Nonnull + private CalculatorBroadcaster broadcaster; + + @Before + public void setUp() throws Exception { + broadcaster = new CalculatorBroadcaster(application); + } + + @Test + public void testShouldSendEditorStateChangedIntent() throws Exception { + assertIntentSent(editor_state_changed, ACTION_EDITOR_STATE_CHANGED); + } + + @Test + public void testShouldSendEditorStateChangedLiteIntent() throws Exception { + assertIntentSent(editor_state_changed_light, ACTION_EDITOR_STATE_CHANGED); + } + + @Test + public void testShouldSendDisplayStateChangedIntent() throws Exception { + assertIntentSent(display_state_changed, ACTION_DISPLAY_STATE_CHANGED); + } + + private void assertIntentSent(@Nonnull CalculatorEventType eventType, final String expectedAction) { + final BroadcastReceiver receiver = Mockito.mock(BroadcastReceiver.class); + application.registerReceiver(receiver, new IntentFilter(expectedAction)); + broadcaster.onCalculatorEvent(CalculatorEventDataImpl.newInstance(1L, 1L), eventType, null); + verify(receiver, times(1)).onReceive(Mockito.any(), argThat(new BaseMatcher() { + @Override + public boolean matches(Object o) { + return ((Intent) o).getAction().equals(expectedAction); + } + + @Override + public void describeTo(Description description) { + } + })); + } +} diff --git a/android-app-core/src/main/test/org/solovyev/android/calculator/CalculatorReceiverTest.java b/android-app-core/src/main/test/org/solovyev/android/calculator/CalculatorReceiverTest.java new file mode 100644 index 00000000..e3a8f642 --- /dev/null +++ b/android-app-core/src/main/test/org/solovyev/android/calculator/CalculatorReceiverTest.java @@ -0,0 +1,47 @@ +package org.solovyev.android.calculator; + +import android.content.Intent; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.robolectric.Robolectric; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.robolectric.Robolectric.application; +import static org.solovyev.android.calculator.CalculatorButton.four; +import static org.solovyev.android.calculator.CalculatorReceiver.ACTION_BUTTON_ID_EXTRA; +import static org.solovyev.android.calculator.CalculatorReceiver.ACTION_BUTTON_PRESSED; +import static org.solovyev.android.calculator.CalculatorReceiver.newButtonClickedIntent; + +@Config(manifest = Config.NONE) +@RunWith(RobolectricTestRunner.class) +public class CalculatorReceiverTest { + + @Test + public void testShouldPressButtonOnIntent() throws Exception { + Locator.setKeyboard(mock(CalculatorKeyboard.class)); + + final Intent intent = newButtonClickedIntent(application, four); + new CalculatorReceiver().onReceive(application, intent); + + verify(Locator.getInstance().getKeyboard(), times(1)).buttonPressed(Mockito.anyString()); + verify(Locator.getInstance().getKeyboard(), times(1)).buttonPressed("4"); + } + + @Test + public void testShouldDoNothingIfButtonInvalid() throws Exception { + Locator.setKeyboard(mock(CalculatorKeyboard.class)); + + final Intent intent = new Intent(application, CalculatorReceiver.class); + intent.setAction(ACTION_BUTTON_PRESSED); + intent.putExtra(ACTION_BUTTON_ID_EXTRA, "test!@"); + new CalculatorReceiver().onReceive(application, intent); + + verify(Locator.getInstance().getKeyboard(), times(0)).buttonPressed(Mockito.anyString()); + } +} diff --git a/core/src/main/java/org/solovyev/android/calculator/Locator.java b/core/src/main/java/org/solovyev/android/calculator/Locator.java index e525d265..f656e619 100644 --- a/core/src/main/java/org/solovyev/android/calculator/Locator.java +++ b/core/src/main/java/org/solovyev/android/calculator/Locator.java @@ -65,7 +65,7 @@ public class Locator implements CalculatorLocator { private CalculatorClipboard calculatorClipboard = new DummyCalculatorClipboard(); @Nonnull - private static final CalculatorLocator instance = new Locator(); + private static final Locator instance = new Locator(); @Nonnull private CalculatorPreferenceService calculatorPreferenceService; @@ -172,4 +172,8 @@ public class Locator implements CalculatorLocator { public CalculatorPreferenceService getPreferenceService() { return this.calculatorPreferenceService; } + + public static void setKeyboard(@Nonnull CalculatorKeyboard keyboard) { + instance.calculatorKeyboard = keyboard; + } }