SensorAgeConditionTests.swift 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // LoopFollow
  2. // SensorAgeConditionTests.swift
  3. @testable import LoopFollow
  4. import Testing
  5. struct SensorAgeConditionTests {
  6. let cond = SensorAgeCondition()
  7. // MARK: - 10-day lifetime (default)
  8. @Test("fires when within threshold hours of 10-day expiry")
  9. func firesNear10DayExpiry() {
  10. let alarm = Alarm.sensorChange(threshold: 12, lifetimeDays: 10)
  11. // Sensor inserted 9 days and 13 hours ago → 11 hours until 10-day mark → within 12-hour window
  12. let insertTime = Date().addingTimeInterval(-9 * 86400 - 13 * 3600).timeIntervalSince1970
  13. let data = AlarmData.withSensorInsertTime(insertTime)
  14. #expect(cond.evaluate(alarm: alarm, data: data, now: .init()))
  15. }
  16. @Test("does NOT fire when far from 10-day expiry")
  17. func doesNotFireEarly() {
  18. let alarm = Alarm.sensorChange(threshold: 12, lifetimeDays: 10)
  19. // Sensor inserted 8 days ago → 2 days until 10-day mark → outside 12-hour window
  20. let insertTime = Date().addingTimeInterval(-8 * 86400).timeIntervalSince1970
  21. let data = AlarmData.withSensorInsertTime(insertTime)
  22. #expect(!cond.evaluate(alarm: alarm, data: data, now: .init()))
  23. }
  24. // MARK: - 15-day lifetime
  25. @Test("fires when within threshold hours of 15-day expiry")
  26. func firesNear15DayExpiry() {
  27. let alarm = Alarm.sensorChange(threshold: 12, lifetimeDays: 15)
  28. // Sensor inserted 14 days and 13 hours ago → 11 hours until 15-day mark
  29. let insertTime = Date().addingTimeInterval(-14 * 86400 - 13 * 3600).timeIntervalSince1970
  30. let data = AlarmData.withSensorInsertTime(insertTime)
  31. #expect(cond.evaluate(alarm: alarm, data: data, now: .init()))
  32. }
  33. @Test("does NOT fire at day 10 when lifetime is 15 days")
  34. func doesNotFireAtDay10With15DayLifetime() {
  35. let alarm = Alarm.sensorChange(threshold: 12, lifetimeDays: 15)
  36. // Sensor inserted 10 days ago → 5 days until 15-day mark → should NOT fire
  37. let insertTime = Date().addingTimeInterval(-10 * 86400).timeIntervalSince1970
  38. let data = AlarmData.withSensorInsertTime(insertTime)
  39. #expect(!cond.evaluate(alarm: alarm, data: data, now: .init()))
  40. }
  41. // MARK: - Edge cases
  42. @Test("does NOT fire when sageInsertTime is nil")
  43. func ignoresMissingSensor() {
  44. let alarm = Alarm.sensorChange(threshold: 12)
  45. let data = AlarmData.withSensorInsertTime(nil)
  46. #expect(!cond.evaluate(alarm: alarm, data: data, now: .init()))
  47. }
  48. @Test("does NOT fire when sageInsertTime is zero (no sensor data)")
  49. func ignoresZeroInsertTime() {
  50. let alarm = Alarm.sensorChange(threshold: 12)
  51. let data = AlarmData.withSensorInsertTime(0)
  52. #expect(!cond.evaluate(alarm: alarm, data: data, now: .init()))
  53. }
  54. @Test("does NOT fire when threshold is nil")
  55. func ignoresNilThreshold() {
  56. let alarm = Alarm.sensorChange(threshold: nil)
  57. let insertTime = Date().addingTimeInterval(-11 * 86400).timeIntervalSince1970
  58. let data = AlarmData.withSensorInsertTime(insertTime)
  59. #expect(!cond.evaluate(alarm: alarm, data: data, now: .init()))
  60. }
  61. @Test("defaults to 10-day lifetime when sensorLifetimeDays is nil")
  62. func defaultsTo10Days() {
  63. let alarm = Alarm.sensorChange(threshold: 12, lifetimeDays: nil)
  64. // Sensor inserted 9 days and 13 hours ago → within 12-hour window of 10-day mark
  65. let insertTime = Date().addingTimeInterval(-9 * 86400 - 13 * 3600).timeIntervalSince1970
  66. let data = AlarmData.withSensorInsertTime(insertTime)
  67. #expect(cond.evaluate(alarm: alarm, data: data, now: .init()))
  68. }
  69. }