package com.uxxu.konashi.lib;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.AndroidTestCase;
import com.uxxu.konashi.lib.action.AioAnalogReadAction;
import com.uxxu.konashi.lib.action.BatteryLevelReadAction;
import com.uxxu.konashi.lib.action.HardwareResetAction;
import com.uxxu.konashi.lib.action.I2cModeAction;
import com.uxxu.konashi.lib.action.I2cSendConditionAction;
import com.uxxu.konashi.lib.action.I2cSetReadParamAction;
import com.uxxu.konashi.lib.action.I2cWriteAction;
import com.uxxu.konashi.lib.action.PioDigitalWriteAction;
import com.uxxu.konashi.lib.action.PioPinModeAction;
import com.uxxu.konashi.lib.action.PioPinPullupAction;
import com.uxxu.konashi.lib.action.PwmDutyAction;
import com.uxxu.konashi.lib.action.PwmLedDriveAction;
import com.uxxu.konashi.lib.action.PwmPeriodAction;
import com.uxxu.konashi.lib.action.PwmPinModeAction;
import com.uxxu.konashi.lib.action.UartBaudrateAction;
import com.uxxu.konashi.lib.action.UartModeAction;
import com.uxxu.konashi.lib.action.UartWriteAction;
import org.jdeferred.Deferred;
import org.jdeferred.Promise;
import org.jdeferred.impl.DeferredObject;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.internal.util.reflection.Whitebox;
import java.util.UUID;
import info.izumin.android.bletia.Bletia;
import info.izumin.android.bletia.BletiaException;
import info.izumin.android.bletia.action.Action;
import info.izumin.android.bletia.action.ReadRemoteRssiAction;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
/**
* Created by izumin on 7/31/15.
*/
@RunWith(AndroidJUnit4.class)
public class KonashiManagerTest extends AndroidTestCase {
public static final String TAG = KonashiManagerTest.class.getSimpleName();
@Mock private BluetoothGattService mService;
@Mock private BluetoothGattCharacteristic mCharacteristic;
@Mock private Bletia mBletia;
private KonashiManager mKonashiManager;
private Deferred<BluetoothGattCharacteristic, BletiaException, Void> mDeferred;
private Promise<BluetoothGattCharacteristic, BletiaException, Void> mPromise;
@Captor private ArgumentCaptor<Action<BluetoothGattCharacteristic, UUID>> mActionCaptor;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mKonashiManager = spy(new KonashiManager(InstrumentationRegistry.getTargetContext()));
mDeferred = new DeferredObject<>();
mPromise = mDeferred.promise();
when(mBletia.getService(any(UUID.class))).thenReturn(mService);
when(mService.getCharacteristic(any(UUID.class))).thenReturn(mCharacteristic);
when(mCharacteristic.getUuid()).thenReturn(UUID.randomUUID());
when(mBletia.execute(mActionCaptor.capture())).thenReturn(mPromise);
Whitebox.setInternalState(mKonashiManager, "mBletia", mBletia);
}
@Test
public void testPinMode() throws Exception {
mKonashiManager.pinMode(0, 0);
assertThat(mActionCaptor.getValue()).isInstanceOf(PioPinModeAction.class);
}
@Test
public void testPinModeAll() throws Exception {
mKonashiManager.pinModeAll(0);
assertThat(mActionCaptor.getValue()).isInstanceOf(PioPinModeAction.class);
}
@Test
public void testPinPullup() throws Exception {
mKonashiManager.pinPullup(0, 0);
assertThat(mActionCaptor.getValue()).isInstanceOf(PioPinPullupAction.class);
}
@Test
public void testPinPullupAll() throws Exception {
mKonashiManager.pinPullupAll(0);
assertThat(mActionCaptor.getValue()).isInstanceOf(PioPinPullupAction.class);
}
@Test
public void testDigitalWrite() throws Exception {
mKonashiManager.digitalWrite(0, 0);
assertThat(mActionCaptor.getValue()).isInstanceOf(PioDigitalWriteAction.class);
}
@Test
public void testDigitalWriteAll() throws Exception {
mKonashiManager.digitalWriteAll(0);
assertThat(mActionCaptor.getValue()).isInstanceOf(PioDigitalWriteAction.class);
}
@Test
public void testPwmMode_ForPwmEnable() throws Exception {
mKonashiManager.pwmMode(0, Konashi.PWM_ENABLE);
assertThat(mActionCaptor.getValue()).isInstanceOf(PwmPinModeAction.class);
}
@Test
public void testPwmMode_ForPwmLedEnable() throws Exception {
// TODO: ちゃんとテストしたいけど良いやり方が思い付かない
mKonashiManager.pwmMode(0, Konashi.PWM_ENABLE_LED_MODE);
assertThat(mActionCaptor.getValue()).isInstanceOf(PwmPinModeAction.class);
}
@Test
public void testPwmPeriod() throws Exception {
mKonashiManager.pwmPeriod(0, 0);
assertThat(mActionCaptor.getValue()).isInstanceOf(PwmPeriodAction.class);
}
@Test
public void testPwmDuty() throws Exception {
mKonashiManager.pwmDuty(0, 0);
assertThat(mActionCaptor.getValue()).isInstanceOf(PwmDutyAction.class);
}
@Test
public void testPwmLedDrive_Float() throws Exception {
mKonashiManager.pwmLedDrive(0, 0f);
assertThat(mActionCaptor.getValue()).isInstanceOf(PwmLedDriveAction.class);
}
@Test
public void testPwmLedDrive_Double() throws Exception {
mKonashiManager.pwmLedDrive(0, 0d);
assertThat(mActionCaptor.getValue()).isInstanceOf(PwmLedDriveAction.class);
}
@Test
public void testAnalogRead() throws Exception {
mKonashiManager.analogRead(0);
assertThat(mActionCaptor.getValue()).isInstanceOf(AioAnalogReadAction.class);
}
@Test
public void testUartMode() throws Exception {
mKonashiManager.uartMode(0);
assertThat(mActionCaptor.getValue()).isInstanceOf(UartModeAction.class);
}
@Test
public void testUartBaudrate() throws Exception {
mKonashiManager.uartBaudrate(0);
assertThat(mActionCaptor.getValue()).isInstanceOf(UartBaudrateAction.class);
}
@Test
public void testUartWrite_Bytes() throws Exception {
mKonashiManager.uartWrite(new byte[]{0});
assertThat(mActionCaptor.getValue()).isInstanceOf(UartWriteAction.class);
}
@Test
public void testUartWrite_String() throws Exception {
mKonashiManager.uartWrite("test");
assertThat(mActionCaptor.getValue()).isInstanceOf(UartWriteAction.class);
}
@Test
public void testI2cMode() throws Exception {
mKonashiManager.i2cMode(0);
assertThat(mActionCaptor.getValue()).isInstanceOf(I2cModeAction.class);
}
@Test
public void testI2cStartCondition() throws Exception {
// TODO: conditionの検証もしたい(VisibleForTesting annotationがほしい)
mKonashiManager.i2cStartCondition();
assertThat(mActionCaptor.getValue()).isInstanceOf(I2cSendConditionAction.class);
}
@Test
public void testI2cRestartCondition() throws Exception {
// TODO: conditionの検証もしたい(VisibleForTesting annotationがほしい)
mKonashiManager.i2cRestartCondition();
assertThat(mActionCaptor.getValue()).isInstanceOf(I2cSendConditionAction.class);
}
@Test
public void testI2cStopCondition() throws Exception {
// TODO: conditionの検証もしたい(VisibleForTesting annotationがほしい)
mKonashiManager.i2cStopCondition();
assertThat(mActionCaptor.getValue()).isInstanceOf(I2cSendConditionAction.class);
}
@Test
public void testI2cWrite() throws Exception {
mKonashiManager.i2cWrite(0, new byte[]{0}, (byte) 0);
assertThat(mActionCaptor.getValue()).isInstanceOf(I2cWriteAction.class);
}
@Test
public void testI2cRead() throws Exception {
// TODO: ReadActionが呼ばれてるかどうかの検証もやりたいが,思いつかない
mKonashiManager.i2cRead(0, (byte) 0);
assertThat(mActionCaptor.getValue()).isInstanceOf(I2cSetReadParamAction.class);
}
@Test
public void testReset() throws Exception {
mKonashiManager.reset();
assertThat(mActionCaptor.getValue()).isInstanceOf(HardwareResetAction.class);
}
@Test
public void testGetBatteryLevel() throws Exception {
mKonashiManager.getBatteryLevel();
assertThat(mActionCaptor.getValue()).isInstanceOf(BatteryLevelReadAction.class);
}
@Test
public void testGetSignalStrength() throws Exception {
mKonashiManager.getSignalStrength();
assertThat(mActionCaptor.getValue()).isInstanceOf(ReadRemoteRssiAction.class);
}
}