import unittest
from tools.lib.pretty_print import pretty_print_html
from tools.lib.template_parser import validate
# Note that GOOD_HTML isn't necessarily beautiful HTML. Apart
# from adjusting indentation, we mostly leave things alone to
# respect whatever line-wrapping styles were in place before.
BAD_HTML = """
Test
Goodbyeworld!
print 'hello world'
{{ bla }}
"""
GOOD_HTML = """
Test
Goodbyeworld!
print 'hello world'
{{ bla }}
"""
BAD_HTML1 = """
foobarfoobarfoobar
"""
GOOD_HTML1 = """
foobarfoobarfoobar
"""
BAD_HTML2 = """
{{# foobar area}}
foobarfoobarfoobar
{{/ foobar}}
"""
GOOD_HTML2 = """
{{# foobar area}}
foobarfoobarfoobar
{{/ foobar}}
"""
# The old GOOD_HTML3 test was flawed.
BAD_HTML4 = """
"""
GOOD_HTML4 = """
"""
BAD_HTML5 = """
foo
{{#if foobar}}
hello
{{else}}
bye
{{/if}}
bar
"""
GOOD_HTML5 = """
foo
{{#if foobar}}
hello
{{else}}
bye
{{/if}}
bar
"""
BAD_HTML6 = """
"""
GOOD_HTML6 = """
"""
BAD_HTML7 = """
{{dyn_name}}
{{#if invite_only}} {{/if}}
"""
GOOD_HTML7 = """
{{dyn_name}}
{{#if invite_only}} {{/if}}
"""
BAD_HTML8 = """
{{#each test}}
{{#with this}}
{{#if foobar}}
{{{test}}}
{{/if}}
{{#if foobar2}}
{{> teststuff}}
{{/if}}
{{/with}}
{{/each}}
"""
GOOD_HTML8 = """
{{#each test}}
{{#with this}}
{{#if foobar}}
{{{test}}}
{{/if}}
{{#if foobar2}}
{{> teststuff}}
{{/if}}
{{/with}}
{{/each}}
"""
BAD_HTML9 = """
"""
GOOD_HTML9 = """
"""
BAD_HTML10 = """
{% block portico_content %}
foobar
{% for row in data %}
{% for group in (row[0:2], row[2:4]) %}
{% endfor %}
{% endfor %}
{% endblock %}
"""
GOOD_HTML10 = """
{% block portico_content %}
foobar
{% for row in data %}
{% for group in (row[0:2], row[2:4]) %}
{% endfor %}
{% endfor %}
{% endblock %}
"""
BAD_HTML11 = """
"""
GOOD_HTML11 = """
"""
def pretty_print(html: str, template_format: str | None = None) -> str:
fn = ""
tokens = validate(fn=fn, text=html, template_format=template_format)
return pretty_print_html(tokens, fn=fn)
class TestPrettyPrinter(unittest.TestCase):
def compare(self, a: str, b: str) -> None:
self.assertEqual(a.split("\n"), b.split("\n"))
def test_pretty_print(self) -> None:
self.compare(pretty_print(GOOD_HTML), GOOD_HTML)
self.compare(pretty_print(BAD_HTML), GOOD_HTML)
self.compare(pretty_print(BAD_HTML1), GOOD_HTML1)
self.compare(pretty_print(BAD_HTML2, template_format="handlebars"), GOOD_HTML2)
self.compare(pretty_print(BAD_HTML4), GOOD_HTML4)
self.compare(pretty_print(BAD_HTML5, template_format="handlebars"), GOOD_HTML5)
self.compare(pretty_print(BAD_HTML6), GOOD_HTML6)
self.compare(pretty_print(BAD_HTML7, template_format="handlebars"), GOOD_HTML7)
self.compare(pretty_print(BAD_HTML8, template_format="handlebars"), GOOD_HTML8)
self.compare(pretty_print(BAD_HTML9, template_format="handlebars"), GOOD_HTML9)
self.compare(pretty_print(BAD_HTML10, template_format="django"), GOOD_HTML10)
self.compare(pretty_print(BAD_HTML11), GOOD_HTML11)