UnfinalizedDoseTests.swift 13 KB

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