/
test_textui.py
92 lines (73 loc) · 2.67 KB
/
test_textui.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
from core import initial_state, render, key as rusty_key
from textui import step, parse, dispatch, mainloop
from pytest import raises
from effect import Func, raise_
from effect.testing import noop, perform_sequence
from effect.io import Display, Prompt
from storage import SaveGame
in_street = initial_state.set(location_name="Street")
def test_parse():
assert parse("move up") == ["move", "up"]
assert parse("move in there") == ["move", "in there"]
assert parse("take bottle") == ["take", "bottle"]
assert parse("take rusty key") == ["take", "rusty key"]
def test_parse_error():
with raises(Exception) as err_info:
parse("move")
assert str(
err_info.value
) == "Expected: `take <item>` or `move <direction>`"
def test_dispatch():
with_key = in_street.transform(
["inventory"], [rusty_key],
["world", "Street", "items"], {}
)
assert dispatch(initial_state, "move", "east") == in_street
assert dispatch(in_street, "take", "rusty key") == with_key
def test_dispatch_error():
with raises(Exception) as err_info:
dispatch(initial_state, "move", "up")
assert str(
err_info.value
) == "Invalid argument!"
def test_step():
expected_effects = [
(Display(render(initial_state)), noop),
(Prompt("> "), lambda i: "move east"),
(Display("Okay."), noop)
]
eff = step(initial_state)
result = perform_sequence(expected_effects, eff)
assert result == in_street
def test_step_bad_command():
expected_effects = [
(Display(render(initial_state)), noop),
(Prompt("> "), lambda i: "do a flip"),
(Display("Expected: `take <item>` or `move <direction>`"), noop)
]
eff = step(initial_state)
result = perform_sequence(expected_effects, eff)
assert result == initial_state
def test_quit_game():
for exc in (KeyboardInterrupt(), EOFError()):
expected_effects = [
(Display(render(initial_state)), noop),
(Prompt("> "), lambda i: raise_(exc)),
(Display("\nThanks for playing!"), noop),
]
eff = step(initial_state)
with raises(SystemExit):
perform_sequence(expected_effects, eff)
def test_mainloop():
expected_effects = [
(Display(render(initial_state)), noop),
(Prompt("> "), lambda i: "move east"),
(Display("Okay."), noop),
(SaveGame(state=in_street), noop),
(Display(render(in_street)), noop),
(Prompt("> "), lambda i: raise_(KeyboardInterrupt())),
(Display("\nThanks for playing!"), noop)
]
eff = mainloop(initial_state)
with raises(SystemExit):
perform_sequence(expected_effects, eff)