/*
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of
* the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright (c) 2014 Digi International Inc., All Rights Reserved.
*/
package com.digi.android.wva.test;
import android.os.Build;
import android.test.ActivityInstrumentationTestCase2;
import com.digi.android.wva.ChartActivity;
import com.digi.android.wva.WvaApplication;
import com.digi.android.wva.fragments.ChartFragment;
import com.digi.android.wva.model.VehicleData;
import com.digi.wva.WVA;
import com.digi.wva.async.WvaCallback;
import org.joda.time.DateTime;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
/**
* This might be more accurately described as ChartFragmentTest. However, since
* there is no built-in Android fragment unit testing, using a
* ChartActivityTest class to wrap testing for the ChartFragment will have
* to suffice.
*
* <p>
* I suppose it would be possible to make an AndroidTestCase
* which creates a ChartFragment and an Activity, attaches the fragment to that
* activity, and does its testing from there...</p>
* Created by mwadsten on 5/28/13.
*/
public class ChartActivityTest extends ActivityInstrumentationTestCase2<ChartActivity> {
public static final String ENGINE_SPEED = "EngineSpeed";
public static final String VEHICLE_SPEED = "VehicleSpeed";
public ChartActivityTest() {
this(ChartActivity.class);
}
public ChartActivityTest(Class<ChartActivity> activityClass) {
super(activityClass);
}
private ChartFragment getChartFragment() {
if (getActivity() == null)
return null;
return getActivity().getChartFragment();
}
@SuppressWarnings("unchecked")
@Override
protected void setUp() throws Exception {
super.setUp();
setActivityInitialTouchMode(false);
getChartFragment().setIsTesting(true);
getChartFragment().clearDataset();
WVA dev = mock(WVA.class);
doNothing().when(dev).subscribeToVehicleData(anyString(), anyInt(), any(WvaCallback.class));
((WvaApplication)getActivity().getApplication()).setDevice(dev);
}
@Override
protected void tearDown() throws Exception {
// super doesn't destroy (i.e. finish) activity at end of any tests
// (and by extension, doesn't end the activity at the end of all
// these tests)
getActivity().finish();
super.tearDown();
}
public void testPreconditions() {
assertNotNull("Activity is null", getActivity());
assertNotNull("Chart fragment is null", getChartFragment());
// isDestroyed() was introduced in API 17
if (Build.VERSION.SDK_INT >= 17)
assertFalse("Activity destroyed!", getActivity().isDestroyed());
}
public void testGraphBuilt() {
ChartFragment frag = getChartFragment();
assertNotNull("Speed series is null", frag.getSpeedSeries());
assertNotNull("RPM series is null", frag.getRpmSeries());
assertEquals("Speed series has data", 0, frag.getSpeedSeries().getItemCount());
assertEquals("RPM series has data", 0, frag.getRpmSeries().getItemCount());
assertNull("Last speed is not null", frag.getLastSpeed());
assertNull("Last RPM is not null", frag.getLastRPM());
}
public void testHandleNewData() {
VehicleData newSpeed = new VehicleData(VEHICLE_SPEED, 100, null);
VehicleData newRpm = new VehicleData(ENGINE_SPEED, 200, null);
ChartFragment frag = getChartFragment();
assertEquals("Speed series has data", 0, frag.getSpeedSeries().getItemCount());
assertEquals("RPM series has data", 0, frag.getRpmSeries().getItemCount());
frag.handleNewData(newRpm);
assertEquals("RPM series doesn't have new data", 1, frag.getRpmSeries().getItemCount());
assertEquals("Speed series got new data it shouldn't have", 0, frag.getSpeedSeries().getItemCount());
frag.handleNewData(newSpeed);
assertEquals("Speed series doesn't have new data", 1, frag.getSpeedSeries().getItemCount());
assertEquals("RPM series got new data it shouldn't have", 1, frag.getRpmSeries().getItemCount());
assertSame("Wrong last speed", frag.getLastSpeed(), newSpeed);
assertSame("Wrong last RPM", frag.getLastRPM(), newRpm);
}
public void testStressTest() {
ChartFragment frag = getChartFragment();
assertEquals("Speed series has data", 0, frag.getSpeedSeries().getItemCount());
assertEquals("RPM series has data", 0, frag.getRpmSeries().getItemCount());
int count = 2500; // 2.5 seconds worth, on the screen
long time = (long) frag.getStartTime();
for (int i = 0; i < count; i++) {
frag.handleNewData(new VehicleData(ENGINE_SPEED, i+count, new DateTime(time + i)));
frag.handleNewData(new VehicleData(VEHICLE_SPEED, i, new DateTime(time + i)));
}
assertEquals("Speed series has wrong count", count, frag.getSpeedSeries().getItemCount());
assertEquals("RPM series has wrong count", count, frag.getRpmSeries().getItemCount());
assertEquals("Wrong last rpm", 2*count - 1, frag.getLastRPM().value, 0.1);
assertEquals("Wrong last speed", count - 1, frag.getLastSpeed().value, 0.1);
}
public void testClearDataset() {
ChartFragment frag = getChartFragment();
frag.handleNewData(new VehicleData(ENGINE_SPEED, 0, null));
frag.handleNewData(new VehicleData(VEHICLE_SPEED, 0, null));
assertEquals("RPM series wrong count", 1, frag.getRpmSeries().getItemCount());
assertEquals("Speed series wrong count", 1, frag.getSpeedSeries().getItemCount());
frag.clearDataset();
assertEquals("RPM series not cleared", 0, frag.getRpmSeries().getItemCount());
assertEquals("Speed series not cleared", 0, frag.getSpeedSeries().getItemCount());
}
public void testTimespanCorrect() {
ChartFragment frag = getChartFragment();
double start = frag.getStartTime();
double end = frag.getEndTime();
double interval = 15 * 60 * 1000;
assertEquals("End time is off", end, start + interval, 0.01);
}
// public void testTimeShift() {
//
// }
}