Redesign nach Feedback. Statt Schritt-Karussell jetzt Apples What's-New-Sheet-Stil: pro Seite Titel + Zeilen-Liste (Icon+Titel+Text) + EIN Button unten, Indikator oben (nicht beim Button). - ManaOnboardingStep → ManaOnboardingPage (Titel/Vorspann/Row-Liste/ Fußnote). Voll Sendable, keine Action-Closures mehr. - Doktrin: fragt NIE Berechtigungen ab — die bleiben just-in-time. Onboarding informiert nur (kein Extrahieren auf Vorrat). - Präsentation als .sheet (.presentationDetents([.large]) + Griff) statt fullScreenCover → nicht mehr eingezwängt; per Wischen = gesehen. - Cross-Fade statt Swipe, reduced-motion-aware. 7 Tests (Seiten-Modell). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
56 lines
1.8 KiB
Swift
56 lines
1.8 KiB
Swift
import XCTest
|
|
@testable import ManaOnboardingUI
|
|
|
|
final class ManaOnboardingPageTests: XCTestCase {
|
|
func testDefaultIdFallsBackToTitle() {
|
|
let page = ManaOnboardingPage(title: "Werte", rows: [])
|
|
XCTAssertEqual(page.id, "Werte")
|
|
}
|
|
|
|
func testExplicitIdWins() {
|
|
let page = ManaOnboardingPage(id: "p1", title: "Werte", rows: [])
|
|
XCTAssertEqual(page.id, "p1")
|
|
}
|
|
|
|
func testIntroAndFootnoteDefaultNil() {
|
|
let page = ManaOnboardingPage(title: "Werte", rows: [])
|
|
XCTAssertNil(page.intro)
|
|
XCTAssertNil(page.footnote)
|
|
}
|
|
|
|
func testRowsArePreserved() {
|
|
let page = ManaOnboardingPage(
|
|
title: "Features",
|
|
rows: [
|
|
.init(symbol: "calendar", title: "Frequenz", text: "egal wann"),
|
|
.init(symbol: "bell", title: "Erinnerung", text: "lokal"),
|
|
]
|
|
)
|
|
XCTAssertEqual(page.rows.count, 2)
|
|
XCTAssertEqual(page.rows.first?.symbol, "calendar")
|
|
XCTAssertEqual(page.rows.last?.title, "Erinnerung")
|
|
}
|
|
|
|
func testRowDefaultIdFallsBackToTitle() {
|
|
let row = ManaOnboardingPage.Row(symbol: "star", title: "Mein Titel", text: "x")
|
|
XCTAssertEqual(row.id, "Mein Titel")
|
|
}
|
|
|
|
func testFootnoteAndIntroStored() {
|
|
let page = ManaOnboardingPage(
|
|
title: "Features",
|
|
intro: "Vorspann",
|
|
rows: [.init(symbol: "star", title: "a", text: "b")],
|
|
footnote: "Konto optional"
|
|
)
|
|
XCTAssertEqual(page.intro, "Vorspann")
|
|
XCTAssertEqual(page.footnote, "Konto optional")
|
|
}
|
|
|
|
func testPageIsSendable() {
|
|
// Compile-time-Beleg: ohne Action-Closures ist die API voll Sendable.
|
|
func requireSendable<T: Sendable>(_: T.Type) {}
|
|
requireSendable(ManaOnboardingPage.self)
|
|
requireSendable(ManaOnboardingPage.Row.self)
|
|
}
|
|
}
|