Files
onyx/Packages/OnyxKit/Tests/OnyxDesignTests/OnyxThemeTests.swift
T
ScarriffleandClaude Opus 5 ecb39fbe5f Eine Designschicht statt hundertfach gesetzter Zahlen
Token für Schrift, Symbolgröße, Abstand, Radius und Bewegung, dazu sieben
Bauteile, die vorher in jeder Kachel neu gebaut wurden — Karte, Abschnittstitel,
Hinweis, Pillenknopf, Regler, Ablegefläche, Haarlinie.

Symbole bekommen eine **eigene** Staffel und nicht die der Schrift: ein
9-Punkt-Symbol neben 9-Punkt-Text wirkt kleiner, nicht gleich groß. Beide in
eine Staffel zu zwingen hieße, an jeder Stelle gegen sie zu arbeiten.

Das Flächenrezept — Tint, Bänderung, Kante — stand zweimal da, einmal für das
Panel und einmal für Fenster. Es ist jetzt `OnyxStone`, generisch über die Form,
damit auch die animierende Notch-Silhouette es benutzen kann.

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

104 lines
3.6 KiB
Swift

import Testing
import SwiftUI
@testable import OnyxDesign
@Suite("Farbwahl")
@MainActor
struct OnyxThemeTests {
private func freshDefaults(_ name: String) -> UserDefaults {
let suite = "onyx.theme.test.\(name)"
let defaults = UserDefaults(suiteName: suite)!
defaults.removePersistentDomain(forName: suite)
return defaults
}
@Test("Ohne Einstellung stehen die Werkswerte")
func defaultsAreTheFactoryColours() {
let theme = OnyxTheme(defaults: freshDefaults(#function))
#expect(theme.accent.onyxHex == OnyxTheme.defaultAccent.onyxHex)
#expect(theme.isDefault)
}
@Test("Eine gewählte Farbe übersteht den Neustart")
func choiceSurvivesRestart() {
let defaults = freshDefaults(#function)
let theme = OnyxTheme(defaults: defaults)
theme.accent = Color(onyxHex: "#FF8800")!
let restarted = OnyxTheme(defaults: defaults)
#expect(restarted.accent.onyxHex == "#FF8800")
#expect(!restarted.isDefault)
}
@Test("Herunter und Hoch sind getrennt einstellbar")
func directionsAreIndependent() {
let theme = OnyxTheme(defaults: freshDefaults(#function))
theme.download = Color(onyxHex: "#112233")!
#expect(theme.download.onyxHex == "#112233")
#expect(theme.upload.onyxHex == OnyxTheme.defaultUpload.onyxHex)
}
@Test("Zurücksetzen stellt alles wieder her")
func resetRestoresEverything() {
let theme = OnyxTheme(defaults: freshDefaults(#function))
theme.accent = Color(onyxHex: "#000000")!
theme.download = Color(onyxHex: "#000000")!
theme.upload = Color(onyxHex: "#000000")!
theme.reset()
#expect(theme.isDefault)
}
}
@Suite("Farben als Text")
struct ColourHexTests {
@Test("Hin und zurück ergibt denselben Wert")
func roundTrip() {
for hex in ["#000000", "#FFFFFF", "#7FA8FF", "#6FCF97", "#EF6D9C"] {
#expect(Color(onyxHex: hex)?.onyxHex == hex)
}
}
@Test("Ohne Doppelkreuz geht es auch")
func hashIsOptional() {
#expect(Color(onyxHex: "7FA8FF")?.onyxHex == "#7FA8FF")
}
@Test("Unsinn ergibt keine Farbe")
func garbageIsRejected() {
// Sonst stünde nach einer verkorksten Einstellung Schwarz auf Schwarz.
#expect(Color(onyxHex: nil) == nil)
#expect(Color(onyxHex: "") == nil)
#expect(Color(onyxHex: "#12345") == nil)
#expect(Color(onyxHex: "#GGGGGG") == nil)
}
}
@Suite("Farben, die sich nicht gleichen dürfen")
@MainActor
struct ColourCollisionTests {
/// Beide waren zeichengleich `#6FCF97`. Damit hieß derselbe grüne Balken im
/// Netzwerk „lädt herunter" und in den Messwerten „alles in Ordnung" — und
/// wer beides nebeneinander sieht, liest eine Aussage, die niemand gemeint
/// hat.
@Test("Herunterladen ist nicht die Signalfarbe für „in Ordnung“")
func downloadIsNotThePositiveSignal() {
#expect(OnyxTheme.defaultDownload.onyxHex != Onyx.Color.positive.onyxHex)
}
@Test("Herunter und Hoch sind auch untereinander unterscheidbar")
func directionsDifferFromEachOther() {
#expect(OnyxTheme.defaultDownload.onyxHex != OnyxTheme.defaultUpload.onyxHex)
}
/// Die drei Signalfarben tragen die Bedeutung. Fielen zwei davon zusammen,
/// wäre eine Warnung von einem Fehler nicht mehr zu unterscheiden.
@Test("Die Signalfarben sind paarweise verschieden")
func signalColoursAreDistinct() {
let signals = [Onyx.Color.positive, Onyx.Color.warning, Onyx.Color.critical]
#expect(Set(signals.map(\.onyxHex)).count == signals.count)
}
}