def test_creation_of_invalid_kind_throws_mock_generator_error():
    # when:
    try:
        ParameterKind.from_in_out(False, False)
    except MockGeneratorError:
        return
    assert False
def test_from_string_for_illegal_value():
    # when:
    try:
        ParameterKind.from_string('abc')
    except MockGeneratorError:
        return
    assert False
def test_from_string(identifier: str, expected_in: bool, expected_out: bool):
    # when:
    kind = ParameterKind.from_string(identifier)

    # then:
    assert kind.is_in() == expected_in
    assert kind.is_out() == expected_out
def test_kind_out():
    # when:
    kind = ParameterKind.kind_out()

    # then:
    assert not kind.is_in()
    assert kind.is_out()
def test_kind_from_in_out(p_in: bool, p_out: bool):
    # when:
    kind = ParameterKind.from_in_out(p_in, p_out)

    # then:
    assert kind.is_in() == p_in
    assert kind.is_out() == p_out
def test_parse_fixed_length(text, fixed_length):
    # when:
    parameter_documentation = ParameterDocumentation.from_param_string(text)

    # then:
    assert parameter_documentation.identifier == 'test'
    assert parameter_documentation.kind == ParameterKind.kind_in()
    assert parameter_documentation.fixed_length == fixed_length
def test_parse_null_terminated():
    # given:
    text = '@param[in, null-terminated] value'

    # when:
    parameter_documentation = ParameterDocumentation.from_param_string(text)

    # then:
    assert parameter_documentation.identifier == 'value'
    assert parameter_documentation.kind == ParameterKind.kind_in()
    assert parameter_documentation.fixed_length is None
    assert parameter_documentation.null_terminated
def test_enrich_with_documentation_sets_fixed_length():
    # given:
    parameter = Parameter('abc', 'def', PointerType('int', False, 1, False))
    parameter_documentation = create_parameter_documentation('abc',
                                                             fixed_length=4)

    # when:
    parameter.enrich_with_documentation(parameter_documentation)

    # then:
    assert parameter.kind == ParameterKind.kind_in_out()
    assert parameter.fixed_length == 4
def test_enrich_with_documentation_sets_is_input():
    # given:
    parameter = Parameter('abc', 'def', PointerType('int', False, 1, False))
    parameter_documentation = create_parameter_documentation(
        'abc', parameter_kind='out')

    # when:
    parameter.enrich_with_documentation(parameter_documentation)

    # then:
    assert parameter.kind == ParameterKind.kind_out()
    assert not parameter.is_input
    assert parameter.is_not_input
def test_enrich_with_documentation_defaults():
    # given:
    parameter = Parameter('abc', 'def', SimpleType('int'))
    parameter_documentation = create_parameter_documentation('abc')

    # when:
    parameter.enrich_with_documentation(parameter_documentation)

    # then:
    assert parameter.kind == ParameterKind.kind_in()
    assert parameter.is_input
    assert not parameter.is_not_input
    assert not parameter.is_output
    assert parameter.has_simple_type
    assert not parameter.has_pointer_type
    assert not parameter.is_single_element
    assert not parameter.has_fixed_length
    assert parameter.fixed_length is None
    assert not parameter.is_null_terminated
    assert not parameter.has_length_descriptor
    assert parameter.length_descriptor is None
import pytest

from c_mock_generator.module_definition.exceptions import MockGeneratorError
from c_mock_generator.module_definition.parameter_documentation import \
    ParameterDocumentation, ActiveAttributions, parse_param_annotation
from c_mock_generator.module_definition.parameter_kind import ParameterKind


@pytest.mark.parametrize('text,identifier,kind', [
    ('@param abc', 'abc', None),
    ('@param abc The ABC', 'abc', None),
    ('@param[in] abc The ABC', 'abc', ParameterKind.kind_in()),
    ('@param[out] abc The ABC', 'abc', ParameterKind.kind_out()),
    ('@param[inout] abc The ABC', 'abc', ParameterKind.kind_in_out()),
])
def test_from_param_string(text, identifier, kind):
    # when:
    parameter_documentation = ParameterDocumentation.from_param_string(text)

    # then:
    assert parameter_documentation.identifier == identifier
    if kind is None:
        assert parameter_documentation.kind is None
    else:
        assert parameter_documentation.kind == kind
    assert parameter_documentation.fixed_length is None
    assert not parameter_documentation.null_terminated
    assert parameter_documentation.length_descriptor is None


@pytest.mark.parametrize('text', [