#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Tests for tiny_render."""


import unittest

import tiny_render


# Admittedly, the HTML generated by this isn't always _beautiful_ to read
# (especially with e.g., ordered lists). Since the intent is for the HTML to be
# shipped alongside the plain-text, the hope is that people won't have to
# subject themselves to reading the HTML often. :)
class Test(unittest.TestCase):
    """Tests for tiny_render."""

    def test_bold(self):
        pieces = [
            tiny_render.Bold("hello"),
            ", ",
            tiny_render.Bold(["world", "!"]),
        ]

        self.assertEqual(
            tiny_render.render_text_pieces(pieces),
            "**hello**, **world!**",
        )

        self.assertEqual(
            tiny_render.render_html_pieces(pieces),
            "<b>hello</b>, <b>world!</b>",
        )

    def test_line_break(self):
        pieces = [
            "hello",
            tiny_render.line_break,
            ["world", "!"],
        ]

        self.assertEqual(
            tiny_render.render_text_pieces(pieces),
            "hello\nworld!",
        )

        self.assertEqual(
            tiny_render.render_html_pieces(pieces),
            "hello<br />\nworld!",
        )

    def test_linkification(self):
        pieces = [
            "hello ",
            tiny_render.Link(href="https://google.com", inner="world!"),
        ]

        self.assertEqual(
            tiny_render.render_text_pieces(pieces),
            "hello world!",
        )

        self.assertEqual(
            tiny_render.render_html_pieces(pieces),
            'hello <a href="https://google.com">world!</a>',
        )

    def test_unordered_list(self):
        pieces = [
            "hello:",
            tiny_render.UnorderedList(
                [
                    "world",
                    "w o r l d",
                ]
            ),
        ]

        self.assertEqual(
            tiny_render.render_text_pieces(pieces),
            "\n".join(
                (
                    "hello:",
                    "  - world",
                    "  - w o r l d",
                )
            ),
        )

        self.assertEqual(
            tiny_render.render_html_pieces(pieces),
            "\n".join(
                (
                    "hello:<ul>",
                    "<li>world</li>",
                    "<li>w o r l d</li>",
                    "</ul>",
                    "",
                )
            ),
        )

    def test_nested_unordered_list(self):
        pieces = [
            "hello:",
            tiny_render.UnorderedList(
                [
                    "world",
                    ["and more:", tiny_render.UnorderedList(["w o r l d"])],
                    "world2",
                ]
            ),
        ]

        self.assertEqual(
            tiny_render.render_text_pieces(pieces),
            "\n".join(
                (
                    "hello:",
                    "  - world",
                    "  - and more:",
                    "    - w o r l d",
                    "  - world2",
                )
            ),
        )

        self.assertEqual(
            tiny_render.render_html_pieces(pieces),
            "\n".join(
                (
                    "hello:<ul>",
                    "<li>world</li>",
                    "<li>and more:<ul>",
                    "<li>w o r l d</li>",
                    "</ul>",
                    "</li>",
                    "<li>world2</li>",
                    "</ul>",
                    "",
                )
            ),
        )

    def test_switch(self):
        pieces = ["hello ", tiny_render.Switch(text="text", html="html")]
        self.assertEqual(tiny_render.render_text_pieces(pieces), "hello text")
        self.assertEqual(tiny_render.render_html_pieces(pieces), "hello html")

    def test_golden(self):
        pieces = [
            "hello",
            tiny_render.UnorderedList(
                [
                    tiny_render.Switch(
                        text="text", html=tiny_render.Bold("html")
                    ),
                    "the",
                    tiny_render.Bold("sun"),
                ]
            ),
            tiny_render.line_break,
            ["is", " out!"],
        ]

        self.assertEqual(
            tiny_render.render_text_pieces(pieces),
            "\n".join(
                (
                    "hello",
                    "  - text",
                    "  - the",
                    "  - **sun**",
                    "is out!",
                )
            ),
        )

        self.assertEqual(
            tiny_render.render_html_pieces(pieces),
            "\n".join(
                (
                    "hello<ul>",
                    "<li><b>html</b></li>",
                    "<li>the</li>",
                    "<li><b>sun</b></li>",
                    "</ul>",
                    "<br />",
                    "is out!",
                )
            ),
        )


if __name__ == "__main__":
    unittest.main()
