def test_constraints_everything_match():
    tc_check_constraints(ps(), 'CMD', {
        '-a': '1',
        '-b': rxc(r'ab+c'),
        '-c': lambda x: int(x) > 5,
        '-d': 'xyz'
    }, [('-c', '99'), ('-b', 'abbbc'), ('-e', 'not checked')])
def test_constraints_str_regex_mismatch():
    with pytest.raises(TF):
        tc_check_constraints(ps(), 'CMD', {'-a': rxc(r'ab+c')}, [('-a', 'b')])
def test_constraints_str_multiple_one_mismatch():
    with pytest.raises(TF):
        tc_check_constraints(ps(), 'CMD', {
            '-a': '1',
            '-b': '2'
        }, [('-a', '1'), ('-b', '999')])
def test_constraints_str_regex_match():
    tc_check_constraints(ps(), 'CMD', {'-a': rxc(r'ab+c')}, [('-a', 'abbbc')])
def test_constraints_str_repeated_actual_mismatch():
    with pytest.raises(TF):
        tc_check_constraints(ps(), 'CMD', {'-a': '1'}, [('-a', '1'),
                                                        ('-a', '999')])
def test_constraints_str_multiple_match():
    tc_check_constraints(ps(), 'CMD', {
        '-a': '1',
        '-b': '2'
    }, [('-a', '1'), ('-b', '2')])
def test_constraints_str_single_mismatch_arg():
    with pytest.raises(TF):
        tc_check_constraints(ps(), 'CMD', {'-a': '1'}, [('-a', '999')])
def test_constraints_str_repeated_actual_match():
    tc_check_constraints(ps(), 'CMD', {'-a': '1'}, [('-a', '1'), ('-a', '1')])
def test_constraints_str_single_mismatch_option():
    tc_check_constraints(ps(), 'CMD', {'-a': '1'}, [('-b', '1')])
def test_constraints_str_single_match():
    tc_check_constraints(ps(), 'CMD', {'-a': '1'}, [('-a', '1')])
def test_constraints_str_nonempty_empty_passes():
    tc_check_constraints(ps(), 'CMD', {'-a': '1'}, [])
def test_constraints_str_empty_nonempty_passes():
    tc_check_constraints(ps(), 'CMD', {}, [('-a', '1')])
def test_constraints_empty_empty_passes():
    tc_check_constraints(ps(), 'CMD', {}, [])