Helpers.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. // LoopFollow
  2. // Helpers.swift
  3. // Tests/AlarmConditions/Helpers.swift
  4. import Foundation
  5. @testable import LoopFollow
  6. import Testing
  7. // MARK: - Alarm helpers
  8. extension Alarm {
  9. static func battery(threshold: Double?) -> Self {
  10. var alarm = Alarm(type: .battery)
  11. alarm.threshold = threshold
  12. return alarm
  13. }
  14. static func sensorChange(threshold: Double?, lifetimeDays: Int? = 10) -> Self {
  15. var alarm = Alarm(type: .sensorChange)
  16. alarm.threshold = threshold
  17. alarm.sensorLifetimeDays = lifetimeDays
  18. return alarm
  19. }
  20. static func futureCarbs(threshold: Double = 45, delta: Double = 5) -> Self {
  21. var alarm = Alarm(type: .futureCarbs)
  22. alarm.threshold = threshold
  23. alarm.delta = delta
  24. return alarm
  25. }
  26. static func low(belowBG: Double?, predictiveMinutes: Int? = nil, persistentMinutes: Int? = nil) -> Self {
  27. var alarm = Alarm(type: .low)
  28. alarm.belowBG = belowBG
  29. alarm.predictiveMinutes = predictiveMinutes
  30. alarm.persistentMinutes = persistentMinutes
  31. return alarm
  32. }
  33. static func fastDrop(delta: Double?, window: Int?) -> Self {
  34. var alarm = Alarm(type: .fastDrop)
  35. alarm.delta = delta
  36. alarm.monitoringWindow = window
  37. return alarm
  38. }
  39. }
  40. // MARK: - AlarmData helpers
  41. extension AlarmData {
  42. static func withBattery(_ level: Double?) -> Self {
  43. AlarmData(
  44. bgReadings: [],
  45. predictionData: [],
  46. expireDate: nil,
  47. lastLoopTime: nil,
  48. latestOverrideStart: nil,
  49. latestOverrideEnd: nil,
  50. latestTempTargetStart: nil,
  51. latestTempTargetEnd: nil,
  52. recBolus: nil,
  53. COB: nil,
  54. sageInsertTime: nil,
  55. pumpInsertTime: nil,
  56. latestPumpVolume: nil,
  57. IOB: nil,
  58. recentBoluses: [],
  59. latestBattery: level,
  60. latestBatteryIsCharging: nil,
  61. latestPumpBattery: nil,
  62. batteryHistory: [],
  63. recentCarbs: [],
  64. dbSizePercentage: nil
  65. )
  66. }
  67. static func withSensorInsertTime(_ insertTime: TimeInterval?) -> Self {
  68. AlarmData(
  69. bgReadings: [],
  70. predictionData: [],
  71. expireDate: nil,
  72. lastLoopTime: nil,
  73. latestOverrideStart: nil,
  74. latestOverrideEnd: nil,
  75. latestTempTargetStart: nil,
  76. latestTempTargetEnd: nil,
  77. recBolus: nil,
  78. COB: nil,
  79. sageInsertTime: insertTime,
  80. pumpInsertTime: nil,
  81. latestPumpVolume: nil,
  82. IOB: nil,
  83. recentBoluses: [],
  84. latestBattery: nil,
  85. latestBatteryIsCharging: nil,
  86. latestPumpBattery: nil,
  87. batteryHistory: [],
  88. recentCarbs: [],
  89. dbSizePercentage: nil
  90. )
  91. }
  92. /// Builds an `AlarmData` from a list of glucose values ordered **oldest →
  93. /// newest** (the same order the app stores them; `bgReadings.last` is the most
  94. /// recent reading). Readings are spaced 5 minutes apart ending now.
  95. static func withReadings(_ sgvs: [Int]) -> Self {
  96. let now = Date()
  97. let last = sgvs.count - 1
  98. let readings = sgvs.enumerated().map { offset, sgv in
  99. GlucoseValue(sgv: sgv, date: now.addingTimeInterval(Double(offset - last) * 300))
  100. }
  101. return AlarmData(
  102. bgReadings: readings,
  103. predictionData: [],
  104. expireDate: nil,
  105. lastLoopTime: nil,
  106. latestOverrideStart: nil,
  107. latestOverrideEnd: nil,
  108. latestTempTargetStart: nil,
  109. latestTempTargetEnd: nil,
  110. recBolus: nil,
  111. COB: nil,
  112. sageInsertTime: nil,
  113. pumpInsertTime: nil,
  114. latestPumpVolume: nil,
  115. IOB: nil,
  116. recentBoluses: [],
  117. latestBattery: nil,
  118. latestBatteryIsCharging: nil,
  119. latestPumpBattery: nil,
  120. batteryHistory: [],
  121. recentCarbs: [],
  122. dbSizePercentage: nil
  123. )
  124. }
  125. static func withGlucose(readings: [GlucoseValue] = [], prediction: [GlucoseValue] = []) -> Self {
  126. AlarmData(
  127. bgReadings: readings,
  128. predictionData: prediction,
  129. expireDate: nil,
  130. lastLoopTime: nil,
  131. latestOverrideStart: nil,
  132. latestOverrideEnd: nil,
  133. latestTempTargetStart: nil,
  134. latestTempTargetEnd: nil,
  135. recBolus: nil,
  136. COB: nil,
  137. sageInsertTime: nil,
  138. pumpInsertTime: nil,
  139. latestPumpVolume: nil,
  140. IOB: nil,
  141. recentBoluses: [],
  142. latestBattery: nil,
  143. latestBatteryIsCharging: nil,
  144. latestPumpBattery: nil,
  145. batteryHistory: [],
  146. recentCarbs: [],
  147. dbSizePercentage: nil
  148. )
  149. }
  150. static func withCarbs(_ carbs: [CarbSample]) -> Self {
  151. AlarmData(
  152. bgReadings: [],
  153. predictionData: [],
  154. expireDate: nil,
  155. lastLoopTime: nil,
  156. latestOverrideStart: nil,
  157. latestOverrideEnd: nil,
  158. latestTempTargetStart: nil,
  159. latestTempTargetEnd: nil,
  160. recBolus: nil,
  161. COB: nil,
  162. sageInsertTime: nil,
  163. pumpInsertTime: nil,
  164. latestPumpVolume: nil,
  165. IOB: nil,
  166. recentBoluses: [],
  167. latestBattery: nil,
  168. latestBatteryIsCharging: nil,
  169. latestPumpBattery: nil,
  170. batteryHistory: [],
  171. recentCarbs: carbs,
  172. dbSizePercentage: nil
  173. )
  174. }
  175. }