AlwaysTrueCondition.swift 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. //
  2. // AlwaysTrueCondition.swift
  3. // LoopFollow
  4. //
  5. // Created by Jonas Björkert on 2025-04-20.
  6. // Copyright © 2025 Jon Fawcett. All rights reserved.
  7. //
  8. import XCTest
  9. @testable import LoopFollow
  10. struct AlwaysTrueCondition: AlarmCondition {
  11. static let type: AlarmType = .low
  12. init() {}
  13. func evaluate(alarm: Alarm, data: AlarmData) -> Bool { true }
  14. }
  15. final class CommonAlarmGuardsTests: XCTestCase {
  16. var now: Date!
  17. var config: AlarmConfiguration!
  18. var context: AlarmContext!
  19. var alarm: Alarm!
  20. var data: AlarmData!
  21. var cond: AlwaysTrueCondition!
  22. override func setUp() {
  23. super.setUp()
  24. now = Date()
  25. config = .default
  26. context = AlarmContext(now: now, config: config)
  27. alarm = Alarm(type: .low)
  28. alarm.name = "test"
  29. alarm.isEnabled = true
  30. alarm.snoozedUntil = nil
  31. alarm.playSoundOption = .always
  32. alarm.activeOption = .always
  33. alarm.snoozeDuration = 0
  34. data = AlarmData(expireDate: nil)
  35. cond = AlwaysTrueCondition()
  36. }
  37. func testMuteUntil() {
  38. config.muteUntil = now.addingTimeInterval(60)
  39. context = AlarmContext(now: now, config: config)
  40. XCTAssertFalse(cond.shouldFire(alarm: alarm, data: data, context: context))
  41. }
  42. func testDisabledAlarm() {
  43. alarm.isEnabled = false
  44. XCTAssertFalse(cond.shouldFire(alarm: alarm, data: data, context: context))
  45. }
  46. func testSnoozedAlarm() {
  47. alarm.snoozedUntil = now.addingTimeInterval(60)
  48. XCTAssertFalse(cond.shouldFire(alarm: alarm, data: data, context: context))
  49. }
  50. func testRespectsNightFlag() {
  51. let night = Calendar.current.date(bySettingHour: 23, minute: 0, second: 0, of: now)!
  52. alarm.activeOption = .day // alarm should be inactive at night
  53. context = AlarmContext(now: night, config: config)
  54. XCTAssertFalse(cond.shouldFire(alarm: alarm, data: data, context: context))
  55. }
  56. func testRespectsDayFlag() {
  57. let day = Calendar.current.date(bySettingHour: 9, minute: 0, second: 0, of: now)!
  58. alarm.activeOption = .night // alarm should be inactive during day
  59. context = AlarmContext(now: day, config: config)
  60. XCTAssertFalse(cond.shouldFire(alarm: alarm, data: data, context: context))
  61. }
  62. func testAllGuardsPass() {
  63. XCTAssertTrue(cond.shouldFire(alarm: alarm, data: data, context: context))
  64. }
  65. }