{%- import "generator_macros.j2" as macros with context -%}

{%- macro func_call(case) -%}
    {{ case["property"] }}(
        {% for arg in case["input"].values() %}
            {{ arg }}{{- "," if not loop.last }}
        {% endfor %}
    )
{%- endmacro -%}

{%- macro test_case(case) -%}
    {%- set expected = case["expected"] -%}
    {%- set exp_error = expected["error"] -%}
    def test_{{ case["description"] | to_snake }}(self):
    {%- if case is error_case %}
        with self.assertRaises(ValueError) as err:
            {{ func_call(case) }}
        self.assertEqual(type(err.exception), ValueError)
        self.assertEqual(err.exception.args[0], "{{ exp_error }}")
    {%- else %}
        self.assertEqual({{ func_call(case) }}, {{ expected }})
    {%- endif %}
{% endmacro %}

{{ macros.header() }}

class {{ exercise | camel_case }}Test(unittest.TestCase):
    {% for case in cases -%}
    {{ test_case(case) }}
    {% endfor -%}

{{ macros.footer() }}
