summaryrefslogtreecommitdiff
path: root/tests/test_util_nodes.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_util_nodes.py')
-rw-r--r--tests/test_util_nodes.py40
1 files changed, 38 insertions, 2 deletions
diff --git a/tests/test_util_nodes.py b/tests/test_util_nodes.py
index d20b4b892..839334cd8 100644
--- a/tests/test_util_nodes.py
+++ b/tests/test_util_nodes.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
test_util_nodes
~~~~~~~~~~~~~~~
@@ -9,6 +8,7 @@
:license: BSD, see LICENSE for details.
"""
from textwrap import dedent
+from typing import Any
import pytest
from docutils import frontend
@@ -17,7 +17,7 @@ from docutils.parsers import rst
from docutils.utils import new_document
from sphinx.transforms import ApplySourceWorkaround
-from sphinx.util.nodes import extract_messages, clean_astext
+from sphinx.util.nodes import NodeMatcher, extract_messages, clean_astext
def _transform(doctree):
@@ -50,6 +50,42 @@ def assert_node_count(messages, node_type, expect_count):
% (node_type, node_list, count, expect_count))
+def test_NodeMatcher():
+ doctree = nodes.document(None, None)
+ doctree += nodes.paragraph('', 'Hello')
+ doctree += nodes.paragraph('', 'Sphinx', block=1)
+ doctree += nodes.paragraph('', 'World', block=2)
+ doctree += nodes.literal_block('', 'blah blah blah', block=3)
+
+ # search by node class
+ matcher = NodeMatcher(nodes.paragraph)
+ assert len(doctree.traverse(matcher)) == 3
+
+ # search by multiple node classes
+ matcher = NodeMatcher(nodes.paragraph, nodes.literal_block)
+ assert len(doctree.traverse(matcher)) == 4
+
+ # search by node attribute
+ matcher = NodeMatcher(block=1)
+ assert len(doctree.traverse(matcher)) == 1
+
+ # search by node attribute (Any)
+ matcher = NodeMatcher(block=Any)
+ assert len(doctree.traverse(matcher)) == 3
+
+ # search by both class and attribute
+ matcher = NodeMatcher(nodes.paragraph, block=Any)
+ assert len(doctree.traverse(matcher)) == 2
+
+ # mismatched
+ matcher = NodeMatcher(nodes.title)
+ assert len(doctree.traverse(matcher)) == 0
+
+ # search with Any does not match to Text node
+ matcher = NodeMatcher(blah=Any)
+ assert len(doctree.traverse(matcher)) == 0
+
+
@pytest.mark.parametrize(
'rst,node_cls,count',
[