[lang-ref] ( exsample_ask_yes_no ) ( python )
def test_exsample_ask_yes_no(monkeypatch, capsys):
import builtins
def hook_answers(*answers):
it = iter(answers)
monkeypatch.setattr(builtins, 'input', lambda prompt='': next(it))
def hook_keyboard_interrupt():
def raise_keyboard_interrupt(prompt=""):
raise KeyboardInterrupt()
monkeypatch.setattr(builtins, "input", raise_keyboard_interrupt)
def ask():
while True:
try:
answer = input('Proceed? [Y/n]: ')
except KeyboardInterrupt:
print('\nCancelled.')
return False
ans = answer.strip().lower()
if ans == '' or ans in ['y', 'yes']:
return True
elif ans in ['n', 'no']:
return False
else:
print("\nPlease respond with 'y' or 'n'")
continue
# yes
hook_answers('y')
r = ask()
assert r is True
hook_answers('yes')
r = ask()
assert r is True
hook_answers('y ') # strip
r = ask()
assert r is True
# default
hook_answers('')
r = ask()
assert r is True
# no
hook_answers('no')
r = ask()
assert r is False
# illegal input -> continue -> no
hook_answers('yes, but..', "no")
r = ask()
assert r is False
out = capsys.readouterr().out
assert "Please respond with 'y' or 'n'" in out
# cancel (Ctrl-C)
hook_keyboard_interrupt()
r = ask()
assert r is False
out = capsys.readouterr().out
assert "Cancelled." in out