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>
104 lines
3.6 KiB
Swift
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)
|
|
}
|
|
}
|