MinimedPumpManagerTests.swift 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //
  2. // MinimedPumpManagerTests.swift
  3. // MinimedKitTests
  4. //
  5. // Created by Pete Schwamb on 5/3/20.
  6. // Copyright © 2020 Pete Schwamb. All rights reserved.
  7. //
  8. import XCTest
  9. @testable import MinimedKit
  10. import LoopKit
  11. class MinimedPumpManagerTests: XCTestCase {
  12. func testPendingDoseUpdatesWithActualDeliveryFromHistoryDose() {
  13. let bolusTime = Date().addingTimeInterval(-TimeInterval(minutes: 5));
  14. let bolusEventTime = bolusTime.addingTimeInterval(2)
  15. let cancelTime = bolusEventTime.addingTimeInterval(TimeInterval(minutes: 1))
  16. let unfinalizedBolus = UnfinalizedDose(bolusAmount: 5.4, startTime: bolusTime, duration: TimeInterval(200), insulinType: .novolog, automatic: false, isReconciledWithHistory: false)
  17. // 5.4 bolus interrupted at 1.0 units
  18. let eventDose = DoseEntry(type: .bolus, startDate: bolusEventTime, endDate: cancelTime, value: unfinalizedBolus.units, unit: .units, deliveredUnits: 1.0)
  19. let bolusEvent = NewPumpEvent(
  20. date: bolusEventTime,
  21. dose: eventDose,
  22. isMutable: false,
  23. raw: Data(hexadecimalString: "abcdef")!,
  24. title: "Test Bolus",
  25. type: .bolus)
  26. let result = MinimedPumpManager.reconcilePendingDosesWith([bolusEvent], reconciliationMappings: [:], pendingDoses: [unfinalizedBolus])
  27. // Should mark pending bolus as reconciled
  28. XCTAssertEqual(1, result.pendingDoses.count)
  29. let pendingBolus = result.pendingDoses.first!
  30. XCTAssertEqual(true, pendingBolus.isReconciledWithHistory)
  31. // Pending bolus should be updated with actual delivery amount
  32. XCTAssertEqual(1.0, pendingBolus.units)
  33. XCTAssertEqual(5.4, pendingBolus.programmedUnits)
  34. XCTAssertEqual(TimeInterval(minutes: 1), pendingBolus.duration)
  35. XCTAssertEqual(true, pendingBolus.isFinished)
  36. }
  37. func testReconciledDosesShouldOnlyAppearInReturnedPendingDoses() {
  38. let bolusTime = Date().addingTimeInterval(-TimeInterval(minutes: 5));
  39. // Shows up in history 2 seconds later
  40. let bolusEventTime = bolusTime.addingTimeInterval(2)
  41. let bolusAmount = 1.5
  42. let bolusDuration = PumpModel.model523.bolusDeliveryTime(units: bolusAmount)
  43. let unfinalizedBolus = UnfinalizedDose(bolusAmount: bolusAmount, startTime: bolusTime, duration: bolusDuration, insulinType: .novolog, automatic: false, isReconciledWithHistory: false)
  44. let eventDose = DoseEntry(type: .bolus, startDate: bolusEventTime, endDate: bolusEventTime.addingTimeInterval(bolusDuration), value: bolusAmount, unit: .units, deliveredUnits: bolusAmount)
  45. let bolusEvent = NewPumpEvent(
  46. date: bolusEventTime,
  47. dose: eventDose,
  48. isMutable: false,
  49. raw: Data(hexadecimalString: "abcdef")!,
  50. title: "Test Bolus",
  51. type: .bolus)
  52. let result = MinimedPumpManager.reconcilePendingDosesWith([bolusEvent], reconciliationMappings: [:], pendingDoses: [unfinalizedBolus])
  53. // Should mark pending bolus as reconciled
  54. XCTAssertEqual(1, result.pendingDoses.count)
  55. let pendingBolus = result.pendingDoses.first!
  56. XCTAssertEqual(true, pendingBolus.isReconciledWithHistory)
  57. XCTAssertEqual(1, result.reconciliationMappings.count)
  58. XCTAssertEqual(unfinalizedBolus.uuid, result.reconciliationMappings[bolusEvent.raw]?.uuid)
  59. XCTAssertEqual(unfinalizedBolus.startTime, result.reconciliationMappings[bolusEvent.raw]?.startTime)
  60. // Bolus should not be returned as history event
  61. XCTAssert(result.remainingEvents.isEmpty)
  62. }
  63. func testReconciledDosesShouldNotAppearInReturnedPumpEvents() {
  64. let bolusTime = Date().addingTimeInterval(-TimeInterval(minutes: 5));
  65. // Shows up in history 2 seconds later
  66. let bolusEventTime = bolusTime.addingTimeInterval(2)
  67. let bolusAmount = 1.5
  68. let bolusDuration = PumpModel.model523.bolusDeliveryTime(units: bolusAmount)
  69. let eventDose = DoseEntry(type: .bolus, startDate: bolusEventTime, endDate: bolusEventTime.addingTimeInterval(bolusDuration), value: bolusAmount, unit: .units, deliveredUnits: bolusAmount)
  70. let bolusEvent = NewPumpEvent(
  71. date: bolusEventTime,
  72. dose: eventDose,
  73. isMutable: false,
  74. raw: Data(hexadecimalString: "abcdef")!,
  75. title: "Test Bolus",
  76. type: .bolus)
  77. let reconciliationMappings: [Data:ReconciledDoseMapping] = [
  78. bolusEvent.raw : ReconciledDoseMapping(startTime: bolusTime, uuid: UUID(), eventRaw: bolusEvent.raw)
  79. ]
  80. let result = MinimedPumpManager.reconcilePendingDosesWith([bolusEvent], reconciliationMappings: reconciliationMappings, pendingDoses: [])
  81. // Bolus should not be returned as history event
  82. XCTAssert(result.remainingEvents.isEmpty)
  83. }
  84. }