Files
h2g2/tests/test_parser.py
seppedl 679639df9f Wire game transitions end-to-end, add Guide lookup, add 79 tests
Transitions:
- Add I-HOUSEWRECK (tick 20) and I-VOGONS (tick 50) timed events to
  earth.py, queued at startup in main.py
- I-VOGONS demolishes Earth and moves player to Vogon Hold
- Fix airlock→Dark transition to call Dark room M-ENTER handler
- Fix dream-restore to support multiple callbacks (list instead of single)
- Add state.finish() call to RAMP for endgame victory

Guide system:
- Add 16-entry lookup database to GUIDE object (space, towel, vogons,
  poetry, beast, babel fish, earth, magrathea, marvin, etc.)
- "consult guide about X" now returns relevant entry text

Tests (79 passing):
- test_engine.py (14): containment, flags, articles, clock mechanics
- test_parser.py (20): directions, compound verbs, prepositions, synonyms
- test_earth.py (21): full opening sequence, puzzles, navigation
- test_vogon.py (4): room existence, Hold first-visit sequence
- test_dark.py (7): inventory clearing, dream dispatch, probabilities
- conftest.py: shared game fixture and send() helper

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 22:04:22 +02:00

178 lines
4.5 KiB
Python

"""Tests for the input parser."""
from tests.conftest import send
def test_direction_shortcut_n(game):
state, parser, _ = game
result = parser.parse("n", state)
assert result is not None
assert result.verb == "walk"
assert result.direction == "NORTH"
def test_direction_shortcut_s(game):
state, parser, _ = game
result = parser.parse("s", state)
assert result is not None
assert result.verb == "walk"
assert result.direction == "SOUTH"
def test_direction_shortcut_e(game):
state, parser, _ = game
result = parser.parse("e", state)
assert result is not None
assert result.verb == "walk"
assert result.direction == "EAST"
def test_direction_go_north(game):
state, parser, _ = game
result = parser.parse("go north", state)
assert result is not None
assert result.verb == "walk"
assert result.direction == "NORTH"
def test_compound_verb_get_out(game):
state, parser, _ = game
result = parser.parse("get out of bed", state)
assert result is not None
assert result.verb == "get out"
def test_compound_verb_turn_on(game):
state, parser, _ = game
result = parser.parse("turn on light", state)
assert result is not None
assert result.verb == "turn on"
def test_compound_verb_turn_off(game):
state, parser, _ = game
result = parser.parse("turn off light", state)
assert result is not None
assert result.verb == "turn off"
def test_compound_verb_look_in(game):
state, parser, _ = game
result = parser.parse("look in pocket", state)
assert result is not None
assert result.verb == "look in"
def test_compound_verb_look_at(game):
state, parser, _ = game
result = parser.parse("look at bed", state)
assert result is not None
assert result.verb == "examine"
def test_compound_verb_pick_up(game):
state, parser, _ = game
result = parser.parse("pick up gown", state)
assert result is not None
assert result.verb == "take"
def test_compound_verb_stand_up(game):
state, parser, _ = game
result = parser.parse("stand up", state)
assert result is not None
assert result.verb == "stand up"
def test_compound_verb_lie_down(game):
state, parser, _ = game
result = parser.parse("lie down", state)
assert result is not None
assert result.verb == "lie down"
def test_compound_verb_put_on(game):
state, parser, _ = game
result = parser.parse("put on gown", state)
assert result is not None
assert result.verb == "put on"
def test_compound_verb_take_off(game):
state, parser, _ = game
result = parser.parse("take off gown", state)
assert result is not None
assert result.verb == "take off"
def test_preposition_splitting(game):
state, parser, _ = game
# Need objects in scope for "put X in Y" — use gown (in bedroom) and bed
result = parser.parse("put gown in bed", state)
assert result is not None
assert result.prep == "in"
def test_again_command(game):
state, parser, _ = game
# First command
result1 = parser.parse("look", state)
assert result1 is not None
# Again via "g"
result2 = parser.parse("g", state)
assert result2 is result1
# Again via "again"
result3 = parser.parse("again", state)
assert result3 is result1
def test_buzz_word_stripping(game):
state, parser, _ = game
result = parser.parse("take the gown", state)
assert result is not None
assert result.verb == "take"
# "the" should be stripped, object should resolve to GOWN
assert result.direct_obj is not None
assert result.direct_obj.id == "GOWN"
def test_verb_synonym_grab(game):
state, parser, _ = game
result = parser.parse("grab gown", state)
assert result is not None
assert result.verb == "take"
def test_verb_synonym_x(game):
state, parser, _ = game
result = parser.parse("x bed", state)
assert result is not None
assert result.verb == "examine"
def test_verb_synonym_i(game):
state, parser, _ = game
result = parser.parse("i", state)
assert result is not None
assert result.verb == "inventory"
def test_negation(game):
state, parser, _ = game
result = parser.parse("don't panic", state)
assert result is not None
assert result.is_negated is True
assert result.verb == "panic"
def test_empty_input_returns_none(game):
state, parser, _ = game
result = parser.parse("", state)
assert result is None
def test_only_buzz_words_returns_none(game):
state, parser, _ = game
result = parser.parse("the a an", state)
assert result is None