QuantityFormatterTests.swift 12 KB

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