1//! Define custom test flags not natively supported by ui_test
2
3use crate::{
4 build_manager::BuildManager, parser::Comments, per_test_config::TestConfig, Config, Errored,
5};
6use std::{
7 panic::{RefUnwindSafe, UnwindSafe},
8 process::{Command, Output},
9};
10
11#[cfg(feature = "rustc")]
12pub mod edition;
13#[cfg(feature = "rustc")]
14pub mod revision_args;
15#[cfg(feature = "rustc")]
16pub mod run;
17pub mod rustfix;
18
19/// Tester-specific flag that gets parsed from `//@` comments.
20pub trait Flag: Send + Sync + UnwindSafe + RefUnwindSafe + std::fmt::Debug {
21 /// Clone the boxed value and create a new box.
22 fn clone_inner(&self) -> Box<dyn Flag>;
23
24 /// Modify a command to what the flag specifies
25 fn apply(
26 &self,
27 _cmd: &mut Command,
28 _config: &TestConfig,
29 _build_manager: &BuildManager,
30 ) -> Result<(), Errored> {
31 Ok(())
32 }
33
34 /// Whether this flag causes a test to be filtered out
35 fn test_condition(&self, _config: &Config, _comments: &Comments, _revision: &str) -> bool {
36 false
37 }
38
39 /// Run an action after a test is finished.
40 /// Returns an empty [`Vec`] if no action was taken.
41 fn post_test_action(
42 &self,
43 _config: &TestConfig,
44 _output: &Output,
45 _build_manager: &BuildManager,
46 ) -> Result<(), Errored> {
47 Ok(())
48 }
49
50 /// Whether the flag gets overridden by the same flag in revisions.
51 fn must_be_unique(&self) -> bool;
52}
53
54/// Use the unit type for when you don't need any behaviour and just need to know if the flag was set or not.
55impl Flag for () {
56 fn clone_inner(&self) -> Box<dyn Flag> {
57 Box::new(())
58 }
59 fn must_be_unique(&self) -> bool {
60 true
61 }
62}
63
64impl Clone for Box<dyn Flag> {
65 fn clone(&self) -> Self {
66 self.clone_inner()
67 }
68}
69