summaryrefslogtreecommitdiffstats
path: root/src/test/run-make/coverage/doctest.rs
blob: ec04ea57063796851aa7bc1d0b758b6a51660c8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//! This test ensures that code from doctests is properly re-mapped.
//! See <https://github.com/rust-lang/rust/issues/79417> for more info.
//!
//! Just some random code:
//! ```
//! if true {
//!     // this is executed!
//!     assert_eq!(1, 1);
//! } else {
//!     // this is not!
//!     assert_eq!(1, 2);
//! }
//! ```
//!
//! doctest testing external code:
//! ```
//! extern crate doctest_crate;
//! doctest_crate::fn_run_in_doctests(1);
//! ```
//!
//! doctest returning a result:
//! ```
//! #[derive(Debug, PartialEq)]
//! struct SomeError {
//!     msg: String,
//! }
//! let mut res = Err(SomeError { msg: String::from("a message") });
//! if res.is_ok() {
//!     res?;
//! } else {
//!     if *res.as_ref().unwrap_err() == *res.as_ref().unwrap_err() {
//!         println!("{:?}", res);
//!     }
//!     if *res.as_ref().unwrap_err() == *res.as_ref().unwrap_err() {
//!         res = Ok(1);
//!     }
//!     res = Ok(0);
//! }
//! // need to be explicit because rustdoc cant infer the return type
//! Ok::<(), SomeError>(())
//! ```
//!
//! doctest with custom main:
//! ```
//! fn some_func() {
//!     println!("called some_func()");
//! }
//!
//! #[derive(Debug)]
//! struct SomeError;
//!
//! extern crate doctest_crate;
//!
//! fn doctest_main() -> Result<(), SomeError> {
//!     some_func();
//!     doctest_crate::fn_run_in_doctests(2);
//!     Ok(())
//! }
//!
//! // this `main` is not shown as covered, as it clashes with all the other
//! // `main` functions that were automatically generated for doctests
//! fn main() -> Result<(), SomeError> {
//!     doctest_main()
//! }
//! ```

/// doctest attached to fn testing external code:
/// ```
/// extern crate doctest_crate;
/// doctest_crate::fn_run_in_doctests(3);
/// ```
///
fn main() {
    if true {
        assert_eq!(1, 1);
    } else {
        assert_eq!(1, 2);
    }
}

// FIXME(Swatinem): Fix known issue that coverage code region columns need to be offset by the
// doc comment line prefix (`///` or `//!`) and any additional indent (before or after the doc
// comment characters). This test produces `llvm-cov show` results demonstrating the problem.
//
// One of the above tests now includes: `derive(Debug, PartialEq)`, producing an `llvm-cov show`
// result with a distinct count for `Debug`, denoted by `^1`, but the caret points to the wrong
// column. Similarly, the `if` blocks without `else` blocks show `^0`, which should point at, or
// one character past, the `if` block's closing brace. In both cases, these are most likely off
// by the number of characters stripped from the beginning of each doc comment line: indent
// whitespace, if any, doc comment prefix (`//!` in this case) and (I assume) one space character
// (?). Note, when viewing `llvm-cov show` results in `--color` mode, the column offset errors are
// more pronounced, and show up in more places, with background color used to show some distinct
// code regions with different coverage counts.
//
// NOTE: Since the doc comment line prefix may vary, one possible solution is to replace each
// character stripped from the beginning of doc comment lines with a space. This will give coverage
// results the correct column offsets, and I think it should compile correctly, but I don't know
// what affect it might have on diagnostic messages from the compiler, and whether anyone would care
// if the indentation changed. I don't know if there is a more viable solution.