summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorTakeshi KOMIYA <i.tkomiya@gmail.com>2020-10-24 18:12:45 +0900
committerTakeshi KOMIYA <i.tkomiya@gmail.com>2020-10-24 18:12:45 +0900
commit445b9515c126aab84f14251e57e289cb12121754 (patch)
tree7032b82311cff77d74b66537499075480e7a8f5f /tests
parente4e5ee33307abdc65fba6244ae7349987ddae529 (diff)
parent071b14884c90e807827079ee18b1677ea71833e6 (diff)
downloadsphinx-git-445b9515c126aab84f14251e57e289cb12121754.tar.gz
Merge branch '3.x'
Diffstat (limited to 'tests')
-rw-r--r--tests/roots/test-domain-c/function_param_target.rst5
-rw-r--r--tests/roots/test-ext-autodoc/target/overload2.py5
-rw-r--r--tests/test_domain_c.py52
-rw-r--r--tests/test_domain_cpp.py15
-rw-r--r--tests/test_domain_py.py23
-rw-r--r--tests/test_ext_autodoc.py16
-rw-r--r--tests/test_pycode_ast.py14
7 files changed, 117 insertions, 13 deletions
diff --git a/tests/roots/test-domain-c/function_param_target.rst b/tests/roots/test-domain-c/function_param_target.rst
new file mode 100644
index 000000000..05de01445
--- /dev/null
+++ b/tests/roots/test-domain-c/function_param_target.rst
@@ -0,0 +1,5 @@
+.. c:function:: void f(int i)
+
+ - :c:var:`i`
+
+- :c:var:`f.i`
diff --git a/tests/roots/test-ext-autodoc/target/overload2.py b/tests/roots/test-ext-autodoc/target/overload2.py
new file mode 100644
index 000000000..e901f791b
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/overload2.py
@@ -0,0 +1,5 @@
+from target.overload import Bar
+
+
+class Baz(Bar):
+ pass
diff --git a/tests/test_domain_c.py b/tests/test_domain_c.py
index b6f72287e..43d71f74e 100644
--- a/tests/test_domain_c.py
+++ b/tests/test_domain_c.py
@@ -9,6 +9,8 @@
"""
import pytest
+from xml.etree import ElementTree
+
from sphinx import addnodes
from sphinx.addnodes import desc
from sphinx.domains.c import DefinitionParser, DefinitionError
@@ -529,6 +531,25 @@ def filter_warnings(warning, file):
return res
+def extract_role_links(app, filename):
+ t = (app.outdir / filename).read_text()
+ lis = [l for l in t.split('\n') if l.startswith("<li")]
+ entries = []
+ for l in lis:
+ li = ElementTree.fromstring(l)
+ aList = list(li.iter('a'))
+ assert len(aList) == 1
+ a = aList[0]
+ target = a.attrib['href'].lstrip('#')
+ title = a.attrib['title']
+ assert len(a) == 1
+ code = a[0]
+ assert code.tag == 'code'
+ text = ''.join(code.itertext())
+ entries.append((target, title, text))
+ return entries
+
+
@pytest.mark.sphinx(testroot='domain-c', confoverrides={'nitpicky': True})
def test_build_domain_c(app, status, warning):
app.builder.build_all()
@@ -562,6 +583,26 @@ def test_build_domain_c_semicolon(app, status, warning):
assert len(ws) == 0
+@pytest.mark.sphinx(testroot='domain-c', confoverrides={'nitpicky': True})
+def test_build_function_param_target(app, warning):
+ # the anchor for function parameters should be the function
+ app.builder.build_all()
+ ws = filter_warnings(warning, "function_param_target")
+ assert len(ws) == 0
+ entries = extract_role_links(app, "function_param_target.html")
+ assert entries == [
+ ('c.f', 'i', 'i'),
+ ('c.f', 'f.i', 'f.i'),
+ ]
+
+
+def _get_obj(app, queryName):
+ domain = app.env.get_domain('c')
+ for name, dispname, objectType, docname, anchor, prio in domain.get_objects():
+ if name == queryName:
+ return (docname, anchor, objectType)
+ return (queryName, "not", "found")
+
def test_cfunction(app):
text = (".. c:function:: PyObject* "
"PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)")
@@ -569,8 +610,7 @@ def test_cfunction(app):
assert_node(doctree[1], addnodes.desc, desctype="function",
domain="c", objtype="function", noindex=False)
- domain = app.env.get_domain('c')
- entry = domain.objects.get('PyType_GenericAlloc')
+ entry = _get_obj(app, 'PyType_GenericAlloc')
assert entry == ('index', 'c.PyType_GenericAlloc', 'function')
@@ -580,8 +620,7 @@ def test_cmember(app):
assert_node(doctree[1], addnodes.desc, desctype="member",
domain="c", objtype="member", noindex=False)
- domain = app.env.get_domain('c')
- entry = domain.objects.get('PyTypeObject.tp_bases')
+ entry = _get_obj(app, 'PyTypeObject.tp_bases')
assert entry == ('index', 'c.PyTypeObject.tp_bases', 'member')
@@ -591,9 +630,8 @@ def test_cvar(app):
assert_node(doctree[1], addnodes.desc, desctype="var",
domain="c", objtype="var", noindex=False)
- domain = app.env.get_domain('c')
- entry = domain.objects.get('PyClass_Type')
- assert entry == ('index', 'c.PyClass_Type', 'var')
+ entry = _get_obj(app, 'PyClass_Type')
+ assert entry == ('index', 'c.PyClass_Type', 'member')
def test_noindexentry(app):
diff --git a/tests/test_domain_cpp.py b/tests/test_domain_cpp.py
index 6d3ad7e4e..cacbb2f11 100644
--- a/tests/test_domain_cpp.py
+++ b/tests/test_domain_cpp.py
@@ -1231,3 +1231,18 @@ def test_noindexentry(app):
assert_node(doctree, (addnodes.index, desc, addnodes.index, desc))
assert_node(doctree[0], addnodes.index, entries=[('single', 'f (C++ function)', '_CPPv41fv', '', None)])
assert_node(doctree[2], addnodes.index, entries=[])
+
+
+def test_mix_decl_duplicate(app, warning):
+ # Issue 8270
+ text = (".. cpp:struct:: A\n"
+ ".. cpp:function:: void A()\n"
+ ".. cpp:struct:: A\n")
+ restructuredtext.parse(app, text)
+ ws = warning.getvalue().split("\n")
+ assert len(ws) == 5
+ assert "index.rst:2: WARNING: Duplicate C++ declaration, also defined in 'index'." in ws[0]
+ assert "Declaration is 'void A()'." in ws[1]
+ assert "index.rst:3: WARNING: Duplicate C++ declaration, also defined in 'index'." in ws[2]
+ assert "Declaration is 'A'." in ws[3]
+ assert ws[4] == "" \ No newline at end of file
diff --git a/tests/test_domain_py.py b/tests/test_domain_py.py
index 5d9974975..eb3afae1d 100644
--- a/tests/test_domain_py.py
+++ b/tests/test_domain_py.py
@@ -315,7 +315,7 @@ def test_pyfunction_signature(app):
def test_pyfunction_signature_full(app):
text = (".. py:function:: hello(a: str, b = 1, *args: str, "
- "c: bool = True, **kwargs: str) -> str")
+ "c: bool = True, d: tuple = (1, 2), **kwargs: str) -> str")
doctree = restructuredtext.parse(app, text)
assert_node(doctree, (addnodes.index,
[desc, ([desc_signature, ([desc_name, "hello"],
@@ -345,6 +345,14 @@ def test_pyfunction_signature_full(app):
[desc_sig_operator, "="],
" ",
[nodes.inline, "True"])],
+ [desc_parameter, ([desc_sig_name, "d"],
+ [desc_sig_punctuation, ":"],
+ " ",
+ [desc_sig_name, pending_xref, "tuple"],
+ " ",
+ [desc_sig_operator, "="],
+ " ",
+ [nodes.inline, "(1, 2)"])],
[desc_parameter, ([desc_sig_operator, "**"],
[desc_sig_name, "kwargs"],
[desc_sig_punctuation, ":"],
@@ -388,6 +396,19 @@ def test_pyfunction_signature_full_py38(app):
[desc_parameter, desc_sig_operator, "/"])])
+@pytest.mark.skipif(sys.version_info < (3, 8), reason='python 3.8+ is required.')
+def test_pyfunction_with_number_literals(app):
+ text = ".. py:function:: hello(age=0x10, height=1_6_0)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, ([desc_parameter, ([desc_sig_name, "age"],
+ [desc_sig_operator, "="],
+ [nodes.inline, "0x10"])],
+ [desc_parameter, ([desc_sig_name, "height"],
+ [desc_sig_operator, "="],
+ [nodes.inline, "1_6_0"])])])
+
+
def test_optional_pyfunction_signature(app):
text = ".. py:function:: compile(source [, filename [, symbol]]) -> ast object"
doctree = restructuredtext.parse(app, text)
diff --git a/tests/test_ext_autodoc.py b/tests/test_ext_autodoc.py
index 7fff09bb6..9cb54de5b 100644
--- a/tests/test_ext_autodoc.py
+++ b/tests/test_ext_autodoc.py
@@ -2003,6 +2003,22 @@ def test_overload(app):
@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_overload2(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.overload2', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.overload2',
+ '',
+ '',
+ '.. py:class:: Baz(x: int, y: int)',
+ ' Baz(x: str, y: str)',
+ ' :module: target.overload2',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
def test_pymodule_for_ModuleLevelDocumenter(app):
app.env.ref_context['py:module'] = 'target.classes'
actual = do_autodoc(app, 'class', 'Foo')
diff --git a/tests/test_pycode_ast.py b/tests/test_pycode_ast.py
index 32a784b74..bbff64dd0 100644
--- a/tests/test_pycode_ast.py
+++ b/tests/test_pycode_ast.py
@@ -58,7 +58,7 @@ from sphinx.pycode import ast
])
def test_unparse(source, expected):
module = ast.parse(source)
- assert ast.unparse(module.body[0].value) == expected
+ assert ast.unparse(module.body[0].value, source) == expected
def test_unparse_None():
@@ -66,8 +66,12 @@ def test_unparse_None():
@pytest.mark.skipif(sys.version_info < (3, 8), reason='python 3.8+ is required.')
-def test_unparse_py38():
- source = "lambda x=0, /, y=1, *args, z, **kwargs: x + y + z"
- expected = "lambda x=0, /, y=1, *args, z, **kwargs: ..."
+@pytest.mark.parametrize('source,expected', [
+ ("lambda x=0, /, y=1, *args, z, **kwargs: x + y + z",
+ "lambda x=0, /, y=1, *args, z, **kwargs: ..."), # posonlyargs
+ ("0x1234", "0x1234"), # Constant
+ ("1_000_000", "1_000_000"), # Constant
+])
+def test_unparse_py38(source, expected):
module = ast.parse(source)
- assert ast.unparse(module.body[0].value) == expected
+ assert ast.unparse(module.body[0].value, source) == expected