def test_attp_prompts_projects(attp_dp, tasks, out):
    tasks.add_task(Task("unassigned_task"))
    tasks.add_task(Task("@@@project prj:fakeproj1"))
    tasks.add_task(Task("an assigned task prj:fakeproj2"))
    with pytest.raises(IOError):
        next(attp_dp)
    o = out()
    print(o)
    assert 'auto create' in o
    assert 'new project' in o
    assert '0. fakeproj1' in o
def test_phase_can_skip_cycle(dp, out, tasks: Tasks, capsys):
    tasks.add_task(Task(""))
    dp.dummy_input = ['skip']
    next(dp)
    o = out()
    assert o.count("What do") == 1
    assert o.count("Skipping") == 1
def test_can_retry_response(dp, out, tasks):
    tasks.add_task(Task(""))
    dp.dummy_input = ['d', 'skip']
    next(dp)
    assert out().count("Skipping") == 1
def test_displays_options_command(dp, out, tasks):
    tasks.add_task(Task(""))
    with pytest.raises(IOError):
        next(dp)
    assert out().count('skip') == 1
def test_attp_can_assign_to_existing_prj(attp_dp, tasks, out):
    attp_dp.dummy_input = ['p', '0']
    tasks.add_task(t := Task("buy paint"))
    tasks.add_task(Task("@@@project prj:guitar"))
    next(attp_dp)
    assert t.persist == "buy paint prj:guitar"
def test_attp_new_test_makes_new_and_assigns(attp_dp, tasks, out):
    attp_dp.dummy_input = ['n', 'new']
    tasks.add_task(t := Task("make thing"))
    next(attp_dp)
    assert t.persist == 'make thing prj:new'
    assert Task('prj:new @@@project') in tasks
def test_attp_auto_has_correct_effect(attp_dp, tasks, out):
    attp_dp.dummy_input = ['a']
    tasks.add_task(t := Task("make thing"))
    next(attp_dp)
    assert t.persist == 'prj:make_thing @@@project'
    print(out())
def test_flp_manual_has_correct_effect(flp_dp, tasks: Tasks, out):
    flp_dp.dummy_input = ['m', 'mars_attacks']
    tasks.add_task(t := Task("@@@project test"))
    next(flp_dp)
    assert t.persist == '@@@project test prj:mars_attacks'
def test_flp_auto_has_correct_effect(flp_dp, tasks, out):
    flp_dp.dummy_input = ['a']
    tasks.add_task(t := Task("@@@project test"))
    next(flp_dp)
    assert t.persist == '@@@project prj:test'
def test_flp_filters_to_correct_tasks(flp_dp, tasks):
    tasks.add_tasks_from_list(
        ["@@@project test", "@@@project prj:test", "test"])
    assert list(flp_dp.relevant_tasks) == [
        Task("@@@project test"),
    ]
def test_partial_matcher_handle_non_unique_matches(dp, out, tasks):
    tasks.add_task(Task(""))
    dp._option_classes = [DummyOption('kite'), DummyOption('kitten')]
    dp.dummy_input = ['kit']
    with pytest.raises(IOError):
        next(dp)
def test_can_match_unique_partial_command(dp, out, tasks):
    tasks.add_task(Task(""))
    dp.dummy_input = ['s']
    next(dp)
    assert out().count("Skipping") == 1