| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- //
- // TestingScenario.swift
- // LoopTestingKit
- //
- // Created by Michael Pangburn on 4/20/19.
- // Copyright © 2019 LoopKit Authors. All rights reserved.
- //
- import Foundation
- import LoopKit
- public struct ReloadManager: Codable {
- public let pump: Bool?
- public let cgm: Bool?
- }
- public struct TestingScenario {
- var dateRelativeGlucoseSamples: [DateRelativeGlucoseSample]
- var dateRelativeBasalEntries: [DateRelativeBasalEntry]
- var dateRelativeBolusEntries: [DateRelativeBolusEntry]
- var dateRelativeCarbEntries: [DateRelativeCarbEntry]
- var deviceActions: [DeviceAction]?
- var shouldReloadManager: ReloadManager?
-
- public func instantiate(relativeTo referenceDate: Date = Date()) -> TestingScenarioInstance {
- let glucoseSamples = dateRelativeGlucoseSamples
- .map { $0.newGlucoseSample(relativeTo: referenceDate) }
- let pastGlucoseSamples = glucoseSamples.filter { $0.date <= referenceDate }
- let futureGlucoseSamples = glucoseSamples.filter { $0.date > referenceDate }
- let basalEntries = dateRelativeBasalEntries.map { $0.newPumpEvent(relativeTo: referenceDate) }
- let bolusEntries = dateRelativeBolusEntries.map { $0.newPumpEvent(relativeTo: referenceDate) }
- let pumpEvents = (basalEntries + bolusEntries)
- .filter { $0.date <= referenceDate }
- .sorted(by: { $0.date < $1.date })
- let carbEntries = dateRelativeCarbEntries
- .filter { $0.enteredAt(relativeTo: referenceDate) <= referenceDate }
- .map { $0.newCarbEntry(relativeTo: referenceDate) }
- return TestingScenarioInstance(pastGlucoseSamples: pastGlucoseSamples, futureGlucoseSamples: futureGlucoseSamples, pumpEvents: pumpEvents, carbEntries: carbEntries, deviceActions: deviceActions ?? [], shouldReloadManager: shouldReloadManager)
- }
- public mutating func stepBackward(by offset: TimeInterval) {
- assert(offset > 0)
- shift(by: offset)
- }
- public mutating func stepForward(by offset: TimeInterval) {
- assert(offset > 0)
- shift(by: -offset)
- }
- public mutating func stepForward(
- unitsPerHour: Double,
- duration: TimeInterval,
- dateOffset: TimeInterval = 0,
- loopInterval: TimeInterval = 60 * 5 /* minutes */
- ) {
- precondition(duration > 0)
- dateRelativeBasalEntries.removeAll(where: { $0.dateOffset >= dateOffset })
- let basal = DateRelativeBasalEntry(unitsPerHourValue: unitsPerHour, dateOffset: dateOffset, duration: duration)
- dateRelativeBasalEntries.append(basal)
- stepForward(by: loopInterval)
- }
- mutating func shift(by offset: TimeInterval) {
- dateRelativeGlucoseSamples.mutateEach { $0.shift(by: offset) }
- dateRelativeBasalEntries.mutateEach { $0.shift(by: offset) }
- dateRelativeBolusEntries.mutateEach { $0.shift(by: offset) }
- dateRelativeCarbEntries.mutateEach { $0.shift(by: offset) }
- }
- }
- extension TestingScenario: Codable {
- public enum CodingKeys: String, CodingKey {
- case dateRelativeGlucoseSamples = "glucoseValues"
- case dateRelativeBasalEntries = "basalDoses"
- case dateRelativeBolusEntries = "bolusDoses"
- case dateRelativeCarbEntries = "carbEntries"
- case deviceActions = "deviceActions"
- case shouldReloadManager = "reloadManager"
- }
- }
- extension TestingScenario {
- public init(source: URL) throws {
- let decoder = JSONDecoder()
- let data = try Data(contentsOf: source)
- self = try decoder.decode(TestingScenario.self, from: data)
- }
- }
|