diff options
Diffstat (limited to 'tests/test_tree.py')
-rw-r--r-- | tests/test_tree.py | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/tests/test_tree.py b/tests/test_tree.py new file mode 100644 index 0000000..7a7d605 --- /dev/null +++ b/tests/test_tree.py @@ -0,0 +1,93 @@ +from markdown_it import MarkdownIt +from markdown_it.tree import SyntaxTreeNode + +EXAMPLE_MARKDOWN = """ +## Heading here + +Some paragraph text and **emphasis here** and more text here. +""" + + +def test_tree_to_tokens_conversion(): + tokens = MarkdownIt().parse(EXAMPLE_MARKDOWN) + tokens_after_roundtrip = SyntaxTreeNode(tokens).to_tokens() + assert tokens == tokens_after_roundtrip + + +def test_property_passthrough(): + tokens = MarkdownIt().parse(EXAMPLE_MARKDOWN) + heading_open = tokens[0] + tree = SyntaxTreeNode(tokens) + heading_node = tree.children[0] + assert heading_open.tag == heading_node.tag + assert tuple(heading_open.map) == heading_node.map + assert heading_open.level == heading_node.level + assert heading_open.content == heading_node.content + assert heading_open.markup == heading_node.markup + assert heading_open.info == heading_node.info + assert heading_open.meta == heading_node.meta + assert heading_open.block == heading_node.block + assert heading_open.hidden == heading_node.hidden + + +def test_type(): + tokens = MarkdownIt().parse(EXAMPLE_MARKDOWN) + tree = SyntaxTreeNode(tokens) + # Root type is "root" + assert tree.type == "root" + # "_open" suffix must be stripped from nested token type + assert tree.children[0].type == "heading" + assert tree[0].type == "heading" + # For unnested tokens, node type must remain same as token type + assert tree.children[0].children[0].type == "inline" + + +def test_sibling_traverse(): + tokens = MarkdownIt().parse(EXAMPLE_MARKDOWN) + tree = SyntaxTreeNode(tokens) + paragraph_inline_node = tree.children[1].children[0] + text_node = paragraph_inline_node.children[0] + assert text_node.type == "text" + strong_node = text_node.next_sibling + assert strong_node.type == "strong" + another_text_node = strong_node.next_sibling + assert another_text_node.type == "text" + assert another_text_node.next_sibling is None + assert another_text_node.previous_sibling.previous_sibling == text_node + assert text_node.previous_sibling is None + + +def test_pretty(file_regression): + md = MarkdownIt("commonmark") + tokens = md.parse( + """ +# Header + +Here's some text and an image ![title](image.png) + +1. a **list** + +> a *quote* + """ + ) + node = SyntaxTreeNode(tokens) + file_regression.check(node.pretty(indent=2, show_text=True), extension=".xml") + + +def test_walk(): + tokens = MarkdownIt().parse(EXAMPLE_MARKDOWN) + tree = SyntaxTreeNode(tokens) + expected_node_types = ( + "root", + "heading", + "inline", + "text", + "paragraph", + "inline", + "text", + "strong", + "text", + "text", + ) + for node, expected_type in zip(tree.walk(), expected_node_types): + assert node.type == expected_type |