60 lines
1.5 KiB
Swift
60 lines
1.5 KiB
Swift
import XCTest
|
|
@testable import TranslatorPlugin
|
|
|
|
@MainActor
|
|
final class ScreenshotOverlaySessionTests: XCTestCase {
|
|
func testCancellationDismissesPresentedOverlayWindow() async {
|
|
let window = RecordingScreenshotOverlayWindow()
|
|
let session = ScreenshotOverlaySession(
|
|
hasAvailableScreens: { true },
|
|
activateApplication: {},
|
|
overlayWindowPresenter: { onComplete in
|
|
return [window]
|
|
}
|
|
)
|
|
|
|
let task = Task {
|
|
await session.selectRegion()
|
|
}
|
|
await waitUntil { window.showCount == 1 }
|
|
|
|
task.cancel()
|
|
await waitUntil { window.dismissCount == 1 }
|
|
|
|
let result = await task.value
|
|
XCTAssertEqual(result, .failure(.cancelled))
|
|
}
|
|
|
|
private func waitUntil(
|
|
_ condition: @MainActor () -> Bool,
|
|
file: StaticString = #filePath,
|
|
line: UInt = #line
|
|
) async {
|
|
let deadline = Date().addingTimeInterval(1)
|
|
while !condition(), Date() < deadline {
|
|
await Task.yield()
|
|
}
|
|
|
|
XCTAssertTrue(condition(), file: file, line: line)
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
private final class RecordingScreenshotOverlayWindow: ScreenshotOverlayWindowManaging {
|
|
private(set) var showCount = 0
|
|
private(set) var keyCount = 0
|
|
private(set) var dismissCount = 0
|
|
|
|
func showOverlayWindow() {
|
|
showCount += 1
|
|
}
|
|
|
|
func makeOverlayKeyWindow() {
|
|
keyCount += 1
|
|
}
|
|
|
|
func dismissOverlayWindow() {
|
|
dismissCount += 1
|
|
}
|
|
}
|