package org.iilab.pb.trigger;
import android.app.Application;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.Intent;
import org.codehaus.plexus.util.ReflectionUtils;
import org.iilab.pb.alert.PanicAlert;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.shadows.ShadowKeyguardManager;
import java.util.HashMap;
import java.util.Map;
import static android.content.Intent.ACTION_CAMERA_BUTTON;
import static android.content.Intent.ACTION_SCREEN_OFF;
import static android.content.Intent.ACTION_SCREEN_ON;
import static org.mockito.Mockito.anyLong;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.robolectric.Robolectric.shadowOf;
@RunWith(RobolectricTestRunner.class)
public class HardwareTriggerReceiverTest {
private Application context;
private HardwareTriggerReceiver spyHardwareTriggerReceiver;
@Mock
private MultiClickEvent mockMultiClickEvent;
@Mock
private PanicAlert mockPanicAlert;
private ShadowKeyguardManager shadowKeyguardManager;
private Map<String, String> eventLog = new HashMap<String, String>();
@Before
public void setUp() throws IllegalAccessException {
initMocks(this);
context = Robolectric.application;
spyHardwareTriggerReceiver = spy(new HardwareTriggerReceiver());
when(spyHardwareTriggerReceiver.getPanicAlert(context)).thenReturn(mockPanicAlert);
ReflectionUtils.setVariableValueInObject(spyHardwareTriggerReceiver, "multiClickEvent", mockMultiClickEvent);
shadowKeyguardManager = shadowOf((KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE));
shadowKeyguardManager.setinRestrictedInputMode(true);
}
@Test
public void shouldActivateAlertWhenTheMultiClickEventIsActivatedAndResetTheEvent() throws IllegalAccessException {
when(mockMultiClickEvent.isActivated()).thenReturn(true);
spyHardwareTriggerReceiver.onReceive(context, new Intent(ACTION_SCREEN_OFF));
verify(mockMultiClickEvent).registerClick(anyLong());
// verify(mockPanicAlert).activate();
MultiClickEvent actualEvent = (MultiClickEvent) ReflectionUtils.getValueIncludingSuperclasses("multiClickEvent", spyHardwareTriggerReceiver);
Assert.assertNotSame(mockMultiClickEvent, actualEvent);
}
@Test
public void shouldNotActivateAlertWhenTheMultiClickEventIsNotActivated() {
when(mockMultiClickEvent.isActivated()).thenReturn(false);
spyHardwareTriggerReceiver.onReceive(context, new Intent(ACTION_SCREEN_ON));
verify(mockMultiClickEvent).registerClick(anyLong());
verify(mockPanicAlert, never()).activate();
}
@Test
public void shouldNotProcessAnyThingForIntentsOtherThanScreenOnAndOff() {
spyHardwareTriggerReceiver.onReceive(context, new Intent(ACTION_CAMERA_BUTTON));
verifyNoMoreInteractions(mockMultiClickEvent);
verify(mockPanicAlert, never()).activate();
}
// @Test
// public void shouldNotProcessAnyThingIfScreenIsUnlocked() {
// shadowKeyguardManager.setinRestrictedInputMode(false);
// spyHardwareTriggerReceiver.onReceive(context, new Intent(ACTION_SCREEN_ON));
//
// verifyNoMoreInteractions(mockMultiClickEvent);
// verify(mockPanicAlert, never()).activate();
// }
}