UnfinalizedDoseTests.swift 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. //
  2. // MockKitTests.swift
  3. // MockKitTests
  4. //
  5. // Created by Nathaniel Hamming on 2020-11-27.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import XCTest
  9. import LoopKit
  10. @testable import MockKit
  11. class UnfinalizedDoseTests: XCTestCase {
  12. func testInitializationBolus() {
  13. let amount = 3.5
  14. let startTime = Date()
  15. let duration = TimeInterval(5)
  16. let unfinalizedBolus = UnfinalizedDose(bolusAmount: amount,
  17. startTime: startTime,
  18. duration: duration,
  19. insulinType: nil,
  20. automatic: false)
  21. XCTAssertEqual(unfinalizedBolus.doseType, .bolus)
  22. XCTAssertEqual(unfinalizedBolus.units, amount)
  23. XCTAssertNil(unfinalizedBolus.scheduledUnits)
  24. XCTAssertNil(unfinalizedBolus.scheduledTempRate)
  25. XCTAssertEqual(unfinalizedBolus.startTime, startTime)
  26. XCTAssertEqual(unfinalizedBolus.duration, duration)
  27. XCTAssertEqual(unfinalizedBolus.finishTime, startTime.addingTimeInterval(duration))
  28. XCTAssertEqual(unfinalizedBolus.rate, amount/duration.hours)
  29. XCTAssertNil(unfinalizedBolus.insulinType)
  30. XCTAssertEqual(unfinalizedBolus.automatic, false)
  31. }
  32. func testInitializationTBR() {
  33. let amount = 0.5
  34. let startTime = Date()
  35. let duration = TimeInterval.minutes(30)
  36. let unfinalizedTBR = UnfinalizedDose(tempBasalRate: amount,
  37. startTime: startTime,
  38. duration: duration)
  39. XCTAssertEqual(unfinalizedTBR.doseType, .tempBasal)
  40. XCTAssertEqual(unfinalizedTBR.units, amount*duration.hours)
  41. XCTAssertNil(unfinalizedTBR.scheduledUnits)
  42. XCTAssertNil(unfinalizedTBR.scheduledTempRate)
  43. XCTAssertEqual(unfinalizedTBR.startTime, startTime)
  44. XCTAssertEqual(unfinalizedTBR.duration, duration)
  45. XCTAssertEqual(unfinalizedTBR.finishTime, startTime.addingTimeInterval(duration))
  46. XCTAssertEqual(unfinalizedTBR.rate, amount)
  47. }
  48. func testInitializatinSuspend() {
  49. let startTime = Date()
  50. let unfinalizedSuspend = UnfinalizedDose(suspendStartTime: startTime)
  51. XCTAssertEqual(unfinalizedSuspend.doseType, .suspend)
  52. XCTAssertEqual(unfinalizedSuspend.units, 0)
  53. XCTAssertNil(unfinalizedSuspend.scheduledUnits)
  54. XCTAssertNil(unfinalizedSuspend.scheduledTempRate)
  55. XCTAssertEqual(unfinalizedSuspend.startTime, startTime)
  56. XCTAssertEqual(unfinalizedSuspend.rate, 0)
  57. }
  58. func testInitializationResume() {
  59. let startTime = Date()
  60. let unfinalizedResume = UnfinalizedDose(resumeStartTime: startTime)
  61. XCTAssertEqual(unfinalizedResume.doseType, .resume)
  62. XCTAssertEqual(unfinalizedResume.units, 0)
  63. XCTAssertNil(unfinalizedResume.scheduledUnits)
  64. XCTAssertNil(unfinalizedResume.scheduledTempRate)
  65. XCTAssertEqual(unfinalizedResume.startTime, startTime)
  66. XCTAssertEqual(unfinalizedResume.rate, 0)
  67. }
  68. func testIsFinished() {
  69. let amount = 0.5
  70. let now = Date()
  71. let duration = TimeInterval.minutes(30)
  72. var unfinalizedTBR = UnfinalizedDose(tempBasalRate: amount,
  73. startTime: now,
  74. duration: duration)
  75. XCTAssertFalse(unfinalizedTBR.finished)
  76. unfinalizedTBR = UnfinalizedDose(tempBasalRate: amount,
  77. startTime: now-duration,
  78. duration: duration)
  79. XCTAssertTrue(unfinalizedTBR.finished)
  80. }
  81. func testFinalizedUnits() {
  82. let amount = 3.5
  83. let now = Date()
  84. let duration = TimeInterval.minutes(1)
  85. var unfinalizedBolus = UnfinalizedDose(bolusAmount: amount,
  86. startTime: now,
  87. duration: duration)
  88. XCTAssertNil(unfinalizedBolus.finalizedUnits)
  89. unfinalizedBolus = UnfinalizedDose(bolusAmount: amount,
  90. startTime: now-duration,
  91. duration: duration)
  92. XCTAssertEqual(unfinalizedBolus.finalizedUnits, amount)
  93. }
  94. func testCancel() {
  95. let now = Date()
  96. let rate = 3.0
  97. let duration = TimeInterval.hours(1)
  98. var dose = UnfinalizedDose(tempBasalRate: rate,
  99. startTime: now,
  100. duration: duration)
  101. dose.cancel(at: now + duration/2)
  102. XCTAssertEqual(dose.units, rate/2)
  103. XCTAssertEqual(dose.scheduledUnits, rate)
  104. XCTAssertEqual(dose.scheduledTempRate, rate)
  105. XCTAssertEqual(dose.duration, duration/2)
  106. }
  107. func testRawValue() {
  108. let amount = 3.5
  109. let startTime = Date()
  110. let duration = TimeInterval.minutes(1)
  111. let unfinalizedBolus = UnfinalizedDose(bolusAmount: amount,
  112. startTime: startTime,
  113. duration: duration)
  114. let rawValue = unfinalizedBolus.rawValue
  115. XCTAssertEqual(UnfinalizedDose.DoseType(rawValue: rawValue["doseType"] as! UnfinalizedDose.DoseType.RawValue), .bolus)
  116. XCTAssertEqual(rawValue["units"] as! Double, amount)
  117. XCTAssertEqual(rawValue["startTime"] as! Date, startTime)
  118. XCTAssertNil(rawValue["scheduledUnits"])
  119. XCTAssertNil(rawValue["scheduledTempRate"])
  120. XCTAssertEqual(rawValue["duration"] as! Double, duration)
  121. }
  122. func testRawValueBolusWithScheduledUnits() {
  123. let amount = 3.5
  124. let startTime = Date()
  125. let duration = TimeInterval.minutes(1)
  126. var unfinalizedBolus = UnfinalizedDose(bolusAmount: amount,
  127. startTime: startTime,
  128. duration: duration)
  129. unfinalizedBolus.scheduledUnits = amount
  130. let rawValue = unfinalizedBolus.rawValue
  131. XCTAssertEqual(UnfinalizedDose.DoseType(rawValue: rawValue["doseType"] as! UnfinalizedDose.DoseType.RawValue), .bolus)
  132. XCTAssertEqual(rawValue["units"] as! Double, amount)
  133. XCTAssertEqual(rawValue["startTime"] as! Date, startTime)
  134. XCTAssertEqual(rawValue["scheduledUnits"] as! Double, amount)
  135. XCTAssertNil(rawValue["scheduleTempRate"])
  136. XCTAssertEqual(rawValue["duration"] as! Double, duration)
  137. let restoredUnfinalizedBolus = UnfinalizedDose(rawValue: rawValue)!
  138. XCTAssertEqual(restoredUnfinalizedBolus.doseType, unfinalizedBolus.doseType)
  139. XCTAssertEqual(restoredUnfinalizedBolus.units, unfinalizedBolus.units)
  140. XCTAssertEqual(restoredUnfinalizedBolus.scheduledUnits, unfinalizedBolus.scheduledUnits)
  141. XCTAssertEqual(restoredUnfinalizedBolus.scheduledTempRate, unfinalizedBolus.scheduledTempRate)
  142. XCTAssertEqual(restoredUnfinalizedBolus.startTime, unfinalizedBolus.startTime)
  143. XCTAssertEqual(restoredUnfinalizedBolus.duration, unfinalizedBolus.duration)
  144. XCTAssertEqual(restoredUnfinalizedBolus.finishTime, unfinalizedBolus.finishTime)
  145. XCTAssertEqual(restoredUnfinalizedBolus.rate, unfinalizedBolus.rate)
  146. }
  147. func testRawValueTBRWithScheduledTempRate() {
  148. let rate = 0.5
  149. let startTime = Date()
  150. let duration = TimeInterval.minutes(30)
  151. var unfinalizedTBR = UnfinalizedDose(tempBasalRate: rate,
  152. startTime: startTime,
  153. duration: duration)
  154. unfinalizedTBR.scheduledTempRate = rate
  155. let rawValue = unfinalizedTBR.rawValue
  156. XCTAssertEqual(UnfinalizedDose.DoseType(rawValue: rawValue["doseType"] as! UnfinalizedDose.DoseType.RawValue), .tempBasal)
  157. XCTAssertEqual(rawValue["units"] as! Double, rate*duration.hours)
  158. XCTAssertEqual(rawValue["startTime"] as! Date, startTime)
  159. XCTAssertNil(rawValue["scheduledUnits"])
  160. XCTAssertEqual(rawValue["scheduledTempRate"] as! Double, rate)
  161. XCTAssertEqual(rawValue["duration"] as! Double, duration)
  162. let restoredUnfinalizedTBR = UnfinalizedDose(rawValue: rawValue)!
  163. XCTAssertEqual(restoredUnfinalizedTBR.doseType, unfinalizedTBR.doseType)
  164. XCTAssertEqual(restoredUnfinalizedTBR.units, unfinalizedTBR.units)
  165. XCTAssertEqual(restoredUnfinalizedTBR.scheduledUnits, unfinalizedTBR.scheduledUnits)
  166. XCTAssertEqual(restoredUnfinalizedTBR.scheduledTempRate, unfinalizedTBR.scheduledTempRate)
  167. XCTAssertEqual(restoredUnfinalizedTBR.startTime, unfinalizedTBR.startTime)
  168. XCTAssertEqual(restoredUnfinalizedTBR.duration, unfinalizedTBR.duration)
  169. XCTAssertEqual(restoredUnfinalizedTBR.finishTime, unfinalizedTBR.finishTime)
  170. XCTAssertEqual(restoredUnfinalizedTBR.rate, unfinalizedTBR.rate)
  171. }
  172. func testRestoreFromRawValue() {
  173. let rate = 0.5
  174. let startTime = Date()
  175. let duration = TimeInterval.minutes(30)
  176. let expectedUnfinalizedTBR = UnfinalizedDose(tempBasalRate: rate,
  177. startTime: startTime,
  178. duration: duration)
  179. let rawValue = expectedUnfinalizedTBR.rawValue
  180. let unfinalizedTBR = UnfinalizedDose(rawValue: rawValue)!
  181. XCTAssertEqual(unfinalizedTBR.doseType, .tempBasal)
  182. XCTAssertEqual(unfinalizedTBR.units, rate*duration.hours)
  183. XCTAssertNil(unfinalizedTBR.scheduledUnits)
  184. XCTAssertNil(unfinalizedTBR.scheduledTempRate)
  185. XCTAssertEqual(unfinalizedTBR.startTime, startTime)
  186. XCTAssertEqual(unfinalizedTBR.duration, duration)
  187. XCTAssertEqual(unfinalizedTBR.finishTime, startTime.addingTimeInterval(duration))
  188. XCTAssertEqual(unfinalizedTBR.rate, rate)
  189. }
  190. func testDoseEntryInitFromUnfinalizedBolus() {
  191. let amount = 3.5
  192. let now = Date()
  193. let duration = TimeInterval.minutes(1)
  194. let unfinalizedBolus = UnfinalizedDose(bolusAmount: amount,
  195. startTime: now,
  196. duration: duration)
  197. let doseEntry = DoseEntry(unfinalizedBolus)
  198. XCTAssertEqual(doseEntry.type, .bolus)
  199. XCTAssertEqual(doseEntry.startDate, now)
  200. XCTAssertEqual(doseEntry.endDate, now.addingTimeInterval(duration))
  201. XCTAssertEqual(doseEntry.programmedUnits, amount)
  202. XCTAssertEqual(doseEntry.unit, .units)
  203. XCTAssertNil(doseEntry.deliveredUnits)
  204. }
  205. func testDoseEntryInitFromUnfinalizedTBR() {
  206. let amount = 0.5
  207. let now = Date()
  208. let duration = TimeInterval.minutes(30)
  209. let rate = amount*duration.hours
  210. let unfinalizedTBR = UnfinalizedDose(tempBasalRate: amount,
  211. startTime: now,
  212. duration: duration)
  213. let doseEntry = DoseEntry(unfinalizedTBR)
  214. XCTAssertEqual(doseEntry.type, .tempBasal)
  215. XCTAssertEqual(doseEntry.startDate, now)
  216. XCTAssertEqual(doseEntry.endDate, now.addingTimeInterval(duration))
  217. XCTAssertEqual(doseEntry.programmedUnits, rate)
  218. XCTAssertEqual(doseEntry.unit, .unitsPerHour)
  219. XCTAssertNil(doseEntry.deliveredUnits)
  220. }
  221. func testDoseEntryInitFromUnfinalizedSuspend() {
  222. let now = Date()
  223. let unfinalizedSuspend = UnfinalizedDose(suspendStartTime: now)
  224. let doseEntry = DoseEntry(unfinalizedSuspend)
  225. XCTAssertEqual(doseEntry.type, .suspend)
  226. XCTAssertEqual(doseEntry.startDate, now)
  227. XCTAssertEqual(doseEntry.endDate, now)
  228. XCTAssertEqual(doseEntry.programmedUnits, 0)
  229. XCTAssertEqual(doseEntry.unit, .units)
  230. XCTAssertNil(doseEntry.deliveredUnits)
  231. }
  232. func testDoseEntryInitFromUnfinalizedResume() {
  233. let now = Date()
  234. let unfinalizedResume = UnfinalizedDose(resumeStartTime: now)
  235. let doseEntry = DoseEntry(unfinalizedResume)
  236. XCTAssertEqual(doseEntry.type, .resume)
  237. XCTAssertEqual(doseEntry.startDate, now)
  238. XCTAssertEqual(doseEntry.endDate, now)
  239. XCTAssertEqual(doseEntry.programmedUnits, 0)
  240. XCTAssertEqual(doseEntry.unit, .units)
  241. XCTAssertNil(doseEntry.deliveredUnits)
  242. }
  243. func testBolusCancelLongAfterFinishTime() {
  244. let end = Date()
  245. let duration = TimeInterval(1)
  246. var dose = UnfinalizedDose(bolusAmount: 1, startTime: end-duration, duration: duration)
  247. dose.cancel(at: end + .hours(1))
  248. XCTAssertEqual(1.0, dose.units)
  249. XCTAssertTrue(dose.finished)
  250. }
  251. func testInterruptedBolus() {
  252. let end = Date()
  253. let duration = TimeInterval.minutes(1)
  254. var dose = UnfinalizedDose(bolusAmount: 5,
  255. startTime: end - duration/2,
  256. duration: duration)
  257. dose.cancel(at: end)
  258. XCTAssertEqual(dose.units, 2.5)
  259. XCTAssertEqual(dose.scheduledUnits, 5)
  260. XCTAssertEqual(dose.duration, TimeInterval.minutes(0.5))
  261. XCTAssertEqual(dose.finishTime, end)
  262. XCTAssertTrue(dose.finished)
  263. XCTAssertEqual(dose.progress, 1)
  264. XCTAssertEqual(dose.finalizedUnits!, 2.5)
  265. XCTAssertTrue(dose.description.contains("Interrupted Bolus"))
  266. let doseEntry = DoseEntry(dose)
  267. XCTAssertEqual(doseEntry.deliveredUnits, 2.5)
  268. XCTAssertEqual(doseEntry.programmedUnits, 5)
  269. XCTAssertEqual(doseEntry.startDate, end - duration/2)
  270. XCTAssertEqual(doseEntry.endDate, end)
  271. XCTAssertEqual(doseEntry.type, .bolus)
  272. }
  273. }