mtest: rust: allow parsing doctest output

Doctests have a slightly different output compared to what "protocol: rust"
supports:

  running 2 tests
  test ../doctest1.rs - my_func (line 7) ... ignored
  test ../doctest1.rs - (line 3) ... ok

  test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.12s

Add a little more parsing in order to accept this; a simple minded split()
fails to unpack the tuple.  I plan to contribute an extension of the rust
module to invoke doctests, for now this allows running rustdoc --test with
"protocol: 'rust'" and get information about the subtests:

  ▶ 4/8 ../doctest1.rs:my_func:7                     SKIP
  ▶ 4/8 ../doctest1.rs:3                             OK
  4/8 rust_unit_tests:doctests / rust doctest        OK              0.28s   1 subtests passed

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
pull/13983/head
Paolo Bonzini 4 months ago committed by Dylan Baker
parent f9f69d835e
commit 2fd0dacf06
  1. 13
      mesonbuild/mtest.py
  2. 12
      test cases/rust/9 unit tests/doctest1.rs
  3. 13
      test cases/rust/9 unit tests/meson.build

@ -81,6 +81,9 @@ if sys.maxunicode >= 0x10000:
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 @@ class TestRunRust(TestRun):
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)

@ -0,0 +1,12 @@
//! This is a doctest
//!
//! ```
//! assert_eq!(2+2, 4)
//! ```
/// ```ignore
/// this one will be skipped
/// ```
fn my_func()
{
}

@ -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')

Loading…
Cancel
Save