| 1 | import Foundation |
| 2 | import XCTest |
| 3 | |
| 4 | @testable import CallsKit |
| 5 | |
| 6 | /// The display kept awake through a call (0.4.10): begun once on joining, |
| 7 | /// ended once on leaving or the call ending, never held twice. |
| 8 | @MainActor final class CallWakeTests: XCTestCase { |
| 9 | final class Recorder: CallWake.Activities { |
| 10 | var begun: [String] = [] |
| 11 | var ended = 0 |
| 12 | var live = 0 |
| 13 | func begin(reason: String) -> NSObjectProtocol { |
| 14 | begun.append(reason) |
| 15 | live += 1 |
| 16 | return NSObject() |
| 17 | } |
| 18 | func end(_ activity: NSObjectProtocol) { |
| 19 | ended += 1 |
| 20 | live -= 1 |
| 21 | } |
| 22 | } |
| 23 | |
| 24 | func testHeldFromJoiningUntilLeaving() { |
| 25 | let recorder = Recorder() |
| 26 | let wake = CallWake(activities: recorder) |
| 27 | XCTAssertFalse(wake.holding) |
| 28 | wake.update(inCall: true) |
| 29 | wake.update(inCall: true) |
| 30 | XCTAssertTrue(wake.holding) |
| 31 | XCTAssertEqual(recorder.begun, [CallWake.reason], "once, however often it is told") |
| 32 | wake.update(inCall: false) |
| 33 | wake.update(inCall: false) |
| 34 | XCTAssertFalse(wake.holding) |
| 35 | XCTAssertEqual(recorder.ended, 1) |
| 36 | XCTAssertEqual(recorder.live, 0) |
| 37 | } |
| 38 | |
| 39 | func testAnEndedCallLetsTheDisplaySleep() { |
| 40 | XCTAssertTrue(CallWake.inCall(joining: true, phase: "admitted")) |
| 41 | XCTAssertTrue(CallWake.inCall(joining: true, phase: nil), "joining, before the room has answered") |
| 42 | XCTAssertTrue(CallWake.inCall(joining: true, phase: "reconnecting")) |
| 43 | XCTAssertFalse(CallWake.inCall(joining: true, phase: "ended")) |
| 44 | XCTAssertFalse(CallWake.inCall(joining: false, phase: "admitted")) |
| 45 | } |
| 46 | |
| 47 | func testRejoiningHoldsItAgain() { |
| 48 | let recorder = Recorder() |
| 49 | let wake = CallWake(activities: recorder) |
| 50 | for _ in 0..<3 { |
| 51 | wake.update(inCall: true) |
| 52 | wake.update(inCall: false) |
| 53 | } |
| 54 | XCTAssertEqual(recorder.begun.count, 3) |
| 55 | XCTAssertEqual(recorder.ended, 3) |
| 56 | XCTAssertEqual(recorder.live, 0) |
| 57 | } |
| 58 | |
| 59 | #if os(macOS) |
| 60 | func testTheModelHoldsItWhileJoiningOnly() { |
| 61 | let model = CallsModel(store: MemorySessionStore(), remote: .bridge, defaults: UserDefaults(suiteName: "wake-\(UUID())")!) |
| 62 | XCTAssertFalse(model.wake.holding) |
| 63 | model.joining = true |
| 64 | XCTAssertTrue(model.wake.holding) |
| 65 | model.joining = false |
| 66 | XCTAssertFalse(model.wake.holding) |
| 67 | } |
| 68 | #endif |
| 69 | |
| 70 | func testTheRealActivityBeginsAndEnds() { |
| 71 | let wake = CallWake() |
| 72 | wake.update(inCall: true) |
| 73 | XCTAssertTrue(wake.holding) |
| 74 | wake.update(inCall: false) |
| 75 | XCTAssertFalse(wake.holding) |
| 76 | } |
| 77 | } |
| 78 | |