diff --git a/app/src/main/java/info/nightscout/androidaps/utils/wizard/BolusWizard.kt b/app/src/main/java/info/nightscout/androidaps/utils/wizard/BolusWizard.kt index 9dfdea4acc..c586da6af7 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/wizard/BolusWizard.kt +++ b/app/src/main/java/info/nightscout/androidaps/utils/wizard/BolusWizard.kt @@ -36,10 +36,9 @@ import javax.inject.Inject import kotlin.math.abs class BolusWizard @Inject constructor( - injector: HasAndroidInjector + val injector: HasAndroidInjector ) { - @Inject lateinit var injector: HasAndroidInjector @Inject lateinit var aapsLogger: AAPSLogger @Inject lateinit var resourceHelper: ResourceHelper @Inject lateinit var rxBus: RxBusWrapper diff --git a/app/src/test/java/info/nightscout/androidaps/data/IobTest.java b/app/src/test/java/info/nightscout/androidaps/data/IobTest.java deleted file mode 100644 index 778bdbf59c..0000000000 --- a/app/src/test/java/info/nightscout/androidaps/data/IobTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package info.nightscout.androidaps.data; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.modules.junit4.PowerMockRunner; - -/** - * Created by mike on 27.03.2018. - */ - -@RunWith(PowerMockRunner.class) -public class IobTest { - - @Test - public void plusTest() { - Iob a = new Iob().iobContrib(1).activityContrib(2); - Iob b = new Iob().iobContrib(3).activityContrib(4); - a.plus(b); - Assert.assertEquals(4d, a.iobContrib, 0.01d); - Assert.assertEquals(6d, a.activityContrib, 0.01d); - } - - @Test - public void equalTest() { - Iob a1 = new Iob().iobContrib(1).activityContrib(2); - Iob a2 = new Iob().iobContrib(1).activityContrib(2); - Iob b = new Iob().iobContrib(3).activityContrib(4); - - Assert.assertEquals(true, a1.equals(a1)); - Assert.assertEquals(true, a1.equals(a2)); - Assert.assertEquals(false, a1.equals(b)); - Assert.assertEquals(false, a1.equals(null)); - Assert.assertEquals(false, a1.equals(new Object())); - } - @Test - public void hashCodeTest() { - Iob a = new Iob().iobContrib(1).activityContrib(2); - Assert.assertNotEquals(0, a.hashCode()); - } -} diff --git a/app/src/test/java/info/nightscout/androidaps/data/IobTest.kt b/app/src/test/java/info/nightscout/androidaps/data/IobTest.kt new file mode 100644 index 0000000000..ed5837ea0a --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/data/IobTest.kt @@ -0,0 +1,34 @@ +package info.nightscout.androidaps.data + +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith +import org.powermock.modules.junit4.PowerMockRunner + +@RunWith(PowerMockRunner::class) +class IobTest { + + @Test fun plusTest() { + val a = Iob().iobContrib(1.0).activityContrib(2.0) + val b = Iob().iobContrib(3.0).activityContrib(4.0) + a.plus(b) + Assert.assertEquals(4.0, a.iobContrib, 0.01) + Assert.assertEquals(6.0, a.activityContrib, 0.01) + } + + @Test fun equalTest() { + val a1 = Iob().iobContrib(1.0).activityContrib(2.0) + val a2 = Iob().iobContrib(1.0).activityContrib(2.0) + val b = Iob().iobContrib(3.0).activityContrib(4.0) + Assert.assertTrue(a1 == a1) + Assert.assertTrue(a1 == a2) + Assert.assertFalse(a1 == b) + Assert.assertFalse(a1 == null) + Assert.assertFalse(a1 == Any()) + } + + @Test fun hashCodeTest() { + val a = Iob().iobContrib(1.0).activityContrib(2.0) + Assert.assertNotEquals(0, a.hashCode().toLong()) + } +} \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/androidaps/data/IobTotalTest.java b/app/src/test/java/info/nightscout/androidaps/data/IobTotalTest.java deleted file mode 100644 index b54b112516..0000000000 --- a/app/src/test/java/info/nightscout/androidaps/data/IobTotalTest.java +++ /dev/null @@ -1,143 +0,0 @@ -package info.nightscout.androidaps.data; - -import org.json.JSONObject; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.modules.junit4.PowerMockRunner; - -import info.nightscout.androidaps.utils.DateUtil; - -/** - * Created by mike on 27.03.2018. - */ - -@RunWith(PowerMockRunner.class) -public class IobTotalTest { - - long now = DateUtil.now(); - - @Test - public void copytest() { - IobTotal a = new IobTotal(now); - a.iob = 10; - IobTotal b = a.copy(); - Assert.assertEquals(a.iob, b.iob, 0.01d); - } - - @Test - public void plusTest() { - IobTotal a = new IobTotal(now); - a.iob = 10; - a.activity = 10; - a.bolussnooze = 10; - a.basaliob = 10; - a.netbasalinsulin = 10; - a.hightempinsulin = 10; - a.netInsulin = 10; - a.extendedBolusInsulin = 10; - a.plus(a.copy()); - Assert.assertEquals(20, a.iob, 0.01d); - Assert.assertEquals(20, a.activity, 0.01d); - Assert.assertEquals(20, a.bolussnooze, 0.01d); - Assert.assertEquals(20, a.basaliob, 0.01d); - Assert.assertEquals(20, a.netbasalinsulin, 0.01d); - Assert.assertEquals(20, a.hightempinsulin, 0.01d); - Assert.assertEquals(20, a.netInsulin, 0.01d); - Assert.assertEquals(20, a.extendedBolusInsulin, 0.01d); - } - - @Test - public void combineTest() { - IobTotal a = new IobTotal(now); - a.iob = 10; - a.activity = 11; - a.bolussnooze = 12; - a.basaliob = 13; - a.netbasalinsulin = 14; - a.hightempinsulin = 15; - a.netInsulin = 16; - a.extendedBolusInsulin = 17; - IobTotal b = a.copy(); - IobTotal c = IobTotal.combine(a, b); - Assert.assertEquals(a.time, c.time, 0.01d); - Assert.assertEquals(23, c.iob, 0.01d); - Assert.assertEquals(22, c.activity, 0.01d); - Assert.assertEquals(12, c.bolussnooze, 0.01d); - Assert.assertEquals(26, c.basaliob, 0.01d); - Assert.assertEquals(28, c.netbasalinsulin, 0.01d); - Assert.assertEquals(30, c.hightempinsulin, 0.01d); - Assert.assertEquals(32, c.netInsulin, 0.01d); - Assert.assertEquals(34, c.extendedBolusInsulin, 0.01d); - } - - @Test - public void roundTest() { - IobTotal a = new IobTotal(now); - a.iob = 1.1111111111111; - a.activity = 1.1111111111111; - a.bolussnooze = 1.1111111111111; - a.basaliob = 1.1111111111111; - a.netbasalinsulin = 1.1111111111111; - a.hightempinsulin = 1.1111111111111; - a.netInsulin = 1.1111111111111; - a.extendedBolusInsulin = 1.1111111111111; - a.round(); - Assert.assertEquals(1.111d, a.iob, 0.00001d); - Assert.assertEquals(1.1111d, a.activity, 0.00001d); - Assert.assertEquals(1.1111d, a.bolussnooze, 0.00001d); - Assert.assertEquals(1.111d, a.basaliob, 0.00001d); - Assert.assertEquals(1.111d, a.netbasalinsulin, 0.00001d); - Assert.assertEquals(1.111d, a.hightempinsulin, 0.00001d); - Assert.assertEquals(1.111d, a.netInsulin, 0.00001d); - Assert.assertEquals(1.111d, a.extendedBolusInsulin, 0.00001d); - } - - @Test - public void jsonTest() { - IobTotal a = new IobTotal(now); - a.iob = 10; - a.activity = 11; - a.bolussnooze = 12; - a.basaliob = 13; - a.netbasalinsulin = 14; - a.hightempinsulin = 15; - a.netInsulin = 16; - a.extendedBolusInsulin = 17; - try { - JSONObject j = a.json(); - Assert.assertEquals(a.iob, j.getDouble("iob"), 0.0000001d); - Assert.assertEquals(a.basaliob, j.getDouble("basaliob"), 0.0000001d); - Assert.assertEquals(a.activity, j.getDouble("activity"), 0.0000001d); - Assert.assertEquals(now, DateUtil.fromISODateString(j.getString("time")).getTime(), 1000); - } catch (Exception e) { - Assert.fail("Exception: " + e.getMessage()); - } - } - - @Test - public void determineBasalJsonTest() { - IobTotal a = new IobTotal(now); - a.iob = 10; - a.activity = 11; - a.bolussnooze = 12; - a.basaliob = 13; - a.netbasalinsulin = 14; - a.hightempinsulin = 15; - a.netInsulin = 16; - a.extendedBolusInsulin = 17; - a.iobWithZeroTemp = new IobTotal(now); - try { - JSONObject j = a.determineBasalJson(); - Assert.assertEquals(a.iob, j.getDouble("iob"), 0.0000001d); - Assert.assertEquals(a.basaliob, j.getDouble("basaliob"), 0.0000001d); - Assert.assertEquals(a.bolussnooze, j.getDouble("bolussnooze"), 0.0000001d); - Assert.assertEquals(a.activity, j.getDouble("activity"), 0.0000001d); - Assert.assertEquals(0, j.getLong("lastBolusTime")); - Assert.assertEquals(now, DateUtil.fromISODateString(j.getString("time")).getTime(), 1000); - Assert.assertNotNull(j.getJSONObject("iobWithZeroTemp")); - } catch (Exception e) { - Assert.fail("Exception: " + e.getMessage()); - } - } -} diff --git a/app/src/test/java/info/nightscout/androidaps/data/IobTotalTest.kt b/app/src/test/java/info/nightscout/androidaps/data/IobTotalTest.kt new file mode 100644 index 0000000000..42b7d96361 --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/data/IobTotalTest.kt @@ -0,0 +1,130 @@ +package info.nightscout.androidaps.data + +import info.nightscout.androidaps.utils.DateUtil +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith +import org.powermock.modules.junit4.PowerMockRunner + +@RunWith(PowerMockRunner::class) +class IobTotalTest { + + var now = DateUtil.now() + @Test fun copytest() { + val a = IobTotal(now) + a.iob = 10.0 + val b = a.copy() + Assert.assertEquals(a.iob, b.iob, 0.01) + } + + @Test fun plusTest() { + val a = IobTotal(now) + a.iob = 10.0 + a.activity = 10.0 + a.bolussnooze = 10.0 + a.basaliob = 10.0 + a.netbasalinsulin = 10.0 + a.hightempinsulin = 10.0 + a.netInsulin = 10.0 + a.extendedBolusInsulin = 10.0 + a.plus(a.copy()) + Assert.assertEquals(20.0, a.iob, 0.01) + Assert.assertEquals(20.0, a.activity, 0.01) + Assert.assertEquals(20.0, a.bolussnooze, 0.01) + Assert.assertEquals(20.0, a.basaliob, 0.01) + Assert.assertEquals(20.0, a.netbasalinsulin, 0.01) + Assert.assertEquals(20.0, a.hightempinsulin, 0.01) + Assert.assertEquals(20.0, a.netInsulin, 0.01) + Assert.assertEquals(20.0, a.extendedBolusInsulin, 0.01) + } + + @Test fun combineTest() { + val a = IobTotal(now) + a.iob = 10.0 + a.activity = 11.0 + a.bolussnooze = 12.0 + a.basaliob = 13.0 + a.netbasalinsulin = 14.0 + a.hightempinsulin = 15.0 + a.netInsulin = 16.0 + a.extendedBolusInsulin = 17.0 + val b = a.copy() + val c = IobTotal.combine(a, b) + Assert.assertEquals(a.time.toDouble(), c.time.toDouble(), 0.01) + Assert.assertEquals(23.0, c.iob, 0.01) + Assert.assertEquals(22.0, c.activity, 0.01) + Assert.assertEquals(12.0, c.bolussnooze, 0.01) + Assert.assertEquals(26.0, c.basaliob, 0.01) + Assert.assertEquals(28.0, c.netbasalinsulin, 0.01) + Assert.assertEquals(30.0, c.hightempinsulin, 0.01) + Assert.assertEquals(32.0, c.netInsulin, 0.01) + Assert.assertEquals(34.0, c.extendedBolusInsulin, 0.01) + } + + @Test fun roundTest() { + val a = IobTotal(now) + a.iob = 1.1111111111111 + a.activity = 1.1111111111111 + a.bolussnooze = 1.1111111111111 + a.basaliob = 1.1111111111111 + a.netbasalinsulin = 1.1111111111111 + a.hightempinsulin = 1.1111111111111 + a.netInsulin = 1.1111111111111 + a.extendedBolusInsulin = 1.1111111111111 + a.round() + Assert.assertEquals(1.111, a.iob, 0.00001) + Assert.assertEquals(1.1111, a.activity, 0.00001) + Assert.assertEquals(1.1111, a.bolussnooze, 0.00001) + Assert.assertEquals(1.111, a.basaliob, 0.00001) + Assert.assertEquals(1.111, a.netbasalinsulin, 0.00001) + Assert.assertEquals(1.111, a.hightempinsulin, 0.00001) + Assert.assertEquals(1.111, a.netInsulin, 0.00001) + Assert.assertEquals(1.111, a.extendedBolusInsulin, 0.00001) + } + + @Test fun jsonTest() { + val a = IobTotal(now) + a.iob = 10.0 + a.activity = 11.0 + a.bolussnooze = 12.0 + a.basaliob = 13.0 + a.netbasalinsulin = 14.0 + a.hightempinsulin = 15.0 + a.netInsulin = 16.0 + a.extendedBolusInsulin = 17.0 + try { + val j = a.json() + Assert.assertEquals(a.iob, j.getDouble("iob"), 0.0000001) + Assert.assertEquals(a.basaliob, j.getDouble("basaliob"), 0.0000001) + Assert.assertEquals(a.activity, j.getDouble("activity"), 0.0000001) + Assert.assertEquals(now.toFloat(), DateUtil.fromISODateString(j.getString("time")).time.toFloat(), 1000f) + } catch (e: Exception) { + Assert.fail("Exception: " + e.message) + } + } + + @Test fun determineBasalJsonTest() { + val a = IobTotal(now) + a.iob = 10.0 + a.activity = 11.0 + a.bolussnooze = 12.0 + a.basaliob = 13.0 + a.netbasalinsulin = 14.0 + a.hightempinsulin = 15.0 + a.netInsulin = 16.0 + a.extendedBolusInsulin = 17.0 + a.iobWithZeroTemp = IobTotal(now) + try { + val j = a.determineBasalJson() + Assert.assertEquals(a.iob, j.getDouble("iob"), 0.0000001) + Assert.assertEquals(a.basaliob, j.getDouble("basaliob"), 0.0000001) + Assert.assertEquals(a.bolussnooze, j.getDouble("bolussnooze"), 0.0000001) + Assert.assertEquals(a.activity, j.getDouble("activity"), 0.0000001) + Assert.assertEquals(0, j.getLong("lastBolusTime")) + Assert.assertEquals(now.toFloat(), DateUtil.fromISODateString(j.getString("time")).time.toFloat(), 1000f) + Assert.assertNotNull(j.getJSONObject("iobWithZeroTemp")) + } catch (e: Exception) { + Assert.fail("Exception: " + e.message) + } + } +} \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/elements/LayoutBuilderTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/elements/LayoutBuilderTest.java deleted file mode 100644 index 12b3aa1b25..0000000000 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/elements/LayoutBuilderTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package info.nightscout.androidaps.plugins.general.automation.elements; - -import junit.framework.Assert; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -import info.nightscout.androidaps.MainApp; - -@RunWith(PowerMockRunner.class) -@PrepareForTest({MainApp.class}) -public class LayoutBuilderTest { - - @Test - public void addTest() { - LayoutBuilder layoutBuilder = new LayoutBuilder(); - - InputInsulin inputInsulin = new InputInsulin(); - layoutBuilder.add(inputInsulin); - Assert.assertEquals(1, layoutBuilder.mElements.size()); - } - - @Test - public void addConditionalTest() { - LayoutBuilder layoutBuilder = new LayoutBuilder(); - - InputInsulin inputInsulin = new InputInsulin(); - layoutBuilder.add(inputInsulin, true); - Assert.assertEquals(1, layoutBuilder.mElements.size()); - layoutBuilder.add(inputInsulin, false); - Assert.assertEquals(1, layoutBuilder.mElements.size()); - } -} \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/elements/LayoutBuilderTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/elements/LayoutBuilderTest.kt new file mode 100644 index 0000000000..1a02397522 --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/elements/LayoutBuilderTest.kt @@ -0,0 +1,31 @@ +package info.nightscout.androidaps.plugins.general.automation.elements + +import dagger.android.AndroidInjector +import dagger.android.HasAndroidInjector +import info.TestBase +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith +import org.powermock.modules.junit4.PowerMockRunner + +@RunWith(PowerMockRunner::class) +class LayoutBuilderTest : TestBase() { + + val injector = HasAndroidInjector { AndroidInjector { } } + + @Test fun addTest() { + val layoutBuilder = LayoutBuilder() + val inputInsulin = InputInsulin(injector) + layoutBuilder.add(inputInsulin) + Assert.assertEquals(1, layoutBuilder.mElements.size) + } + + @Test fun addConditionalTest() { + val layoutBuilder = LayoutBuilder() + val inputInsulin = InputInsulin(injector) + layoutBuilder.add(inputInsulin, true) + Assert.assertEquals(1, layoutBuilder.mElements.size) + layoutBuilder.add(inputInsulin, false) + Assert.assertEquals(1, layoutBuilder.mElements.size) + } +} \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/pump/combo/ComboPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/pump/combo/ComboPluginTest.java deleted file mode 100644 index 8e7784f5b8..0000000000 --- a/app/src/test/java/info/nightscout/androidaps/plugins/pump/combo/ComboPluginTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.combo; - -import android.content.Context; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -import info.AAPSMocker; -import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.interfaces.Constraint; -import info.nightscout.androidaps.interfaces.PluginType; -import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.pump.combo.ruffyscripter.history.Bolus; -import info.nightscout.androidaps.queue.CommandQueue; -import info.nightscout.androidaps.utils.ToastUtils; - -import static org.junit.Assert.assertEquals; - -@RunWith(PowerMockRunner.class) -@PrepareForTest({MainApp.class, ConfigBuilderPlugin.class, ToastUtils.class, Context.class, CommandQueue.class}) -public class ComboPluginTest { - - ComboPlugin comboPlugin; - - @Test - public void invalidBasalRateOnComboPumpShouldLimitLoopInvokation() throws Exception { - comboPlugin.setPluginEnabled(PluginType.PUMP, true); - comboPlugin.setValidBasalRateProfileSelectedOnPump(false); - - Constraint c = new Constraint<>(true); - c = comboPlugin.isLoopInvocationAllowed(c); - Assert.assertEquals("Combo: No valid basal rate read from pump", c.getReasons()); - Assert.assertEquals(Boolean.FALSE, c.value()); - comboPlugin.setPluginEnabled(PluginType.PUMP, false); - } - - @Test - public void calculateFakePumpTimestamp() throws Exception { - long now = System.currentTimeMillis(); - long pumpTimestamp = now - now % 1000; - // same timestamp, different bolus leads to different fake timestamp - Assert.assertNotEquals( - comboPlugin.calculateFakeBolusDate(new Bolus(pumpTimestamp, 0.1, true)), - comboPlugin.calculateFakeBolusDate(new Bolus(pumpTimestamp, 0.3, true)) - ); - // different timestamp, same bolus leads to different fake timestamp - Assert.assertNotEquals( - comboPlugin.calculateFakeBolusDate(new Bolus(pumpTimestamp, 0.3, true)), - comboPlugin.calculateFakeBolusDate(new Bolus(pumpTimestamp + 60 * 1000, 0.3, true)) - ); - // generated timestamp has second-precision - Bolus bolus = new Bolus(pumpTimestamp, 0.2, true); - long calculatedTimestamp = comboPlugin.calculateFakeBolusDate(bolus); - assertEquals(calculatedTimestamp, calculatedTimestamp - calculatedTimestamp % 1000); - } - - @Before - public void prepareMocks() throws Exception { - AAPSMocker.mockMainApp(); - AAPSMocker.mockConfigBuilder(); - AAPSMocker.mockStrings(); - AAPSMocker.mockCommandQueue(); - - comboPlugin = ComboPlugin.getPlugin(); - } -} \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/pump/combo/ComboPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/pump/combo/ComboPluginTest.kt new file mode 100644 index 0000000000..674be7dbbe --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/plugins/pump/combo/ComboPluginTest.kt @@ -0,0 +1,90 @@ +package info.nightscout.androidaps.plugins.pump.combo + +import android.content.Context +import dagger.android.AndroidInjector +import dagger.android.HasAndroidInjector +import info.AAPSMocker +import info.TestBase +import info.nightscout.androidaps.MainApp +import info.nightscout.androidaps.interfaces.ActivePluginProvider +import info.nightscout.androidaps.interfaces.CommandQueueProvider +import info.nightscout.androidaps.interfaces.Constraint +import info.nightscout.androidaps.interfaces.PluginType +import info.nightscout.androidaps.logging.AAPSLogger +import info.nightscout.androidaps.plugins.bus.RxBusWrapper +import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin +import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker +import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction +import info.nightscout.androidaps.plugins.pump.combo.ruffyscripter.history.Bolus +import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin +import info.nightscout.androidaps.queue.CommandQueue +import info.nightscout.androidaps.utils.resources.ResourceHelper +import info.nightscout.androidaps.utils.sharedPreferences.SP +import org.junit.Assert +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.powermock.core.classloader.annotations.PrepareForTest +import org.powermock.modules.junit4.PowerMockRunner + +@RunWith(PowerMockRunner::class) +@PrepareForTest(MainApp::class, ConfigBuilderPlugin::class, ConstraintChecker::class, Context::class, CommandQueue::class) +class ComboPluginTest : TestBase() { + + @Mock lateinit var aapsLogger: AAPSLogger + @Mock lateinit var resourceHelper: ResourceHelper + @Mock lateinit var profileFunction: ProfileFunction + @Mock lateinit var constraintChecker: ConstraintChecker + @Mock lateinit var activePlugin: ActivePluginProvider + @Mock lateinit var commandQueue: CommandQueueProvider + @Mock lateinit var treatmentsPlugin: TreatmentsPlugin + @Mock lateinit var mainApp: MainApp + @Mock lateinit var sp: SP + + val injector = HasAndroidInjector { + AndroidInjector { + } + } + + private lateinit var comboPlugin: ComboPlugin + + @Test @Throws(Exception::class) + fun invalidBasalRateOnComboPumpShouldLimitLoopInvocation() { + comboPlugin.setPluginEnabled(PluginType.PUMP, true) + comboPlugin.setValidBasalRateProfileSelectedOnPump(false) + var c = Constraint(true) + c = comboPlugin.isLoopInvocationAllowed(c) + Assert.assertEquals("Combo: No valid basal rate read from pump", c.getReasons(aapsLogger)) + Assert.assertEquals(false, c.value()) + comboPlugin.setPluginEnabled(PluginType.PUMP, false) + } + + @Test @Throws(Exception::class) + fun calculateFakePumpTimestamp() { + val now = System.currentTimeMillis() + val pumpTimestamp = now - now % 1000 + // same timestamp, different bolus leads to different fake timestamp + Assert.assertNotEquals( + comboPlugin.calculateFakeBolusDate(Bolus(pumpTimestamp, 0.1, true)), + comboPlugin.calculateFakeBolusDate(Bolus(pumpTimestamp, 0.3, true)) + ) + // different timestamp, same bolus leads to different fake timestamp + Assert.assertNotEquals( + comboPlugin.calculateFakeBolusDate(Bolus(pumpTimestamp, 0.3, true)), + comboPlugin.calculateFakeBolusDate(Bolus(pumpTimestamp + 60 * 1000, 0.3, true)) + ) + // generated timestamp has second-precision + val bolus = Bolus(pumpTimestamp, 0.2, true) + val calculatedTimestamp = comboPlugin.calculateFakeBolusDate(bolus) + Assert.assertEquals(calculatedTimestamp, calculatedTimestamp - calculatedTimestamp % 1000) + } + + @Before @Throws(Exception::class) fun prepareMocks() { + AAPSMocker.mockMainApp() + AAPSMocker.mockConfigBuilder() + AAPSMocker.mockStrings() + AAPSMocker.mockCommandQueue() + comboPlugin = ComboPlugin(injector, aapsLogger, RxBusWrapper(), mainApp, resourceHelper, constraintChecker, profileFunction, treatmentsPlugin, sp, commandQueue) + } +} \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/androidaps/utils/BolusWizardTest.java b/app/src/test/java/info/nightscout/androidaps/utils/BolusWizardTest.java deleted file mode 100644 index c8a4703c62..0000000000 --- a/app/src/test/java/info/nightscout/androidaps/utils/BolusWizardTest.java +++ /dev/null @@ -1,103 +0,0 @@ -package info.nightscout.androidaps.utils; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -import info.AAPSMocker; -import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker; -import info.nightscout.androidaps.interfaces.Constraint; -import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions; -import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus; -import info.nightscout.androidaps.data.IobTotal; -import info.nightscout.androidaps.data.Profile; -import info.nightscout.androidaps.interfaces.PumpInterface; -import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin; -import info.nightscout.androidaps.plugins.pump.mdi.MDIPlugin; -import info.nightscout.androidaps.utils.wizard.BolusWizard; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * Created by kuchjir on 12/12/2017. - */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({MainApp.class, GlucoseStatus.class, ConfigBuilderPlugin.class, TreatmentsPlugin.class, ConstraintChecker.class, ProfileFunctions.class}) -public class BolusWizardTest { - private static final double PUMP_BOLUS_STEP = 0.1; - - @Test - /** Should calculate the same bolus when different blood glucose but both in target range */ - public void shouldCalculateTheSameBolusWhenBGsInRange() throws Exception { - Profile profile = setupProfile(4d, 8d, 20d, 12d); - - BolusWizard bw = new BolusWizard(profile, "", null, 20, 0.0, 4.2, 0d, 100d, true, true, true, true, false, false, false); - Double bolusForBg42 = bw.getCalculatedTotalInsulin(); - bw = new BolusWizard(profile, "", null, 20, 0.0, 5.4, 0d, 100d, true, true, true, true, false, false, false); - Double bolusForBg54 = bw.getCalculatedTotalInsulin(); - Assert.assertEquals(bolusForBg42, bolusForBg54); - } - - @Test - public void shouldCalculateHigherBolusWhenHighBG() throws Exception { - Profile profile = setupProfile(4d, 8d, 20d, 12d); - - BolusWizard bw = new BolusWizard(profile, "", null, 20, 0.0, 9.8, 0d, 100d, true, true, true, true, false, false, false); - Double bolusForHighBg = bw.getCalculatedTotalInsulin(); - bw = new BolusWizard(profile, "", null, 20, 0.0, 5.4, 0d, 100d, true, true, true, true, false, false, false); - Double bolusForBgInRange = bw.getCalculatedTotalInsulin(); - Assert.assertTrue(bolusForHighBg > bolusForBgInRange); - } - - @Test - public void shouldCalculateLowerBolusWhenLowBG() throws Exception { - Profile profile = setupProfile(4d, 8d, 20d, 12d); - - BolusWizard bw = new BolusWizard(profile, "", null, 20, 0.0, 3.6, 0d, 100d, true, true, true, true, false, false, false); - Double bolusForLowBg = bw.getCalculatedTotalInsulin(); - bw = new BolusWizard(profile, "", null, 20, 0.0, 5.4, 0d, 100d, true, true, true, true, false, false, false); - Double bolusForBgInRange = bw.getCalculatedTotalInsulin(); - Assert.assertTrue(bolusForLowBg < bolusForBgInRange); - } - - private Profile setupProfile(Double targetLow, Double targetHigh, Double insulinSensitivityFactor, Double insulinToCarbRatio) { - Profile profile = mock(Profile.class); - when(profile.getTargetLowMgdl()).thenReturn(targetLow); - when(profile.getTargetHighMgdl()).thenReturn(targetHigh); - when(profile.getIsfMgdl()).thenReturn(insulinSensitivityFactor); - when(profile.getIc()).thenReturn(insulinToCarbRatio); - - PowerMockito.mockStatic(GlucoseStatus.class); - when(GlucoseStatus.getGlucoseStatusData()).thenReturn(null); - - PowerMockito.mockStatic(TreatmentsPlugin.class); - TreatmentsPlugin treatment = mock(TreatmentsPlugin.class); - IobTotal iobTotalZero = new IobTotal(System.currentTimeMillis()); - when(treatment.getLastCalculationTreatments()).thenReturn(iobTotalZero); - when(treatment.getLastCalculationTempBasals()).thenReturn(iobTotalZero); - PowerMockito.mockStatic(MainApp.class); - when(TreatmentsPlugin.getPlugin()).thenReturn(treatment); - - AAPSMocker.mockConfigBuilder(); - PumpInterface pump = MDIPlugin.getPlugin(); - pump.getPumpDescription().bolusStep = PUMP_BOLUS_STEP; - when(ConfigBuilderPlugin.getPlugin().getActivePump()).thenReturn(pump); - - AAPSMocker.mockConstraintsChecker(); - Mockito.doAnswer(invocation -> { - Constraint constraint = invocation.getArgument(0); - return constraint; - }).when(AAPSMocker.constraintChecker).applyBolusConstraints(any(Constraint.class)); - - AAPSMocker.mockProfileFunctions(); - return profile; - } -} \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/androidaps/utils/wizard/BolusWizardTest.kt b/app/src/test/java/info/nightscout/androidaps/utils/wizard/BolusWizardTest.kt new file mode 100644 index 0000000000..7f0ccb216d --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/utils/wizard/BolusWizardTest.kt @@ -0,0 +1,126 @@ +package info.nightscout.androidaps.utils.wizard + +import android.content.Context +import dagger.android.AndroidInjector +import dagger.android.HasAndroidInjector +import info.TestBase +import info.nightscout.androidaps.Constants +import info.nightscout.androidaps.data.IobTotal +import info.nightscout.androidaps.data.Profile +import info.nightscout.androidaps.interfaces.ActivePluginProvider +import info.nightscout.androidaps.interfaces.CommandQueueProvider +import info.nightscout.androidaps.interfaces.Constraint +import info.nightscout.androidaps.interfaces.PumpDescription +import info.nightscout.androidaps.logging.AAPSLogger +import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin +import info.nightscout.androidaps.plugins.bus.RxBusWrapper +import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker +import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction +import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus +import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin +import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin +import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin +import info.nightscout.androidaps.utils.resources.ResourceHelper +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito +import org.mockito.Mockito.`when` +import org.mockito.invocation.InvocationOnMock +import org.powermock.core.classloader.annotations.PrepareForTest +import org.powermock.modules.junit4.PowerMockRunner + +@RunWith(PowerMockRunner::class) +@PrepareForTest(ConstraintChecker::class, VirtualPumpPlugin::class) +class BolusWizardTest : TestBase() { + + private val PUMP_BOLUS_STEP = 0.1 + + @Mock lateinit var aapsLogger: AAPSLogger + @Mock lateinit var resourceHelper: ResourceHelper + @Mock lateinit var profileFunction: ProfileFunction + @Mock lateinit var constraintChecker: ConstraintChecker + @Mock lateinit var context: Context + @Mock lateinit var activePlugin: ActivePluginProvider + @Mock lateinit var commandQueue: CommandQueueProvider + @Mock lateinit var loopPlugin: LoopPlugin + @Mock lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin + @Mock lateinit var treatmentsPlugin: TreatmentsPlugin + @Mock lateinit var virtualPumpPlugin: VirtualPumpPlugin + + val injector = HasAndroidInjector { + AndroidInjector { + if (it is BolusWizard) { + it.aapsLogger = aapsLogger + it.resourceHelper = resourceHelper + it.rxBus = RxBusWrapper() + it.profileFunction = profileFunction + it.constraintChecker = constraintChecker + it.context = context + it.activePlugin = activePlugin + it.commandQueue = commandQueue + it.loopPlugin = loopPlugin + it.iobCobCalculatorPlugin = iobCobCalculatorPlugin + } + if (it is GlucoseStatus) { + it.aapsLogger = aapsLogger + it.iobCobCalculatorPlugin = iobCobCalculatorPlugin + } + } + } + + private fun setupProfile(targetLow: Double, targetHigh: Double, insulinSensitivityFactor: Double, insulinToCarbRatio: Double): Profile { + val profile = Mockito.mock(Profile::class.java) + `when`(profile.targetLowMgdl).thenReturn(targetLow) + `when`(profile.targetHighMgdl).thenReturn(targetHigh) + `when`(profile.isfMgdl).thenReturn(insulinSensitivityFactor) + `when`(profile.ic).thenReturn(insulinToCarbRatio) + + `when`(profileFunction.getUnits()).thenReturn(Constants.MGDL) + `when`(iobCobCalculatorPlugin.dataLock).thenReturn(Unit) + `when`(activePlugin.activeTreatments).thenReturn(treatmentsPlugin) + `when`(treatmentsPlugin.lastCalculationTreatments).thenReturn(IobTotal(System.currentTimeMillis())) + `when`(treatmentsPlugin.lastCalculationTempBasals).thenReturn(IobTotal(System.currentTimeMillis())) + `when`(activePlugin.activePump).thenReturn(virtualPumpPlugin) + val pumpDescription = PumpDescription() + pumpDescription.bolusStep = PUMP_BOLUS_STEP + `when`(virtualPumpPlugin.pumpDescription).thenReturn(pumpDescription) + + Mockito.doAnswer { invocation: InvocationOnMock -> + invocation.getArgument>(0) + }.`when`(constraintChecker).applyBolusConstraints(anyObject()) + return profile + } + + @Test + /** Should calculate the same bolus when different blood glucose but both in target range */ + fun shouldCalculateTheSameBolusWhenBGsInRange() { + val profile = setupProfile(4.0, 8.0, 20.0, 12.0) + var bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 4.2, 0.0, 100.0, true, true, true, true, false, false, false) + val bolusForBg42 = bw.calculatedTotalInsulin + bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 5.4, 0.0, 100.0, true, true, true, true, false, false, false) + val bolusForBg54 = bw.calculatedTotalInsulin + Assert.assertEquals(bolusForBg42, bolusForBg54, 0.01) + } + + @Test + fun shouldCalculateHigherBolusWhenHighBG() { + val profile = setupProfile(4.0, 8.0, 20.0, 12.0) + var bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 9.8, 0.0, 100.0, true, true, true, true, false, false, false) + val bolusForHighBg = bw.calculatedTotalInsulin + bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 5.4, 0.0, 100.0, true, true, true, true, false, false, false) + val bolusForBgInRange = bw.calculatedTotalInsulin + Assert.assertTrue(bolusForHighBg > bolusForBgInRange) + } + + @Test + fun shouldCalculateLowerBolusWhenLowBG() { + val profile = setupProfile(4.0, 8.0, 20.0, 12.0) + var bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 3.6, 0.0, 100.0, true, true, true, true, false, false, false) + val bolusForLowBg = bw.calculatedTotalInsulin + bw = BolusWizard(injector).doCalc(profile, "", null, 20, 0.0, 5.4, 0.0, 100.0, true, true, true, true, false, false, false) + val bolusForBgInRange = bw.calculatedTotalInsulin + Assert.assertTrue(bolusForLowBg < bolusForBgInRange) + } +} \ No newline at end of file