QuantityFormatterTests.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. //
  2. // QuantityFormatterTests.swift
  3. // LoopKitTests
  4. //
  5. // Copyright © 2018 LoopKit Authors. All rights reserved.
  6. //
  7. import XCTest
  8. import HealthKit
  9. @testable import LoopKit
  10. class QuantityFormatterTests: XCTestCase {
  11. var formatter: QuantityFormatter!
  12. func setFormatter(for unit: HKUnit) {
  13. formatter = QuantityFormatter(for: unit)
  14. formatter.locale = Locale(identifier: "en_US")
  15. formatter.unitStyle = .medium
  16. formatter.avoidLineBreaking = false
  17. }
  18. func testInsulin() {
  19. let unit = HKUnit.internationalUnit()
  20. setFormatter(for: unit)
  21. XCTAssertEqual("U", formatter.localizedUnitStringWithPlurality())
  22. XCTAssertEqual("10 U", formatter.string(from: HKQuantity(unit: unit, doubleValue: 10))!)
  23. formatter.unitStyle = .short
  24. XCTAssertEqual("U", formatter.localizedUnitStringWithPlurality())
  25. XCTAssertEqual("10U", formatter.string(from: HKQuantity(unit: unit, doubleValue: 10))!)
  26. formatter.unitStyle = .long
  27. XCTAssertEqual("Units", formatter.localizedUnitStringWithPlurality())
  28. XCTAssertEqual("10 Units", formatter.string(from: HKQuantity(unit: unit, doubleValue: 10))!)
  29. }
  30. func testInsulinRates() {
  31. let unit = HKUnit.internationalUnit().unitDivided(by: .hour())
  32. setFormatter(for: unit)
  33. XCTAssertEqual("U/hr", formatter.localizedUnitStringWithPlurality())
  34. XCTAssertEqual("10 U/hr", formatter.string(from: HKQuantity(unit: unit, doubleValue: 10))!)
  35. formatter.unitStyle = .short
  36. XCTAssertEqual("U/hr", formatter.localizedUnitStringWithPlurality())
  37. XCTAssertEqual("10U/hr", formatter.string(from: HKQuantity(unit: unit, doubleValue: 10))!)
  38. formatter.unitStyle = .long
  39. XCTAssertEqual("Units/hour", formatter.localizedUnitStringWithPlurality())
  40. XCTAssertEqual("10 Units/hour", formatter.string(from: HKQuantity(unit: unit, doubleValue: 10))!)
  41. XCTAssertEqual("1 Unit/hour", formatter.string(from: HKQuantity(unit: unit, doubleValue: 1))!)
  42. }
  43. func testCarbs() {
  44. let unit = HKUnit.gram()
  45. setFormatter(for: unit)
  46. XCTAssertEqual("g", formatter.localizedUnitStringWithPlurality())
  47. XCTAssertEqual("10 g", formatter.string(from: HKQuantity(unit: unit, doubleValue: 10))!)
  48. formatter.unitStyle = .short
  49. XCTAssertEqual("g", formatter.localizedUnitStringWithPlurality())
  50. XCTAssertEqual("10g", formatter.string(from: HKQuantity(unit: unit, doubleValue: 10))!)
  51. formatter.unitStyle = .long
  52. XCTAssertEqual("grams", formatter.localizedUnitStringWithPlurality())
  53. XCTAssertEqual("10 grams", formatter.string(from: HKQuantity(unit: unit, doubleValue: 10))!)
  54. XCTAssertEqual("0 grams", formatter.string(from: HKQuantity(unit: unit, doubleValue: 0))!)
  55. XCTAssertEqual("1 gram", formatter.string(from: HKQuantity(unit: unit, doubleValue: 1))!)
  56. formatter.numberFormatter.formattingContext = .standalone
  57. XCTAssertEqual("10 grams", formatter.string(from: HKQuantity(unit: unit, doubleValue: 10))!)
  58. }
  59. func testGlucoseMGDL() {
  60. let unit = HKUnit.milligramsPerDeciliter
  61. setFormatter(for: unit)
  62. XCTAssertEqual("mg/dL", formatter.localizedUnitStringWithPlurality())
  63. XCTAssertEqual("60 mg/dL", formatter.string(from: HKQuantity(unit: unit, doubleValue: 60))!)
  64. XCTAssertEqual("180 mg/dL", formatter.string(from: HKQuantity(unit: unit, doubleValue: 180))!)
  65. formatter.unitStyle = .short
  66. XCTAssertEqual("mg/dL", formatter.localizedUnitStringWithPlurality())
  67. XCTAssertEqual("60mg/dL", formatter.string(from: HKQuantity(unit: unit, doubleValue: 60))!)
  68. XCTAssertEqual("180mg/dL", formatter.string(from: HKQuantity(unit: unit, doubleValue: 180))!)
  69. formatter.unitStyle = .long
  70. XCTAssertEqual("milligrams per deciliter", formatter.localizedUnitStringWithPlurality())
  71. XCTAssertEqual("180 milligrams per deciliter", formatter.string(from: HKQuantity(unit: unit, doubleValue: 180))!)
  72. XCTAssertEqual("0 milligrams per deciliter", formatter.string(from: HKQuantity(unit: unit, doubleValue: 0))!)
  73. XCTAssertEqual("1 milligrams per deciliter", formatter.string(from: HKQuantity(unit: unit, doubleValue: 1))!)
  74. }
  75. func testGlucoseMMOLL() {
  76. let unit = HKUnit.millimolesPerLiter
  77. setFormatter(for: unit)
  78. XCTAssertEqual("mmol/L", formatter.localizedUnitStringWithPlurality())
  79. XCTAssertEqual("6.0 mmol/L", formatter.string(from: HKQuantity(unit: unit, doubleValue: 6))!)
  80. XCTAssertEqual("7.8 mmol/L", formatter.string(from: HKQuantity(unit: unit, doubleValue: 7.84))!)
  81. XCTAssertEqual("12.0 mmol/L", formatter.string(from: HKQuantity(unit: unit, doubleValue: 12))!)
  82. formatter.unitStyle = .short
  83. XCTAssertEqual("mmol/L", formatter.localizedUnitStringWithPlurality())
  84. XCTAssertEqual("6.0mmol/L", formatter.string(from: HKQuantity(unit: unit, doubleValue: 6))!)
  85. XCTAssertEqual("7.8mmol/L", formatter.string(from: HKQuantity(unit: unit, doubleValue: 7.8))!)
  86. formatter.unitStyle = .long
  87. XCTAssertEqual("millimoles per liter", formatter.localizedUnitStringWithPlurality())
  88. XCTAssertEqual("5.5 millimoles per liter", formatter.string(from: HKQuantity(unit: unit, doubleValue: 5.5))!)
  89. XCTAssertEqual("0.0 millimoles per liter", formatter.string(from: HKQuantity(unit: unit, doubleValue: 0))!)
  90. XCTAssertEqual("1.0 millimoles per liter", formatter.string(from: HKQuantity(unit: unit, doubleValue: 1))!)
  91. }
  92. func testGlucoseRates() {
  93. var unit = HKUnit.millimolesPerLiterPerMinute
  94. setFormatter(for: unit)
  95. XCTAssertEqual("mmol/L/min", formatter.localizedUnitStringWithPlurality())
  96. XCTAssertEqual("0.5 mmol/L/min", formatter.string(from: HKQuantity(unit: unit, doubleValue: 0.5))!)
  97. XCTAssertEqual("0.8 mmol/L/min", formatter.string(from: HKQuantity(unit: unit, doubleValue: 0.8))!)
  98. XCTAssertEqual("1.5 mmol/L/min", formatter.string(from: HKQuantity(unit: unit, doubleValue: 1.5))!)
  99. unit = HKUnit.milligramsPerDeciliterPerMinute
  100. setFormatter(for: unit)
  101. XCTAssertEqual("mg/dL/min", formatter.localizedUnitStringWithPlurality())
  102. XCTAssertEqual("1.0 mg/dL/min", formatter.string(from: HKQuantity(unit: unit, doubleValue: 1.0))!)
  103. XCTAssertEqual("5.2 mg/dL/min", formatter.string(from: HKQuantity(unit: unit, doubleValue: 5.2))!)
  104. XCTAssertEqual("10.1 mg/dL/min", formatter.string(from: HKQuantity(unit: unit, doubleValue: 10.1))!)
  105. }
  106. func testAvoidLineBreaking() {
  107. setFormatter(for: .internationalUnit())
  108. formatter.avoidLineBreaking = true
  109. XCTAssertEqual("U", formatter.localizedUnitStringWithPlurality())
  110. XCTAssertEqual("10\(String.nonBreakingSpace)U", formatter.string(from: HKQuantity(unit: HKUnit.internationalUnit(), doubleValue: 10))!)
  111. formatter.unitStyle = .short
  112. XCTAssertEqual("10\(String.wordJoiner)U", formatter.string(from: HKQuantity(unit: HKUnit.internationalUnit(), doubleValue: 10))!)
  113. formatter.unitStyle = .long
  114. XCTAssertEqual("Units", formatter.localizedUnitStringWithPlurality())
  115. XCTAssertEqual("10 Units", formatter.string(from: HKQuantity(unit: HKUnit.internationalUnit(), doubleValue: 10))!)
  116. formatter.unitStyle = .medium
  117. setFormatter(for: HKUnit.milligramsPerDeciliter)
  118. formatter.avoidLineBreaking = true
  119. XCTAssertEqual("mg\(String.wordJoiner)/\(String.wordJoiner)dL", formatter.localizedUnitStringWithPlurality())
  120. XCTAssertEqual("60\(String.nonBreakingSpace)mg\(String.wordJoiner)/\(String.wordJoiner)dL", formatter.string(from: HKQuantity(unit: HKUnit.milligramsPerDeciliter, doubleValue: 60))!)
  121. XCTAssertEqual("180\(String.nonBreakingSpace)mg\(String.wordJoiner)/\(String.wordJoiner)dL", formatter.string(from: HKQuantity(unit: HKUnit.milligramsPerDeciliter, doubleValue: 180))!)
  122. formatter.unitStyle = .short
  123. XCTAssertEqual("mg\(String.wordJoiner)/\(String.wordJoiner)dL", formatter.localizedUnitStringWithPlurality())
  124. XCTAssertEqual("60\(String.wordJoiner)mg\(String.wordJoiner)/\(String.wordJoiner)dL", formatter.string(from: HKQuantity(unit: HKUnit.milligramsPerDeciliter, doubleValue: 60))!)
  125. XCTAssertEqual("180\(String.wordJoiner)mg\(String.wordJoiner)/\(String.wordJoiner)dL", formatter.string(from: HKQuantity(unit: HKUnit.milligramsPerDeciliter, doubleValue: 180))!)
  126. formatter.unitStyle = .long
  127. XCTAssertEqual("milligrams per deciliter", formatter.localizedUnitStringWithPlurality())
  128. XCTAssertEqual("180 milligrams per deciliter", formatter.string(from: HKQuantity(unit: HKUnit.milligramsPerDeciliter, doubleValue: 180))!)
  129. XCTAssertEqual("0 milligrams per deciliter", formatter.string(from: HKQuantity(unit: HKUnit.milligramsPerDeciliter, doubleValue: 0))!)
  130. XCTAssertEqual("1 milligrams per deciliter", formatter.string(from: HKQuantity(unit: HKUnit.milligramsPerDeciliter, doubleValue: 1))!)
  131. formatter.unitStyle = .medium
  132. setFormatter(for: HKUnit.millimolesPerLiter)
  133. formatter.avoidLineBreaking = true
  134. XCTAssertEqual("mmol\(String.wordJoiner)/\(String.wordJoiner)L", formatter.localizedUnitStringWithPlurality())
  135. XCTAssertEqual("6.0\(String.nonBreakingSpace)mmol\(String.wordJoiner)/\(String.wordJoiner)L", formatter.string(from: HKQuantity(unit: HKUnit.millimolesPerLiter, doubleValue: 6))!)
  136. XCTAssertEqual("7.8\(String.nonBreakingSpace)mmol\(String.wordJoiner)/\(String.wordJoiner)L", formatter.string(from: HKQuantity(unit: HKUnit.millimolesPerLiter, doubleValue: 7.84))!)
  137. XCTAssertEqual("12.0\(String.nonBreakingSpace)mmol\(String.wordJoiner)/\(String.wordJoiner)L", formatter.string(from: HKQuantity(unit: HKUnit.millimolesPerLiter, doubleValue: 12))!)
  138. formatter.unitStyle = .short
  139. XCTAssertEqual("mmol\(String.wordJoiner)/\(String.wordJoiner)L", formatter.localizedUnitStringWithPlurality())
  140. XCTAssertEqual("6.0\(String.wordJoiner)mmol\(String.wordJoiner)/\(String.wordJoiner)L", formatter.string(from: HKQuantity(unit: HKUnit.millimolesPerLiter, doubleValue: 6))!)
  141. XCTAssertEqual("7.8\(String.wordJoiner)mmol\(String.wordJoiner)/\(String.wordJoiner)L", formatter.string(from: HKQuantity(unit: HKUnit.millimolesPerLiter, doubleValue: 7.8))!)
  142. formatter.unitStyle = .long
  143. XCTAssertEqual("millimoles per liter", formatter.localizedUnitStringWithPlurality())
  144. XCTAssertEqual("5.5 millimoles per liter", formatter.string(from: HKQuantity(unit: HKUnit.millimolesPerLiter, doubleValue: 5.5))!)
  145. XCTAssertEqual("0.0 millimoles per liter", formatter.string(from: HKQuantity(unit: HKUnit.millimolesPerLiter, doubleValue: 0))!)
  146. XCTAssertEqual("1.0 millimoles per liter", formatter.string(from: HKQuantity(unit: HKUnit.millimolesPerLiter, doubleValue: 1))!)
  147. }
  148. func testUnitRounding() {
  149. let value = 1.2345
  150. var unit: HKUnit = .milligramsPerDeciliter
  151. XCTAssertEqual(unit.roundForPreferredDigits(value: value), 1)
  152. unit = unit.unitDivided(by: .internationalUnit())
  153. XCTAssertEqual(unit.roundForPreferredDigits(value: value), 1)
  154. unit = unit.unitDivided(by: .minute())
  155. XCTAssertEqual(unit.roundForPreferredDigits(value: value), 1)
  156. unit = .millimolesPerLiter
  157. XCTAssertEqual(unit.roundForPreferredDigits(value: value), 1.2)
  158. unit = HKUnit.millimolesPerLiter.unitDivided(by: .internationalUnit())
  159. XCTAssertEqual(unit.roundForPreferredDigits(value: value), 1.2)
  160. unit = HKUnit.millimolesPerLiter.unitDivided(by: .minute())
  161. XCTAssertEqual(unit.roundForPreferredDigits(value: value), 1.2)
  162. }
  163. func testQuantityRounding() {
  164. let value = 1.2345
  165. var unit: HKUnit = .milligramsPerDeciliter
  166. XCTAssertEqual(HKQuantity(unit: unit, doubleValue: value).doubleValue(for: unit, withRounding: true), 1)
  167. unit = unit.unitDivided(by: .internationalUnit())
  168. XCTAssertEqual(HKQuantity(unit: unit, doubleValue: value).doubleValue(for: unit, withRounding: true), 1)
  169. unit = unit.unitDivided(by: .minute())
  170. XCTAssertEqual(HKQuantity(unit: unit, doubleValue: value).doubleValue(for: unit, withRounding: true), 1)
  171. unit = .millimolesPerLiter
  172. XCTAssertEqual(HKQuantity(unit: unit, doubleValue: value).doubleValue(for: unit, withRounding: true), 1.2)
  173. unit = HKUnit.millimolesPerLiter.unitDivided(by: .internationalUnit())
  174. XCTAssertEqual(HKQuantity(unit: unit, doubleValue: value).doubleValue(for: unit, withRounding: true), 1.2)
  175. unit = HKUnit.millimolesPerLiter.unitDivided(by: .minute())
  176. XCTAssertEqual(HKQuantity(unit: unit, doubleValue: value).doubleValue(for: unit, withRounding: true), 1.2)
  177. }
  178. }