cards-native/Tests/UnitTests
Till JS 505aa9db19 feat(study): Typing-Karten + Levenshtein-Match-Logik
CardRenderer für typing ist nicht mehr Placeholder. Web-Vorbild:
TypingView.svelte + cards-domain/typing.ts.

Typing.swift (Sources/Core/Domain/):
- check(input:answer:aliases:) → TypingMatch (correct/close/wrong)
- Normalisierung: trim + lowercase + NFD-Decomp + Combining-Marks
  strippen (Diakritika: ä → a)
- Aliases-Support (Komma-getrennt aus card.fields["aliases"])
- Levenshtein-Threshold max(1, floor(len * 0.2)) → "close"

TypingCardView (Features/Study/):
- TextField mit Auto-Focus 0.15s nach onAppear, Return = Submit
- Submit-Button mit Return-Symbol + primary background
- Nach Submit: Badge (✓ Richtig / ≈ Fast / ✗ Falsch) + User-
  Eingabe in „…" Quotes + Divider + erwartete Antwort
- Haptic-Feedback: heavy bei correct, light bei close/wrong
- Reset on card.id change

TypingTests: 8 Tests für check() — exact, case+whitespace,
NFD-Umlauts, aliases, Levenshtein-close (Berln → Berlin),
empty-input, sowie Levenshtein-Helper-Sanity.

Build 8 → 9. 43 Tests grün (war 35).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 17:39:39 +02:00
..
CardsNativeTests.swift chore: Rebrand auf ev.mana.cardecky 2026-05-13 13:29:04 +02:00
ClozeTests.swift v0.3.0 — Phase β-2 Study-Loop 2026-05-13 00:16:11 +02:00
DeckDecodingTests.swift v0.2.0 — Phase β-1 Decks lesen 2026-05-13 00:06:28 +02:00
MarketplaceDecodingTests.swift fix: PublicDeckOwner.pseudonym ist Bool, nicht String? 2026-05-13 15:46:20 +02:00
MaskRegionsTests.swift v0.5.0 — Phase β-4 Media + Advanced Card-Types 2026-05-13 00:35:36 +02:00
MutationEncodingTests.swift v0.4.0 — Phase β-3 Editor 2026-05-13 00:24:43 +02:00
ReviewDecodingTests.swift v0.3.0 — Phase β-2 Study-Loop 2026-05-13 00:16:11 +02:00
TypingTests.swift feat(study): Typing-Karten + Levenshtein-Match-Logik 2026-05-13 17:39:39 +02:00