Files
Termind/TFMTests/HostIntegrationRenderingTests.swift
T

64 lines
3.0 KiB
Swift

import AppKit
import SwiftUI
import TermindApplication
import TermindDomain
import Testing
@testable import Termind
@Suite(.requiresVisibleWindow, .serialized) @MainActor
struct HostIntegrationRenderingTests {
@Test(arguments: ["en", "zh-Hans", "zh-Hant"], [320.0, 360.0, 480.0])
func hostEditorShowsForwardingAboveIntegrationAtNarrowWidth(language: String, width: CGFloat) async throws {
let host = TermindDomain.Host(name: "Production", host: "server.invalid")
let app = AppModel(hosts: HostLibraryModel(hosts: [host]))
let navigation = WindowModel()
let controller = NSHostingController(
rootView: HostEditorView(hostID: host.id).environment(app).environment(navigation)
.environment(\.locale, Locale(identifier: language))
.frame(width: width, height: 1400))
let window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: width, height: 1400),
styleMask: [.borderless], backing: .buffered, defer: false)
window.isReleasedWhenClosed = false
controller.sizingOptions = []
window.contentViewController = controller
controller.view.frame = NSRect(x: 0, y: 0, width: width, height: 1400)
window.orderFront(nil)
defer {
app.shutdownForTermination()
window.orderOut(nil)
window.contentViewController = nil
window.close()
}
try await Task.sleep(for: .milliseconds(500))
controller.view.layoutSubtreeIfNeeded()
let defaultLabel = AppLocalization.string("Default", locale: Locale(identifier: language))
let steppers = descendants(controller.view).compactMap { $0 as? NSStepper }
#expect(steppers.count == 1)
#expect(descendants(controller.view).compactMap { $0 as? NSSegmentedControl }.isEmpty)
let control = try #require(
descendants(controller.view).compactMap { $0 as? NSPopUpButton }.first { $0.title == defaultLabel })
let frame = control.convert(control.bounds, to: controller.view)
#expect(frame.minX >= 16 && frame.maxX <= width - 16)
let stepper = try #require(steppers.first)
let forwardingFrame = stepper.convert(stepper.bounds, to: controller.view)
if controller.view.isFlipped {
#expect(forwardingFrame.midY < frame.midY)
} else {
#expect(forwardingFrame.midY > frame.midY)
}
let bitmap = try #require(controller.view.bitmapImageRepForCachingDisplay(in: controller.view.bounds))
controller.view.cacheDisplay(in: controller.view.bounds, to: bitmap)
let data = try #require(bitmap.representation(using: .png, properties: [:]))
Attachment.record(data, named: "host-integration-mac-\(language)-\(Int(width)).png")
try data.write(
to: FileManager.default.temporaryDirectory.appending(
path: "host-integration-mac-\(language)-\(Int(width)).png"))
}
private func descendants(_ view: NSView) -> [NSView] {
[view] + view.subviews.flatMap(descendants)
}
}