ChartAxisValuesStaticGeneratorTests.swift 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. //
  2. // ChartAxisValuesStaticGeneratorTests.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 SwiftCharts
  10. @testable import LoopKitUI
  11. class ChartAxisValuesStaticGeneratorTests: XCTestCase {
  12. private var maxSegmentCount: Double = 4
  13. private let minSegmentCount: Double = 2
  14. private let axisValueGenerator: ChartAxisValueStaticGenerator = { ChartAxisValueDouble($0) }
  15. private let addPaddingSegmentIfEdge: Bool = false
  16. private let multiple: Double = 40
  17. func testGenerateYAxisValuesUsingLinearSegmentStep40To400() {
  18. let pointsAtLimits = [
  19. ChartPoint(x: ChartAxisValue(scalar: 1), y: ChartAxisValue(scalar: 40)),
  20. ChartPoint(x: ChartAxisValue(scalar: 2), y: ChartAxisValue(scalar: 120)),
  21. ChartPoint(x: ChartAxisValue(scalar: 3), y: ChartAxisValue(scalar: 250)),
  22. ChartPoint(x: ChartAxisValue(scalar: 4), y: ChartAxisValue(scalar: 400)),
  23. ]
  24. var yAxisValues = generateYAxisValuesUsingLinearSegmentStep(chartPoints: pointsAtLimits)
  25. XCTAssertEqual(yAxisValues[0].scalar, 40)
  26. XCTAssertEqual(yAxisValues[1].scalar, 160)
  27. XCTAssertEqual(yAxisValues[2].scalar, 280)
  28. XCTAssertEqual(yAxisValues[3].scalar, 400)
  29. let pointsNearLimits = [
  30. ChartPoint(x: ChartAxisValue(scalar: 1), y: ChartAxisValue(scalar: 41)),
  31. ChartPoint(x: ChartAxisValue(scalar: 2), y: ChartAxisValue(scalar: 42)),
  32. ChartPoint(x: ChartAxisValue(scalar: 3), y: ChartAxisValue(scalar: 43)),
  33. ChartPoint(x: ChartAxisValue(scalar: 4), y: ChartAxisValue(scalar: 397)),
  34. ChartPoint(x: ChartAxisValue(scalar: 5), y: ChartAxisValue(scalar: 398)),
  35. ChartPoint(x: ChartAxisValue(scalar: 6), y: ChartAxisValue(scalar: 399)),
  36. ]
  37. yAxisValues = generateYAxisValuesUsingLinearSegmentStep(chartPoints: pointsNearLimits)
  38. XCTAssertEqual(yAxisValues[0].scalar, 40)
  39. XCTAssertEqual(yAxisValues[1].scalar, 160)
  40. XCTAssertEqual(yAxisValues[2].scalar, 280)
  41. XCTAssertEqual(yAxisValues[3].scalar, 400)
  42. }
  43. func testGenerateYAxisValuesUsingLinearSegmentStep40To600() {
  44. // the max expected value is 600, but the y-axis will go to 680 due to the step size
  45. let pointsAtLimits = [
  46. ChartPoint(x: ChartAxisValue(scalar: 1), y: ChartAxisValue(scalar: 40)),
  47. ChartPoint(x: ChartAxisValue(scalar: 2), y: ChartAxisValue(scalar: 120)),
  48. ChartPoint(x: ChartAxisValue(scalar: 3), y: ChartAxisValue(scalar: 250)),
  49. ChartPoint(x: ChartAxisValue(scalar: 4), y: ChartAxisValue(scalar: 600)),
  50. ]
  51. var yAxisValues = generateYAxisValuesUsingLinearSegmentStep(chartPoints: pointsAtLimits)
  52. XCTAssertEqual(yAxisValues[0].scalar, 40)
  53. XCTAssertEqual(yAxisValues[1].scalar, 200)
  54. XCTAssertEqual(yAxisValues[2].scalar, 360)
  55. XCTAssertEqual(yAxisValues[3].scalar, 520)
  56. XCTAssertEqual(yAxisValues[4].scalar, 680)
  57. let pointsNearLimits = [
  58. ChartPoint(x: ChartAxisValue(scalar: 1), y: ChartAxisValue(scalar: 41)),
  59. ChartPoint(x: ChartAxisValue(scalar: 2), y: ChartAxisValue(scalar: 42)),
  60. ChartPoint(x: ChartAxisValue(scalar: 3), y: ChartAxisValue(scalar: 43)),
  61. ChartPoint(x: ChartAxisValue(scalar: 4), y: ChartAxisValue(scalar: 597)),
  62. ChartPoint(x: ChartAxisValue(scalar: 5), y: ChartAxisValue(scalar: 598)),
  63. ChartPoint(x: ChartAxisValue(scalar: 6), y: ChartAxisValue(scalar: 599)),
  64. ]
  65. yAxisValues = generateYAxisValuesUsingLinearSegmentStep(chartPoints: pointsNearLimits)
  66. XCTAssertEqual(yAxisValues[0].scalar, 40)
  67. XCTAssertEqual(yAxisValues[1].scalar, 200)
  68. XCTAssertEqual(yAxisValues[2].scalar, 360)
  69. XCTAssertEqual(yAxisValues[3].scalar, 520)
  70. XCTAssertEqual(yAxisValues[4].scalar, 680)
  71. }
  72. func testGenerateYAxisValuesUsingLinearSegmentStep0To400() {
  73. // when starting at 0, the max segment size is set to 5
  74. maxSegmentCount = 5
  75. let pointsAtLimits = [
  76. ChartPoint(x: ChartAxisValue(scalar: 1), y: ChartAxisValue(scalar: 0)),
  77. ChartPoint(x: ChartAxisValue(scalar: 2), y: ChartAxisValue(scalar: 120)),
  78. ChartPoint(x: ChartAxisValue(scalar: 3), y: ChartAxisValue(scalar: 250)),
  79. ChartPoint(x: ChartAxisValue(scalar: 4), y: ChartAxisValue(scalar: 400)),
  80. ]
  81. var yAxisValues = generateYAxisValuesUsingLinearSegmentStep(chartPoints: pointsAtLimits)
  82. XCTAssertEqual(yAxisValues[0].scalar, 0)
  83. XCTAssertEqual(yAxisValues[1].scalar, 80)
  84. XCTAssertEqual(yAxisValues[2].scalar, 160)
  85. XCTAssertEqual(yAxisValues[3].scalar, 240)
  86. XCTAssertEqual(yAxisValues[4].scalar, 320)
  87. XCTAssertEqual(yAxisValues[5].scalar, 400)
  88. let pointsNearLimits = [
  89. ChartPoint(x: ChartAxisValue(scalar: 1), y: ChartAxisValue(scalar: 1)),
  90. ChartPoint(x: ChartAxisValue(scalar: 2), y: ChartAxisValue(scalar: 2)),
  91. ChartPoint(x: ChartAxisValue(scalar: 3), y: ChartAxisValue(scalar: 3)),
  92. ChartPoint(x: ChartAxisValue(scalar: 4), y: ChartAxisValue(scalar: 397)),
  93. ChartPoint(x: ChartAxisValue(scalar: 5), y: ChartAxisValue(scalar: 398)),
  94. ChartPoint(x: ChartAxisValue(scalar: 6), y: ChartAxisValue(scalar: 399)),
  95. ]
  96. yAxisValues = generateYAxisValuesUsingLinearSegmentStep(chartPoints: pointsNearLimits)
  97. XCTAssertEqual(yAxisValues[0].scalar, 0)
  98. XCTAssertEqual(yAxisValues[1].scalar, 80)
  99. XCTAssertEqual(yAxisValues[2].scalar, 160)
  100. XCTAssertEqual(yAxisValues[3].scalar, 240)
  101. XCTAssertEqual(yAxisValues[4].scalar, 320)
  102. XCTAssertEqual(yAxisValues[5].scalar, 400)
  103. }
  104. func testGenerateYAxisValuesUsingLinearSegmentStep0To680() {
  105. // when starting at 0, the max segment size is set to 5
  106. maxSegmentCount = 5
  107. let pointsAtLimits = [
  108. ChartPoint(x: ChartAxisValue(scalar: 1), y: ChartAxisValue(scalar: 0)),
  109. ChartPoint(x: ChartAxisValue(scalar: 2), y: ChartAxisValue(scalar: 120)),
  110. ChartPoint(x: ChartAxisValue(scalar: 3), y: ChartAxisValue(scalar: 250)),
  111. ChartPoint(x: ChartAxisValue(scalar: 4), y: ChartAxisValue(scalar: 600)),
  112. ]
  113. var yAxisValues = generateYAxisValuesUsingLinearSegmentStep(chartPoints: pointsAtLimits)
  114. XCTAssertEqual(yAxisValues[0].scalar, 0)
  115. XCTAssertEqual(yAxisValues[1].scalar, 120)
  116. XCTAssertEqual(yAxisValues[2].scalar, 240)
  117. XCTAssertEqual(yAxisValues[3].scalar, 360)
  118. XCTAssertEqual(yAxisValues[4].scalar, 480)
  119. XCTAssertEqual(yAxisValues[5].scalar, 600)
  120. let pointsNearLimits = [
  121. ChartPoint(x: ChartAxisValue(scalar: 1), y: ChartAxisValue(scalar: 1)),
  122. ChartPoint(x: ChartAxisValue(scalar: 2), y: ChartAxisValue(scalar: 2)),
  123. ChartPoint(x: ChartAxisValue(scalar: 3), y: ChartAxisValue(scalar: 3)),
  124. ChartPoint(x: ChartAxisValue(scalar: 4), y: ChartAxisValue(scalar: 597)),
  125. ChartPoint(x: ChartAxisValue(scalar: 5), y: ChartAxisValue(scalar: 598)),
  126. ChartPoint(x: ChartAxisValue(scalar: 6), y: ChartAxisValue(scalar: 599)),
  127. ]
  128. yAxisValues = generateYAxisValuesUsingLinearSegmentStep(chartPoints: pointsNearLimits)
  129. XCTAssertEqual(yAxisValues[0].scalar, 0)
  130. XCTAssertEqual(yAxisValues[1].scalar, 120)
  131. XCTAssertEqual(yAxisValues[2].scalar, 240)
  132. XCTAssertEqual(yAxisValues[3].scalar, 360)
  133. XCTAssertEqual(yAxisValues[4].scalar, 480)
  134. XCTAssertEqual(yAxisValues[5].scalar, 600)
  135. }
  136. }
  137. extension ChartAxisValuesStaticGeneratorTests {
  138. func generateYAxisValuesUsingLinearSegmentStep(chartPoints: [ChartPoint]) -> [ChartAxisValue] {
  139. return ChartAxisValuesStaticGenerator.generateYAxisValuesUsingLinearSegmentStep(chartPoints: chartPoints,
  140. minSegmentCount: minSegmentCount,
  141. maxSegmentCount: maxSegmentCount,
  142. multiple: multiple,
  143. axisValueGenerator: axisValueGenerator,
  144. addPaddingSegmentIfEdge: addPaddingSegmentIfEdge)
  145. }
  146. }