MockPumpManagerState.swift 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. //
  2. // MockPumpManagerState.swift
  3. // MockKit
  4. //
  5. // Created by Pete Schwamb on 7/31/19.
  6. // Copyright © 2019 LoopKit Authors. All rights reserved.
  7. //
  8. import Foundation
  9. public struct MockPumpManagerState {
  10. public var reservoirUnitsRemaining: Double
  11. public var tempBasalEnactmentShouldError: Bool
  12. public var bolusEnactmentShouldError: Bool
  13. public var deliverySuspensionShouldError: Bool
  14. public var deliveryResumptionShouldError: Bool
  15. public var maximumBolus: Double
  16. public var maximumBasalRatePerHour: Double
  17. public var suspendState: SuspendState
  18. public var pumpBatteryChargeRemaining: Double?
  19. public var unfinalizedBolus: UnfinalizedDose?
  20. public var unfinalizedTempBasal: UnfinalizedDose?
  21. var finalizedDoses: [UnfinalizedDose]
  22. public var dosesToStore: [UnfinalizedDose] {
  23. return finalizedDoses + [unfinalizedTempBasal, unfinalizedBolus].compactMap {$0}
  24. }
  25. public mutating func finalizeFinishedDoses() {
  26. if let bolus = unfinalizedBolus, bolus.finished {
  27. finalizedDoses.append(bolus)
  28. unfinalizedBolus = nil
  29. }
  30. if let tempBasal = unfinalizedTempBasal, tempBasal.finished {
  31. finalizedDoses.append(tempBasal)
  32. unfinalizedTempBasal = nil
  33. }
  34. }
  35. }
  36. extension MockPumpManagerState: RawRepresentable {
  37. public typealias RawValue = [String: Any]
  38. public init?(rawValue: RawValue) {
  39. guard let reservoirUnitsRemaining = rawValue["reservoirUnitsRemaining"] as? Double else {
  40. return nil
  41. }
  42. self.reservoirUnitsRemaining = reservoirUnitsRemaining
  43. self.tempBasalEnactmentShouldError = rawValue["tempBasalEnactmentShouldError"] as? Bool ?? false
  44. self.bolusEnactmentShouldError = rawValue["bolusEnactmentShouldError"] as? Bool ?? false
  45. self.deliverySuspensionShouldError = rawValue["deliverySuspensionShouldError"] as? Bool ?? false
  46. self.deliveryResumptionShouldError = rawValue["deliveryResumptionShouldError"] as? Bool ?? false
  47. self.maximumBolus = rawValue["maximumBolus"] as? Double ?? 25.0
  48. self.maximumBasalRatePerHour = rawValue["maximumBasalRatePerHour"] as? Double ?? 5.0
  49. self.pumpBatteryChargeRemaining = rawValue["pumpBatteryChargeRemaining"] as? Double ?? nil
  50. if let rawUnfinalizedBolus = rawValue["unfinalizedBolus"] as? UnfinalizedDose.RawValue {
  51. self.unfinalizedBolus = UnfinalizedDose(rawValue: rawUnfinalizedBolus)
  52. }
  53. if let rawUnfinalizedTempBasal = rawValue["unfinalizedTempBasal"] as? UnfinalizedDose.RawValue {
  54. self.unfinalizedTempBasal = UnfinalizedDose(rawValue: rawUnfinalizedTempBasal)
  55. }
  56. if let rawFinalizedDoses = rawValue["finalizedDoses"] as? [UnfinalizedDose.RawValue] {
  57. self.finalizedDoses = rawFinalizedDoses.compactMap( { UnfinalizedDose(rawValue: $0) } )
  58. } else {
  59. self.finalizedDoses = []
  60. }
  61. if let rawSuspendState = rawValue["suspendState"] as? SuspendState.RawValue, let suspendState = SuspendState(rawValue: rawSuspendState) {
  62. self.suspendState = suspendState
  63. } else {
  64. self.suspendState = .resumed(Date())
  65. }
  66. }
  67. public var rawValue: RawValue {
  68. var raw: RawValue = [
  69. "reservoirUnitsRemaining": reservoirUnitsRemaining,
  70. ]
  71. raw["suspendState"] = suspendState.rawValue
  72. if tempBasalEnactmentShouldError {
  73. raw["tempBasalEnactmentShouldError"] = true
  74. }
  75. if bolusEnactmentShouldError {
  76. raw["bolusEnactmentShouldError"] = true
  77. }
  78. if deliverySuspensionShouldError {
  79. raw["deliverySuspensionShouldError"] = true
  80. }
  81. if deliveryResumptionShouldError {
  82. raw["deliveryResumptionShouldError"] = true
  83. }
  84. raw["finalizedDoses"] = finalizedDoses.map( { $0.rawValue })
  85. raw["maximumBolus"] = maximumBolus
  86. raw["maximumBasalRatePerHour"] = maximumBasalRatePerHour
  87. raw["unfinalizedBolus"] = unfinalizedBolus?.rawValue
  88. raw["unfinalizedTempBasal"] = unfinalizedTempBasal?.rawValue
  89. raw["pumpBatteryChargeRemaining"] = pumpBatteryChargeRemaining
  90. return raw
  91. }
  92. }
  93. extension MockPumpManagerState: CustomDebugStringConvertible {
  94. public var debugDescription: String {
  95. return """
  96. ## MockPumpManagerState
  97. * reservoirUnitsRemaining: \(reservoirUnitsRemaining)
  98. * tempBasalEnactmentShouldError: \(tempBasalEnactmentShouldError)
  99. * bolusEnactmentShouldError: \(bolusEnactmentShouldError)
  100. * deliverySuspensionShouldError: \(deliverySuspensionShouldError)
  101. * deliveryResumptionShouldError: \(deliveryResumptionShouldError)
  102. * maximumBolus: \(maximumBolus)
  103. * maximumBasalRatePerHour: \(maximumBasalRatePerHour)
  104. * pumpBatteryChargeRemaining: \(String(describing: pumpBatteryChargeRemaining))
  105. * suspendState: \(suspendState)
  106. * unfinalizedBolus: \(String(describing: unfinalizedBolus))
  107. * unfinalizedTempBasal: \(String(describing: unfinalizedTempBasal))
  108. * finalizedDoses: \(finalizedDoses)
  109. """
  110. }
  111. }
  112. public enum SuspendState: Equatable, RawRepresentable {
  113. public typealias RawValue = [String: Any]
  114. private enum SuspendStateType: Int {
  115. case suspend, resume
  116. }
  117. case suspended(Date)
  118. case resumed(Date)
  119. public init?(rawValue: RawValue) {
  120. guard let suspendStateType = rawValue["suspendStateType"] as? SuspendStateType.RawValue,
  121. let date = rawValue["date"] as? Date else {
  122. return nil
  123. }
  124. switch SuspendStateType(rawValue: suspendStateType) {
  125. case .suspend?:
  126. self = .suspended(date)
  127. case .resume?:
  128. self = .resumed(date)
  129. default:
  130. return nil
  131. }
  132. }
  133. public var rawValue: RawValue {
  134. switch self {
  135. case .suspended(let date):
  136. return [
  137. "suspendStateType": SuspendStateType.suspend.rawValue,
  138. "date": date
  139. ]
  140. case .resumed(let date):
  141. return [
  142. "suspendStateType": SuspendStateType.resume.rawValue,
  143. "date": date
  144. ]
  145. }
  146. }
  147. }