PredictedGlucoseChartTests.swift 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. //
  2. // PredictedGlucoseChartTests.swift
  3. // LoopTests
  4. //
  5. // Created by Nathaniel Hamming on 2020-09-29.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import XCTest
  9. import HealthKit
  10. import LoopKit
  11. import SwiftCharts
  12. @testable import LoopKitUI
  13. class PredictedGlucoseChartTests: XCTestCase {
  14. private let yAxisStepSizeMGDL: Double = 40
  15. func testClampingPredictedGlucoseValues40To400() {
  16. let glucoseValues = [
  17. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 40), startDate: Date()),
  18. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 120), startDate: Date()),
  19. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 250), startDate: Date()),
  20. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 400), startDate: Date())
  21. ]
  22. let predictedGlucoseValues = [
  23. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 0), startDate: Date()),
  24. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 40), startDate: Date()),
  25. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 280), startDate: Date()),
  26. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 380), startDate: Date()),
  27. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 400), startDate: Date()),
  28. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 480), startDate: Date()),
  29. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 580), startDate: Date())
  30. ]
  31. let predictedGlucoseChart = PredictedGlucoseChart(predictedGlucoseBounds: .default,
  32. yAxisStepSizeMGDLOverride: yAxisStepSizeMGDL)
  33. predictedGlucoseChart.setGlucoseValues(glucoseValues)
  34. predictedGlucoseChart.setPredictedGlucoseValues(predictedGlucoseValues)
  35. let predictedGlucosePoints = predictedGlucoseChart.predictedGlucosePoints
  36. XCTAssertEqual(predictedGlucosePoints[0].y.scalar, 40)
  37. XCTAssertEqual(predictedGlucosePoints[1].y.scalar, 40)
  38. XCTAssertEqual(predictedGlucosePoints[2].y.scalar, 280)
  39. XCTAssertEqual(predictedGlucosePoints[3].y.scalar, 380)
  40. XCTAssertEqual(predictedGlucosePoints[4].y.scalar, 400)
  41. XCTAssertEqual(predictedGlucosePoints[5].y.scalar, 400)
  42. XCTAssertEqual(predictedGlucosePoints[6].y.scalar, 400)
  43. }
  44. func testClampingPredictedGlucoseValues40To600() {
  45. // the max expected value is 600, but the y-axis will go to 680 due to the step size
  46. let glucoseValues = [
  47. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 40), startDate: Date()),
  48. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 120), startDate: Date()),
  49. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 350), startDate: Date()),
  50. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 480), startDate: Date()),
  51. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 600), startDate: Date())
  52. ]
  53. let predictedGlucoseValues = [
  54. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 0), startDate: Date()),
  55. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 40), startDate: Date()),
  56. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 300), startDate: Date()),
  57. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 450), startDate: Date()),
  58. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 600), startDate: Date()),
  59. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 750), startDate: Date()),
  60. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 1000), startDate: Date())
  61. ]
  62. let predictedGlucoseChart = PredictedGlucoseChart(predictedGlucoseBounds: .default,
  63. yAxisStepSizeMGDLOverride: yAxisStepSizeMGDL)
  64. predictedGlucoseChart.setGlucoseValues(glucoseValues)
  65. predictedGlucoseChart.setPredictedGlucoseValues(predictedGlucoseValues)
  66. let predictedGlucosePoints = predictedGlucoseChart.predictedGlucosePoints
  67. XCTAssertEqual(predictedGlucosePoints[0].y.scalar, 40)
  68. XCTAssertEqual(predictedGlucosePoints[1].y.scalar, 40)
  69. XCTAssertEqual(predictedGlucosePoints[2].y.scalar, 300)
  70. XCTAssertEqual(predictedGlucosePoints[3].y.scalar, 450)
  71. XCTAssertEqual(predictedGlucosePoints[4].y.scalar, 600)
  72. XCTAssertEqual(predictedGlucosePoints[5].y.scalar, 680)
  73. XCTAssertEqual(predictedGlucosePoints[6].y.scalar, 680)
  74. }
  75. func testClampingPredictedGlucoseValues0To400() {
  76. let glucoseValues = [
  77. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 0), startDate: Date()),
  78. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 120), startDate: Date()),
  79. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 250), startDate: Date()),
  80. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 400), startDate: Date())
  81. ]
  82. let predictedGlucoseValues = [
  83. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: -100), startDate: Date()),
  84. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 0), startDate: Date()),
  85. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 100), startDate: Date()),
  86. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 380), startDate: Date()),
  87. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 400), startDate: Date()),
  88. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 480), startDate: Date()),
  89. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 580), startDate: Date())
  90. ]
  91. let predictedGlucoseChart = PredictedGlucoseChart(predictedGlucoseBounds: .default,
  92. yAxisStepSizeMGDLOverride: yAxisStepSizeMGDL)
  93. predictedGlucoseChart.setGlucoseValues(glucoseValues)
  94. predictedGlucoseChart.setPredictedGlucoseValues(predictedGlucoseValues)
  95. let predictedGlucosePoints = predictedGlucoseChart.predictedGlucosePoints
  96. XCTAssertEqual(predictedGlucosePoints[0].y.scalar, 0)
  97. XCTAssertEqual(predictedGlucosePoints[1].y.scalar, 0)
  98. XCTAssertEqual(predictedGlucosePoints[2].y.scalar, 100)
  99. XCTAssertEqual(predictedGlucosePoints[3].y.scalar, 380)
  100. XCTAssertEqual(predictedGlucosePoints[4].y.scalar, 400)
  101. XCTAssertEqual(predictedGlucosePoints[5].y.scalar, 400)
  102. XCTAssertEqual(predictedGlucosePoints[6].y.scalar, 400)
  103. }
  104. func testClampingPredictedGlucoseValues0To600() {
  105. let glucoseValues = [
  106. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 0), startDate: Date()),
  107. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 120), startDate: Date()),
  108. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 350), startDate: Date()),
  109. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 480), startDate: Date()),
  110. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 600), startDate: Date())
  111. ]
  112. let predictedGlucoseValues = [
  113. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: -100), startDate: Date()),
  114. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 0), startDate: Date()),
  115. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 150), startDate: Date()),
  116. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 350), startDate: Date()),
  117. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 600), startDate: Date()),
  118. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 750), startDate: Date()),
  119. GlucoseValueTestable(quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 1000), startDate: Date())
  120. ]
  121. let predictedGlucoseChart = PredictedGlucoseChart(predictedGlucoseBounds: .default,
  122. yAxisStepSizeMGDLOverride: yAxisStepSizeMGDL)
  123. predictedGlucoseChart.setGlucoseValues(glucoseValues)
  124. predictedGlucoseChart.setPredictedGlucoseValues(predictedGlucoseValues)
  125. let predictedGlucosePoints = predictedGlucoseChart.predictedGlucosePoints
  126. XCTAssertEqual(predictedGlucosePoints[0].y.scalar, 0)
  127. XCTAssertEqual(predictedGlucosePoints[1].y.scalar, 0)
  128. XCTAssertEqual(predictedGlucosePoints[2].y.scalar, 150)
  129. XCTAssertEqual(predictedGlucosePoints[3].y.scalar, 350)
  130. XCTAssertEqual(predictedGlucosePoints[4].y.scalar, 600)
  131. XCTAssertEqual(predictedGlucosePoints[5].y.scalar, 600)
  132. XCTAssertEqual(predictedGlucosePoints[6].y.scalar, 600)
  133. }
  134. }
  135. struct GlucoseValueTestable: GlucoseValue {
  136. var quantity: HKQuantity
  137. var startDate: Date
  138. }