[hawkmoth] Re: [PATCH 4/4] test: add diagnostic tests

  • From: Bruno Santos <brunomanuelsantos@xxxxxxxxxxxxxxxxxx>
  • To: Jani Nikula <jani@xxxxxxxxxx>
  • Date: Sun, 28 Apr 2019 22:09:03 +0200

On 22:06:07 2019-04-28, Jani Nikula wrote:

On Sun, 28 Apr 2019, Bruno Santos <brunomanuelsantos@xxxxxxxxxxxxxxxxxx> 
wrote:
This patch lists no new tests, but the existing examples provide enough
coverage for Clang related warnings and errors: we don't care for
checking every possible kind of error as long as we can assert they are
generated appropriately.

The framework is quite general though and will accept tests for any new
diagnostics we add support for.

Again at the high level looks fine, but please make two changes:

1) Make the parse_to_string removal a separate prep patch.

2) Have the testlib code handle non-existing .stderr files gracefully,
   meaning the same thing as empty file, and remove all the empty files.

Will do ;)

Thanks for the review.


BR,
Jani.

---
 hawkmoth/__main__.py               | 15 ++++++++++-----
 hawkmoth/parser.py                 | 16 ----------------
 test/compat-javadoc-basic.stderr   |  0
 test/compat-javadoc-liberal.stderr |  0
 test/compat-kernel-doc.stderr      |  0
 test/compat.stderr                 |  0
 test/composition.stderr            |  0
 test/doc.stderr                    |  0
 test/enum.stderr                   |  0
 test/example-10-macro.stderr       |  0
 test/example-20-variable.stderr    |  0
 test/example-30-typedef.stderr     |  0
 test/example-40-enum.stderr        |  0
 test/example-50-struct.stderr      |  1 +
 test/example-70-function.stderr    |  2 ++
 test/example-80-compat.stderr      |  2 ++
 test/example-90-generic.stderr     |  0
 test/function-like-macro.stderr    |  0
 test/function.stderr               |  0
 test/meta-expected-failure.stderr  |  0
 test/simple-macro.stderr           |  0
 test/struct.stderr                 |  0
 test/test_cautodoc.py              |  4 ++--
 test/test_hawkmoth.py              | 20 +++++++++++++++-----
 test/testenv.py                    |  7 ++++---
 test/typedef-enum.stderr           |  0
 test/typedef-struct.stderr         |  0
 test/typedef.stderr                |  0
 test/union.stderr                  |  0
 test/variable.stderr               |  0
 30 files changed, 36 insertions(+), 31 deletions(-)
 create mode 100644 test/compat-javadoc-basic.stderr
 create mode 100644 test/compat-javadoc-liberal.stderr
 create mode 100644 test/compat-kernel-doc.stderr
 create mode 100644 test/compat.stderr
 create mode 100644 test/composition.stderr
 create mode 100644 test/doc.stderr
 create mode 100644 test/enum.stderr
 create mode 100644 test/example-10-macro.stderr
 create mode 100644 test/example-20-variable.stderr
 create mode 100644 test/example-30-typedef.stderr
 create mode 100644 test/example-40-enum.stderr
 create mode 100644 test/example-50-struct.stderr
 create mode 100644 test/example-70-function.stderr
 create mode 100644 test/example-80-compat.stderr
 create mode 100644 test/example-90-generic.stderr
 create mode 100644 test/function-like-macro.stderr
 create mode 100644 test/function.stderr
 create mode 100644 test/meta-expected-failure.stderr
 create mode 100644 test/simple-macro.stderr
 create mode 100644 test/struct.stderr
 create mode 100644 test/typedef-enum.stderr
 create mode 100644 test/typedef-struct.stderr
 create mode 100644 test/typedef.stderr
 create mode 100644 test/union.stderr
 create mode 100644 test/variable.stderr

diff --git a/hawkmoth/__main__.py b/hawkmoth/__main__.py
index 6689777..1efb267 100644
--- a/hawkmoth/__main__.py
+++ b/hawkmoth/__main__.py
@@ -10,7 +10,7 @@
 import argparse
 import sys
 
-from hawkmoth.parser import parse_to_string
+from hawkmoth.parser import parse
 
 def main():
     parser = argparse.ArgumentParser(prog='hawkmoth', description="""
@@ -31,10 +31,15 @@ def main():
                         help='Verbose output.')
     args = parser.parse_args()
 
-    comments, errors = parse_to_string(args.file, args.verbose,
-                                       compat=args.compat, 
clang=args.clang)
+    docs, errors = parse(args.file, compat=args.compat, clang=args.clang)
 
-    print(comments)
-    print(errors, file=sys.stderr)
+    for (doc, meta) in docs:
+        if args.verbose:
+            print('# {}'.format(meta))
+        print(doc)
+
+    for (severity, filename, lineno, msg) in errors:
+        print('{}: {}:{}: {}\n'.format(severity.name,
+                                       filename, lineno, msg), 
file=sys.stderr)
 
 main()
diff --git a/hawkmoth/parser.py b/hawkmoth/parser.py
index 20ca327..b6963c4 100644
--- a/hawkmoth/parser.py
+++ b/hawkmoth/parser.py
@@ -294,19 +294,3 @@ def parse(filename, **options):
     result.sort(key=lambda r: r[1]['line'])
 
     return result, errors
-
-def parse_to_string(filename, verbose, **options):
-    docs_str = ''
-    errors_str = ''
-    docs, errors = parse(filename, **options)
-
-    for (doc, meta) in docs:
-        if verbose:
-            docs_str += ('# ' + str(meta) + '\n')
-        docs_str += doc + '\n'
-
-    for (severity, filename, lineno, msg) in errors:
-        errors_str += '{}: {}:{}: {}\n'.format(severity.name,
-                                               filename, lineno, msg)
-
-    return docs_str, errors_str
diff --git a/test/compat-javadoc-basic.stderr 
b/test/compat-javadoc-basic.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/compat-javadoc-liberal.stderr 
b/test/compat-javadoc-liberal.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/compat-kernel-doc.stderr b/test/compat-kernel-doc.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/compat.stderr b/test/compat.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/composition.stderr b/test/composition.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/doc.stderr b/test/doc.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/enum.stderr b/test/enum.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/example-10-macro.stderr b/test/example-10-macro.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/example-20-variable.stderr 
b/test/example-20-variable.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/example-30-typedef.stderr b/test/example-30-typedef.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/example-40-enum.stderr b/test/example-40-enum.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/example-50-struct.stderr b/test/example-50-struct.stderr
new file mode 100644
index 0000000..ea95c38
--- /dev/null
+++ b/test/example-50-struct.stderr
@@ -0,0 +1 @@
+ERROR: 9: unknown type name 'list_data_t'
diff --git a/test/example-70-function.stderr 
b/test/example-70-function.stderr
new file mode 100644
index 0000000..1686172
--- /dev/null
+++ b/test/example-70-function.stderr
@@ -0,0 +1,2 @@
+WARNING: 9: declaration of 'struct list' will not be visible outside of 
this function
+WARNING: 9: declaration of 'enum mode' will not be visible outside of this 
function
diff --git a/test/example-80-compat.stderr b/test/example-80-compat.stderr
new file mode 100644
index 0000000..1686172
--- /dev/null
+++ b/test/example-80-compat.stderr
@@ -0,0 +1,2 @@
+WARNING: 9: declaration of 'struct list' will not be visible outside of 
this function
+WARNING: 9: declaration of 'enum mode' will not be visible outside of this 
function
diff --git a/test/example-90-generic.stderr b/test/example-90-generic.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/function-like-macro.stderr 
b/test/function-like-macro.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/function.stderr b/test/function.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/meta-expected-failure.stderr 
b/test/meta-expected-failure.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/simple-macro.stderr b/test/simple-macro.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/struct.stderr b/test/struct.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/test_cautodoc.py b/test/test_cautodoc.py
index 4d7c746..38bc119 100755
--- a/test/test_cautodoc.py
+++ b/test/test_cautodoc.py
@@ -23,7 +23,7 @@ def _get_output(input_filename, app, status, warning, 
**options):
 
     app.build()
 
-    return testenv.read_file(os.path.join(app.outdir, 'index.txt'))
+    return testenv.read_file(os.path.join(app.outdir, 'index.txt')), None
 
 @with_app(confdir=testenv.testdir, create_new_srcdir=True, 
buildername='text')
 def _get_expected(input_filename, app, status, warning, **options):
@@ -32,7 +32,7 @@ def _get_expected(input_filename, app, status, warning, 
**options):
 
     app.build()
 
-    return testenv.read_file(os.path.join(app.outdir, 'index.txt'))
+    return testenv.read_file(os.path.join(app.outdir, 'index.txt')), None
 
 class DirectiveTest(unittest.TestCase):
     pass
diff --git a/test/test_hawkmoth.py b/test/test_hawkmoth.py
index 61c0f08..1cf3992 100755
--- a/test/test_hawkmoth.py
+++ b/test/test_hawkmoth.py
@@ -6,15 +6,25 @@
 import unittest
 
 import testenv
-from hawkmoth.parser import parse_to_string
+from hawkmoth.parser import parse
 
 def _get_output(input_filename, **options):
-    output, errors = parse_to_string(input_filename, False, **options)
-    # FIXME: should handle errors
-    return output
+    docs_str = ''
+    errors_str = ''
+
+    docs, errors = parse(input_filename, **options)
+
+    for (doc, meta) in docs:
+        docs_str += doc + '\n'
+
+    for (severity, filename, lineno, msg) in errors:
+        errors_str += '{}: {}: {}\n'.format(severity.name, lineno, msg)
+
+    return docs_str, errors_str
 
 def _get_expected(input_filename, **options):
-    return testenv.read_file(input_filename, ext='rst')
+    return testenv.read_file(input_filename, ext='rst'), \
+        testenv.read_file(input_filename, ext='stderr')
 
 class ParserTest(unittest.TestCase):
     pass
diff --git a/test/testenv.py b/test/testenv.py
index c86749a..b76c280 100644
--- a/test/testenv.py
+++ b/test/testenv.py
@@ -72,10 +72,11 @@ def read_file(filename, **kwargs):
 def _test_generator(get_output, get_expected, input_filename, **options):
     """Return a function that compares output/expected results on 
input_filename."""
     def test(self):
-        output = get_output(input_filename, **options)
-        expected = get_expected(input_filename, **options)
+        output_docs, output_errors = get_output(input_filename, **options)
+        expect_docs, expect_errors = get_expected(input_filename, 
**options)
 
-        self.assertEqual(expected, output)
+        self.assertEqual(expect_docs, output_docs)
+        self.assertEqual(expect_errors, output_errors)
 
     return test
 
diff --git a/test/typedef-enum.stderr b/test/typedef-enum.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/typedef-struct.stderr b/test/typedef-struct.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/typedef.stderr b/test/typedef.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/union.stderr b/test/union.stderr
new file mode 100644
index 0000000..e69de29
diff --git a/test/variable.stderr b/test/variable.stderr
new file mode 100644
index 0000000..e69de29
-- 
2.21.0

Other related posts: