import Foundation import XCTest @testable import CallsKit /// The display kept awake through a call (0.4.10): begun once on joining, /// ended once on leaving or the call ending, never held twice. @MainActor final class CallWakeTests: XCTestCase { final class Recorder: CallWake.Activities { var begun: [String] = [] var ended = 0 var live = 0 func begin(reason: String) -> NSObjectProtocol { begun.append(reason) live += 1 return NSObject() } func end(_ activity: NSObjectProtocol) { ended += 1 live -= 1 } } func testHeldFromJoiningUntilLeaving() { let recorder = Recorder() let wake = CallWake(activities: recorder) XCTAssertFalse(wake.holding) wake.update(inCall: true) wake.update(inCall: true) XCTAssertTrue(wake.holding) XCTAssertEqual(recorder.begun, [CallWake.reason], "once, however often it is told") wake.update(inCall: false) wake.update(inCall: false) XCTAssertFalse(wake.holding) XCTAssertEqual(recorder.ended, 1) XCTAssertEqual(recorder.live, 0) } func testAnEndedCallLetsTheDisplaySleep() { XCTAssertTrue(CallWake.inCall(joining: true, phase: "admitted")) XCTAssertTrue(CallWake.inCall(joining: true, phase: nil), "joining, before the room has answered") XCTAssertTrue(CallWake.inCall(joining: true, phase: "reconnecting")) XCTAssertFalse(CallWake.inCall(joining: true, phase: "ended")) XCTAssertFalse(CallWake.inCall(joining: false, phase: "admitted")) } func testRejoiningHoldsItAgain() { let recorder = Recorder() let wake = CallWake(activities: recorder) for _ in 0..<3 { wake.update(inCall: true) wake.update(inCall: false) } XCTAssertEqual(recorder.begun.count, 3) XCTAssertEqual(recorder.ended, 3) XCTAssertEqual(recorder.live, 0) } #if os(macOS) func testTheModelHoldsItWhileJoiningOnly() { let model = CallsModel(store: MemorySessionStore(), remote: .bridge, defaults: UserDefaults(suiteName: "wake-\(UUID())")!) XCTAssertFalse(model.wake.holding) model.joining = true XCTAssertTrue(model.wake.holding) model.joining = false XCTAssertFalse(model.wake.holding) } #endif func testTheRealActivityBeginsAndEnds() { let wake = CallWake() wake.update(inCall: true) XCTAssertTrue(wake.holding) wake.update(inCall: false) XCTAssertFalse(wake.holding) } }