1use crate::{
2 diagnostics::Message,
3 parser::{Pattern, Span, Spanned},
4};
5use std::{num::NonZeroUsize, path::PathBuf, process::ExitStatus};
6
7/// All the ways in which a test can fail.
8#[derive(Debug)]
9#[must_use]
10pub enum Error {
11 /// Got an invalid exit status.
12 ExitStatus {
13 /// The exit status of the command.
14 status: ExitStatus,
15 /// The expected exit status as set in the file or derived from the mode.
16 expected: i32,
17 /// A reason for why the expected exit status was expected
18 reason: Spanned<String>,
19 },
20 /// A pattern was declared but had no matching error.
21 PatternNotFound {
22 /// The pattern that was not found, and the span of where that pattern was declared.
23 pattern: Spanned<Pattern>,
24 /// Can be `None` when it is expected outside the current file
25 expected_line: Option<NonZeroUsize>,
26 },
27 /// A diagnostic code matcher was declared but had no matching error.
28 CodeNotFound {
29 /// The code that was not found, and the span of where that code was declared.
30 code: Spanned<String>,
31 /// Can be `None` when it is expected outside the current file
32 expected_line: Option<NonZeroUsize>,
33 },
34 /// A ui test checking for failure does not have any failure patterns
35 NoPatternsFound,
36 /// A ui test checking for success has failure patterns
37 PatternFoundInPassTest {
38 /// Span of a flag changing the mode (if changed from default).
39 mode: Span,
40 /// Span of the pattern
41 span: Span,
42 },
43 /// Stderr/Stdout differed from the `.stderr`/`.stdout` file present.
44 OutputDiffers {
45 /// The file containing the expected output that differs from the actual output.
46 path: PathBuf,
47 /// The normalized output from the command.
48 actual: Vec<u8>,
49 /// The unnormalized output from the command.
50 output: Vec<u8>,
51 /// The contents of the file.
52 expected: Vec<u8>,
53 /// A command, that when run, causes the output to get blessed instead of erroring.
54 bless_command: Option<String>,
55 },
56 /// There were errors that don't have a pattern.
57 ErrorsWithoutPattern {
58 /// The main message of the error.
59 msgs: Vec<Message>,
60 /// File and line information of the error.
61 path: Option<(PathBuf, NonZeroUsize)>,
62 },
63 /// A comment failed to parse.
64 InvalidComment {
65 /// The comment
66 msg: String,
67 /// The character range in which it was defined.
68 span: Span,
69 },
70 /// An invalid setting was used.
71 ConfigError(String),
72 /// Conflicting comments
73 MultipleRevisionsWithResults {
74 /// The comment being looked for
75 kind: String,
76 /// The lines where conflicts happened
77 lines: Vec<Span>,
78 },
79 /// A subcommand (e.g. rustfix) of a test failed.
80 Command {
81 /// The name of the subcommand (e.g. "rustfix").
82 kind: String,
83 /// The exit status of the command.
84 status: ExitStatus,
85 },
86 /// This catches crashes of ui tests and reports them along the failed test.
87 Bug(String),
88 /// An auxiliary build failed with its own set of errors.
89 Aux {
90 /// Path to the aux file.
91 path: Spanned<PathBuf>,
92 /// The errors that occurred during the build of the aux file.
93 errors: Vec<Error>,
94 },
95 /// An error occured applying [`rustfix`] suggestions
96 Rustfix(anyhow::Error),
97}
98
99pub(crate) type Errors = Vec<Error>;
100