1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
"""Test sphinx.roles"""
from __future__ import annotations
from unittest.mock import Mock
import pytest
from docutils import nodes
from sphinx.roles import EmphasizedLiteral, _format_rfc_target
from sphinx.testing.util import assert_node
def test_samp() -> None:
emph_literal_role = EmphasizedLiteral()
# normal case
text = 'print 1+{variable}'
ret, msg = emph_literal_role('samp', text, text, 0, Mock())
assert_node(
ret[0],
[
nodes.literal,
(
'print 1+',
[nodes.emphasis, 'variable'],
),
],
)
assert msg == []
# two emphasis items
text = 'print {1}+{variable}'
ret, msg = emph_literal_role('samp', text, text, 0, Mock())
assert_node(
ret[0],
[
nodes.literal,
(
'print ',
[nodes.emphasis, '1'],
'+',
[nodes.emphasis, 'variable'],
),
],
)
assert msg == []
# empty curly brace
text = 'print 1+{}'
ret, msg = emph_literal_role('samp', text, text, 0, Mock())
assert_node(ret[0], [nodes.literal, 'print 1+{}'])
assert msg == []
# half-opened variable
text = 'print 1+{variable'
ret, msg = emph_literal_role('samp', text, text, 0, Mock())
assert_node(ret[0], [nodes.literal, 'print 1+{variable'])
assert msg == []
# nested
text = 'print 1+{{variable}}'
ret, msg = emph_literal_role('samp', text, text, 0, Mock())
assert_node(
ret[0],
[
nodes.literal,
(
'print 1+',
[nodes.emphasis, '{variable'],
'}',
),
],
)
assert msg == []
# emphasized item only
text = '{variable}'
ret, msg = emph_literal_role('samp', text, text, 0, Mock())
assert_node(ret[0], [nodes.literal, nodes.emphasis, 'variable'])
assert msg == []
# escaping
text = r'print 1+\{variable}'
ret, msg = emph_literal_role('samp', text, text, 0, Mock())
assert_node(ret[0], [nodes.literal, 'print 1+{variable}'])
assert msg == []
# escaping (2)
text = r'print 1+\{{variable}\}'
ret, msg = emph_literal_role('samp', text, text, 0, Mock())
assert_node(
ret[0],
[
nodes.literal,
(
'print 1+{',
[nodes.emphasis, 'variable'],
'}',
),
],
)
assert msg == []
# escape a backslash
text = r'print 1+\\{variable}'
ret, msg = emph_literal_role('samp', text, text, 0, Mock())
assert_node(
ret[0],
[
nodes.literal,
(
'print 1+\\',
[nodes.emphasis, 'variable'],
),
],
)
assert msg == []
@pytest.mark.parametrize(
('target', 'expected_output'),
[
('123', 'RFC 123'),
('123#', 'RFC 123#'),
('123#id1', 'RFC 123#id1'),
('123#section', 'RFC 123 Section'),
('123#section-1', 'RFC 123 Section 1'),
('123#section-2.5.3', 'RFC 123 Section 2.5.3'),
('123#page-13', 'RFC 123 Page 13'),
('123#appendix-B', 'RFC 123 Appendix B'),
# Section names are also present in some RFC anchors. Until we come up with a reliable way
# to reconstruct the section names from the corresponding anchors with the correct
# capitalization it's probably better to leave them alone.
('9076#name-risks-in-the-dns-data', 'RFC 9076#name-risks-in-the-dns-data'),
],
)
def test_format_rfc_target(target: str, expected_output: str) -> None:
assert _format_rfc_target(target) == expected_output
|