def test_tree_children_of_childless_node(self): source = ( '%hr\n' ' text\n' ) with self.assertRaises(TemplateSyntaxError): Parser.build_tree(source)
def test_jinja_variables(self): source = '#{var} #{var2}' lines = Parser.get_source_lines(source) self.assertEquals(['{{ var }} {{ var2 }}'], lines) source = '%hr(class="#{class}")' lines = Parser.get_source_lines(source) self.assertEqual(['%hr(class="{{ class }}")'], lines)
def test_invalid_indentation(self): source = ( '%div\n' ' f\n' ' f\n' ' f\n' ' f\n' ) with self.assertRaises(TemplateIndentationError): Parser.build_tree(source)
def test_jinja_line(self): line = '-extends "base.haml"' node = Parser.parse_line(line) self.assertIsInstance(node, nodes.JinjaNode) self.assertEqual('extends', node.tag) self.assertEqual('"base.haml"', node.data) self.assertFalse(node.has_children())
def test_shortcut_class(self): line = '.cls' node = Parser.parse_line(line) self.assertIsInstance(node, nodes.HtmlNode) self.assertFalse(node.has_children()) self.assertEqual('div', node.tag) self.assertEqual({'class': 'cls'}, node.attributes)
def test_shortcut_id(self): line = '#myid' node = Parser.parse_line(line) self.assertIsInstance(node, nodes.HtmlNode) self.assertFalse(node.has_children()) self.assertEqual('div', node.tag) self.assertEqual({'id': 'myid'}, node.attributes)
def test_single_html_tag(self): line = '%div' node = Parser.parse_line(line) self.assertFalse(node.has_children()) self.assertIsInstance(node, nodes.HtmlNode) self.assertEqual('div', node.tag) self.assertEqual({}, node.attributes)
def test_tree_jinja_tag_for(self): source = ( '-for item in list\n' ' item\n' ) tree = Parser.build_tree(source) lines = tree.render_lines() self.assertEqual(['{% for item in list %}', 'item', '{% endfor %}'], lines)
def test_tree_jinja_tags_self_closing(self): source = ( '-extends "base.haml"\n' 'text\n' ) tree = Parser.build_tree(source) lines = tree.render_lines() self.assertEqual(['{% extends "base.haml" %}', 'text'], lines)
def test_line_continuation(self): source = ( '%div(a="1", \\\n' ' b="2")\n' ' text\n' ) lines = Parser.get_source_lines(source) self.assertEqual(3, len(lines)) self.assertEqual(['%div(a="1", b="2")', '', ' text'], lines)
def test_tree_text_with_html_child(self): source = ( 'text on base line\n' ' %div\n' ) tree = Parser.build_tree(source) lines = tree.render_lines() self.assertEqual(['text on base line', '<div>', '</div>'], lines)
def test_line_continuation_indented_properly(self): source = ( '%div\n' ' %p(a="1", \\ \n' ' b="2")\n' ' Text\n' ) lines = Parser.get_source_lines(source) self.assertEqual(['%div', ' %p(a="1", b="2")', '', ' Text'], lines)
def test_tree_text_with_unusual_indentation(self): source = ( 'text on base line\n' ' indented for no good reason\n' ) tree = Parser.build_tree(source) lines = tree.render_lines() self.assertEqual(['text on base line', 'indented for no good reason'], lines)
def test_comment(self): source = ( '%div\n' '; comment\n' ' text\n' ) lines = Parser.get_source_lines(source) self.assertEqual(3, len(lines)) self.assertEqual(['%div', '', ' text'], lines)
def test_single_child(self): source = ('%div') tree = Parser.build_tree(source) self.assertTrue(tree.has_children()) self.assertEqual(1, len(tree.get_children())) node = tree.get_children()[0] self.assertIsInstance(node, nodes.HtmlNode) self.assertEqual('div', node.tag) self.assertEqual({}, node.attributes)
def test_tree_raw_jinja_tag_with_a_div(self): source = ( '{% if True %}\n' ' %div true text\n' '{% endif %}\n' ) tree = Parser.build_tree(source) lines = tree.render_lines() self.assertEqual(['{% if True %}', '<div>', 'true text', '</div>', '{% endif %}'], lines)
def test_tree_jinja_tags_empty(self): source = ( '-for item in list\n' '-if True\n' 'top\n' ) tree = Parser.build_tree(source) lines = tree.render_lines() self.assertEqual(['{% for item in list %}', '{% endfor %}', '{% if True %}', '{% endif %}', 'top'], lines)
def test_tree_text(self): source = ( '%div\n' ' text\n' ' text2\n' 'top level text\n' ) tree = Parser.build_tree(source) lines = tree.render_lines() self.assertEqual(['<div>', 'text', 'text2', '</div>', 'top level text'], lines)
def test_tree_jinja_tag_if_else(self): source = ( '-if True\n' ' %div true\n' '-else\n' ' %div false\n' ) tree = Parser.build_tree(source) lines = tree.render_lines() self.assertEqual(['{% if True %}', '<div>', 'true', '</div>', '{% else %}', '<div>', 'false', '</div>', '{% endif %}'], lines)
def test_basic(self): source = ( '%div\n' ' text\n' '%p\n' ' %p\n' ' nested-text\n' ) lines = Parser.get_source_lines(source) self.assertEqual(['%div', ' text', '%p', ' %p', ' nested-text'], lines)
def test_tree_nested(self): source = ( '%div(a="1", \\ \n' ' b="2")\n' ' %h1 heading 1\n' ' %p: %span: %b bold nested\n' ) tree = Parser.build_tree(source) lines = tree.render_lines() self.assertEqual(['<div a="1" b="2">', '<h1>', 'heading 1', '</h1>', '<p>', '<span>', '<b>', 'bold nested', '</b>', '</span>', '</p>', '</div>'], lines)
def test_tree_special_block_tag_javascript(self): source = ( ':javascript\n' ' ..\n' ' .###.1\n' '%div content\n' ) tree = Parser.build_tree(source) self.assertIsInstance(tree, nodes.Node) lines = tree.render_lines() self.assertEqual(['<script type="text/javascript">', '..', '.###.1', '</script>', '<div>', 'content', '</div>'], lines)
def test_single_line_continuation(self): source = ( '%div(a="1", \\ \n' ' b="2")\n' ) tree = Parser.build_tree(source) self.assertTrue(tree.has_children()) self.assertEqual(1, len(tree.get_children())) node = tree.get_children()[0] self.assertIsInstance(node, nodes.HtmlNode) self.assertEqual('div', node.tag) self.assertEqual({'a': '1', 'b': '2'}, node.attributes)
def test_line_continuation_in_if_statement(self): source = ( '-if True\n' ' %link(a="1", \\\n' ' b="2")\n' ' %script(c="3")\n' '-else\n' ' %link(d="4")\n' ) tree = Parser.build_tree(source) lines = tree.render_lines() self.assertEqual(['{% if True %}', '<link a="1" b="2" />', '<script c="3">','</script>', '{% else %}', '<link d="4" />', '{% endif %}'], lines)
def test_inline_content(self): source = '%div.cls inline content' tree = Parser.build_tree(source) self.assertEqual(1, len(tree.get_children())) node = tree.get_children()[0] self.assertIsInstance(node, nodes.HtmlNode) self.assertEqual('div', node.tag) self.assertEqual({'class': 'cls'}, node.attributes) self.assertEqual(1, len(node.get_children())) text_node = node.get_children()[0] self.assertIsInstance(text_node, nodes.TextNode) self.assertEqual('inline content', text_node.data)
def test_tree_jinja_tag_if_elif_elif_else(self): source = ( '-if 1\n' ' 1\n' '-elif 2\n' ' 2\n' '-elif 3\n' ' 3\n' '-else\n' ' 4\n' ) tree = Parser.build_tree(source) lines = tree.render_lines() self.assertEqual(['{% if 1 %}', '1', '{% elif 2 %}', '2', '{% elif 3 %}', '3', '{% else %}', '4', '{% endif %}'], lines)
def test_tree_jinja_tag_followed_by_html_tag(self): source = ( '%html\n' ' -for item in items\n' ' #{item}\n' ' -else\n' ' Empty\n' ' %div(a="1", \\ \n' ' b="2")\n' ) tree = Parser.build_tree(source) self.assertIsInstance(tree, nodes.Node) lines = tree.render_lines() self.assertEqual(['<html>', '{% for item in items %}', '{{ item }}', '{% else %}', 'Empty', '{% endfor %}', '<div a="1" b="2">', '</div>', '</html>'], lines)
def __init__(self, source, newline_string=None, indent_string=None): self.parser = Parser(source) self.newline_string = newline_string or '' self.indent_string = indent_string or ''
def test_empty(self): self.assertEqual(0, Parser.get_indent_level(''))
def test_mixed_tabs_and_spaces_raises_error(self): with self.assertRaises(ValueError): Parser.get_indent_level(' \t %div')
def test_whitespace_only(self): # get_source_lines should strip these, but get_indent_level respects # whitespace-only lines. self.assertEqual(4, Parser.get_indent_level(' '))
def test_parser_stores_source_text(self): parser = Parser('%div') self.assertEqual('%div', parser.source)
def test_parser_builds_tree_on_init(self): parser = Parser('') self.assertIsInstance(parser.tree, nodes.Node)