iobplugin tests

This commit is contained in:
Milos Kozak 2018-08-17 19:00:35 +02:00
parent d198de94c0
commit 4133bc9ad1
2 changed files with 153 additions and 45 deletions

View file

@ -110,35 +110,7 @@ public class IobCobCalculatorPlugin extends PluginBase {
return bucketed_data; return bucketed_data;
} }
@Nullable // roundup to whole minute
public List<BgReading> getBucketedData(long fromTime) {
//log.debug("Locking getBucketedData");
synchronized (dataLock) {
if (bucketed_data == null) {
if (L.isEnabled(L.AUTOSENS))
log.debug("No bucketed data available");
return null;
}
int index = indexNewerThan(fromTime);
if (index > -1) {
List<BgReading> part = bucketed_data.subList(0, index);
if (L.isEnabled(L.AUTOSENS))
log.debug("Bucketed data striped off: " + part.size() + "/" + bucketed_data.size());
return part;
}
}
//log.debug("Releasing getBucketedData");
return null;
}
private int indexNewerThan(long time) {
for (int index = 0; index < bucketed_data.size(); index++) {
if (bucketed_data.get(index).date < time)
return index - 1;
}
return -1;
}
public static long roundUpTime(long time) { public static long roundUpTime(long time) {
if (time % 60000 == 0) if (time % 60000 == 0)
return time; return time;
@ -187,24 +159,26 @@ public class IobCobCalculatorPlugin extends PluginBase {
} }
@Nullable @Nullable
private BgReading findNewer(long time) { public BgReading findNewer(long time) {
BgReading lastFound = bgReadings.get(0); BgReading lastFound = bgReadings.get(0);
if (lastFound.date < time) return null; if (lastFound.date < time) return null;
for (int i = 1; i < bgReadings.size(); ++i) { for (int i = 1; i < bgReadings.size(); ++i) {
if (bgReadings.get(i).date == time) return bgReadings.get(i);
if (bgReadings.get(i).date > time) continue; if (bgReadings.get(i).date > time) continue;
lastFound = bgReadings.get(i); lastFound = bgReadings.get(i-1);
if (bgReadings.get(i).date < time) break; if (bgReadings.get(i).date < time) break;
} }
return lastFound; return lastFound;
} }
@Nullable @Nullable
private BgReading findOlder(long time) { public BgReading findOlder(long time) {
BgReading lastFound = bgReadings.get(bgReadings.size() - 1); BgReading lastFound = bgReadings.get(bgReadings.size() - 1);
if (lastFound.date > time) return null; if (lastFound.date > time) return null;
for (int i = bgReadings.size() - 2; i >= 0; --i) { for (int i = bgReadings.size() - 2; i >= 0; --i) {
if (bgReadings.get(i).date == time) return bgReadings.get(i);
if (bgReadings.get(i).date < time) continue; if (bgReadings.get(i).date < time) continue;
lastFound = bgReadings.get(i); lastFound = bgReadings.get(i + 1);
if (bgReadings.get(i).date > time) break; if (bgReadings.get(i).date > time) break;
} }
return lastFound; return lastFound;
@ -217,7 +191,7 @@ public class IobCobCalculatorPlugin extends PluginBase {
} }
bucketed_data = new ArrayList<>(); bucketed_data = new ArrayList<>();
long currentTime = bgReadings.get(0).date + 5 * 60 * 1000 - bgReadings.get(0).date % (5 * 60 * 1000) - 5 * 60 * 1000L; long currentTime = bgReadings.get(0).date - bgReadings.get(0).date % T.mins(5).msecs();
//log.debug("First reading: " + new Date(currentTime).toLocaleString()); //log.debug("First reading: " + new Date(currentTime).toLocaleString());
while (true) { while (true) {
@ -227,16 +201,20 @@ public class IobCobCalculatorPlugin extends PluginBase {
if (newer == null || older == null) if (newer == null || older == null)
break; break;
double bgDelta = newer.value - older.value; if (older.date == newer.date) { // direct hit
long timeDiffToNew = newer.date - currentTime; bucketed_data.add(newer);
} else {
double bgDelta = newer.value - older.value;
long timeDiffToNew = newer.date - currentTime;
double currentBg = newer.value - (double) timeDiffToNew / (newer.date - older.date) * bgDelta; double currentBg = newer.value - (double) timeDiffToNew / (newer.date - older.date) * bgDelta;
BgReading newBgreading = new BgReading(); BgReading newBgreading = new BgReading();
newBgreading.date = currentTime; newBgreading.date = currentTime;
newBgreading.value = Math.round(currentBg); newBgreading.value = Math.round(currentBg);
bucketed_data.add(newBgreading); bucketed_data.add(newBgreading);
//log.debug("BG: " + newBgreading.value + " (" + new Date(newBgreading.date).toLocaleString() + ") Prev: " + older.value + " (" + new Date(older.date).toLocaleString() + ") Newer: " + newer.value + " (" + new Date(newer.date).toLocaleString() + ")"); //log.debug("BG: " + newBgreading.value + " (" + new Date(newBgreading.date).toLocaleString() + ") Prev: " + older.value + " (" + new Date(older.date).toLocaleString() + ") Newer: " + newer.value + " (" + new Date(newer.date).toLocaleString() + ")");
currentTime -= 5 * 60 * 1000L; }
currentTime -= T.mins(5).msecs();
} }
} }

View file

@ -15,14 +15,14 @@ import java.util.List;
import info.AAPSMocker; import info.AAPSMocker;
import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.utils.SP; import info.nightscout.utils.SP;
import info.nightscout.utils.T; import info.nightscout.utils.T;
@RunWith(PowerMockRunner.class) @RunWith(PowerMockRunner.class)
@PrepareForTest({MainApp.class, ConfigBuilderPlugin.class, SP.class, Context.class}) @PrepareForTest({MainApp.class, ConfigBuilderPlugin.class, SP.class, Context.class, L.class})
public class IobCobCalculatorPluginTest { public class IobCobCalculatorPluginTest {
IobCobCalculatorPlugin iobCobCalculatorPlugin = IobCobCalculatorPlugin.getPlugin(); IobCobCalculatorPlugin iobCobCalculatorPlugin = IobCobCalculatorPlugin.getPlugin();
@ -105,10 +105,140 @@ public class IobCobCalculatorPluginTest {
Assert.assertEquals(bgReadingList.get(3).date, iobCobCalculatorPlugin.getBucketedData().get(3).date); Assert.assertEquals(bgReadingList.get(3).date, iobCobCalculatorPlugin.getBucketedData().get(3).date);
Assert.assertEquals(bgReadingList.size(), iobCobCalculatorPlugin.getBucketedData().size()); Assert.assertEquals(bgReadingList.size(), iobCobCalculatorPlugin.getBucketedData().size());
// Missing value should be replaced
bgReadingList.clear();
bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(10).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
iobCobCalculatorPlugin.createBucketedData();
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
Assert.assertEquals(bgReadingList.get(0).date, iobCobCalculatorPlugin.getBucketedData().get(0).date);
Assert.assertEquals(bgReadingList.get(2).date, iobCobCalculatorPlugin.getBucketedData().get(3).date);
Assert.assertEquals(bgReadingList.size() + 1, iobCobCalculatorPlugin.getBucketedData().size());
// drift should be cleared
bgReadingList.clear();
bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(15).msecs() + T.secs(10).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(10).msecs() + T.secs(10).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(5).msecs() - T.secs(10).msecs()).value(100));
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
iobCobCalculatorPlugin.createBucketedData();
Assert.assertEquals(false, iobCobCalculatorPlugin.isAbout5minData()); // too much drift
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.getBucketedData().get(0).date);
Assert.assertEquals(T.mins(15).msecs(), iobCobCalculatorPlugin.getBucketedData().get(1).date);
Assert.assertEquals(T.mins(10).msecs(), iobCobCalculatorPlugin.getBucketedData().get(2).date);
Assert.assertEquals(T.mins(5).msecs(), iobCobCalculatorPlugin.getBucketedData().get(3).date);
Assert.assertEquals(bgReadingList.size(), iobCobCalculatorPlugin.getBucketedData().size());
// bucketed data should return null if not enough bg data
bgReadingList.clear();
bgReadingList.add(new BgReading().date(T.mins(30).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
iobCobCalculatorPlugin.createBucketedData();
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
Assert.assertEquals(null, iobCobCalculatorPlugin.getBucketedData());
// data should be reconstructed
bgReadingList.clear();
bgReadingList.add(new BgReading().date(T.mins(50).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(45).msecs()).value(90));
bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(40));
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
iobCobCalculatorPlugin.createBucketedData();
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
Assert.assertEquals(T.mins(50).msecs(), iobCobCalculatorPlugin.getBucketedData().get(0).date);
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.getBucketedData().get(6).date);
Assert.assertEquals(7, iobCobCalculatorPlugin.getBucketedData().size());
Assert.assertEquals(100, iobCobCalculatorPlugin.getBucketedData().get(0).value, 1);
Assert.assertEquals(90, iobCobCalculatorPlugin.getBucketedData().get(1).value, 1);
Assert.assertEquals(50, iobCobCalculatorPlugin.getBucketedData().get(5).value, 1);
Assert.assertEquals(40, iobCobCalculatorPlugin.getBucketedData().get(6).value, 1);
// non 5min data should be reconstructed
bgReadingList.clear();
bgReadingList.add(new BgReading().date(T.mins(50).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(48).msecs()).value(96));
bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(40));
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
iobCobCalculatorPlugin.createBucketedData();
Assert.assertEquals(false, iobCobCalculatorPlugin.isAbout5minData());
Assert.assertEquals(T.mins(50).msecs(), iobCobCalculatorPlugin.getBucketedData().get(0).date);
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.getBucketedData().get(6).date);
Assert.assertEquals(7, iobCobCalculatorPlugin.getBucketedData().size());
Assert.assertEquals(100, iobCobCalculatorPlugin.getBucketedData().get(0).value, 1);
Assert.assertEquals(90, iobCobCalculatorPlugin.getBucketedData().get(1).value, 1);
Assert.assertEquals(50, iobCobCalculatorPlugin.getBucketedData().get(5).value, 1);
Assert.assertEquals(40, iobCobCalculatorPlugin.getBucketedData().get(6).value, 1);
}
@Test
public void getBgReadingsTest() {
List<BgReading> bgReadingList = new ArrayList<>();
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
Assert.assertEquals(bgReadingList, iobCobCalculatorPlugin.getBgReadings());
}
@Test
public void roundUpTimeTest() {
Assert.assertEquals(T.mins(3).msecs(), iobCobCalculatorPlugin.roundUpTime(T.secs(155).msecs()));
}
@Test
public void findNewerTest() {
List<BgReading> bgReadingList = new ArrayList<>();
bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(15).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(10).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
Assert.assertEquals(T.mins(10).msecs(), iobCobCalculatorPlugin.findNewer(T.mins(8).msecs()).date);
Assert.assertEquals(T.mins(5).msecs(), iobCobCalculatorPlugin.findNewer(T.mins(5).msecs()).date);
Assert.assertEquals(T.mins(10).msecs(), iobCobCalculatorPlugin.findNewer(T.mins(10).msecs()).date);
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.findNewer(T.mins(20).msecs()).date);
Assert.assertEquals(null, iobCobCalculatorPlugin.findNewer(T.mins(22).msecs()));
}
@Test
public void findOlderTest() {
List<BgReading> bgReadingList = new ArrayList<>();
bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(15).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(10).msecs()).value(100));
bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
Assert.assertEquals(T.mins(5).msecs(), iobCobCalculatorPlugin.findOlder(T.mins(8).msecs()).date);
Assert.assertEquals(T.mins(5).msecs(), iobCobCalculatorPlugin.findOlder(T.mins(5).msecs()).date);
Assert.assertEquals(T.mins(10).msecs(), iobCobCalculatorPlugin.findOlder(T.mins(10).msecs()).date);
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.findOlder(T.mins(20).msecs()).date);
Assert.assertEquals(null, iobCobCalculatorPlugin.findOlder(T.mins(4).msecs()));
} }
@Before @Before
public void doMock() { public void doMock() {
AAPSMocker.mockMainApp(); AAPSMocker.mockMainApp();
AAPSMocker.mockL();
} }
} }