from django.template.defaultfilters import length
from django.test import SimpleTestCase
from django.utils.safestring import mark_safe

from ..utils import setup


class LengthTests(SimpleTestCase):
    @setup({"length01": "{{ list|length }}"})
    def test_length01(self):
        output = self.engine.render_to_string(
            "length01", {"list": ["4", None, True, {}]}
        )
        self.assertEqual(output, "4")

    @setup({"length02": "{{ list|length }}"})
    def test_length02(self):
        output = self.engine.render_to_string("length02", {"list": []})
        self.assertEqual(output, "0")

    @setup({"length03": "{{ string|length }}"})
    def test_length03(self):
        output = self.engine.render_to_string("length03", {"string": ""})
        self.assertEqual(output, "0")

    @setup({"length04": "{{ string|length }}"})
    def test_length04(self):
        output = self.engine.render_to_string("length04", {"string": "django"})
        self.assertEqual(output, "6")

    @setup({"length05": "{% if string|length == 6 %}Pass{% endif %}"})
    def test_length05(self):
        output = self.engine.render_to_string(
            "length05", {"string": mark_safe("django")}
        )
        self.assertEqual(output, "Pass")

    # Invalid uses that should fail silently.
    @setup({"length06": "{{ int|length }}"})
    def test_length06(self):
        output = self.engine.render_to_string("length06", {"int": 7})
        self.assertEqual(output, "0")

    @setup({"length07": "{{ None|length }}"})
    def test_length07(self):
        output = self.engine.render_to_string("length07", {"None": None})
        self.assertEqual(output, "0")


class FunctionTests(SimpleTestCase):
    def test_string(self):
        self.assertEqual(length("1234"), 4)

    def test_safestring(self):
        self.assertEqual(length(mark_safe("1234")), 4)

    def test_list(self):
        self.assertEqual(length([1, 2, 3, 4]), 4)
