[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