1"""
2    test_roles
3    ~~~~~~~~~~
4
5    Test sphinx.roles
6
7    :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
8    :license: BSD, see LICENSE for details.
9"""
10
11from unittest.mock import Mock
12
13from docutils import nodes
14
15from sphinx.roles import EmphasizedLiteral
16from sphinx.testing.util import assert_node
17
18
19def test_samp():
20    emph_literal_role = EmphasizedLiteral()
21
22    # normal case
23    text = 'print 1+{variable}'
24    ret, msg = emph_literal_role('samp', text, text, 0, Mock())
25    assert_node(ret[0], [nodes.literal, ("print 1+",
26                                         [nodes.emphasis, "variable"])])
27    assert msg == []
28
29    # two emphasis items
30    text = 'print {1}+{variable}'
31    ret, msg = emph_literal_role('samp', text, text, 0, Mock())
32    assert_node(ret[0], [nodes.literal, ("print ",
33                                         [nodes.emphasis, "1"],
34                                         "+",
35                                         [nodes.emphasis, "variable"])])
36    assert msg == []
37
38    # empty curly brace
39    text = 'print 1+{}'
40    ret, msg = emph_literal_role('samp', text, text, 0, Mock())
41    assert_node(ret[0], [nodes.literal, "print 1+{}"])
42    assert msg == []
43
44    # half-opened variable
45    text = 'print 1+{variable'
46    ret, msg = emph_literal_role('samp', text, text, 0, Mock())
47    assert_node(ret[0], [nodes.literal, "print 1+{variable"])
48    assert msg == []
49
50    # nested
51    text = 'print 1+{{variable}}'
52    ret, msg = emph_literal_role('samp', text, text, 0, Mock())
53    assert_node(ret[0], [nodes.literal, ("print 1+",
54                                         [nodes.emphasis, "{variable"],
55                                         "}")])
56    assert msg == []
57
58    # emphasized item only
59    text = '{variable}'
60    ret, msg = emph_literal_role('samp', text, text, 0, Mock())
61    assert_node(ret[0], [nodes.literal, nodes.emphasis, "variable"])
62    assert msg == []
63
64    # escaping
65    text = r'print 1+\{variable}'
66    ret, msg = emph_literal_role('samp', text, text, 0, Mock())
67    assert_node(ret[0], [nodes.literal, "print 1+{variable}"])
68    assert msg == []
69
70    # escaping (2)
71    text = r'print 1+\{{variable}\}'
72    ret, msg = emph_literal_role('samp', text, text, 0, Mock())
73    assert_node(ret[0], [nodes.literal, ("print 1+{",
74                                         [nodes.emphasis, "variable"],
75                                         "}")])
76    assert msg == []
77
78    # escape a backslash
79    text = r'print 1+\\{variable}'
80    ret, msg = emph_literal_role('samp', text, text, 0, Mock())
81    assert_node(ret[0], [nodes.literal, ("print 1+\\",
82                                         [nodes.emphasis, "variable"])])
83    assert msg == []
84