Akzentfarbe zieht sich durch
Picker-Werte leuchteten weiter in der Standardfarbe, während Schalter und Symbole daneben schon die gewählte trugen. Zwei Ursachen, beide behoben — welche davon im Einzelfall zog, ließ sich nicht nachstellen, weil der Bildschirm hinter der Anmeldung liegt. Erstens stand `.tint` im Scene-Body. Scene-Bodies werten Änderungen an beobachteten Objekten nicht zuverlässig neu aus; nach einem Farbwechsel blieb ein Teil der Oberfläche auf dem alten Wert stehen. Jetzt setzt RootView Tönung und Akzent — eine View wertet zuverlässig neu aus. Zweitens nahm der Vorgabewert der Umgebung blind die Standardfarbe. Listen und Formulare zeichnen ihre Zeilen teilweise in einem eigenen Darstellungskontext, in dem eigene Umgebungswerte verloren gehen; dort erschien dann Mint statt der gewählten Farbe. Der Vorgabewert liest jetzt die gespeicherte Auswahl. Damit das nicht wieder auseinanderläuft, liegt die Speicherung an einer Stelle: AccentOption.stored/store. Vorher hatte FlixyTheme eigene Schlüssel — zwei Kopien derselben Namen driften auseinander, und zwar unbemerkt. Dazu setzen die Formulare die Tönung ausdrücklich, statt sich auf Vererbung zu verlassen. 154 Tests, fünf davon zur Speicherung. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import Foundation
|
||||
import Testing
|
||||
@testable import FlixyDesign
|
||||
|
||||
@@ -147,3 +148,57 @@ struct DefaultAccentTests {
|
||||
#expect(corrected == AccentOption.default.color)
|
||||
}
|
||||
}
|
||||
|
||||
@Suite("Gespeicherte Akzentfarbe")
|
||||
struct AccentStorageTests {
|
||||
private func freshDefaults() -> UserDefaults {
|
||||
UserDefaults(suiteName: "flixy.accent.tests.\(UUID().uuidString)")!
|
||||
}
|
||||
|
||||
@Test("Ohne gespeicherte Auswahl gilt die Voreinstellung")
|
||||
func defaultWithoutSelection() {
|
||||
#expect(AccentOption.stored(in: freshDefaults()) == .default)
|
||||
}
|
||||
|
||||
@Test("Eine kuratierte Auswahl kommt zurück")
|
||||
func curatedRoundTrips() {
|
||||
let defaults = freshDefaults()
|
||||
let sky = AccentOption.palette.first { $0.id == "sky" }!
|
||||
sky.store(in: defaults)
|
||||
#expect(AccentOption.stored(in: defaults) == sky)
|
||||
}
|
||||
|
||||
@Test("Eine eigene Farbe kommt mit ihrem Wert zurück")
|
||||
func customRoundTrips() {
|
||||
let defaults = freshDefaults()
|
||||
let purple = AccentOption.custom(RGB(hex: 0x8B5CF6))
|
||||
purple.store(in: defaults)
|
||||
|
||||
let restored = AccentOption.stored(in: defaults)
|
||||
#expect(restored.id == AccentOption.customIdentifier)
|
||||
#expect(restored.color == RGB(hex: 0x8B5CF6))
|
||||
}
|
||||
|
||||
@Test("Eine unlesbare eigene Farbe fällt auf die Voreinstellung zurück")
|
||||
func brokenCustomFallsBack() {
|
||||
// Entsteht, wenn jemand die Voreinstellungen von Hand bearbeitet.
|
||||
let defaults = freshDefaults()
|
||||
defaults.set(AccentOption.customIdentifier, forKey: AccentOption.StorageKey.identifier)
|
||||
defaults.set("kein Hexwert", forKey: AccentOption.StorageKey.customHex)
|
||||
|
||||
#expect(AccentOption.stored(in: defaults) == .default)
|
||||
}
|
||||
|
||||
@Test("Der Umgebungswert und das Theme zeigen dieselbe Farbe")
|
||||
@MainActor
|
||||
func environmentMatchesTheme() {
|
||||
// Der eigentliche Punkt: gäbe es zwei getrennte Speicherwege, liefe
|
||||
// einer der beiden irgendwann auf die Standardfarbe — und genau das
|
||||
// sah man als Picker-Wert in Mint neben Schaltern in Violett.
|
||||
let defaults = freshDefaults()
|
||||
AccentOption.custom(RGB(hex: 0x8B5CF6)).store(in: defaults)
|
||||
|
||||
let theme = FlixyTheme(defaults: defaults)
|
||||
#expect(theme.accentColor == AccentOption.storedAccentColor(in: defaults))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user