MIL-006: Spoken Malay word
Review record RC-028 (Go, autonomous mode, not independent). Task: MIL-006#1 Task: MIL-006#2 Task: MIL-006#3 Task: MIL-006#4 Task: MIL-006#5
This commit is contained in:
@@ -33,6 +33,11 @@ class _RecordingProgress:
|
||||
self.saved.append(deck.cards)
|
||||
|
||||
|
||||
class _SilentSpeech:
|
||||
def speak(self, text: str, language_code: str) -> None:
|
||||
return None
|
||||
|
||||
|
||||
class _MissingRepository:
|
||||
def load(self) -> Vocabulary:
|
||||
raise VocabularyNotFoundError("missing")
|
||||
@@ -46,7 +51,9 @@ def test_open_study_session_builds_session_over_all_cards() -> None:
|
||||
cards = (Card("aku", "mig"), Card("kau", "du"))
|
||||
repository = _FakeRepository(Vocabulary(LanguagePair("ms", "da"), cards))
|
||||
|
||||
session = open_study_session(repository, _RecordingProgress(), _first)
|
||||
session = open_study_session(
|
||||
repository, _RecordingProgress(), _SilentSpeech(), _first
|
||||
)
|
||||
|
||||
assert session.remaining == 2
|
||||
assert session.next_card() == CardDto("aku", "mig", "ms", "da")
|
||||
@@ -54,7 +61,9 @@ def test_open_study_session_builds_session_over_all_cards() -> None:
|
||||
|
||||
def test_open_study_session_propagates_repository_error() -> None:
|
||||
with pytest.raises(VocabularyNotFoundError):
|
||||
open_study_session(_MissingRepository(), _RecordingProgress(), _first)
|
||||
open_study_session(
|
||||
_MissingRepository(), _RecordingProgress(), _SilentSpeech(), _first
|
||||
)
|
||||
|
||||
|
||||
def test_open_study_session_prefers_saved_progress() -> None:
|
||||
@@ -62,7 +71,9 @@ def test_open_study_session_prefers_saved_progress() -> None:
|
||||
vocabulary = Vocabulary(pair, (Card("aku", "mig"), Card("kau", "du")))
|
||||
progress = _RecordingProgress(Deck(pair, [Card("kau", "du")]))
|
||||
|
||||
session = open_study_session(_FakeRepository(vocabulary), progress, _first)
|
||||
session = open_study_session(
|
||||
_FakeRepository(vocabulary), progress, _SilentSpeech(), _first
|
||||
)
|
||||
|
||||
assert session.remaining == 1
|
||||
assert session.next_card() == CardDto("kau", "du", "ms", "da")
|
||||
@@ -71,7 +82,9 @@ def test_open_study_session_prefers_saved_progress() -> None:
|
||||
def test_open_study_session_skips_vocabulary_when_progress_exists() -> None:
|
||||
progress = _RecordingProgress(Deck(LanguagePair("ms", "da"), []))
|
||||
|
||||
session = open_study_session(_MissingRepository(), progress, _first)
|
||||
session = open_study_session(
|
||||
_MissingRepository(), progress, _SilentSpeech(), _first
|
||||
)
|
||||
|
||||
assert session.remaining == 0
|
||||
|
||||
@@ -80,7 +93,9 @@ def test_open_study_session_never_saves_on_start() -> None:
|
||||
vocabulary = Vocabulary(LanguagePair("ms", "da"), (Card("aku", "mig"),))
|
||||
progress = _RecordingProgress()
|
||||
|
||||
session = open_study_session(_FakeRepository(vocabulary), progress, _first)
|
||||
session = open_study_session(
|
||||
_FakeRepository(vocabulary), progress, _SilentSpeech(), _first
|
||||
)
|
||||
session.next_card()
|
||||
|
||||
assert progress.saved == []
|
||||
|
||||
@@ -28,9 +28,22 @@ class _RecordingProgress:
|
||||
self.saved.append(deck.cards)
|
||||
|
||||
|
||||
def _session(*cards: Card, progress: _RecordingProgress | None = None) -> StudySession:
|
||||
class _RecordingSpeech:
|
||||
def __init__(self) -> None:
|
||||
self.spoken: list[tuple[str, str]] = []
|
||||
|
||||
def speak(self, text: str, language_code: str) -> None:
|
||||
self.spoken.append((text, language_code))
|
||||
|
||||
|
||||
def _session(
|
||||
*cards: Card,
|
||||
progress: _RecordingProgress | None = None,
|
||||
speech: _RecordingSpeech | None = None,
|
||||
) -> StudySession:
|
||||
store = _RecordingProgress() if progress is None else progress
|
||||
return StudySession(Deck(PAIR, cards), _first, store)
|
||||
voice = _RecordingSpeech() if speech is None else speech
|
||||
return StudySession(Deck(PAIR, cards), _first, store, voice)
|
||||
|
||||
|
||||
def test_current_card_is_none_before_first_draw() -> None:
|
||||
@@ -105,3 +118,35 @@ def test_next_card_never_saves() -> None:
|
||||
session.next_card()
|
||||
session.next_card()
|
||||
assert progress.saved == []
|
||||
|
||||
|
||||
def test_next_card_speaks_front_text_once_in_front_language() -> None:
|
||||
speech = _RecordingSpeech()
|
||||
session = _session(A, B, speech=speech)
|
||||
session.next_card()
|
||||
assert speech.spoken == [("aku", "ms")]
|
||||
|
||||
|
||||
def test_next_card_does_not_speak_when_deck_is_empty() -> None:
|
||||
speech = _RecordingSpeech()
|
||||
session = _session(speech=speech)
|
||||
session.next_card()
|
||||
assert speech.spoken == []
|
||||
|
||||
|
||||
def test_next_card_speaks_again_on_every_draw() -> None:
|
||||
speech = _RecordingSpeech()
|
||||
session = _session(A, B, speech=speech)
|
||||
session.next_card()
|
||||
session.next_card()
|
||||
assert speech.spoken == [("aku", "ms"), ("kau", "ms")]
|
||||
|
||||
|
||||
def test_mark_known_does_not_speak_but_following_draw_does() -> None:
|
||||
speech = _RecordingSpeech()
|
||||
session = _session(A, B, speech=speech)
|
||||
session.next_card()
|
||||
session.mark_known()
|
||||
assert speech.spoken == [("aku", "ms")]
|
||||
session.next_card()
|
||||
assert speech.spoken == [("aku", "ms"), ("kau", "ms")]
|
||||
|
||||
Reference in New Issue
Block a user