diff --git a/mesonbuild/mtest.py b/mesonbuild/mtest.py index 503cb14325dd..27e0f796a3f1 100644 --- a/mesonbuild/mtest.py +++ b/mesonbuild/mtest.py @@ -81,6 +81,9 @@ UNENCODABLE_XML_CHR_RANGES = [fr'{chr(low)}-{chr(high)}' for (low, high) in UNENCODABLE_XML_UNICHRS] UNENCODABLE_XML_CHRS_RE = re.compile('([' + ''.join(UNENCODABLE_XML_CHR_RANGES) + '])') +RUST_TEST_RE = re.compile(r'^test (?!result)(.*) \.\.\. (.*)$') +RUST_DOCTEST_RE = re.compile(r'^(.*?) - (.*? |)\(line (\d+)\)') + def is_windows() -> bool: platname = platform.system().lower() @@ -1157,8 +1160,14 @@ def parse_res(n: int, name: str, result: str) -> TAPParser.Test: n = 1 async for line in lines: - if line.startswith('test ') and not line.startswith('test result'): - _, name, _, result = line.rstrip().split(' ') + match = RUST_TEST_RE.match(line) + if match: + name, result = match.groups() + doctest = RUST_DOCTEST_RE.match(name) + if doctest: + name = ':'.join((x.rstrip() for x in doctest.groups() if x)) + else: + name = name.rstrip() name = name.replace('::', '.') t = parse_res(n, name, result) self.results.append(t) diff --git a/test cases/rust/9 unit tests/doctest1.rs b/test cases/rust/9 unit tests/doctest1.rs new file mode 100644 index 000000000000..d270f7d67047 --- /dev/null +++ b/test cases/rust/9 unit tests/doctest1.rs @@ -0,0 +1,12 @@ +//! This is a doctest +//! +//! ``` +//! assert_eq!(2+2, 4) +//! ``` + +/// ```ignore +/// this one will be skipped +/// ``` +fn my_func() +{ +} diff --git a/test cases/rust/9 unit tests/meson.build b/test cases/rust/9 unit tests/meson.build index e6274578146e..aa9da679693e 100644 --- a/test cases/rust/9 unit tests/meson.build +++ b/test cases/rust/9 unit tests/meson.build @@ -31,6 +31,19 @@ test( suite : ['foo'], ) +rustdoc = find_program('rustdoc', required: false) +if rustdoc.found() + # rustdoc is invoked mostly like rustc. This is a simple example + # where it is easy enough to invoke it by hand. + test( + 'rust doctest', + rustdoc, + args : ['--test', '--crate-name', 'doctest1', '--crate-type', 'lib', files('doctest1.rs')], + protocol : 'rust', + suite : ['doctests'], + ) +endif + exe = executable('rust_exe', ['test2.rs', 'test.rs'], build_by_default : false) rust = import('rust')