| 1 | use crate::{ |
| 2 | diagnostics::Message, |
| 3 | parser::{Pattern, Span, Spanned}, |
| 4 | }; |
| 5 | use std::{num::NonZeroUsize, path::PathBuf, process::ExitStatus}; |
| 6 | |
| 7 | /// All the ways in which a test can fail. |
| 8 | #[derive (Debug)] |
| 9 | #[must_use ] |
| 10 | pub 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 | |
| 99 | pub(crate) type Errors = Vec<Error>; |
| 100 | |