| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 |
- //
- // TherapySettingsTests.swift
- // LoopKitTests
- //
- // Created by Anna Quinlan on 7/27/20.
- // Copyright © 2020 LoopKit Authors. All rights reserved.
- //
- import XCTest
- import LoopKit
- class TherapySettingsTests: XCTestCase {
- private let dateFormatter = ISO8601DateFormatter()
- let date = Date(timeIntervalSince1970: 100000)
-
- private let encoder: JSONEncoder = {
- let encoder = JSONEncoder()
- encoder.outputFormatting = [.prettyPrinted, .sortedKeys, .withoutEscapingSlashes]
- encoder.dateEncodingStrategy = .iso8601
- return encoder
- }()
-
- private let decoder: JSONDecoder = {
- let decoder = JSONDecoder()
- decoder.dateDecodingStrategy = .iso8601
- return decoder
- }()
-
- private func getTherapySettings() -> TherapySettings {
- let timeZone = TimeZone(identifier: "America/Los_Angeles")!
- let glucoseTargetRangeSchedule = GlucoseRangeSchedule(
- rangeSchedule: DailyQuantitySchedule(unit: .milligramsPerDeciliter,
- dailyItems: [RepeatingScheduleValue(startTime: .hours(0), value: DoubleRange(minValue: 100.0, maxValue: 110.0)),
- RepeatingScheduleValue(startTime: .hours(8), value: DoubleRange(minValue: 95.0, maxValue: 105.0)),
- RepeatingScheduleValue(startTime: .hours(14), value: DoubleRange(minValue: 95.0, maxValue: 105.0)),
- RepeatingScheduleValue(startTime: .hours(16), value: DoubleRange(minValue: 100.0, maxValue: 110.0)),
- RepeatingScheduleValue(startTime: .hours(18), value: DoubleRange(minValue: 90.0, maxValue: 100.0)),
- RepeatingScheduleValue(startTime: .hours(21), value: DoubleRange(minValue: 110.0, maxValue: 120.0))],
- timeZone: timeZone)!,
- override: GlucoseRangeSchedule.Override(value: DoubleRange(minValue: 80.0, maxValue: 90.0),
- start: date.addingTimeInterval(.minutes(-30)),
- end: date.addingTimeInterval(.minutes(30)))
- )
- let basalRateSchedule = BasalRateSchedule(
- dailyItems: [RepeatingScheduleValue(startTime: .hours(0), value: 1.0),
- RepeatingScheduleValue(startTime: .hours(8), value: 1.125),
- RepeatingScheduleValue(startTime: .hours(10), value: 1.25),
- RepeatingScheduleValue(startTime: .hours(12), value: 1.5),
- RepeatingScheduleValue(startTime: .hours(14), value: 1.25),
- RepeatingScheduleValue(startTime: .hours(16), value: 1.5),
- RepeatingScheduleValue(startTime: .hours(18), value: 1.25),
- RepeatingScheduleValue(startTime: .hours(21), value: 1.0)],
- timeZone: timeZone)!
- let insulinSensitivitySchedule = InsulinSensitivitySchedule(
- unit: .milligramsPerDeciliter,
- dailyItems: [RepeatingScheduleValue(startTime: .hours(0), value: 45.0),
- RepeatingScheduleValue(startTime: .hours(8), value: 40.0),
- RepeatingScheduleValue(startTime: .hours(10), value: 35.0),
- RepeatingScheduleValue(startTime: .hours(12), value: 30.0),
- RepeatingScheduleValue(startTime: .hours(14), value: 35.0),
- RepeatingScheduleValue(startTime: .hours(16), value: 40.0)],
- timeZone: timeZone)!
- let carbRatioSchedule = CarbRatioSchedule(
- unit: .gram(),
-
- dailyItems: [RepeatingScheduleValue(startTime: .hours(0), value: 10.0),
- RepeatingScheduleValue(startTime: .hours(8), value: 12.0),
- RepeatingScheduleValue(startTime: .hours(10), value: 9.0),
- RepeatingScheduleValue(startTime: .hours(12), value: 10.0),
- RepeatingScheduleValue(startTime: .hours(14), value: 11.0),
- RepeatingScheduleValue(startTime: .hours(16), value: 12.0),
- RepeatingScheduleValue(startTime: .hours(18), value: 8.0),
- RepeatingScheduleValue(startTime: .hours(21), value: 10.0)],
- timeZone: timeZone)!
-
- return TherapySettings(
- glucoseTargetRangeSchedule: glucoseTargetRangeSchedule,
- preMealTargetRange: DoubleRange(minValue: 80.0, maxValue: 90.0),
- workoutTargetRange: DoubleRange(minValue: 130.0, maxValue: 140.0),
- maximumBasalRatePerHour: 3,
- maximumBolus: 5,
- suspendThreshold: GlucoseThreshold(unit: .milligramsPerDeciliter, value: 80),
- insulinSensitivitySchedule: insulinSensitivitySchedule,
- carbRatioSchedule: carbRatioSchedule,
- basalRateSchedule: basalRateSchedule,
- insulinModelSettings: InsulinModelSettings(model: ExponentialInsulinModelPreset.rapidActingAdult)
- )
- }
- let encodedString = """
- {
- "basalRateSchedule" : {
- "items" : [
- {
- "startTime" : 0,
- "value" : 1
- },
- {
- "startTime" : 28800,
- "value" : 1.125
- },
- {
- "startTime" : 36000,
- "value" : 1.25
- },
- {
- "startTime" : 43200,
- "value" : 1.5
- },
- {
- "startTime" : 50400,
- "value" : 1.25
- },
- {
- "startTime" : 57600,
- "value" : 1.5
- },
- {
- "startTime" : 64800,
- "value" : 1.25
- },
- {
- "startTime" : 75600,
- "value" : 1
- }
- ],
- "referenceTimeInterval" : 0,
- "repeatInterval" : 86400,
- "timeZone" : {
- "identifier" : "America/Los_Angeles"
- }
- },
- "carbRatioSchedule" : {
- "unit" : "g",
- "valueSchedule" : {
- "items" : [
- {
- "startTime" : 0,
- "value" : 10
- },
- {
- "startTime" : 28800,
- "value" : 12
- },
- {
- "startTime" : 36000,
- "value" : 9
- },
- {
- "startTime" : 43200,
- "value" : 10
- },
- {
- "startTime" : 50400,
- "value" : 11
- },
- {
- "startTime" : 57600,
- "value" : 12
- },
- {
- "startTime" : 64800,
- "value" : 8
- },
- {
- "startTime" : 75600,
- "value" : 10
- }
- ],
- "referenceTimeInterval" : 0,
- "repeatInterval" : 86400,
- "timeZone" : {
- "identifier" : "America/Los_Angeles"
- }
- }
- },
- "glucoseTargetRangeSchedule" : {
- "override" : {
- "end" : "1970-01-02T04:16:40Z",
- "start" : "1970-01-02T03:16:40Z",
- "value" : {
- "maxValue" : 90,
- "minValue" : 80
- }
- },
- "rangeSchedule" : {
- "unit" : "mg/dL",
- "valueSchedule" : {
- "items" : [
- {
- "startTime" : 0,
- "value" : {
- "maxValue" : 110,
- "minValue" : 100
- }
- },
- {
- "startTime" : 28800,
- "value" : {
- "maxValue" : 105,
- "minValue" : 95
- }
- },
- {
- "startTime" : 50400,
- "value" : {
- "maxValue" : 105,
- "minValue" : 95
- }
- },
- {
- "startTime" : 57600,
- "value" : {
- "maxValue" : 110,
- "minValue" : 100
- }
- },
- {
- "startTime" : 64800,
- "value" : {
- "maxValue" : 100,
- "minValue" : 90
- }
- },
- {
- "startTime" : 75600,
- "value" : {
- "maxValue" : 120,
- "minValue" : 110
- }
- }
- ],
- "referenceTimeInterval" : 0,
- "repeatInterval" : 86400,
- "timeZone" : {
- "identifier" : "America/Los_Angeles"
- }
- }
- }
- },
- "insulinModelSettings" : {
- "exponential" : "rapidActingAdult"
- },
- "insulinSensitivitySchedule" : {
- "unit" : "mg/dL",
- "valueSchedule" : {
- "items" : [
- {
- "startTime" : 0,
- "value" : 45
- },
- {
- "startTime" : 28800,
- "value" : 40
- },
- {
- "startTime" : 36000,
- "value" : 35
- },
- {
- "startTime" : 43200,
- "value" : 30
- },
- {
- "startTime" : 50400,
- "value" : 35
- },
- {
- "startTime" : 57600,
- "value" : 40
- }
- ],
- "referenceTimeInterval" : 0,
- "repeatInterval" : 86400,
- "timeZone" : {
- "identifier" : "America/Los_Angeles"
- }
- }
- },
- "maximumBasalRatePerHour" : 3,
- "maximumBolus" : 5,
- "preMealTargetRange" : {
- "maxValue" : 90,
- "minValue" : 80
- },
- "suspendThreshold" : {
- "unit" : "mg/dL",
- "value" : 80
- },
- "workoutTargetRange" : {
- "maxValue" : 140,
- "minValue" : 130
- }
- }
- """
-
- func testInsulinModelEncoding() throws {
- let adult = InsulinModelSettings.exponentialPreset(.rapidActingAdult)
- let child = InsulinModelSettings.exponentialPreset(.rapidActingChild)
- let walsh = InsulinModelSettings.walsh(WalshInsulinModel(actionDuration: 10))
-
- XCTAssertEqual("""
- {
- "exponential" : "rapidActingAdult"
- }
- """, String(data: try encoder.encode(adult), encoding: .utf8)!)
- XCTAssertEqual("""
- {
- "exponential" : "rapidActingChild"
- }
- """, String(data: try encoder.encode(child), encoding: .utf8)!)
- XCTAssertEqual("""
- {
- "walsh" : {
- "actionDuration" : 10,
- "delay" : 600
- }
- }
- """, String(data: try encoder.encode(walsh), encoding: .utf8)!)
- }
- func testTherapySettingEncoding() throws {
- let original = getTherapySettings()
- let data = try encoder.encode(original)
- XCTAssertEqual(encodedString, String(data: data, encoding: .utf8)!)
- }
-
- func testTherapySettingDecoding() throws {
- let data = encodedString.data(using: .utf8)!
- let decoded = try decoder.decode(TherapySettings.self, from: data)
- let expected = getTherapySettings()
-
- XCTAssertEqual(expected, decoded)
-
- XCTAssertEqual(decoded.basalRateSchedule, expected.basalRateSchedule)
- XCTAssertEqual(decoded.glucoseUnit, expected.glucoseUnit)
- XCTAssertEqual(decoded.insulinSensitivitySchedule, expected.insulinSensitivitySchedule)
- XCTAssertEqual(decoded.preMealTargetRange, expected.preMealTargetRange)
- XCTAssertEqual(decoded.workoutTargetRange, expected.workoutTargetRange)
- XCTAssertEqual(decoded.maximumBolus, expected.maximumBolus)
- XCTAssertEqual(decoded.maximumBasalRatePerHour, expected.maximumBasalRatePerHour)
- XCTAssertEqual(decoded.suspendThreshold, expected.suspendThreshold)
- XCTAssertEqual(decoded.carbRatioSchedule, expected.carbRatioSchedule)
- XCTAssertEqual(decoded.insulinModelSettings, expected.insulinModelSettings)
- XCTAssertEqual(decoded.glucoseTargetRangeSchedule, expected.glucoseTargetRangeSchedule)
- }
- }
|