|
|
@@ -0,0 +1,71 @@
|
|
|
+// LoopFollow
|
|
|
+// InfoColoringTests.swift
|
|
|
+
|
|
|
+@testable import LoopFollow
|
|
|
+import SwiftUI
|
|
|
+import Testing
|
|
|
+
|
|
|
+struct InfoColoringTests {
|
|
|
+ @Test("disabled coloring returns nil regardless of value")
|
|
|
+ func disabledReturnsNil() {
|
|
|
+ let coloring = InfoColoring(enabled: false, warning: 30, urgent: 15)
|
|
|
+ #expect(coloring.color(for: 5, direction: .below) == nil)
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test("below: battery warn 30 / urgent 15, in-range is green")
|
|
|
+ func belowDirection() {
|
|
|
+ let coloring = InfoColoring(enabled: true, warning: 30, urgent: 15)
|
|
|
+ #expect(coloring.color(for: 40, direction: .below) == .green)
|
|
|
+ #expect(coloring.color(for: 30, direction: .below) == .yellow)
|
|
|
+ #expect(coloring.color(for: 25, direction: .below) == .yellow)
|
|
|
+ #expect(coloring.color(for: 15, direction: .below) == .red)
|
|
|
+ #expect(coloring.color(for: 10, direction: .below) == .red)
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test("above: SAGE warn 8 / urgent 9.5, in-range is green")
|
|
|
+ func aboveDirection() {
|
|
|
+ let coloring = InfoColoring(enabled: true, warning: 8, urgent: 9.5)
|
|
|
+ #expect(coloring.color(for: 6, direction: .above) == .green)
|
|
|
+ #expect(coloring.color(for: 8, direction: .above) == .yellow)
|
|
|
+ #expect(coloring.color(for: 8.5, direction: .above) == .yellow)
|
|
|
+ #expect(coloring.color(for: 9.5, direction: .above) == .red)
|
|
|
+ #expect(coloring.color(for: 12, direction: .above) == .red)
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test("nil thresholds are green when enabled")
|
|
|
+ func nilThresholds() {
|
|
|
+ let coloring = InfoColoring(enabled: true, warning: nil, urgent: nil)
|
|
|
+ #expect(coloring.color(for: 999, direction: .above) == .green)
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test("only urgent set still colors red, otherwise green")
|
|
|
+ func onlyUrgent() {
|
|
|
+ let coloring = InfoColoring(enabled: true, warning: nil, urgent: 15)
|
|
|
+ #expect(coloring.color(for: 20, direction: .below) == .green)
|
|
|
+ #expect(coloring.color(for: 15, direction: .below) == .red)
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test("pump reservoir colors on the way down, and a capped 50+ reads green")
|
|
|
+ func pumpReservoir() throws {
|
|
|
+ let config = try #require(InfoType.pump.colorConfig)
|
|
|
+ let coloring = InfoColoring(enabled: true, warning: config.defaultWarning, urgent: config.defaultUrgent)
|
|
|
+ #expect(coloring.color(for: 50, direction: config.direction) == .green)
|
|
|
+ #expect(coloring.color(for: 20, direction: config.direction) == .yellow)
|
|
|
+ #expect(coloring.color(for: 10, direction: config.direction) == .red)
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test("thresholds that need decimals get a fractional step")
|
|
|
+ func fractionalSteps() {
|
|
|
+ #expect(InfoType.recBolus.colorConfig?.step == 0.1)
|
|
|
+ #expect(InfoType.iob.colorConfig?.step == 0.5)
|
|
|
+ #expect(InfoType.sage.colorConfig?.fractionDigits == 1)
|
|
|
+ #expect(InfoType.cob.colorConfig?.fractionDigits == 0)
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test("non-numeric rows are not colorable")
|
|
|
+ func notColorable() {
|
|
|
+ #expect(InfoType.basal.isColorable == false)
|
|
|
+ #expect(InfoType.minMax.isColorable == false)
|
|
|
+ #expect(InfoType.pump.isColorable)
|
|
|
+ }
|
|
|
+}
|