package com.novoda.magicmirror.facerecognition;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.internal.verification.VerificationModeFactory.times;
@RunWith(MockitoJUnitRunner.class)
public class KeyboardFaceSourceTest {
private static final int CODE_SAD = 1;
private static final int CODE_HAPPY = 2;
private KeyboardFaceSource source;
@Mock
private FaceTracker.FaceListener mockListener;
@Mock
private KeyToFaceMappings mockMappings;
@Before
public void setUp() throws Exception {
source = new KeyboardFaceSource(mockListener, mockMappings);
when(mockMappings.getFaceFromKeyCode(CODE_SAD)).thenReturn(FaceExpression.SAD);
when(mockMappings.getFaceFromKeyCode(CODE_HAPPY)).thenReturn(FaceExpression.HAPPY);
when(mockMappings.contains(CODE_HAPPY)).thenReturn(true);
when(mockMappings.contains(CODE_SAD)).thenReturn(true);
}
@Test
public void whenKeySadIsPressed_thenSadExpressionIsTriggered() {
source.onKeyDown(CODE_SAD);
verify(mockListener).onNewFace(FaceExpression.SAD);
}
@Test
public void whenKeySadIsPressedAndHold_thenSadExpressionIsTriggeredOnlyOnce() {
pressAndHold(CODE_SAD);
verify(mockListener, times(1)).onNewFace(FaceExpression.SAD);
}
private void pressAndHold(int code) {
source.onKeyDown(code);
source.onKeyDown(code);
}
@Test
public void whenSadKeySadIsPressedAndReleased_thenLookingExpressionIsTriggered() {
source.onKeyDown(CODE_SAD);
source.onKeyUp(CODE_SAD);
verify(mockListener).onNewFace(FaceExpression.LOOKING);
}
@Test
public void whenUnsupportedKeyIsPressed_thenNoCallbacksAreTriggered() {
source.onKeyDown(1337);
verify(mockListener, times(0)).onNewFace(any(FaceExpression.class));
}
@Test
public void whenAnUnsupportedKeyIsPressedAfterASupportedKey_thenLookingExpressionIsTriggeredOnlyOnce() {
onPressAndReleaseKey(CODE_HAPPY);
onPressAndReleaseKey(2000);
verify(mockListener, times(1)).onNewFace(FaceExpression.LOOKING);
}
@Test
public void givenAnTwoUnsupportedKeyIsPressedAfterAUnSupportedKey_thenLookingExpressionIsTriggeredOnlyOnce() {
onPressAndReleaseKey(CODE_HAPPY);
onPressAndReleaseKey(2001);
onPressAndReleaseKey(2002);
verify(mockListener, times(1)).onNewFace(FaceExpression.LOOKING);
}
private void onPressAndReleaseKey(int code) {
source.onKeyDown(code);
source.onKeyUp(code);
}
}