Files
onyx/Packages/OnyxKit/Tests/OnyxNotchTests/DisplayPolicyTests.swift
T
ScarriffleandClaude Opus 5 c05ccb8ae1 Die Notch wird zur Insel, wo es keine Hardware gibt
Die Silhouette bestand aus zwei überlappenden Teilpfaden. Gefüllt stimmte die
Vereinigung, aber die Kontur zeichnete jeden Teilpfad vollständig nach — auch
dort, wo er innen lag. Dazu kippte die Form ab einer Breite in einen anderen
Zweig, und die beiden Zweige waren nicht dieselbe Geometrie. Zusammen war das
das Flackern an den Rundungen. Jetzt ein durchgehender Umriss, dessen Zweige
ineinander übergehen statt zu springen.

Neu ist die Wahl zwischen verschmolzen und schwebend. Eine echte Notch **muss**
an der Kante kleben und oben eckig sein, sonst klafft ein Spalt zum Gehäuse;
eine Insel **muss** Abstand halten und rundum gerundet sein, sonst sieht sie aus
wie ein abgeschnittenes Rechteck. Beides zu mischen geht nicht, deshalb eine
Wahl und keine zwei Schalter.

Ihre Höhe rät Onyx nicht mehr, sondern misst die Menüleiste: 24 Punkte minus
Luft oben und unten. Vorher hing ein festes Maß unten heraus.

Dazu „nur der Hauptbildschirm" als dritte Anzeigewahl — gemeint ist der mit der
Menüleiste, nicht `NSScreen.main`, das mit dem aktiven Fenster mitwandert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 21:05:13 +02:00

102 lines
4.0 KiB
Swift

import Testing
import CoreGraphics
@testable import OnyxNotch
@Suite("Anzeigen-Auswahl")
struct DisplayPolicyTests {
static let builtIn = ScreenMetrics(
frame: CGRect(x: 0, y: 0, width: 1800, height: 1169),
safeAreaTop: 38,
auxiliaryTopLeft: CGRect(x: 0, y: 1131, width: 790, height: 38),
auxiliaryTopRight: CGRect(x: 1010, y: 1131, width: 790, height: 38),
isBuiltIn: true,
displayID: 1
)
static let external = ScreenMetrics(
frame: CGRect(x: 1800, y: 0, width: 2560, height: 1440),
safeAreaTop: 0, auxiliaryTopLeft: nil, auxiliaryTopRight: nil,
isBuiltIn: false, displayID: 2
)
static let secondExternal = ScreenMetrics(
frame: CGRect(x: -2560, y: 0, width: 2560, height: 1440),
safeAreaTop: 0, auxiliaryTopLeft: nil, auxiliaryTopRight: nil,
isBuiltIn: false, displayID: 3
)
@Test("Nur intern: externe Displays bekommen kein Panel")
func builtInOnlySkipsExternal() {
let chosen = DisplayPolicy.builtInOnly.screens(from: [Self.builtIn, Self.external])
#expect(chosen.map(\.displayID) == [1])
}
@Test("Alle Displays: jedes bekommt eins")
func allDisplaysCoversEverything() {
let chosen = DisplayPolicy.allDisplays
.screens(from: [Self.builtIn, Self.external, Self.secondExternal])
#expect(Set(chosen.map(\.displayID)) == [1, 2, 3])
}
@Test("Nur intern und der Deckel ist zu: Onyx wäre unerreichbar, also fällt es auf extern zurück")
func builtInOnlyFallsBackWhenLidClosed() {
// Deckel zu am Dock: das eingebaute Display verschwindet aus der Liste.
// Ohne Rückfall hätte man gar keinen Zugang mehr zur App.
let chosen = DisplayPolicy.builtInOnly.screens(from: [Self.external])
#expect(chosen.map(\.displayID) == [2])
}
@Test("Rückfall wählt genau ein Display, nicht alle")
func fallbackPicksOnlyOne() {
let chosen = DisplayPolicy.builtInOnly.screens(from: [Self.external, Self.secondExternal])
#expect(chosen.count == 1)
}
// MARK: - Hauptbildschirm
/// Ein externer Bildschirm, der die Menüleiste trägt — der übliche Fall am
/// Schreibtisch, wenn der Laptop danebensteht.
static let externalMain = ScreenMetrics(
frame: CGRect(x: 1800, y: 0, width: 2560, height: 1440),
safeAreaTop: 0, auxiliaryTopLeft: nil, auxiliaryTopRight: nil,
isBuiltIn: false, isMain: true, displayID: 2
)
@Test("Hauptbildschirm: der mit der Menüleiste, auch wenn er extern ist")
func mainDisplayPicksTheMenuBarScreen() {
let chosen = DisplayPolicy.mainDisplay
.screens(from: [Self.builtIn, Self.externalMain, Self.secondExternal])
#expect(chosen.map(\.displayID) == [2])
}
@Test("Hauptbildschirm: genau einer, nie mehrere")
func mainDisplayPicksExactlyOne() {
let chosen = DisplayPolicy.mainDisplay
.screens(from: [Self.builtIn, Self.externalMain, Self.secondExternal])
#expect(chosen.count == 1)
}
@Test("Hauptbildschirm: meldet ihn niemand, bleibt Onyx trotzdem erreichbar")
func mainDisplayFallsBackWhenNobodyClaimsIt() {
// Kann im Betrieb nicht vorkommen — die Menüleiste ist immer irgendwo.
// Ein leeres Ergebnis hieße aber: keine Notch, kein Zugang, kein Weg
// zurück in die Einstellungen.
let chosen = DisplayPolicy.mainDisplay.screens(from: [Self.external, Self.secondExternal])
#expect(chosen.count == 1)
}
@Test("Ohne Displays kein Panel — und kein Absturz")
func noScreensIsSafe() {
#expect(DisplayPolicy.builtInOnly.screens(from: []).isEmpty)
#expect(DisplayPolicy.allDisplays.screens(from: []).isEmpty)
#expect(DisplayPolicy.mainDisplay.screens(from: []).isEmpty)
}
@Test("Mehrere eingebaute Displays gibt es nicht, aber der Code darf daran nicht scheitern")
func handlesImplausibleInput() {
let chosen = DisplayPolicy.builtInOnly.screens(from: [Self.builtIn, Self.builtIn])
#expect(chosen.count == 2)
}
}