summaryrefslogtreecommitdiff
path: root/tests/test_domain_cpp.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_domain_cpp.py')
-rw-r--r--tests/test_domain_cpp.py81
1 files changed, 74 insertions, 7 deletions
diff --git a/tests/test_domain_cpp.py b/tests/test_domain_cpp.py
index cd5d760d8..fba5fdb42 100644
--- a/tests/test_domain_cpp.py
+++ b/tests/test_domain_cpp.py
@@ -786,11 +786,78 @@ def test_xref_parsing():
# raise DefinitionError("")
+def filter_warnings(warning, file):
+ lines = warning.getvalue().split("\n");
+ res = [l for l in lines if "domain-cpp" in l and "{}.rst".format(file) in l and
+ "WARNING: document isn't included in any toctree" not in l]
+ print("Filtered warnings for file '{}':".format(file))
+ for w in res:
+ print(w)
+ return res
+
+
+@pytest.mark.sphinx(testroot='domain-cpp', confoverrides={'nitpicky': True})
+def test_build_domain_cpp_multi_decl_lookup(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "lookup-key-overload")
+ assert len(ws) == 0
+
+ ws = filter_warnings(warning, "multi-decl-lookup")
+ assert len(ws) == 0
+
+
+@pytest.mark.sphinx(testroot='domain-cpp', confoverrides={'nitpicky': True})
+def test_build_domain_cpp_warn_template_param_qualified_name(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "warn-template-param-qualified-name")
+ assert len(ws) == 2
+ assert "WARNING: cpp:type reference target not found: T::typeWarn" in ws[0]
+ assert "WARNING: cpp:type reference target not found: T::U::typeWarn" in ws[1]
+
+
@pytest.mark.sphinx(testroot='domain-cpp')
def test_build_domain_cpp_misuse_of_roles(app, status, warning):
app.builder.build_all()
-
- # TODO: properly check for the warnings we expect
+ ws = filter_warnings(warning, "roles-targets-ok")
+ assert len(ws) == 0
+
+ ws = filter_warnings(warning, "roles-targets-warn")
+ # the roles that should be able to generate warnings:
+ allRoles = ['class', 'struct', 'union', 'func', 'member', 'var', 'type', 'concept', 'enum', 'enumerator']
+ ok = [ # targetType, okRoles
+ ('class', ['class', 'struct', 'type']),
+ ('union', ['union', 'type']),
+ ('func', ['func', 'type']),
+ ('member', ['member', 'var']),
+ ('type', ['type']),
+ ('concept', ['concept']),
+ ('enum', ['type', 'enum']),
+ ('enumerator', ['enumerator']),
+ ('tParam', ['class', 'struct', 'union', 'func', 'member', 'var', 'type', 'concept', 'enum', 'enumerator', 'functionParam']),
+ ('functionParam', ['member', 'var']),
+ ]
+ warn = []
+ for targetType, roles in ok:
+ txtTargetType = "function" if targetType == "func" else targetType
+ for r in allRoles:
+ if r not in roles:
+ warn.append("WARNING: cpp:{} targets a {} (".format(r, txtTargetType))
+ warn = list(sorted(warn))
+ for w in ws:
+ assert "targets a" in w
+ ws = [w[w.index("WARNING:"):] for w in ws]
+ ws = list(sorted(ws))
+ print("Expected warnings:")
+ for w in warn:
+ print(w)
+ print("Actual warnings:")
+ for w in ws:
+ print(w)
+
+ for i in range(min(len(warn), len(ws))):
+ assert ws[i].startswith(warn[i])
+
+ assert len(ws) == len(warn)
@pytest.mark.skipif(docutils.__version_info__ < (0, 13),
@@ -824,14 +891,14 @@ def test_build_domain_cpp_with_add_function_parentheses_is_True(app, status, war
]
f = 'roles.html'
- t = (app.outdir / f).text()
+ t = (app.outdir / f).read_text()
for s in rolePatterns:
check(s, t, f)
for s in parenPatterns:
check(s, t, f)
f = 'any-role.html'
- t = (app.outdir / f).text()
+ t = (app.outdir / f).read_text()
for s in parenPatterns:
check(s, t, f)
@@ -867,14 +934,14 @@ def test_build_domain_cpp_with_add_function_parentheses_is_False(app, status, wa
]
f = 'roles.html'
- t = (app.outdir / f).text()
+ t = (app.outdir / f).read_text()
for s in rolePatterns:
check(s, t, f)
for s in parenPatterns:
check(s, t, f)
f = 'any-role.html'
- t = (app.outdir / f).text()
+ t = (app.outdir / f).read_text()
for s in parenPatterns:
check(s, t, f)
@@ -884,7 +951,7 @@ def test_xref_consistency(app, status, warning):
app.builder.build_all()
test = 'xref_consistency.html'
- output = (app.outdir / test).text()
+ output = (app.outdir / test).read_text()
def classes(role, tag):
pattern = (r'{role}-role:.*?'