diff --git a/Tests/LoopAlgorithmTests/DoseHistoryTests.swift b/Tests/LoopAlgorithmTests/DoseHistoryTests.swift new file mode 100644 index 0000000..9615456 --- /dev/null +++ b/Tests/LoopAlgorithmTests/DoseHistoryTests.swift @@ -0,0 +1,351 @@ +// +// DoseHistoryTests.swift +// LoopAlgorithmTests +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import XCTest +@testable import LoopAlgorithm + +/// A dose in the pump event format of LoopKit's dose fixtures +struct PumpEventDose { + enum Kind: String { + case basal = "BasalProfileStart" + case bolus = "Bolus" + case resume = "PumpResume" + case suspend = "PumpSuspend" + case tempBasal = "TempBasal" + } + + var kind: Kind + var startDate: Date + var endDate: Date + var value: Double + var isRate: Bool + var deliveredUnits: Double? = nil + var scheduledBasalRate: Double? = nil + + var programmedUnits: Double { + isRate ? value * endDate.timeIntervalSince(startDate).hours : value + } + + var unitsInDeliverableIncrements: Double { + guard isRate else { + return deliveredUnits ?? programmedUnits + } + return deliveredUnits ?? round(programmedUnits * 20) / 20 + } + + func basalRelativeDose(with insulinModel: InsulinModel) -> BasalRelativeDose { + let type: BasalRelativeDoseType + switch kind { + case .bolus: + type = .bolus + case .basal: + type = .basal(scheduledRate: value) + case .resume, .suspend, .tempBasal: + type = .basal(scheduledRate: scheduledBasalRate ?? 0) + } + return BasalRelativeDose(type: type, startDate: startDate, endDate: endDate, volume: deliveredUnits ?? programmedUnits, insulinModel: insulinModel) + } + + func insulinDose(with insulinModel: InsulinModel) -> MockInsulinDose { + MockInsulinDose(deliveryType: kind == .bolus ? .bolus : .basal, startDate: startDate, endDate: endDate, + volume: deliveredUnits ?? programmedUnits, insulinModel: insulinModel) + } +} + +struct MockInsulinDose: InsulinDose { + var deliveryType: InsulinDeliveryType + var startDate: Date + var endDate: Date + var volume: Double + var insulinModel: InsulinModel +} + +/// John Walsh's IOB curves, as LoopKit's WalshInsulinModel; some fixtures were generated with it +struct WalshInsulinModel: InsulinModel { + let actionDuration: TimeInterval + let delay: TimeInterval = 600 + + var effectDuration: TimeInterval { actionDuration + delay } + + func percentEffectRemaining(at time: TimeInterval) -> Double { + let timeAfterDelay = time - delay + guard timeAfterDelay > 0 else { return 1 } + guard timeAfterDelay < actionDuration else { return 0 } + + let nearestModeledDuration = TimeInterval(hours: min(6, max(3, round(actionDuration.hours)))) + let minutes = timeAfterDelay.minutes * nearestModeledDuration / actionDuration + + switch nearestModeledDuration { + case TimeInterval(hours: 3): + return -3.2030e-9 * pow(minutes, 4) + 1.354e-6 * pow(minutes, 3) - 1.759e-4 * pow(minutes, 2) + 9.255e-4 * minutes + 0.99951 + case TimeInterval(hours: 4): + return -3.310e-10 * pow(minutes, 4) + 2.530e-7 * pow(minutes, 3) - 5.510e-5 * pow(minutes, 2) - 9.086e-4 * minutes + 0.99950 + case TimeInterval(hours: 5): + return -2.950e-10 * pow(minutes, 4) + 2.320e-7 * pow(minutes, 3) - 5.550e-5 * pow(minutes, 2) + 4.490e-4 * minutes + 0.99300 + default: + return -1.493e-10 * pow(minutes, 4) + 1.413e-7 * pow(minutes, 3) - 4.095e-5 * pow(minutes, 2) + 6.365e-4 * minutes + 0.99700 + } + } +} + +/// A repeating daily basal schedule, expanded the way LoopKit's DailyValueSchedule.between does for a +/// fixed-offset time zone and a first item at midnight +struct DailyBasalSchedule { + var items: [(startTime: TimeInterval, rate: Double)] + var timeZone: TimeZone + + func between(start: Date, end: Date) -> [AbsoluteScheduleValue] { + var calendar = Calendar(identifier: .gregorian) + calendar.timeZone = timeZone + var day = calendar.startOfDay(for: start).addingTimeInterval(.hours(-24)) + var values: [AbsoluteScheduleValue] = [] + while day <= end { + for (index, item) in items.enumerated() { + let segmentStart = day.addingTimeInterval(item.startTime) + let segmentEnd = day.addingTimeInterval(index + 1 < items.count ? items[index + 1].startTime : .hours(24)) + if segmentEnd > start && segmentStart <= end { + values.append(AbsoluteScheduleValue(startDate: segmentStart, endDate: segmentEnd, value: item.rate)) + } + } + day = day.addingTimeInterval(.hours(24)) + } + return values + } +} + +final class DoseHistoryTests: XCTestCase { + + private let fixtureTimeZone = TimeZone(secondsFromGMT: 0)! + + let exponentialModel = ExponentialInsulinModel(actionDuration: .minutes(360), peakActivityTime: .minutes(75)) + + let walshModel = WalshInsulinModel(actionDuration: .hours(4)) + + private func fixtureDate(_ input: String) -> Date { + let formatter = DateFormatter.descriptionFormatter + formatter.timeZone = fixtureTimeZone + return formatter.date(from: input)! + } + + func loadDoseFixture(_ resourceName: String) -> [PumpEventDose] { + let fixture: [JSONDictionary] = loadFixture(resourceName) + let dateFormatter = ISO8601DateFormatter.localTimeDate(timeZone: fixtureTimeZone) + + return fixture.compactMap { + guard let kind = PumpEventDose.Kind(rawValue: $0["type"] as! String) else { + return nil + } + return PumpEventDose( + kind: kind, + startDate: dateFormatter.date(from: $0["start_at"] as! String)!, + endDate: dateFormatter.date(from: $0["end_at"] as! String)!, + value: $0["amount"] as! Double, + isRate: $0["unit"] as! String == "U/hour", + deliveredUnits: $0["delivered"] as? Double, + scheduledBasalRate: $0["scheduled"] as? Double + ) + } + } + + func loadInsulinValueFixture(_ resourceName: String) -> [InsulinValue] { + let fixture: [JSONDictionary] = loadFixture(resourceName) + let dateFormatter = ISO8601DateFormatter.localTimeDate(timeZone: fixtureTimeZone) + + return fixture.map { + InsulinValue(startDate: dateFormatter.date(from: $0["date"] as! String)!, value: $0["value"] as! Double) + } + } + + func loadBasalScheduleFixture(_ resourceName: String) -> DailyBasalSchedule { + let fixture: [JSONDictionary] = loadFixture(resourceName) + return DailyBasalSchedule(items: fixture.map { (.minutes($0["minutes"] as! Double), $0["rate"] as! Double) }, timeZone: fixtureTimeZone) + } + + func testIOBFromSuspend() { + let input = loadDoseFixture("suspend_dose_reconciled") + let normalizedOutput = loadDoseFixture("suspend_dose_reconciled_normalized") + let iobOutput = loadInsulinValueFixture("suspend_dose_reconciled_normalized_iob") + let basals = loadBasalScheduleFixture("basal") + + let basalTimeline = basals.between(start: input.first!.startDate, end: input.first!.startDate) + + let normalized = input.map { $0.insulinDose(with: walshModel) }.annotated(with: basalTimeline) + + XCTAssertEqual(normalizedOutput.count, normalized.count) + + for (expected, calculated) in zip(normalizedOutput, normalized) { + XCTAssertEqual(expected.startDate, calculated.startDate) + XCTAssertEqual(expected.endDate, calculated.endDate) + XCTAssertEqual(expected.value, calculated.netBasalUnitsPerHour, accuracy: Double(Float.ulpOfOne)) + } + + let iob = normalized.insulinOnBoardTimeline(longestEffectDuration: walshModel.effectDuration) + + XCTAssertEqual(iobOutput.count, iob.count) + + for (expected, calculated) in zip(iobOutput, iob) { + XCTAssertEqual(expected.startDate, calculated.startDate) + XCTAssertEqual(expected.value, calculated.value, accuracy: Double(Float.ulpOfOne)) + } + } + + func testIOBFromDoses() { + let input = loadDoseFixture("normalized_doses") + let output = loadInsulinValueFixture("iob_from_doses_output") + + let iob = input.map { $0.basalRelativeDose(with: walshModel) }.insulinOnBoardTimeline(longestEffectDuration: walshModel.effectDuration) + + XCTAssertEqual(output.count, iob.count) + + for (expected, calculated) in zip(output, iob) { + XCTAssertEqual(expected.startDate, calculated.startDate) + XCTAssertEqual(expected.value, calculated.value, accuracy: 0.5) + } + } + + func testIOBFromNoDoses() { + let input: [BasalRelativeDose] = [] + + XCTAssertEqual(0, input.insulinOnBoardTimeline(longestEffectDuration: ExponentialInsulinModelPreset.rapidActingAdult.effectDuration).count) + } + + func testIOBFromDosesExponential() { + let input = loadDoseFixture("normalized_doses") + let output = loadInsulinValueFixture("iob_from_doses_exponential_output") + + let iob = input.map { $0.basalRelativeDose(with: exponentialModel) }.insulinOnBoardTimeline() + + XCTAssertEqual(output.count, iob.count) + + for (expected, calculated) in zip(output, iob) { + XCTAssertEqual(expected.startDate, calculated.startDate) + XCTAssertEqual(expected.value, calculated.value, accuracy: 0.5) + } + } + + func testIOBFromDosesWithDifferentInsulinCurves() { + let f = fixtureDate + let output = loadInsulinValueFixture("iob_from_multiple_curves_output") + + let doses = [ + PumpEventDose(kind: .basal, startDate: f("2018-05-15 14:42:36 +0000"), endDate: f("2018-05-16 14:42:36 +0000"), value: 0.84999999999999998, isRate: true), + PumpEventDose(kind: .bolus, startDate: f("2018-05-15 14:44:46 +0000"), endDate: f("2018-05-15 14:44:46 +0000"), value: 0.9, isRate: false), + PumpEventDose(kind: .tempBasal, startDate: f("2018-05-15 14:42:36 +0000"), endDate: f("2018-05-15 14:42:36 +0000"), value: 0.0, isRate: true), + PumpEventDose(kind: .tempBasal, startDate: f("2018-05-15 14:32:51 +0000"), endDate: f("2018-05-15 15:02:51 +0000"), value: 1.8999999999999999, isRate: true), + PumpEventDose(kind: .bolus, startDate: f("2018-05-15 14:52:51 +0000"), endDate: f("2018-05-15 15:52:51 +0000"), value: 0.9, isRate: false), + ] + + let iobWithoutModel = doses.map { $0.basalRelativeDose(with: exponentialModel) }.insulinOnBoardTimeline() + + // The first bolus is Fiasp; everything else uses the child curve. + let models: [InsulinModel] = [ExponentialInsulinModelPreset.rapidActingChild, ExponentialInsulinModelPreset.fiasp, + ExponentialInsulinModelPreset.rapidActingChild, ExponentialInsulinModelPreset.rapidActingChild, + ExponentialInsulinModelPreset.rapidActingChild] + let iobWithModel = zip(doses, models).map { $0.basalRelativeDose(with: $1) }.insulinOnBoardTimeline() + + XCTAssertEqual(iobWithoutModel.count, iobWithModel.count) + + for (expected, calculated) in zip(output, iobWithModel) { + XCTAssertEqual(expected.startDate, calculated.startDate) + XCTAssertEqual(expected.value, calculated.value, accuracy: 0.00001) + } + } + + func testIOBFromReservoirDoses() { + let input = loadDoseFixture("normalized_reservoir_history_output") + let output = loadInsulinValueFixture("iob_from_reservoir_output") + + let iob = input.map { $0.basalRelativeDose(with: walshModel) }.insulinOnBoardTimeline(longestEffectDuration: walshModel.effectDuration) + + XCTAssertEqual(output.count, iob.count) + + for (expected, calculated) in zip(output, iob) { + XCTAssertEqual(expected.startDate, calculated.startDate) + XCTAssertEqual(expected.value, calculated.value, accuracy: 0.01) + } + } + + func testNormalizeReservoirDoses() { + let input = loadDoseFixture("reservoir_history_with_rewind_and_prime_output") + let output = loadDoseFixture("normalized_reservoir_history_output") + let basalTimeline = loadBasalScheduleFixture("basal").between(start: input.last!.startDate, end: input.first!.endDate) + + let doses = input.map { $0.insulinDose(with: ExponentialInsulinModelPreset.rapidActingAdult) }.annotated(with: basalTimeline) + + XCTAssertEqual(output.count, doses.count) + + // Total delivery on split doses should add up to delivery from original doses + XCTAssertEqual( + input.map(\.unitsInDeliverableIncrements).reduce(0, +), + doses.map(\.volume).reduce(0, +), + accuracy: Double(Float.ulpOfOne)) + + for (expected, calculated) in zip(output, doses) { + XCTAssertEqual(expected.startDate, calculated.startDate) + XCTAssertEqual(expected.endDate, calculated.endDate) + XCTAssertEqual(expected.value, calculated.volume / calculated.duration.hours, accuracy: Double(Float.ulpOfOne)) + switch calculated.type { + case .basal(let scheduledRate): + XCTAssertEqual(expected.scheduledBasalRate, scheduledRate) + case .bolus: + XCTFail("Unexpected bolus in dose history") + } + } + } + + func testNormalizeEdgeCaseDoses() { + assertNormalizes("normalize_edge_case_doses_input", into: "normalize_edge_case_doses_output") + } + + func testNormalizeEdgeCaseDosesMutable() { + assertNormalizes("normalize_edge_case_doses_mutable_input", into: "normalize_edge_case_doses_mutable_output") + } + + private func assertNormalizes(_ inputName: String, into outputName: String, line: UInt = #line) { + let input = loadDoseFixture(inputName) + let output = loadDoseFixture(outputName) + let basalTimeline = loadBasalScheduleFixture("basal").between(start: input.first!.startDate, end: input.last!.endDate) + + let doses = input.map { $0.insulinDose(with: ExponentialInsulinModelPreset.rapidActingAdult) }.annotated(with: basalTimeline) + + XCTAssertEqual(output.count, doses.count, line: line) + + for (expected, calculated) in zip(output, doses) { + XCTAssertEqual(expected.startDate, calculated.startDate, line: line) + XCTAssertEqual(expected.endDate, calculated.endDate, line: line) + XCTAssertEqual(expected.value, expected.isRate ? calculated.netBasalUnitsPerHour : calculated.netBasalUnits, accuracy: 0.01, line: line) + } + } + + func testAnnotateSplitsDeliveredUnitsProportionally() { + assertSplitsProportionally(deliveredUnits: 0.1) + } + + func testAnnotateSplitsPartialDeliveryProportionally() { + assertSplitsProportionally(deliveredUnits: 0.05) + } + + private func assertSplitsProportionally(deliveredUnits: Double, line: UInt = #line) { + // A 5 minute temp basal starting one minute before a basal schedule change at noon + let startDate = fixtureDate("2018-07-16 11:59:00 +0000") + let endDate = startDate.addingTimeInterval(.minutes(5)) + let dose = PumpEventDose(kind: .tempBasal, startDate: startDate, endDate: endDate, value: 1, isRate: true, deliveredUnits: deliveredUnits) + let basals = loadBasalScheduleFixture("basal").between(start: startDate, end: endDate) + + let splitDoses = [dose.insulinDose(with: ExponentialInsulinModelPreset.rapidActingAdult)].annotated(with: basals) + + XCTAssertEqual(2, splitDoses.count, line: line) + XCTAssertEqual(deliveredUnits * 1.0/5.0, splitDoses[0].volume, accuracy: .ulpOfOne, line: line) + XCTAssertEqual(deliveredUnits * 4.0/5.0, splitDoses[1].volume, accuracy: .ulpOfOne, line: line) + } +} + +private extension BasalRelativeDose { + var netBasalUnitsPerHour: Double { + duration > 0 ? netBasalUnits / duration.hours : 0 + } +} diff --git a/Tests/LoopAlgorithmTests/Fixtures/basal.json b/Tests/LoopAlgorithmTests/Fixtures/basal.json new file mode 100644 index 0000000..98f572d --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/basal.json @@ -0,0 +1,44 @@ +[ + { + "i": 0, + "start": "00:00:00", + "rate": 0.9, + "minutes": 0 + }, + { + "i": 1, + "start": "04:00:00", + "rate": 0.925, + "minutes": 240 + }, + { + "i": 2, + "start": "07:00:00", + "rate": 0.85, + "minutes": 420 + }, + { + "i": 3, + "start": "10:00:00", + "rate": 0.85, + "minutes": 600 + }, + { + "i": 4, + "start": "12:00:00", + "rate": 0.75, + "minutes": 720 + }, + { + "i": 5, + "start": "15:00:00", + "rate": 0.8, + "minutes": 900 + }, + { + "i": 6, + "start": "22:00:00", + "rate": 0.9, + "minutes": 1320 + } +] \ No newline at end of file diff --git a/Tests/LoopAlgorithmTests/Fixtures/iob_from_doses_exponential_output.json b/Tests/LoopAlgorithmTests/Fixtures/iob_from_doses_exponential_output.json new file mode 100644 index 0000000..6f86752 --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/iob_from_doses_exponential_output.json @@ -0,0 +1,642 @@ +[ + { + "date" : "2015-10-15T18:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2015-10-15T18:10:00", + "unit" : "U", + "value" : -0.018750000000000003 + }, + { + "date" : "2015-10-15T18:15:00", + "unit" : "U", + "value" : -0.020083333333333335 + }, + { + "date" : "2015-10-15T18:20:00", + "unit" : "U", + "value" : -0.08674967391190945 + }, + { + "date" : "2015-10-15T18:25:00", + "unit" : "U", + "value" : -0.1533638209815783 + }, + { + "date" : "2015-10-15T18:30:00", + "unit" : "U", + "value" : -0.21985157514541492 + }, + { + "date" : "2015-10-15T18:35:00", + "unit" : "U", + "value" : -0.28594868294984466 + }, + { + "date" : "2015-10-15T18:40:00", + "unit" : "U", + "value" : -0.35138913185798915 + }, + { + "date" : "2015-10-15T18:45:00", + "unit" : "U", + "value" : -0.41460789687197663 + }, + { + "date" : "2015-10-15T18:50:00", + "unit" : "U", + "value" : -0.41140454839697138 + }, + { + "date" : "2015-10-15T18:55:00", + "unit" : "U", + "value" : -0.40694042602624531 + }, + { + "date" : "2015-10-15T19:00:00", + "unit" : "U", + "value" : -0.40111368746478182 + }, + { + "date" : "2015-10-15T19:05:00", + "unit" : "U", + "value" : -0.45918724201570321 + }, + { + "date" : "2015-10-15T19:10:00", + "unit" : "U", + "value" : -0.51777937898327886 + }, + { + "date" : "2015-10-15T19:15:00", + "unit" : "U", + "value" : -0.57545506272901459 + }, + { + "date" : "2015-10-15T19:20:00", + "unit" : "U", + "value" : -0.67031079437724594 + }, + { + "date" : "2015-10-15T19:25:00", + "unit" : "U", + "value" : -0.65308790247022863 + }, + { + "date" : "2015-10-15T19:30:00", + "unit" : "U", + "value" : 4.5844563428505971 + }, + { + "date" : "2015-10-15T19:35:00", + "unit" : "U", + "value" : 4.8234744416481918 + }, + { + "date" : "2015-10-15T19:40:00", + "unit" : "U", + "value" : 5.0555348107831648 + }, + { + "date" : "2015-10-15T19:45:00", + "unit" : "U", + "value" : 5.2654029256034685 + }, + { + "date" : "2015-10-15T19:50:00", + "unit" : "U", + "value" : 5.4543457491633829 + }, + { + "date" : "2015-10-15T19:55:00", + "unit" : "U", + "value" : 5.5796818289595951 + }, + { + "date" : "2015-10-15T20:00:00", + "unit" : "U", + "value" : 5.7313776281043038 + }, + { + "date" : "2015-10-15T20:05:00", + "unit" : "U", + "value" : 5.866534076169672 + }, + { + "date" : "2015-10-15T20:10:00", + "unit" : "U", + "value" : 9.3515233597392591 + }, + { + "date" : "2015-10-15T20:15:00", + "unit" : "U", + "value" : 9.2639948506563528 + }, + { + "date" : "2015-10-15T20:20:00", + "unit" : "U", + "value" : 9.1250155710516587 + }, + { + "date" : "2015-10-15T20:25:00", + "unit" : "U", + "value" : 8.959613360663484 + }, + { + "date" : "2015-10-15T20:30:00", + "unit" : "U", + "value" : 8.7679394277654108 + }, + { + "date" : "2015-10-15T20:35:00", + "unit" : "U", + "value" : 8.4976351667316088 + }, + { + "date" : "2015-10-15T20:40:00", + "unit" : "U", + "value" : 8.2718009242472466 + }, + { + "date" : "2015-10-15T20:45:00", + "unit" : "U", + "value" : 7.9677397922764914 + }, + { + "date" : "2015-10-15T20:50:00", + "unit" : "U", + "value" : 7.6531423110771213 + }, + { + "date" : "2015-10-15T20:55:00", + "unit" : "U", + "value" : 7.3305121057107296 + }, + { + "date" : "2015-10-15T21:00:00", + "unit" : "U", + "value" : 7.0039882775409179 + }, + { + "date" : "2015-10-15T21:05:00", + "unit" : "U", + "value" : 6.8599232815908628 + }, + { + "date" : "2015-10-15T21:10:00", + "unit" : "U", + "value" : 6.6827268353420592 + }, + { + "date" : "2015-10-15T21:15:00", + "unit" : "U", + "value" : 6.4975323125878832 + }, + { + "date" : "2015-10-15T21:20:00", + "unit" : "U", + "value" : 6.2311950271168621 + }, + { + "date" : "2015-10-15T21:25:00", + "unit" : "U", + "value" : 5.9662610775540603 + }, + { + "date" : "2015-10-15T21:30:00", + "unit" : "U", + "value" : 5.703410306528899 + }, + { + "date" : "2015-10-15T21:35:00", + "unit" : "U", + "value" : 5.443549906835079 + }, + { + "date" : "2015-10-15T21:40:00", + "unit" : "U", + "value" : 9.1941718730890045 + }, + { + "date" : "2015-10-15T21:45:00", + "unit" : "U", + "value" : 8.9426578501594971 + }, + { + "date" : "2015-10-15T21:50:00", + "unit" : "U", + "value" : 8.6873901964495222 + }, + { + "date" : "2015-10-15T21:55:00", + "unit" : "U", + "value" : 8.419996897114423 + }, + { + "date" : "2015-10-15T22:00:00", + "unit" : "U", + "value" : 8.1495692963244348 + }, + { + "date" : "2015-10-15T22:05:00", + "unit" : "U", + "value" : 8.0510013404305631 + }, + { + "date" : "2015-10-15T22:10:00", + "unit" : "U", + "value" : 7.947479248003801 + }, + { + "date" : "2015-10-15T22:15:00", + "unit" : "U", + "value" : 7.8407880010764028 + }, + { + "date" : "2015-10-15T22:20:00", + "unit" : "U", + "value" : 7.7318648464436839 + }, + { + "date" : "2015-10-15T22:25:00", + "unit" : "U", + "value" : 7.621458400003899 + }, + { + "date" : "2015-10-15T22:30:00", + "unit" : "U", + "value" : 7.504058141533358 + }, + { + "date" : "2015-10-15T22:35:00", + "unit" : "U", + "value" : 7.2072063559501762 + }, + { + "date" : "2015-10-15T22:40:00", + "unit" : "U", + "value" : 6.9106671373789181 + }, + { + "date" : "2015-10-15T22:45:00", + "unit" : "U", + "value" : 6.6150483599313352 + }, + { + "date" : "2015-10-15T22:50:00", + "unit" : "U", + "value" : 6.3215294099560326 + }, + { + "date" : "2015-10-15T22:55:00", + "unit" : "U", + "value" : 6.0312390617306626 + }, + { + "date" : "2015-10-15T23:00:00", + "unit" : "U", + "value" : 5.7451618503011987 + }, + { + "date" : "2015-10-15T23:05:00", + "unit" : "U", + "value" : 5.4641508016258493 + }, + { + "date" : "2015-10-15T23:10:00", + "unit" : "U", + "value" : 5.1889392020133407 + }, + { + "date" : "2015-10-15T23:15:00", + "unit" : "U", + "value" : 4.9201514731443847 + }, + { + "date" : "2015-10-15T23:20:00", + "unit" : "U", + "value" : 4.6583132146527513 + }, + { + "date" : "2015-10-15T23:25:00", + "unit" : "U", + "value" : 4.4038604721990744 + }, + { + "date" : "2015-10-15T23:30:00", + "unit" : "U", + "value" : 4.157148285179713 + }, + { + "date" : "2015-10-15T23:35:00", + "unit" : "U", + "value" : 3.9184585646600665 + }, + { + "date" : "2015-10-15T23:40:00", + "unit" : "U", + "value" : 3.6880073487913116 + }, + { + "date" : "2015-10-15T23:45:00", + "unit" : "U", + "value" : 3.4659514798492381 + }, + { + "date" : "2015-10-15T23:50:00", + "unit" : "U", + "value" : 3.2523947441097145 + }, + { + "date" : "2015-10-15T23:55:00", + "unit" : "U", + "value" : 3.0473935130363934 + }, + { + "date" : "2015-10-16T00:00:00", + "unit" : "U", + "value" : 2.8509619216906583 + }, + { + "date" : "2015-10-16T00:05:00", + "unit" : "U", + "value" : 2.6630766178710337 + }, + { + "date" : "2015-10-16T00:10:00", + "unit" : "U", + "value" : 2.4836811132395682 + }, + { + "date" : "2015-10-16T00:15:00", + "unit" : "U", + "value" : 2.3126897655863949 + }, + { + "date" : "2015-10-16T00:20:00", + "unit" : "U", + "value" : 2.1499914289175757 + }, + { + "date" : "2015-10-16T00:25:00", + "unit" : "U", + "value" : 1.9954542992700548 + }, + { + "date" : "2015-10-16T00:30:00", + "unit" : "U", + "value" : 1.8489281662494723 + }, + { + "date" : "2015-10-16T00:35:00", + "unit" : "U", + "value" : 1.7102522167447076 + }, + { + "date" : "2015-10-16T00:40:00", + "unit" : "U", + "value" : 1.5792522393334008 + }, + { + "date" : "2015-10-16T00:45:00", + "unit" : "U", + "value" : 1.4557417966735475 + }, + { + "date" : "2015-10-16T00:50:00", + "unit" : "U", + "value" : 1.3395243199229128 + }, + { + "date" : "2015-10-16T00:55:00", + "unit" : "U", + "value" : 1.2303950054342776 + }, + { + "date" : "2015-10-16T01:00:00", + "unit" : "U", + "value" : 1.1281412265192725 + }, + { + "date" : "2015-10-16T01:05:00", + "unit" : "U", + "value" : 1.0325384190273319 + }, + { + "date" : "2015-10-16T01:10:00", + "unit" : "U", + "value" : 0.94335795605105055 + }, + { + "date" : "2015-10-16T01:15:00", + "unit" : "U", + "value" : 0.86037059905713076 + }, + { + "date" : "2015-10-16T01:20:00", + "unit" : "U", + "value" : 0.78335347466781946 + }, + { + "date" : "2015-10-16T01:25:00", + "unit" : "U", + "value" : 0.71208475485032652 + }, + { + "date" : "2015-10-16T01:30:00", + "unit" : "U", + "value" : 0.64634339612662106 + }, + { + "date" : "2015-10-16T01:35:00", + "unit" : "U", + "value" : 0.58591097891387478 + }, + { + "date" : "2015-10-16T01:40:00", + "unit" : "U", + "value" : 0.53031810327106477 + }, + { + "date" : "2015-10-16T01:45:00", + "unit" : "U", + "value" : 0.47887549890416919 + }, + { + "date" : "2015-10-16T01:50:00", + "unit" : "U", + "value" : 0.43136991580673895 + }, + { + "date" : "2015-10-16T01:55:00", + "unit" : "U", + "value" : 0.38760420145484975 + }, + { + "date" : "2015-10-16T02:00:00", + "unit" : "U", + "value" : 0.34738572960367692 + }, + { + "date" : "2015-10-16T02:05:00", + "unit" : "U", + "value" : 0.31052608873297527 + }, + { + "date" : "2015-10-16T02:10:00", + "unit" : "U", + "value" : 0.27684765577284548 + }, + { + "date" : "2015-10-16T02:15:00", + "unit" : "U", + "value" : 0.24617422029248465 + }, + { + "date" : "2015-10-16T02:20:00", + "unit" : "U", + "value" : 0.21811262350069069 + }, + { + "date" : "2015-10-16T02:25:00", + "unit" : "U", + "value" : 0.1922648983849887 + }, + { + "date" : "2015-10-16T02:30:00", + "unit" : "U", + "value" : 0.16852209381294375 + }, + { + "date" : "2015-10-16T02:35:00", + "unit" : "U", + "value" : 0.14678704473003373 + }, + { + "date" : "2015-10-16T02:40:00", + "unit" : "U", + "value" : 0.12696661469528853 + }, + { + "date" : "2015-10-16T02:45:00", + "unit" : "U", + "value" : 0.10897012161281953 + }, + { + "date" : "2015-10-16T02:50:00", + "unit" : "U", + "value" : 0.092714235329971514 + }, + { + "date" : "2015-10-16T02:55:00", + "unit" : "U", + "value" : 0.07811720379651968 + }, + { + "date" : "2015-10-16T03:00:00", + "unit" : "U", + "value" : 0.065102801536982405 + }, + { + "date" : "2015-10-16T03:05:00", + "unit" : "U", + "value" : 0.053597770353323318 + }, + { + "date" : "2015-10-16T03:10:00", + "unit" : "U", + "value" : 0.043530781995733972 + }, + { + "date" : "2015-10-16T03:15:00", + "unit" : "U", + "value" : 0.03482327014417011 + }, + { + "date" : "2015-10-16T03:20:00", + "unit" : "U", + "value" : 0.027389826284725402 + }, + { + "date" : "2015-10-16T03:25:00", + "unit" : "U", + "value" : 0.021146086743643433 + }, + { + "date" : "2015-10-16T03:30:00", + "unit" : "U", + "value" : 0.016012309934482737 + }, + { + "date" : "2015-10-16T03:35:00", + "unit" : "U", + "value" : 0.011921441689652637 + }, + { + "date" : "2015-10-16T03:40:00", + "unit" : "U", + "value" : 0.0088100824151718816 + }, + { + "date" : "2015-10-16T03:45:00", + "unit" : "U", + "value" : 0.0066173260136511026 + }, + { + "date" : "2015-10-16T03:50:00", + "unit" : "U", + "value" : 0.0050210961976692075 + }, + { + "date" : "2015-10-16T03:55:00", + "unit" : "U", + "value" : 0.0036823783158275642 + }, + { + "date" : "2015-10-16T04:00:00", + "unit" : "U", + "value" : 0.0025852439700395813 + }, + { + "date" : "2015-10-16T04:05:00", + "unit" : "U", + "value" : 0.0017152598603126484 + }, + { + "date" : "2015-10-16T04:10:00", + "unit" : "U", + "value" : 0.0010585498741866298 + }, + { + "date" : "2015-10-16T04:15:00", + "unit" : "U", + "value" : 0.00059794710049142111 + }, + { + "date" : "2015-10-16T04:20:00", + "unit" : "U", + "value" : 0.00029752570973717093 + }, + { + "date" : "2015-10-16T04:25:00", + "unit" : "U", + "value" : 0.0001207375635234328 + }, + { + "date" : "2015-10-16T04:30:00", + "unit" : "U", + "value" : 3.3298623365256642e-05 + }, + { + "date" : "2015-10-16T04:35:00", + "unit" : "U", + "value" : 3.0976579948276282e-06 + }, + { + "date" : "2015-10-16T04:40:00", + "unit" : "U", + "value" : 0 + } +] \ No newline at end of file diff --git a/Tests/LoopAlgorithmTests/Fixtures/iob_from_doses_output.json b/Tests/LoopAlgorithmTests/Fixtures/iob_from_doses_output.json new file mode 100644 index 0000000..b657023 --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/iob_from_doses_output.json @@ -0,0 +1 @@ +[{"date": "2015-10-15T18:05:00", "value": 0.0, "unit": "U"}, {"date": "2015-10-15T18:10:00", "value": -0.018750000000000006, "unit": "U"}, {"date": "2015-10-15T18:15:00", "value": -0.085416666666666669, "unit": "U"}, {"date": "2015-10-15T18:20:00", "value": -0.15206668087682032, "unit": "U"}, {"date": "2015-10-15T18:25:00", "value": -0.21857935431982956, "unit": "U"}, {"date": "2015-10-15T18:30:00", "value": -0.28464801252543015, "unit": "U"}, {"date": "2015-10-15T18:35:00", "value": -0.35010510247148485, "unit": "U"}, {"date": "2015-10-15T18:40:00", "value": -0.41479512492210602, "unit": "U"}, {"date": "2015-10-15T18:45:00", "value": -0.41190763676098952, "unit": "U"}, {"date": "2015-10-15T18:50:00", "value": -0.40797691999141444, "unit": "U"}, {"date": "2015-10-15T18:55:00", "value": -0.40292107811937894, "unit": "U"}, {"date": "2015-10-15T19:00:00", "value": -0.39698624056940118, "unit": "U"}, {"date": "2015-10-15T19:05:00", "value": -0.45690984213971042, "unit": "U"}, {"date": "2015-10-15T19:10:00", "value": -0.5160939052014526, "unit": "U"}, {"date": "2015-10-15T19:15:00", "value": -0.5741902604296798, "unit": "U"}, {"date": "2015-10-15T19:20:00", "value": -0.66778492452731286, "unit": "U"}, {"date": "2015-10-15T19:25:00", "value": -0.43178101319080897, "unit": "U"}, {"date": "2015-10-15T19:30:00", "value": 4.8055335550120359, "unit": "U"}, {"date": "2015-10-15T19:35:00", "value": 5.0439569248931519, "unit": "U"}, {"date": "2015-10-15T19:40:00", "value": 5.2564032091288739, "unit": "U"}, {"date": "2015-10-15T19:45:00", "value": 5.4534881571023126, "unit": "U"}, {"date": "2015-10-15T19:50:00", "value": 5.5918540183876919, "unit": "U"}, {"date": "2015-10-15T19:55:00", "value": 5.7617970521213326, "unit": "U"}, {"date": "2015-10-15T20:00:00", "value": 5.9186590272588271, "unit": "U"}, {"date": "2015-10-15T20:05:00", "value": 6.0629788559331814, "unit": "U"}, {"date": "2015-10-15T20:10:00", "value": 9.3416452708111812, "unit": "U"}, {"date": "2015-10-15T20:15:00", "value": 9.2679264924395568, "unit": "U"}, {"date": "2015-10-15T20:20:00", "value": 9.1311566183775188, "unit": "U"}, {"date": "2015-10-15T20:25:00", "value": 8.9767537893386322, "unit": "U"}, {"date": "2015-10-15T20:30:00", "value": 8.8018580566191247, "unit": "U"}, {"date": "2015-10-15T20:35:00", "value": 8.552252234133352, "unit": "U"}, {"date": "2015-10-15T20:40:00", "value": 8.2844286507395548, "unit": "U"}, {"date": "2015-10-15T20:45:00", "value": 8.0040683600139655, "unit": "U"}, {"date": "2015-10-15T20:50:00", "value": 7.712867310317252, "unit": "U"}, {"date": "2015-10-15T20:55:00", "value": 7.4123606321714997, "unit": "U"}, {"date": "2015-10-15T21:00:00", "value": 7.1706722555753073, "unit": "U"}, {"date": "2015-10-15T21:05:00", "value": 7.1254496600122827, "unit": "U"}, {"date": "2015-10-15T21:10:00", "value": 6.9617393970761903, "unit": "U"}, {"date": "2015-10-15T21:15:00", "value": 6.7034202910941953, "unit": "U"}, {"date": "2015-10-15T21:20:00", "value": 6.4411294655025397, "unit": "U"}, {"date": "2015-10-15T21:25:00", "value": 6.1756930346329053, "unit": "U"}, {"date": "2015-10-15T21:30:00", "value": 5.9083425409811152, "unit": "U"}, {"date": "2015-10-15T21:35:00", "value": 5.6400399553070137, "unit": "U"}, {"date": "2015-10-15T21:40:00", "value": 9.3783661475995945, "unit": "U"}, {"date": "2015-10-15T21:45:00", "value": 9.1108542204103582, "unit": "U"}, {"date": "2015-10-15T21:50:00", "value": 8.8205731329424886, "unit": "U"}, {"date": "2015-10-15T21:55:00", "value": 8.5236544857453715, "unit": "U"}, {"date": "2015-10-15T22:00:00", "value": 8.4121628508470163, "unit": "U"}, {"date": "2015-10-15T22:05:00", "value": 8.2891516195852599, "unit": "U"}, {"date": "2015-10-15T22:10:00", "value": 8.1623939723762202, "unit": "U"}, {"date": "2015-10-15T22:15:00", "value": 8.031926498827497, "unit": "U"}, {"date": "2015-10-15T22:20:00", "value": 7.898682868513041, "unit": "U"}, {"date": "2015-10-15T22:25:00", "value": 7.7572027441484082, "unit": "U"}, {"date": "2015-10-15T22:30:00", "value": 7.4342948897702952, "unit": "U"}, {"date": "2015-10-15T22:35:00", "value": 7.1098374176912387, "unit": "U"}, {"date": "2015-10-15T22:40:00", "value": 6.7844713305118889, "unit": "U"}, {"date": "2015-10-15T22:45:00", "value": 6.4599143409690667, "unit": "U"}, {"date": "2015-10-15T22:50:00", "value": 6.1370686677850914, "unit": "U"}, {"date": "2015-10-15T22:55:00", "value": 5.8163964384449898, "unit": "U"}, {"date": "2015-10-15T23:00:00", "value": 5.4998105211368991, "unit": "U"}, {"date": "2015-10-15T23:05:00", "value": 5.1880290027561484, "unit": "U"}, {"date": "2015-10-15T23:10:00", "value": 4.8816947056251614, "unit": "U"}, {"date": "2015-10-15T23:15:00", "value": 4.5812274778780608, "unit": "U"}, {"date": "2015-10-15T23:20:00", "value": 4.2866787472586676, "unit": "U"}, {"date": "2015-10-15T23:25:00", "value": 3.9985006890305459, "unit": "U"}, {"date": "2015-10-15T23:30:00", "value": 3.7174102768933639, "unit": "U"}, {"date": "2015-10-15T23:35:00", "value": 3.4413002004784681, "unit": "U"}, {"date": "2015-10-15T23:40:00", "value": 3.1790663931988168, "unit": "U"}, {"date": "2015-10-15T23:45:00", "value": 2.9674459025121354, "unit": "U"}, {"date": "2015-10-15T23:50:00", "value": 2.7629813356602755, "unit": "U"}, {"date": "2015-10-15T23:55:00", "value": 2.5658111309990193, "unit": "U"}, {"date": "2015-10-16T00:00:00", "value": 2.3763386371089359, "unit": "U"}, {"date": "2015-10-16T00:05:00", "value": 2.1936103849532484, "unit": "U"}, {"date": "2015-10-16T00:10:00", "value": 2.0183994767110565, "unit": "U"}, {"date": "2015-10-16T00:15:00", "value": 1.8507002564177386, "unit": "U"}, {"date": "2015-10-16T00:20:00", "value": 1.6985068266336847, "unit": "U"}, {"date": "2015-10-16T00:25:00", "value": 1.5747066972951482, "unit": "U"}, {"date": "2015-10-16T00:30:00", "value": 1.4549325333370042, "unit": "U"}, {"date": "2015-10-16T00:35:00", "value": 1.3388718304255545, "unit": "U"}, {"date": "2015-10-16T00:40:00", "value": 1.2267156075864047, "unit": "U"}, {"date": "2015-10-16T00:45:00", "value": 1.1189147793984533, "unit": "U"}, {"date": "2015-10-16T00:50:00", "value": 1.0147401216299032, "unit": "U"}, {"date": "2015-10-16T00:55:00", "value": 0.9142150372798441, "unit": "U"}, {"date": "2015-10-16T01:00:00", "value": 0.81744236897927469, "unit": "U"}, {"date": "2015-10-16T01:05:00", "value": 0.72449566972835622, "unit": "U"}, {"date": "2015-10-16T01:10:00", "value": 0.63497148245908197, "unit": "U"}, {"date": "2015-10-16T01:15:00", "value": 0.54966882501852599, "unit": "U"}, {"date": "2015-10-16T01:20:00", "value": 0.47039614943892216, "unit": "U"}, {"date": "2015-10-16T01:25:00", "value": 0.3967708826026185, "unit": "U"}, {"date": "2015-10-16T01:30:00", "value": 0.32725818119704375, "unit": "U"}, {"date": "2015-10-16T01:35:00", "value": 0.26174046235113074, "unit": "U"}, {"date": "2015-10-16T01:40:00", "value": 0.20007472515215177, "unit": "U"}, {"date": "2015-10-16T01:45:00", "value": 0.14209255064571641, "unit": "U"}, {"date": "2015-10-16T01:50:00", "value": 0.095810842977274838, "unit": "U"}, {"date": "2015-10-16T01:55:00", "value": 0.080002965672173271, "unit": "U"}, {"date": "2015-10-16T02:00:00", "value": 0.065104330918007297, "unit": "U"}, {"date": "2015-10-16T02:05:00", "value": 0.051088357857381354, "unit": "U"}, {"date": "2015-10-16T02:10:00", "value": 0.036587766581119896, "unit": "U"}, {"date": "2015-10-16T02:15:00", "value": 0.024746042994965325, "unit": "U"}, {"date": "2015-10-16T02:20:00", "value": 0.015304914415581596, "unit": "U"}, {"date": "2015-10-16T02:25:00", "value": 0.0081185642627603517, "unit": "U"}, {"date": "2015-10-16T02:30:00", "value": 0.0030469902521267325, "unit": "U"}, {"date": "2015-10-16T02:35:00", "value": 0.0, "unit": "U"}, {"date": "2015-10-16T02:40:00", "value": 0.0, "unit": "U"}] \ No newline at end of file diff --git a/Tests/LoopAlgorithmTests/Fixtures/iob_from_multiple_curves_output.json b/Tests/LoopAlgorithmTests/Fixtures/iob_from_multiple_curves_output.json new file mode 100644 index 0000000..59d6d88 --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/iob_from_multiple_curves_output.json @@ -0,0 +1,1832 @@ +[ + { + "date" : "2018-05-15T14:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T14:35:00", + "unit" : "U", + "value" : 0.068083333333333329 + }, + { + "date" : "2018-05-15T14:40:00", + "unit" : "U", + "value" : 0.22641666666666665 + }, + { + "date" : "2018-05-15T14:45:00", + "unit" : "U", + "value" : 1.2847500000000001 + }, + { + "date" : "2018-05-15T14:50:00", + "unit" : "U", + "value" : 1.4426604218252472 + }, + { + "date" : "2018-05-15T14:55:00", + "unit" : "U", + "value" : 1.6315008168845901 + }, + { + "date" : "2018-05-15T15:00:00", + "unit" : "U", + "value" : 1.856973269641518 + }, + { + "date" : "2018-05-15T15:05:00", + "unit" : "U", + "value" : 2.0051090073701832 + }, + { + "date" : "2018-05-15T15:10:00", + "unit" : "U", + "value" : 2.0541406193487384 + }, + { + "date" : "2018-05-15T15:15:00", + "unit" : "U", + "value" : 2.0944463997593505 + }, + { + "date" : "2018-05-15T15:20:00", + "unit" : "U", + "value" : 2.1265928762508812 + }, + { + "date" : "2018-05-15T15:25:00", + "unit" : "U", + "value" : 2.1516271451485611 + }, + { + "date" : "2018-05-15T15:30:00", + "unit" : "U", + "value" : 2.1704824312840056 + }, + { + "date" : "2018-05-15T15:35:00", + "unit" : "U", + "value" : 2.1839875490356584 + }, + { + "date" : "2018-05-15T15:40:00", + "unit" : "U", + "value" : 2.1928777062534417 + }, + { + "date" : "2018-05-15T15:45:00", + "unit" : "U", + "value" : 2.1978042452867692 + }, + { + "date" : "2018-05-15T15:50:00", + "unit" : "U", + "value" : 2.1993434218318555 + }, + { + "date" : "2018-05-15T15:55:00", + "unit" : "U", + "value" : 2.1657543130517265 + }, + { + "date" : "2018-05-15T16:00:00", + "unit" : "U", + "value" : 2.0869859379909013 + }, + { + "date" : "2018-05-15T16:05:00", + "unit" : "U", + "value" : 2.0061836656333947 + }, + { + "date" : "2018-05-15T16:10:00", + "unit" : "U", + "value" : 1.9238953054745647 + }, + { + "date" : "2018-05-15T16:15:00", + "unit" : "U", + "value" : 1.8408465292538017 + }, + { + "date" : "2018-05-15T16:20:00", + "unit" : "U", + "value" : 1.7576646941017673 + }, + { + "date" : "2018-05-15T16:25:00", + "unit" : "U", + "value" : 1.6748882348269276 + }, + { + "date" : "2018-05-15T16:30:00", + "unit" : "U", + "value" : 1.5929762431399233 + }, + { + "date" : "2018-05-15T16:35:00", + "unit" : "U", + "value" : 1.5123171313102044 + }, + { + "date" : "2018-05-15T16:40:00", + "unit" : "U", + "value" : 1.4332364621749809 + }, + { + "date" : "2018-05-15T16:45:00", + "unit" : "U", + "value" : 1.3560040203811585 + }, + { + "date" : "2018-05-15T16:50:00", + "unit" : "U", + "value" : 1.2808401932907929 + }, + { + "date" : "2018-05-15T16:55:00", + "unit" : "U", + "value" : 1.2079217240712818 + }, + { + "date" : "2018-05-15T17:00:00", + "unit" : "U", + "value" : 1.1373868940784675 + }, + { + "date" : "2018-05-15T17:05:00", + "unit" : "U", + "value" : 1.0693401866831296 + }, + { + "date" : "2018-05-15T17:10:00", + "unit" : "U", + "value" : 1.0038564801514345 + }, + { + "date" : "2018-05-15T17:15:00", + "unit" : "U", + "value" : 0.94098481303325587 + }, + { + "date" : "2018-05-15T17:20:00", + "unit" : "U", + "value" : 0.88075176170717628 + }, + { + "date" : "2018-05-15T17:25:00", + "unit" : "U", + "value" : 0.82316446624830775 + }, + { + "date" : "2018-05-15T17:30:00", + "unit" : "U", + "value" : 0.7682133375981065 + }, + { + "date" : "2018-05-15T17:35:00", + "unit" : "U", + "value" : 0.71587447609950972 + }, + { + "date" : "2018-05-15T17:40:00", + "unit" : "U", + "value" : 0.66611182879349462 + }, + { + "date" : "2018-05-15T17:45:00", + "unit" : "U", + "value" : 0.61887911043380595 + }, + { + "date" : "2018-05-15T17:50:00", + "unit" : "U", + "value" : 0.57412151094614827 + }, + { + "date" : "2018-05-15T17:55:00", + "unit" : "U", + "value" : 0.53177721001913325 + }, + { + "date" : "2018-05-15T18:00:00", + "unit" : "U", + "value" : 0.49177871765069903 + }, + { + "date" : "2018-05-15T18:05:00", + "unit" : "U", + "value" : 0.45405405777089097 + }, + { + "date" : "2018-05-15T18:10:00", + "unit" : "U", + "value" : 0.41852781050631305 + }, + { + "date" : "2018-05-15T18:15:00", + "unit" : "U", + "value" : 0.38512202723086875 + }, + { + "date" : "2018-05-15T18:20:00", + "unit" : "U", + "value" : 0.35375703125023233 + }, + { + "date" : "2018-05-15T18:25:00", + "unit" : "U", + "value" : 0.3243521157834296 + }, + { + "date" : "2018-05-15T18:30:00", + "unit" : "U", + "value" : 0.29682614982439526 + }, + { + "date" : "2018-05-15T18:35:00", + "unit" : "U", + "value" : 0.27109810148064761 + }, + { + "date" : "2018-05-15T18:40:00", + "unit" : "U", + "value" : 0.24708748748724252 + }, + { + "date" : "2018-05-15T18:45:00", + "unit" : "U", + "value" : 0.22471475677456665 + }, + { + "date" : "2018-05-15T18:50:00", + "unit" : "U", + "value" : 0.20390161522154615 + }, + { + "date" : "2018-05-15T18:55:00", + "unit" : "U", + "value" : 0.184571298045277 + }, + { + "date" : "2018-05-15T19:00:00", + "unit" : "U", + "value" : 0.16664879565826193 + }, + { + "date" : "2018-05-15T19:05:00", + "unit" : "U", + "value" : 0.15006103826013523 + }, + { + "date" : "2018-05-15T19:10:00", + "unit" : "U", + "value" : 0.13473704391723001 + }, + { + "date" : "2018-05-15T19:15:00", + "unit" : "U", + "value" : 0.12060803441618617 + }, + { + "date" : "2018-05-15T19:20:00", + "unit" : "U", + "value" : 0.10760752275303831 + }, + { + "date" : "2018-05-15T19:25:00", + "unit" : "U", + "value" : 0.095671375733160369 + }, + { + "date" : "2018-05-15T19:30:00", + "unit" : "U", + "value" : 0.084737854806747129 + }, + { + "date" : "2018-05-15T19:35:00", + "unit" : "U", + "value" : 0.074747637946072754 + }, + { + "date" : "2018-05-15T19:40:00", + "unit" : "U", + "value" : 0.065643825081797474 + }, + { + "date" : "2018-05-15T19:45:00", + "unit" : "U", + "value" : 0.057371929353482794 + }, + { + "date" : "2018-05-15T19:50:00", + "unit" : "U", + "value" : 0.0498798561918899 + }, + { + "date" : "2018-05-15T19:55:00", + "unit" : "U", + "value" : 0.04311787203539412 + }, + { + "date" : "2018-05-15T20:00:00", + "unit" : "U", + "value" : 0.03703856428799019 + }, + { + "date" : "2018-05-15T20:05:00", + "unit" : "U", + "value" : 0.031596793950053138 + }, + { + "date" : "2018-05-15T20:10:00", + "unit" : "U", + "value" : 0.026749642193648854 + }, + { + "date" : "2018-05-15T20:15:00", + "unit" : "U", + "value" : 0.022456352010185483 + }, + { + "date" : "2018-05-15T20:20:00", + "unit" : "U", + "value" : 0.018678265928236615 + }, + { + "date" : "2018-05-15T20:25:00", + "unit" : "U", + "value" : 0.015378760682142785 + }, + { + "date" : "2018-05-15T20:30:00", + "unit" : "U", + "value" : 0.012523179606376668 + }, + { + "date" : "2018-05-15T20:35:00", + "unit" : "U", + "value" : 0.010078763435580854 + }, + { + "date" : "2018-05-15T20:40:00", + "unit" : "U", + "value" : 0.0080145801046833092 + }, + { + "date" : "2018-05-15T20:45:00", + "unit" : "U", + "value" : 0.0063014540666978987 + }, + { + "date" : "2018-05-15T20:50:00", + "unit" : "U", + "value" : 0.0049061628994142908 + }, + { + "date" : "2018-05-15T20:55:00", + "unit" : "U", + "value" : 0.003790314555342678 + }, + { + "date" : "2018-05-15T21:00:00", + "unit" : "U", + "value" : 0.0028989697490798255 + }, + { + "date" : "2018-05-15T21:05:00", + "unit" : "U", + "value" : 0.0021858386616289212 + }, + { + "date" : "2018-05-15T21:10:00", + "unit" : "U", + "value" : 0.0016213951706374548 + }, + { + "date" : "2018-05-15T21:15:00", + "unit" : "U", + "value" : 0.0011748698803442786 + }, + { + "date" : "2018-05-15T21:20:00", + "unit" : "U", + "value" : 0.0008236024229041905 + }, + { + "date" : "2018-05-15T21:25:00", + "unit" : "U", + "value" : 0.00055393548025383656 + }, + { + "date" : "2018-05-15T21:30:00", + "unit" : "U", + "value" : 0.00035322601755862491 + }, + { + "date" : "2018-05-15T21:35:00", + "unit" : "U", + "value" : 0.00020976022448825627 + }, + { + "date" : "2018-05-15T21:40:00", + "unit" : "U", + "value" : 0.00011270366979644896 + }, + { + "date" : "2018-05-15T21:45:00", + "unit" : "U", + "value" : 5.2053208299390748e-05 + }, + { + "date" : "2018-05-15T21:50:00", + "unit" : "U", + "value" : 1.8590657644046435e-05 + }, + { + "date" : "2018-05-15T21:55:00", + "unit" : "U", + "value" : 3.8382512378587476e-06 + }, + { + "date" : "2018-05-15T22:00:00", + "unit" : "U", + "value" : 1.5864094737860769e-08 + }, + { + "date" : "2018-05-15T22:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T22:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T22:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T22:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T22:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T22:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T22:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T22:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T22:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T22:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T22:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T23:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T23:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T23:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T23:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T23:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T23:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T23:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T23:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T23:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T23:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T23:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-15T23:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T00:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T00:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T00:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T00:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T00:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T00:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T00:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T00:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T00:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T00:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T00:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T00:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T01:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T01:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T01:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T01:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T01:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T01:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T01:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T01:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T01:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T01:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T01:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T01:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T02:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T02:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T02:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T02:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T02:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T02:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T02:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T02:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T02:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T02:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T02:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T02:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T03:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T03:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T03:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T03:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T03:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T03:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T03:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T03:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T03:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T03:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T03:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T03:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T04:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T04:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T04:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T04:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T04:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T04:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T04:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T04:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T04:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T04:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T04:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T04:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T05:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T05:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T05:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T05:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T05:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T05:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T05:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T05:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T05:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T05:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T05:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T05:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T06:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T06:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T06:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T06:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T06:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T06:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T06:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T06:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T06:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T06:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T06:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T06:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T07:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T07:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T07:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T07:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T07:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T07:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T07:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T07:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T07:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T07:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T07:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T07:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T08:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T08:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T08:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T08:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T08:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T08:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T08:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T08:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T08:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T08:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T08:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T08:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T09:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T09:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T09:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T09:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T09:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T09:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T09:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T09:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T09:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T09:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T09:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T09:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T10:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T10:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T10:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T10:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T10:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T10:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T10:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T10:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T10:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T10:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T10:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T10:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T11:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T11:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T11:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T11:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T11:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T11:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T11:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T11:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T11:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T11:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T11:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T11:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T12:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T12:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T12:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T12:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T12:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T12:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T12:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T12:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T12:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T12:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T12:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T12:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T13:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T13:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T13:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T13:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T13:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T13:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T13:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T13:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T13:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T13:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T13:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T13:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T14:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T14:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T14:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T14:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T14:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T14:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T14:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T14:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T14:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T14:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T14:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T14:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T15:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T15:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T15:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T15:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T15:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T15:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T15:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T15:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T15:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T15:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T15:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T15:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T16:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T16:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T16:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T16:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T16:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T16:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T16:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T16:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T16:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T16:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T16:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T16:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T17:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T17:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T17:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T17:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T17:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T17:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T17:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T17:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T17:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T17:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T17:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T17:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T18:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T18:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T18:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T18:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T18:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T18:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T18:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T18:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T18:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T18:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T18:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T18:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T19:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T19:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T19:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T19:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T19:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T19:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T19:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T19:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T19:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T19:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T19:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T19:55:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T20:00:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T20:05:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T20:10:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T20:15:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T20:20:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T20:25:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T20:30:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T20:35:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T20:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T20:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T20:50:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2018-05-16T20:55:00", + "unit" : "U", + "value" : 0 + } +] \ No newline at end of file diff --git a/Tests/LoopAlgorithmTests/Fixtures/iob_from_reservoir_output.json b/Tests/LoopAlgorithmTests/Fixtures/iob_from_reservoir_output.json new file mode 100644 index 0000000..00dde41 --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/iob_from_reservoir_output.json @@ -0,0 +1,557 @@ +[ + { + "date" : "2016-01-30T15:40:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2016-01-30T15:45:00", + "unit" : "U", + "value" : 0.13488888888888889 + }, + { + "date" : "2016-01-30T15:50:00", + "unit" : "U", + "value" : 0.068222222222222226 + }, + { + "date" : "2016-01-30T15:55:00", + "unit" : "U", + "value" : 0.067514484321220022 + }, + { + "date" : "2016-01-30T16:00:00", + "unit" : "U", + "value" : 0.06678896639537546 + }, + { + "date" : "2016-01-30T16:05:00", + "unit" : "U", + "value" : -0.00074881278069904855 + }, + { + "date" : "2016-01-30T16:10:00", + "unit" : "U", + "value" : -0.018427618409960961 + }, + { + "date" : "2016-01-30T16:15:00", + "unit" : "U", + "value" : -0.010875573683178208 + }, + { + "date" : "2016-01-30T16:20:00", + "unit" : "U", + "value" : -0.0029493923329813876 + }, + { + "date" : "2016-01-30T16:25:00", + "unit" : "U", + "value" : -0.020414483345468498 + }, + { + "date" : "2016-01-30T16:30:00", + "unit" : "U", + "value" : 0.062365834815154765 + }, + { + "date" : "2016-01-30T16:35:00", + "unit" : "U", + "value" : 0.14505998900045661 + }, + { + "date" : "2016-01-30T16:40:00", + "unit" : "U", + "value" : 0.32783757546514158 + }, + { + "date" : "2016-01-30T16:45:00", + "unit" : "U", + "value" : 0.4598019301783795 + }, + { + "date" : "2016-01-30T16:50:00", + "unit" : "U", + "value" : 0.59043188942305824 + }, + { + "date" : "2016-01-30T16:55:00", + "unit" : "U", + "value" : 0.74279454295062775 + }, + { + "date" : "2016-01-30T17:00:00", + "unit" : "U", + "value" : 0.91883957574081498 + }, + { + "date" : "2016-01-30T17:05:00", + "unit" : "U", + "value" : 4.7473335690414027 + }, + { + "date" : "2016-01-30T17:10:00", + "unit" : "U", + "value" : 4.7205893142678566 + }, + { + "date" : "2016-01-30T17:15:00", + "unit" : "U", + "value" : 4.6956460306439167 + }, + { + "date" : "2016-01-30T17:20:00", + "unit" : "U", + "value" : 4.6581878823793952 + }, + { + "date" : "2016-01-30T17:25:00", + "unit" : "U", + "value" : 4.5854451394476108 + }, + { + "date" : "2016-01-30T17:30:00", + "unit" : "U", + "value" : 4.6027813624337712 + }, + { + "date" : "2016-01-30T17:35:00", + "unit" : "U", + "value" : 4.6102259682999147 + }, + { + "date" : "2016-01-30T17:40:00", + "unit" : "U", + "value" : 4.5589603458756276 + }, + { + "date" : "2016-01-30T17:45:00", + "unit" : "U", + "value" : 4.548846830954254 + }, + { + "date" : "2016-01-30T17:50:00", + "unit" : "U", + "value" : 4.4565829509093584 + }, + { + "date" : "2016-01-30T17:55:00", + "unit" : "U", + "value" : 4.3325605947143888 + }, + { + "date" : "2016-01-30T18:00:00", + "unit" : "U", + "value" : 4.2267974800496662 + }, + { + "date" : "2016-01-30T18:05:00", + "unit" : "U", + "value" : 5.4155700945160623 + }, + { + "date" : "2016-01-30T18:10:00", + "unit" : "U", + "value" : 5.2494825347097569 + }, + { + "date" : "2016-01-30T18:15:00", + "unit" : "U", + "value" : 5.0467007018788044 + }, + { + "date" : "2016-01-30T18:20:00", + "unit" : "U", + "value" : 4.9041815574952192 + }, + { + "date" : "2016-01-30T18:25:00", + "unit" : "U", + "value" : 4.7641713008881359 + }, + { + "date" : "2016-01-30T18:30:00", + "unit" : "U", + "value" : 4.6196316848788213 + }, + { + "date" : "2016-01-30T18:35:00", + "unit" : "U", + "value" : 4.4708378425452819 + }, + { + "date" : "2016-01-30T18:40:00", + "unit" : "U", + "value" : 4.292838715026746 + }, + { + "date" : "2016-01-30T18:45:00", + "unit" : "U", + "value" : 4.0878775257155624 + }, + { + "date" : "2016-01-30T18:50:00", + "unit" : "U", + "value" : 3.8554187635181547 + }, + { + "date" : "2016-01-30T18:55:00", + "unit" : "U", + "value" : 3.6217340636776383 + }, + { + "date" : "2016-01-30T19:00:00", + "unit" : "U", + "value" : 3.4624685995070617 + }, + { + "date" : "2016-01-30T19:05:00", + "unit" : "U", + "value" : 3.3038194035334003 + }, + { + "date" : "2016-01-30T19:10:00", + "unit" : "U", + "value" : 3.12108881849452 + }, + { + "date" : "2016-01-30T19:15:00", + "unit" : "U", + "value" : 2.9640737031370752 + }, + { + "date" : "2016-01-30T19:20:00", + "unit" : "U", + "value" : 2.8090169147849231 + }, + { + "date" : "2016-01-30T19:25:00", + "unit" : "U", + "value" : 2.6310439784619697 + }, + { + "date" : "2016-01-30T19:30:00", + "unit" : "U", + "value" : 2.7158656703311048 + }, + { + "date" : "2016-01-30T19:35:00", + "unit" : "U", + "value" : 2.8433020866290324 + }, + { + "date" : "2016-01-30T19:40:00", + "unit" : "U", + "value" : 3.4632207817542824 + }, + { + "date" : "2016-01-30T19:45:00", + "unit" : "U", + "value" : 3.3198722041766531 + }, + { + "date" : "2016-01-30T19:50:00", + "unit" : "U", + "value" : 3.1994073575748523 + }, + { + "date" : "2016-01-30T19:55:00", + "unit" : "U", + "value" : 3.1797643299899385 + }, + { + "date" : "2016-01-30T20:00:00", + "unit" : "U", + "value" : 3.1121937375789712 + }, + { + "date" : "2016-01-30T20:05:00", + "unit" : "U", + "value" : 3.1446751787258891 + }, + { + "date" : "2016-01-30T20:10:00", + "unit" : "U", + "value" : 3.1285196330888527 + }, + { + "date" : "2016-01-30T20:15:00", + "unit" : "U", + "value" : 3.1632801791886243 + }, + { + "date" : "2016-01-30T20:20:00", + "unit" : "U", + "value" : 4.1479809029771069 + }, + { + "date" : "2016-01-30T20:25:00", + "unit" : "U", + "value" : 3.9834822751069776 + }, + { + "date" : "2016-01-30T20:30:00", + "unit" : "U", + "value" : 3.8392406781815338 + }, + { + "date" : "2016-01-30T20:35:00", + "unit" : "U", + "value" : 3.6946591732484402 + }, + { + "date" : "2016-01-30T20:40:00", + "unit" : "U", + "value" : 3.5407257995084676 + }, + { + "date" : "2016-01-30T20:45:00", + "unit" : "U", + "value" : 3.3874261680274937 + }, + { + "date" : "2016-01-30T20:50:00", + "unit" : "U", + "value" : 3.2352531696570548 + }, + { + "date" : "2016-01-30T20:55:00", + "unit" : "U", + "value" : 3.085261005079988 + }, + { + "date" : "2016-01-30T21:00:00", + "unit" : "U", + "value" : 2.9372816673332909 + }, + { + "date" : "2016-01-30T21:05:00", + "unit" : "U", + "value" : 2.7907413629475002 + }, + { + "date" : "2016-01-30T21:10:00", + "unit" : "U", + "value" : 2.6471028260569947 + }, + { + "date" : "2016-01-30T21:15:00", + "unit" : "U", + "value" : 2.5111502668268844 + }, + { + "date" : "2016-01-30T21:20:00", + "unit" : "U", + "value" : 2.4064958525345617 + }, + { + "date" : "2016-01-30T21:25:00", + "unit" : "U", + "value" : 2.3012714622124935 + }, + { + "date" : "2016-01-30T21:30:00", + "unit" : "U", + "value" : 2.1960183464844891 + }, + { + "date" : "2016-01-30T21:35:00", + "unit" : "U", + "value" : 2.0910235309730165 + }, + { + "date" : "2016-01-30T21:40:00", + "unit" : "U", + "value" : 1.986502686195295 + }, + { + "date" : "2016-01-30T21:45:00", + "unit" : "U", + "value" : 1.8835249690318872 + }, + { + "date" : "2016-01-30T21:50:00", + "unit" : "U", + "value" : 1.7822280295871071 + }, + { + "date" : "2016-01-30T21:55:00", + "unit" : "U", + "value" : 1.6824769595711171 + }, + { + "date" : "2016-01-30T22:00:00", + "unit" : "U", + "value" : 1.5847700423010984 + }, + { + "date" : "2016-01-30T22:05:00", + "unit" : "U", + "value" : 1.4886582778513744 + }, + { + "date" : "2016-01-30T22:10:00", + "unit" : "U", + "value" : 1.3941551212776522 + }, + { + "date" : "2016-01-30T22:15:00", + "unit" : "U", + "value" : 1.303115763902519 + }, + { + "date" : "2016-01-30T22:20:00", + "unit" : "U", + "value" : 1.2241938781749204 + }, + { + "date" : "2016-01-30T22:25:00", + "unit" : "U", + "value" : 1.1463251788331443 + }, + { + "date" : "2016-01-30T22:30:00", + "unit" : "U", + "value" : 1.0695894037349465 + }, + { + "date" : "2016-01-30T22:35:00", + "unit" : "U", + "value" : 0.99471197396772404 + }, + { + "date" : "2016-01-30T22:40:00", + "unit" : "U", + "value" : 0.92189770714827757 + }, + { + "date" : "2016-01-30T22:45:00", + "unit" : "U", + "value" : 0.85127298068876722 + }, + { + "date" : "2016-01-30T22:50:00", + "unit" : "U", + "value" : 0.78291513570575266 + }, + { + "date" : "2016-01-30T22:55:00", + "unit" : "U", + "value" : 0.71669318624836187 + }, + { + "date" : "2016-01-30T23:00:00", + "unit" : "U", + "value" : 0.65247840707485749 + }, + { + "date" : "2016-01-30T23:05:00", + "unit" : "U", + "value" : 0.59016663173339567 + }, + { + "date" : "2016-01-30T23:10:00", + "unit" : "U", + "value" : 0.52993154731493231 + }, + { + "date" : "2016-01-30T23:15:00", + "unit" : "U", + "value" : 0.47241619989047379 + }, + { + "date" : "2016-01-30T23:20:00", + "unit" : "U", + "value" : 0.41760095998118058 + }, + { + "date" : "2016-01-30T23:25:00", + "unit" : "U", + "value" : 0.36531374345888057 + }, + { + "date" : "2016-01-30T23:30:00", + "unit" : "U", + "value" : 0.31573377830312777 + }, + { + "date" : "2016-01-30T23:35:00", + "unit" : "U", + "value" : 0.26879376195107563 + }, + { + "date" : "2016-01-30T23:40:00", + "unit" : "U", + "value" : 0.22326696667877355 + }, + { + "date" : "2016-01-30T23:45:00", + "unit" : "U", + "value" : 0.18282221358519934 + }, + { + "date" : "2016-01-30T23:50:00", + "unit" : "U", + "value" : 0.14905533718034986 + }, + { + "date" : "2016-01-30T23:55:00", + "unit" : "U", + "value" : 0.12297488953685366 + }, + { + "date" : "2016-01-31T00:00:00", + "unit" : "U", + "value" : 0.098520190008746233 + }, + { + "date" : "2016-01-31T00:05:00", + "unit" : "U", + "value" : 0.075947521254802516 + }, + { + "date" : "2016-01-31T00:10:00", + "unit" : "U", + "value" : 0.05589249490473374 + }, + { + "date" : "2016-01-31T00:15:00", + "unit" : "U", + "value" : 0.037949724121158643 + }, + { + "date" : "2016-01-31T00:20:00", + "unit" : "U", + "value" : 0.022714114635155692 + }, + { + "date" : "2016-01-31T00:25:00", + "unit" : "U", + "value" : 0.0096951335481437178 + }, + { + "date" : "2016-01-31T00:30:00", + "unit" : "U", + "value" : 0.0002680112283814255 + }, + { + "date" : "2016-01-31T00:35:00", + "unit" : "U", + "value" : 0.00022992226001462311 + }, + { + "date" : "2016-01-31T00:40:00", + "unit" : "U", + "value" : 7.3444943720727971e-05 + }, + { + "date" : "2016-01-31T00:45:00", + "unit" : "U", + "value" : 0 + }, + { + "date" : "2016-01-31T00:50:00", + "unit" : "U", + "value" : 0 + } +] \ No newline at end of file diff --git a/Tests/LoopAlgorithmTests/Fixtures/normalize_edge_case_doses_input.json b/Tests/LoopAlgorithmTests/Fixtures/normalize_edge_case_doses_input.json new file mode 100644 index 0000000..5f1b6ab --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/normalize_edge_case_doses_input.json @@ -0,0 +1,16 @@ +[ + { + "type": "TempBasal", + "start_at": "2015-07-12T23:59:59", + "end_at": "2015-07-13T07:54:00", + "amount": 2.0, + "unit": "U/hour" + }, + { + "type": "Bolus", + "start_at": "2015-07-13T11:00:00", + "end_at": "2015-07-13T11:00:00", + "amount": 3.0, + "unit": "U" + } +] \ No newline at end of file diff --git a/Tests/LoopAlgorithmTests/Fixtures/normalize_edge_case_doses_mutable_input.json b/Tests/LoopAlgorithmTests/Fixtures/normalize_edge_case_doses_mutable_input.json new file mode 100644 index 0000000..329f46b --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/normalize_edge_case_doses_mutable_input.json @@ -0,0 +1,18 @@ +[ + { + "type": "TempBasal", + "start_at": "2015-07-12T23:59:59", + "end_at": "2015-07-13T07:54:00", + "amount": 2.0, + "unit": "U/hour", + "isMutable": true + }, + { + "type": "Bolus", + "start_at": "2015-07-13T11:00:00", + "end_at": "2015-07-13T11:00:00", + "amount": 3.0, + "unit": "U", + "isMutable": true + } +] diff --git a/Tests/LoopAlgorithmTests/Fixtures/normalize_edge_case_doses_mutable_output.json b/Tests/LoopAlgorithmTests/Fixtures/normalize_edge_case_doses_mutable_output.json new file mode 100644 index 0000000..583c312 --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/normalize_edge_case_doses_mutable_output.json @@ -0,0 +1,42 @@ +[ + { + "type": "TempBasal", + "start_at": "2015-07-12T23:59:59", + "end_at": "2015-07-13T00:00:00", + "amount": 1.1, + "unit": "U/hour", + "isMutable": true + }, + { + "type": "TempBasal", + "start_at": "2015-07-13T00:00:00", + "end_at": "2015-07-13T04:00:00", + "amount": 1.1, + "unit": "U/hour", + "isMutable": true + }, + { + "type": "TempBasal", + "start_at": "2015-07-13T04:00:00", + "end_at": "2015-07-13T07:00:00", + "amount": 1.075, + "unit": "U/hour", + "isMutable": true + }, + { + "type": "TempBasal", + "start_at": "2015-07-13T07:00:00", + "end_at": "2015-07-13T07:54:00", + "amount": 1.15, + "unit": "U/hour", + "isMutable": true + }, + { + "type": "Bolus", + "start_at": "2015-07-13T11:00:00", + "end_at": "2015-07-13T11:00:00", + "amount": 3.0, + "unit": "U", + "isMutable": true + } +] diff --git a/Tests/LoopAlgorithmTests/Fixtures/normalize_edge_case_doses_output.json b/Tests/LoopAlgorithmTests/Fixtures/normalize_edge_case_doses_output.json new file mode 100644 index 0000000..52f0943 --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/normalize_edge_case_doses_output.json @@ -0,0 +1,37 @@ +[ + { + "type": "TempBasal", + "start_at": "2015-07-12T23:59:59", + "end_at": "2015-07-13T00:00:00", + "amount": 1.1, + "unit": "U/hour" + }, + { + "type": "TempBasal", + "start_at": "2015-07-13T00:00:00", + "end_at": "2015-07-13T04:00:00", + "amount": 1.1, + "unit": "U/hour" + }, + { + "type": "TempBasal", + "start_at": "2015-07-13T04:00:00", + "end_at": "2015-07-13T07:00:00", + "amount": 1.075, + "unit": "U/hour" + }, + { + "type": "TempBasal", + "start_at": "2015-07-13T07:00:00", + "end_at": "2015-07-13T07:54:00", + "amount": 1.15, + "unit": "U/hour" + }, + { + "type": "Bolus", + "start_at": "2015-07-13T11:00:00", + "end_at": "2015-07-13T11:00:00", + "amount": 3.0, + "unit": "U" + } +] \ No newline at end of file diff --git a/Tests/LoopAlgorithmTests/Fixtures/normalized_doses.json b/Tests/LoopAlgorithmTests/Fixtures/normalized_doses.json new file mode 100644 index 0000000..127adea --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/normalized_doses.json @@ -0,0 +1,171 @@ +[ + { + "amount": 3.225, + "start_at": "2015-10-15T22:00:00", + "description": "TempBasal: 3.125U/hour over 30min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T22:29:50", + "scheduled": 1.0, + "isMutable": true + }, + { + "amount": 3.325, + "start_at": "2015-10-15T21:59:50", + "description": "TempBasal: 3.125U/hour over 30min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T22:00:00", + "scheduled": 1.0 + }, + { + "amount": 1.09999999999999998, + "start_at": "2015-10-15T21:39:49", + "description": "TempBasal: 0.9U/hour over 4min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T21:43:49", + "scheduled": 1.0 + }, + { + "start_at": "2015-10-15T21:35:12", + "description": "Normal bolus: 4.0U", + "end_at": "2015-10-15T21:35:12", + "amount": 4.0, + "type": "Bolus", + "unit": "U" + }, + { + "amount": 2.075, + "start_at": "2015-10-15T21:04:34", + "description": "TempBasal: 1.875U/hour over 10min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T21:14:34", + "scheduled": 1.0 + }, + { + "amount": 2.7, + "start_at": "2015-10-15T21:00:04", + "description": "TempBasal: 2.5U/hour over 4min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T21:04:04", + "scheduled": 1.0 + }, + { + "amount": 0.0, + "start_at": "2015-10-15T20:39:52", + "description": "TempBasal: 0.0U/hour over 20min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T20:59:52", + "scheduled": 0.8 + }, + { + "amount": 0.05, + "start_at": "2015-10-15T20:34:34", + "description": "TempBasal: 0.05U/hour over 5min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T20:39:34", + "scheduled": 0.8 + }, + { + "amount": 0.95, + "start_at": "2015-10-15T20:29:51", + "description": "TempBasal: 0.75U/hour over 4min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T20:33:51", + "scheduled": 1.0 + }, + { + "amount": 1.375, + "start_at": "2015-10-15T20:14:37", + "description": "TempBasal: 1.175U/hour over 5min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T20:19:37", + "scheduled": 1.0 + }, + { + "amount": 2.075, + "start_at": "2015-10-15T20:09:52", + "description": "TempBasal: 1.875U/hour over 4min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T20:13:52", + "scheduled": 1.0 + }, + { + "start_at": "2015-10-15T20:05:10", + "description": "Normal bolus: 3.3U", + "end_at": "2015-10-15T20:05:10", + "amount": 3.3, + "type": "Bolus", + "unit": "U" + }, + { + "amount": 3.7, + "start_at": "2015-10-15T19:54:51", + "description": "TempBasal: 3.5U/hour over 15min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T20:09:51", + "scheduled": 1.0 + }, + { + "start_at": "2015-10-15T19:25:54", + "description": "Normal bolus: 5.0U", + "end_at": "2015-10-15T19:25:54", + "amount": 5.0, + "type": "Bolus", + "unit": "U" + }, + { + "amount": 3.7, + "start_at": "2015-10-15T19:24:52", + "description": "TempBasal: 3.5U/hour over 29min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T19:53:52", + "scheduled": 1.0 + }, + { + "amount": 0.4, + "start_at": "2015-10-15T19:19:39", + "description": "TempBasal: 0.2U/hour over 5min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T19:24:39", + "scheduled": 1.0 + }, + { + "amount": 0.2, + "start_at": "2015-10-15T19:00:07", + "description": "TempBasal: 0.0U/hour over 19min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T19:19:07", + "scheduled": 1.0 + }, + { + "amount": 0.0, + "start_at": "2015-10-15T18:14:54", + "description": "TempBasal: 0.0U/hour over 30min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T18:44:54", + "scheduled": 0.8 + }, + { + "amount": 0.775, + "start_at": "2015-10-15T18:09:35", + "description": "TempBasal: 0.575U/hour over 5min", + "type": "TempBasal", + "unit": "U/hour", + "end_at": "2015-10-15T18:14:35", + "scheduled": 1.0 + } +] diff --git a/Tests/LoopAlgorithmTests/Fixtures/normalized_reservoir_history_output.json b/Tests/LoopAlgorithmTests/Fixtures/normalized_reservoir_history_output.json new file mode 100644 index 0000000..131d0cc --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/normalized_reservoir_history_output.json @@ -0,0 +1,434 @@ +[ + { + "start_at" : "2016-01-30T20:30:43", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T20:35:41", + "type" : "TempBasal", + "amount" : 0.90604026845637575, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T20:25:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T20:30:43", + "type" : "TempBasal", + "amount" : 0.89700996677740863, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T20:20:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T20:25:42", + "type" : "TempBasal", + "amount" : 0.60000000000000009, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T20:15:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T20:20:42", + "type" : "TempBasal", + "amount" : 14.352159468438538, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T20:10:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T20:15:41", + "type" : "TempBasal", + "amount" : 3.0100334448160533, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T20:05:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T20:10:42", + "type" : "TempBasal", + "amount" : 2.4000000000000004, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T20:00:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T20:05:42", + "type" : "TempBasal", + "amount" : 2.9900332225913622, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T19:55:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T20:00:41", + "type" : "TempBasal", + "amount" : 1.8, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T19:50:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T19:55:41", + "type" : "TempBasal", + "amount" : 2.4000000000000004, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T19:45:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T19:50:41", + "type" : "TempBasal", + "amount" : 1.2000000000000002, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T19:40:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T19:45:41", + "type" : "TempBasal", + "amount" : 0.90000000000000002, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T19:35:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T19:40:41", + "type" : "TempBasal", + "amount" : 9.6321070234113702, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T19:25:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T19:35:42", + "type" : "TempBasal", + "amount" : 4.2000000000000002, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T19:20:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T19:25:42", + "type" : "TempBasal", + "amount" : 0.60000000000000009, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T19:15:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T19:20:42", + "type" : "TempBasal", + "amount" : 0.90000000000000002, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T19:10:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T19:15:42", + "type" : "TempBasal", + "amount" : 0.89700996677740863, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T19:05:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T19:10:41", + "type" : "TempBasal", + "amount" : 0.60200668896321063, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T19:00:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T19:05:42", + "type" : "TempBasal", + "amount" : 0.90000000000000002, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T18:55:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T19:00:42", + "type" : "TempBasal", + "amount" : 0.89700996677740863, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T18:50:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T18:55:41", + "type" : "TempBasal", + "amount" : 0, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T18:45:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T18:50:41", + "type" : "TempBasal", + "amount" : 0, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T18:40:43", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T18:45:41", + "type" : "TempBasal", + "amount" : 0.30201342281879195, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T18:35:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T18:40:43", + "type" : "TempBasal", + "amount" : 0.59602649006622521, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T18:30:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T18:35:41", + "type" : "TempBasal", + "amount" : 0.9030100334448159, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T18:25:43", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T18:30:42", + "type" : "TempBasal", + "amount" : 0.9030100334448159, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T18:20:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T18:25:43", + "type" : "TempBasal", + "amount" : 0.89700996677740863, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T18:10:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T18:15:44", + "type" : "TempBasal", + "amount" : 0, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T18:05:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T18:10:42", + "type" : "TempBasal", + "amount" : 0.30000000000000004, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T18:00:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T18:05:42", + "type" : "TempBasal", + "amount" : 16.5, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T17:55:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T18:00:42", + "type" : "TempBasal", + "amount" : 0.90000000000000002, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T17:50:44", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T17:55:42", + "type" : "TempBasal", + "amount" : 0.60402684563758391, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T17:45:44", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T17:50:44", + "type" : "TempBasal", + "amount" : 0.90000000000000002, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T17:40:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T17:45:44", + "type" : "TempBasal", + "amount" : 1.7880794701986755, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T17:35:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T17:40:42", + "type" : "TempBasal", + "amount" : 1.2000000000000002, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T17:30:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T17:35:42", + "type" : "TempBasal", + "amount" : 1.7940199335548173, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T17:25:43", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T17:30:41", + "type" : "TempBasal", + "amount" : 1.8120805369127515, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T17:20:44", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T17:25:43", + "type" : "TempBasal", + "amount" : 0.60200668896321063, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T17:15:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T17:20:44", + "type" : "TempBasal", + "amount" : 0.89403973509933776, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T17:10:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T17:15:42", + "type" : "TempBasal", + "amount" : 0.89700996677740863, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T17:05:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T17:10:41", + "type" : "TempBasal", + "amount" : 0.60200668896321063, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T17:00:45", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T17:05:42", + "type" : "TempBasal", + "amount" : 46.969696969696969, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T16:50:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T17:00:45", + "type" : "TempBasal", + "amount" : 2.9850746268656714, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T16:45:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T16:50:42", + "type" : "TempBasal", + "amount" : 2.4000000000000004, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T16:40:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T16:45:42", + "type" : "TempBasal", + "amount" : 2.4000000000000004, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T16:35:43", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T16:40:42", + "type" : "TempBasal", + "amount" : 3.0100334448160533, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T16:30:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T16:35:43", + "type" : "TempBasal", + "amount" : 1.7940199335548173, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T16:25:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T16:30:42", + "type" : "TempBasal", + "amount" : 1.8, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T16:20:41", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T16:25:42", + "type" : "TempBasal", + "amount" : 0.59800664451827246, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T16:15:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T16:20:41", + "type" : "TempBasal", + "amount" : 0.9030100334448159, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T16:10:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T16:15:42", + "type" : "TempBasal", + "amount" : 0.90000000000000002, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T16:05:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T16:10:42", + "type" : "TempBasal", + "amount" : 0.60000000000000009, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T16:00:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T16:05:42", + "type" : "TempBasal", + "amount" : 0, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T15:45:42", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T15:50:42", + "type" : "TempBasal", + "amount" : 0, + "unit" : "U/hour" + }, + { + "start_at" : "2016-01-30T15:40:49", + "scheduled" : 0.80000000000000004, + "end_at" : "2016-01-30T15:45:42", + "type" : "TempBasal", + "amount" : 2.4573378839590441, + "unit" : "U/hour" + } +] diff --git a/Tests/LoopAlgorithmTests/Fixtures/reservoir_history_with_rewind_and_prime_output.json b/Tests/LoopAlgorithmTests/Fixtures/reservoir_history_with_rewind_and_prime_output.json new file mode 100644 index 0000000..ff5dbd2 --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/reservoir_history_with_rewind_and_prime_output.json @@ -0,0 +1,434 @@ +[ + { + "amount": 0.075, + "start_at": "2016-01-30T20:30:43", + "description": "Reservoir decreased 0.075U over 4.97min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T20:35:41" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T20:25:42", + "description": "Reservoir decreased 0.075U over 5.02min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T20:30:43" + }, + { + "amount": 0.05, + "start_at": "2016-01-30T20:20:42", + "description": "Reservoir decreased 0.05U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T20:25:42" + }, + { + "amount": 1.2, + "start_at": "2016-01-30T20:15:41", + "description": "Reservoir decreased 1.2U over 5.02min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T20:20:42" + }, + { + "amount": 0.25, + "start_at": "2016-01-30T20:10:42", + "description": "Reservoir decreased 0.25U over 4.98min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T20:15:41" + }, + { + "amount": 0.2, + "start_at": "2016-01-30T20:05:42", + "description": "Reservoir decreased 0.2U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T20:10:42" + }, + { + "amount": 0.25, + "start_at": "2016-01-30T20:00:41", + "description": "Reservoir decreased 0.25U over 5.02min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T20:05:42" + }, + { + "amount": 0.15, + "start_at": "2016-01-30T19:55:41", + "description": "Reservoir decreased 0.15U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T20:00:41" + }, + { + "amount": 0.2, + "start_at": "2016-01-30T19:50:41", + "description": "Reservoir decreased 0.2U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T19:55:41" + }, + { + "amount": 0.1, + "start_at": "2016-01-30T19:45:41", + "description": "Reservoir decreased 0.1U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T19:50:41" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T19:40:41", + "description": "Reservoir decreased 0.075U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T19:45:41" + }, + { + "amount": 0.80, + "start_at": "2016-01-30T19:35:42", + "description": "Reservoir decreased 0.80U over 4.98min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T19:40:41" + }, + { + "amount": 0.7, + "start_at": "2016-01-30T19:25:42", + "description": "Reservoir decreased 0.7U over 10.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T19:35:42" + }, + { + "amount": 0.05, + "start_at": "2016-01-30T19:20:42", + "description": "Reservoir decreased 0.05U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T19:25:42" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T19:15:42", + "description": "Reservoir decreased 0.075U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T19:20:42" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T19:10:41", + "description": "Reservoir decreased 0.075U over 5.02min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T19:15:42" + }, + { + "amount": 0.05, + "start_at": "2016-01-30T19:05:42", + "description": "Reservoir decreased 0.05U over 4.98min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T19:10:41" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T19:00:42", + "description": "Reservoir decreased 0.075U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T19:05:42" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T18:55:41", + "description": "Reservoir decreased 0.075U over 5.02min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T19:00:42" + }, + { + "amount": 0.0, + "start_at": "2016-01-30T18:50:41", + "description": "Reservoir decreased 0.0U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T18:55:41" + }, + { + "amount": 0.0, + "start_at": "2016-01-30T18:45:41", + "description": "Reservoir decreased 0.0U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T18:50:41" + }, + { + "amount": 0.025, + "start_at": "2016-01-30T18:40:43", + "description": "Reservoir decreased 0.025U over 4.97min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T18:45:41" + }, + { + "amount": 0.05, + "start_at": "2016-01-30T18:35:41", + "description": "Reservoir decreased 0.05U over 5.03min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T18:40:43" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T18:30:42", + "description": "Reservoir decreased 0.075U over 4.98min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T18:35:41" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T18:25:43", + "description": "Reservoir decreased 0.075U over 4.98min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T18:30:42" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T18:20:42", + "description": "Reservoir decreased 0.075U over 5.02min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T18:25:43" + }, + { + "amount": 0.0, + "start_at": "2016-01-30T18:10:42", + "description": "Reservoir decreased 0.0U over 5.03min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T18:15:44" + }, + { + "amount": 0.025, + "start_at": "2016-01-30T18:05:42", + "description": "Reservoir decreased 0.025U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T18:10:42" + }, + { + "amount": 1.375, + "start_at": "2016-01-30T18:00:42", + "description": "Reservoir decreased 1.375U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T18:05:42" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T17:55:42", + "description": "Reservoir decreased 0.075U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T18:00:42" + }, + { + "amount": 0.05, + "start_at": "2016-01-30T17:50:44", + "description": "Reservoir decreased 0.05U over 4.97min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T17:55:42" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T17:45:44", + "description": "Reservoir decreased 0.075U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T17:50:44" + }, + { + "amount": 0.15, + "start_at": "2016-01-30T17:40:42", + "description": "Reservoir decreased 0.15U over 5.03min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T17:45:44" + }, + { + "amount": 0.1, + "start_at": "2016-01-30T17:35:42", + "description": "Reservoir decreased 0.1U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T17:40:42" + }, + { + "amount": 0.15, + "start_at": "2016-01-30T17:30:41", + "description": "Reservoir decreased 0.15U over 5.02min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T17:35:42" + }, + { + "amount": 0.15, + "start_at": "2016-01-30T17:25:43", + "description": "Reservoir decreased 0.15U over 4.97min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T17:30:41" + }, + { + "amount": 0.05, + "start_at": "2016-01-30T17:20:44", + "description": "Reservoir decreased 0.05U over 4.98min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T17:25:43" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T17:15:42", + "description": "Reservoir decreased 0.075U over 5.03min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T17:20:44" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T17:10:41", + "description": "Reservoir decreased 0.075U over 5.02min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T17:15:42" + }, + { + "amount": 0.05, + "start_at": "2016-01-30T17:05:42", + "description": "Reservoir decreased 0.05U over 4.98min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T17:10:41" + }, + { + "amount": 3.875, + "start_at": "2016-01-30T17:00:45", + "description": "Reservoir decreased 3.875U over 4.95min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T17:05:42" + }, + { + "amount": 0.5, + "start_at": "2016-01-30T16:50:42", + "description": "Reservoir decreased 0.5U over 10.05min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T17:00:45" + }, + { + "amount": 0.2, + "start_at": "2016-01-30T16:45:42", + "description": "Reservoir decreased 0.2U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T16:50:42" + }, + { + "amount": 0.2, + "start_at": "2016-01-30T16:40:42", + "description": "Reservoir decreased 0.2U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T16:45:42" + }, + { + "amount": 0.25, + "start_at": "2016-01-30T16:35:43", + "description": "Reservoir decreased 0.25U over 4.98min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T16:40:42" + }, + { + "amount": 0.15, + "start_at": "2016-01-30T16:30:42", + "description": "Reservoir decreased 0.15U over 5.02min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T16:35:43" + }, + { + "amount": 0.15, + "start_at": "2016-01-30T16:25:42", + "description": "Reservoir decreased 0.15U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T16:30:42" + }, + { + "amount": 0.05, + "start_at": "2016-01-30T16:20:41", + "description": "Reservoir decreased 0.05U over 5.02min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T16:25:42" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T16:15:42", + "description": "Reservoir decreased 0.075U over 4.98min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T16:20:41" + }, + { + "amount": 0.075, + "start_at": "2016-01-30T16:10:42", + "description": "Reservoir decreased 0.075U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T16:15:42" + }, + { + "amount": 0.05, + "start_at": "2016-01-30T16:05:42", + "description": "Reservoir decreased 0.05U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T16:10:42" + }, + { + "amount": 0.0, + "start_at": "2016-01-30T16:00:42", + "description": "Reservoir decreased 0.0U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T16:05:42" + }, + { + "amount": 0.0, + "start_at": "2016-01-30T15:45:42", + "description": "Reservoir decreased 0.0U over 5.00min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T15:50:42" + }, + { + "amount": 0.2, + "start_at": "2016-01-30T15:40:49", + "description": "Reservoir decreased 0.2U over 4.88min", + "type": "TempBasal", + "unit": "U", + "end_at": "2016-01-30T15:45:42" + } +] diff --git a/Tests/LoopAlgorithmTests/Fixtures/suspend_dose_reconciled.json b/Tests/LoopAlgorithmTests/Fixtures/suspend_dose_reconciled.json new file mode 100644 index 0000000..513f3c6 --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/suspend_dose_reconciled.json @@ -0,0 +1,9 @@ +[ + { + "type": "PumpSuspend", + "start_at": "2015-07-13T12:00:00", + "end_at": "2015-07-13T12:00:00", + "amount": 0.0, + "unit": "U" + } +] diff --git a/Tests/LoopAlgorithmTests/Fixtures/suspend_dose_reconciled_normalized.json b/Tests/LoopAlgorithmTests/Fixtures/suspend_dose_reconciled_normalized.json new file mode 100644 index 0000000..c33e93c --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/suspend_dose_reconciled_normalized.json @@ -0,0 +1,9 @@ +[ + { + "type": "TempBasal", + "start_at": "2015-07-13T12:00:00", + "end_at": "2015-07-13T12:00:00", + "amount": 0, + "unit": "U/hour" + } +] diff --git a/Tests/LoopAlgorithmTests/Fixtures/suspend_dose_reconciled_normalized_iob.json b/Tests/LoopAlgorithmTests/Fixtures/suspend_dose_reconciled_normalized_iob.json new file mode 100644 index 0000000..2b0f383 --- /dev/null +++ b/Tests/LoopAlgorithmTests/Fixtures/suspend_dose_reconciled_normalized_iob.json @@ -0,0 +1 @@ +[{"unit":"U","date":"2015-07-13T12:00:00","value":0},{"unit":"U","date":"2015-07-13T12:05:00","value":0},{"unit":"U","date":"2015-07-13T12:10:00","value":0},{"unit":"U","date":"2015-07-13T12:15:00","value":0},{"unit":"U","date":"2015-07-13T12:20:00","value":0},{"unit":"U","date":"2015-07-13T12:25:00","value":0},{"unit":"U","date":"2015-07-13T12:30:00","value":0},{"unit":"U","date":"2015-07-13T12:35:00","value":0},{"unit":"U","date":"2015-07-13T12:40:00","value":0},{"unit":"U","date":"2015-07-13T12:45:00","value":0},{"unit":"U","date":"2015-07-13T12:50:00","value":0},{"unit":"U","date":"2015-07-13T12:55:00","value":0},{"unit":"U","date":"2015-07-13T13:00:00","value":0},{"unit":"U","date":"2015-07-13T13:05:00","value":0},{"unit":"U","date":"2015-07-13T13:10:00","value":0},{"unit":"U","date":"2015-07-13T13:15:00","value":0},{"unit":"U","date":"2015-07-13T13:20:00","value":0},{"unit":"U","date":"2015-07-13T13:25:00","value":0},{"unit":"U","date":"2015-07-13T13:30:00","value":0},{"unit":"U","date":"2015-07-13T13:35:00","value":0},{"unit":"U","date":"2015-07-13T13:40:00","value":0},{"unit":"U","date":"2015-07-13T13:45:00","value":0},{"unit":"U","date":"2015-07-13T13:50:00","value":0},{"unit":"U","date":"2015-07-13T13:55:00","value":0},{"unit":"U","date":"2015-07-13T14:00:00","value":0},{"unit":"U","date":"2015-07-13T14:05:00","value":0},{"unit":"U","date":"2015-07-13T14:10:00","value":0},{"unit":"U","date":"2015-07-13T14:15:00","value":0},{"unit":"U","date":"2015-07-13T14:20:00","value":0},{"unit":"U","date":"2015-07-13T14:25:00","value":0},{"unit":"U","date":"2015-07-13T14:30:00","value":0},{"unit":"U","date":"2015-07-13T14:35:00","value":0},{"unit":"U","date":"2015-07-13T14:40:00","value":0},{"unit":"U","date":"2015-07-13T14:45:00","value":0},{"unit":"U","date":"2015-07-13T14:50:00","value":0},{"unit":"U","date":"2015-07-13T14:55:00","value":0},{"unit":"U","date":"2015-07-13T15:00:00","value":0},{"unit":"U","date":"2015-07-13T15:05:00","value":0},{"unit":"U","date":"2015-07-13T15:10:00","value":0},{"unit":"U","date":"2015-07-13T15:15:00","value":0},{"unit":"U","date":"2015-07-13T15:20:00","value":0},{"unit":"U","date":"2015-07-13T15:25:00","value":0},{"unit":"U","date":"2015-07-13T15:30:00","value":0},{"unit":"U","date":"2015-07-13T15:35:00","value":0},{"unit":"U","date":"2015-07-13T15:40:00","value":0},{"unit":"U","date":"2015-07-13T15:45:00","value":0},{"unit":"U","date":"2015-07-13T15:50:00","value":0},{"unit":"U","date":"2015-07-13T15:55:00","value":0},{"unit":"U","date":"2015-07-13T16:00:00","value":0},{"unit":"U","date":"2015-07-13T16:05:00","value":0},{"unit":"U","date":"2015-07-13T16:10:00","value":0}]