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>
60 lines
2.2 KiB
Swift
60 lines
2.2 KiB
Swift
import Testing
|
|
import SwiftUI
|
|
@testable import OnyxDesign
|
|
|
|
@Suite("Werkstoffe")
|
|
@MainActor
|
|
struct NotchMaterialTests {
|
|
|
|
@Test("Stein ist deckend — sonst hätte er an der Hardware-Notch eine Kante")
|
|
func stoneIsOpaque() {
|
|
#expect(NotchMaterial.stone.fillOpacity == 1.0)
|
|
// Und braucht deshalb keine Weichzeichnung darunter.
|
|
#expect(!NotchMaterial.stone.showsVibrancy)
|
|
}
|
|
|
|
@Test("Je durchlässiger, desto weniger Deckkraft")
|
|
func opacityDecreasesWithTranslucency() {
|
|
#expect(NotchMaterial.stone.fillOpacity > NotchMaterial.blur.fillOpacity)
|
|
#expect(NotchMaterial.blur.fillOpacity > NotchMaterial.glass.fillOpacity)
|
|
}
|
|
|
|
@Test("Je durchlässiger, desto mehr Glanz")
|
|
func sheenGrowsWithTranslucency() {
|
|
// Auf deckendem Schwarz genügt ein Hauch; auf Glas ist der Glanz das,
|
|
// was die Fläche überhaupt als Körper lesbar macht.
|
|
#expect(NotchMaterial.stone.sheen < NotchMaterial.blur.sheen)
|
|
#expect(NotchMaterial.blur.sheen < NotchMaterial.glass.sheen)
|
|
}
|
|
|
|
@Test("Alle durchscheinenden Werkstoffe brauchen die Vibrancy-Ebene")
|
|
func translucentMaterialsNeedVibrancy() {
|
|
#expect(NotchMaterial.blur.showsVibrancy)
|
|
#expect(NotchMaterial.glass.showsVibrancy)
|
|
}
|
|
|
|
@Test("Kein Werkstoff ist unsichtbar")
|
|
func nothingIsFullyTransparent() {
|
|
// Eine Fläche mit Deckkraft null wäre kein Werkstoff, sondern ein
|
|
// fehlendes Panel — und niemand fände die Einstellung zurück.
|
|
for material in NotchMaterial.allCases {
|
|
#expect(material.fillOpacity > 0.3)
|
|
}
|
|
}
|
|
|
|
@Test("Jeder Werkstoff überlebt das Speichern")
|
|
func roundTripsThroughDefaults() {
|
|
for material in NotchMaterial.allCases {
|
|
#expect(NotchMaterial(rawValue: material.rawValue) == material)
|
|
}
|
|
}
|
|
|
|
@Test("Ein unbekannter Name fällt auf Stein zurück, nicht ins Nichts")
|
|
func unknownNameFallsBack() {
|
|
let defaults = UserDefaults(suiteName: "onyx.test.material")!
|
|
defaults.removePersistentDomain(forName: "onyx.test.material")
|
|
defaults.set("liquidUnobtainium", forKey: "onyx.theme.material")
|
|
#expect(OnyxTheme(defaults: defaults).material == .stone)
|
|
}
|
|
}
|