package com.evancharlton.mileage.math;
import java.util.ArrayList;
import android.content.ContentValues;
import android.database.MatrixCursor;
import com.evancharlton.mileage.dao.FillupSeries;
import com.evancharlton.mileage.dao.Vehicle;
import com.evancharlton.mileage.provider.tables.FillupsTable;
import com.evancharlton.mileage.tests.TestCase;
public class CalculatorTest extends TestCase {
private void convert(double from, int fromUnits, double to, int toUnits) {
assertCloseEnough(to, Calculator.convert(from, fromUnits, toUnits));
}
// distance tests
public void testConvertMilesToKilometers() {
convert(1.0D, Calculator.MI, 1.609D, Calculator.KM);
}
public void testConvertKilometersToMiles() {
convert(1.0D, Calculator.KM, 0.621D, Calculator.MI);
}
// volume tests
public void testConvertGallonsToLitres() {
convert(1.0D, Calculator.GALLONS, 3.785, Calculator.LITRES);
}
public void testConvertGallonsToImperialGallons() {
convert(1.0D, Calculator.GALLONS, 0.832D, Calculator.IMPERIAL_GALLONS);
}
public void testConvertLitresToGallons() {
convert(1.0D, Calculator.LITRES, 0.264D, Calculator.GALLONS);
}
public void testConvertLitresToImperialGallons() {
convert(1.0D, Calculator.LITRES, 0.219D, Calculator.IMPERIAL_GALLONS);
}
public void testConvertImperialGallonsToGallons() {
convert(1.0D, Calculator.IMPERIAL_GALLONS, 1.201D, Calculator.GALLONS);
}
public void testConvertImperialGallonsToLitres() {
convert(1.0D, Calculator.IMPERIAL_GALLONS, 4.546D, Calculator.LITRES);
}
// fuel economy tests
public void testConvertMpgToMpl() {
convert(1, Calculator.MI_PER_GALLON, 0.264, Calculator.MI_PER_LITRE);
}
public void testConvertMpgToKpl() {
convert(1, Calculator.MI_PER_GALLON, 0.425, Calculator.KM_PER_LITRE);
}
public void testConvertMpgToMpIg() {
convert(1, Calculator.MI_PER_GALLON, 1.201, Calculator.MI_PER_IMP_GALLON);
}
public void testConvertMpgToKpIg() {
convert(1, Calculator.MI_PER_GALLON, 1.932, Calculator.KM_PER_IMP_GALLON);
}
public void testConvertMpgToKpg() {
convert(1, Calculator.MI_PER_GALLON, 1.609, Calculator.KM_PER_GALLON);
}
public void testConvertMpgToGpck() {
convert(1, Calculator.MI_PER_GALLON, 62.137, Calculator.GALLONS_PER_100KM);
}
public void testConvertMpgToLpck() {
convert(1, Calculator.MI_PER_GALLON, 235.214, Calculator.LITRES_PER_100KM);
}
public void testConvertMpgToIgpck() {
convert(1, Calculator.MI_PER_GALLON, 51.739, Calculator.IMP_GAL_PER_100KM);
}
// TODO: test from -> to all unit combinations. Due to the current
// underlying algorithm, this is sufficient to ensure correctness.
public void testConvertKpgToMpg() {
convert(1, Calculator.KM_PER_GALLON, 0.621, Calculator.MI_PER_GALLON);
}
public void testConvertMpigToMpg() {
convert(1, Calculator.MI_PER_IMP_GALLON, 0.833, Calculator.MI_PER_GALLON);
}
public void testConvertKpigToMpg() {
convert(1, Calculator.KM_PER_IMP_GALLON, 0.517, Calculator.MI_PER_GALLON);
}
public void testConvertMplToMpg() {
convert(1, Calculator.MI_PER_LITRE, 3.785, Calculator.MI_PER_GALLON);
}
public void testConvertKplToMpg() {
convert(1, Calculator.KM_PER_LITRE, 2.352, Calculator.MI_PER_GALLON);
}
public void testConvertGpckToMpg() {
convert(1, Calculator.GALLONS_PER_100KM, 62.137, Calculator.MI_PER_GALLON);
}
public void testConvertLpckToMpg() {
convert(1, Calculator.LITRES_PER_100KM, 235.214, Calculator.MI_PER_GALLON);
}
public void testConvertIgpckToMpg() {
convert(1, Calculator.IMP_GAL_PER_100KM, 51.739, Calculator.MI_PER_GALLON);
}
// test the calculation of the fuel economy
private static final String[] PROJECTION = FillupsTable.PROJECTION;
private static int ID = 1;
private static Object[] createFillup(int vehicleId, double odometer, double volume, double price, boolean partial, boolean restart) {
Object[] values = new Object[PROJECTION.length];
int i = 0;
values[i++] = ID++;
values[i++] = volume * price;
values[i++] = price;
values[i++] = volume;
values[i++] = odometer;
values[i++] = 0; // economy
values[i++] = vehicleId;
values[i++] = System.currentTimeMillis();
values[i++] = 0; // latitude
values[i++] = 0; // longitude
values[i++] = partial ? 1 : 0;
values[i++] = restart ? 1 : 0;
return values;
}
@Override
public void setUp() {
ID = 1;
}
public void testAverageEconomyMPG() {
MatrixCursor cursor = new MatrixCursor(FillupsTable.PROJECTION);
int odometer = 0;
odometer += 100;
cursor.addRow(createFillup(1, odometer, 10, 10, false, false));
odometer += 100;
cursor.addRow(createFillup(1, odometer, 10, 10, false, false));
ArrayList<FillupSeries> series = FillupSeries.load(cursor);
FillupSeries underTest = series.get(0);
ContentValues values = new ContentValues();
values.put(Vehicle.PREF_DISTANCE_UNITS, Calculator.MI);
values.put(Vehicle.PREF_VOLUME_UNITS, Calculator.GALLONS);
values.put(Vehicle.PREF_ECONOMY_UNITS, Calculator.MI_PER_GALLON);
Vehicle vehicle = new Vehicle(values);
assertEquals(10D, Calculator.averageEconomy(vehicle, underTest));
}
public void testAverageEconomyLPCK() {
MatrixCursor cursor = new MatrixCursor(FillupsTable.PROJECTION);
int odometer = 0;
odometer += 100;
cursor.addRow(createFillup(1, odometer, 10, 10, false, false));
odometer += 100;
cursor.addRow(createFillup(1, odometer, 10, 10, false, false));
ArrayList<FillupSeries> series = FillupSeries.load(cursor);
FillupSeries underTest = series.get(0);
ContentValues values = new ContentValues();
values.put(Vehicle.PREF_DISTANCE_UNITS, Calculator.KM);
values.put(Vehicle.PREF_VOLUME_UNITS, Calculator.LITRES);
values.put(Vehicle.PREF_ECONOMY_UNITS, Calculator.LITRES_PER_100KM);
Vehicle vehicle = new Vehicle(values);
assertEquals(10D, Calculator.averageEconomy(vehicle, underTest));
}
}