Add 'Collecting' step to 'check' command output + warning for suspicious test filter
Fixes #1092. Signed-off-by: KtorZ <5680256+KtorZ@users.noreply.github.com>
This commit is contained in:
parent
58d782fa78
commit
3c2b631813
|
@ -19,6 +19,7 @@
|
|||
|
||||
- **aiken-lang**: The compiler now raises a warning when attempting to destructure a record constructor without using named fields. See [#1084](https://github.com/aiken-lang/aiken/issues/1084). @KtorZ
|
||||
- **aiken-lang**: Fix blueprint schema definitions related to pairs (no longer omit (sometimes) Pairs definitions, and generate them as data List). See [#1086](https://github.com/aiken-lang/aiken/issues/1086) and [#970](https://github.com/aiken-lang/aiken/issues/970). @KtorZ
|
||||
- **aiken-project**: Improve feedback returned when matching tests or modules - see [#1092](https://github.com/aiken-lang/aiken/issues/1092). @KtorZ
|
||||
|
||||
## v1.1.10 - 2025-01-21
|
||||
|
||||
|
@ -31,7 +32,7 @@
|
|||
### Changed
|
||||
|
||||
- **aiken-project**: The `aiken.toml` file no longer supports `v1` and `v2` for the plutus version field. @rvcas
|
||||
- **aiken-project**: `Error::TomlLoading` now looks much better - [see](https://github.com/aiken-lang/aiken/issues/1032#issuecomment-2562122101). @rvcas
|
||||
- **aiken-project**: `Error::TomlLoading` now looks much better - see [#1032](https://github.com/aiken-lang/aiken/issues/1032#issuecomment-2562122101). @rvcas
|
||||
- **aiken-lang**: 10-20% optimization improvements via case-constr, rearranging function definitions (while maintaining dependency ordering),
|
||||
and allowing inlining in if_then_else_error cases which preserve the same error semantics for a program. @Microproofs
|
||||
|
||||
|
|
|
@ -594,6 +594,8 @@ pub enum Warning {
|
|||
CompilerVersionMismatch { demanded: String, current: String },
|
||||
#[error("No configuration found for environment {env}.")]
|
||||
NoConfigurationForEnv { env: String },
|
||||
#[error("Suspicious test filter (-m) yielding no test scenarios.")]
|
||||
SuspiciousTestMatch { test: String },
|
||||
}
|
||||
|
||||
impl ExtraData for Warning {
|
||||
|
@ -603,7 +605,8 @@ impl ExtraData for Warning {
|
|||
| Warning::DependencyAlreadyExists { .. }
|
||||
| Warning::InvalidModuleName { .. }
|
||||
| Warning::CompilerVersionMismatch { .. }
|
||||
| Warning::NoConfigurationForEnv { .. } => None,
|
||||
| Warning::NoConfigurationForEnv { .. }
|
||||
| Warning::SuspiciousTestMatch { .. } => None,
|
||||
Warning::Type { warning, .. } => warning.extra_data(),
|
||||
}
|
||||
}
|
||||
|
@ -616,7 +619,8 @@ impl GetSource for Warning {
|
|||
Warning::NoValidators
|
||||
| Warning::DependencyAlreadyExists { .. }
|
||||
| Warning::NoConfigurationForEnv { .. }
|
||||
| Warning::CompilerVersionMismatch { .. } => None,
|
||||
| Warning::CompilerVersionMismatch { .. }
|
||||
| Warning::SuspiciousTestMatch { .. } => None,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -627,7 +631,8 @@ impl GetSource for Warning {
|
|||
| Warning::InvalidModuleName { .. }
|
||||
| Warning::DependencyAlreadyExists { .. }
|
||||
| Warning::NoConfigurationForEnv { .. }
|
||||
| Warning::CompilerVersionMismatch { .. } => None,
|
||||
| Warning::CompilerVersionMismatch { .. }
|
||||
| Warning::SuspiciousTestMatch { .. } => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -644,7 +649,8 @@ impl Diagnostic for Warning {
|
|||
| Warning::InvalidModuleName { .. }
|
||||
| Warning::NoConfigurationForEnv { .. }
|
||||
| Warning::DependencyAlreadyExists { .. }
|
||||
| Warning::CompilerVersionMismatch { .. } => None,
|
||||
| Warning::CompilerVersionMismatch { .. }
|
||||
| Warning::SuspiciousTestMatch { .. } => None,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -655,7 +661,8 @@ impl Diagnostic for Warning {
|
|||
| Warning::NoValidators
|
||||
| Warning::DependencyAlreadyExists { .. }
|
||||
| Warning::NoConfigurationForEnv { .. }
|
||||
| Warning::CompilerVersionMismatch { .. } => None,
|
||||
| Warning::CompilerVersionMismatch { .. }
|
||||
| Warning::SuspiciousTestMatch { .. } => None,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -676,6 +683,7 @@ impl Diagnostic for Warning {
|
|||
Warning::NoConfigurationForEnv { .. } => {
|
||||
Some(Box::new("aiken::project::config::missing::env"))
|
||||
}
|
||||
Warning::SuspiciousTestMatch { .. } => Some(Box::new("aiken::check::suspicious_match")),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -696,6 +704,12 @@ impl Diagnostic for Warning {
|
|||
Warning::NoConfigurationForEnv { .. } => Some(Box::new(
|
||||
"When configuration keys are missing for a target environment, no 'config' module will be created. This may lead to issues down the line.",
|
||||
)),
|
||||
Warning::SuspiciousTestMatch { test } => Some(Box::new(
|
||||
format!(
|
||||
"Did you mean to match all tests within a specific module? Like so:\n\n╰─▶ {}",
|
||||
format!("-m \"{test}.{{..}}\"").if_supports_color(Stderr, |s| s.bold()),
|
||||
)
|
||||
)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -980,12 +980,35 @@ where
|
|||
""
|
||||
};
|
||||
|
||||
let match_names = match_split_dot.next().map(|names| {
|
||||
let match_names = match_split_dot.next().and_then(|names| {
|
||||
let names = names.replace(&['{', '}'][..], "");
|
||||
|
||||
let names_split_comma = names.split(',');
|
||||
|
||||
names_split_comma.map(str::to_string).collect()
|
||||
let result = names_split_comma
|
||||
.filter_map(|s| {
|
||||
let s = s.trim();
|
||||
if s.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(s.to_string())
|
||||
}
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
if result.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(result)
|
||||
}
|
||||
});
|
||||
|
||||
self.event_listener.handle_event(Event::CollectingTests {
|
||||
matching_module: if match_module.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(match_module.to_string())
|
||||
},
|
||||
matching_names: match_names.clone().unwrap_or_default(),
|
||||
});
|
||||
|
||||
(match_module.to_string(), match_names)
|
||||
|
@ -993,6 +1016,13 @@ where
|
|||
.collect::<Vec<(String, Option<Vec<String>>)>>()
|
||||
});
|
||||
|
||||
if match_tests.is_none() {
|
||||
self.event_listener.handle_event(Event::CollectingTests {
|
||||
matching_module: None,
|
||||
matching_names: vec![],
|
||||
});
|
||||
}
|
||||
|
||||
for checked_module in self.checked_modules.values() {
|
||||
if checked_module.package != self.config.name.to_string() {
|
||||
continue;
|
||||
|
@ -1064,6 +1094,27 @@ where
|
|||
));
|
||||
}
|
||||
|
||||
// NOTE: The filtering syntax for tests isn't quite obvious. A common pitfall when willing
|
||||
// to match over a top-level module is to simple pass in `-m module_name`, which will be
|
||||
// treated as a match for a test name.
|
||||
//
|
||||
// In this case, we raise an additional warning to suggest a different match syntax, which
|
||||
// may be quite helpful in teaching users how to deal with module filtering.
|
||||
match match_tests.as_deref() {
|
||||
Some(&[(ref s, Some(ref names))]) if tests.is_empty() => {
|
||||
if let [test] = names.as_slice() {
|
||||
self.warnings.push(Warning::SuspiciousTestMatch {
|
||||
test: if s.is_empty() {
|
||||
test.to_string()
|
||||
} else {
|
||||
s.to_string()
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
|
||||
Ok(tests)
|
||||
}
|
||||
|
||||
|
|
|
@ -43,6 +43,10 @@ pub enum Event {
|
|||
name: String,
|
||||
path: PathBuf,
|
||||
},
|
||||
CollectingTests {
|
||||
matching_module: Option<String>,
|
||||
matching_names: Vec<String>,
|
||||
},
|
||||
RunningTests,
|
||||
RunningBenchmarks,
|
||||
FinishedTests {
|
||||
|
|
|
@ -117,6 +117,53 @@ impl EventListener for Terminal {
|
|||
name.if_supports_color(Stderr, |s| s.bright_blue()),
|
||||
);
|
||||
}
|
||||
Event::CollectingTests {
|
||||
matching_module,
|
||||
matching_names,
|
||||
} => {
|
||||
eprintln!(
|
||||
"{:>13} {tests} {module}",
|
||||
"Collecting"
|
||||
.if_supports_color(Stderr, |s| s.bold())
|
||||
.if_supports_color(Stderr, |s| s.purple()),
|
||||
tests = if matching_names.is_empty() {
|
||||
if matching_module.is_some() {
|
||||
"all tests scenarios"
|
||||
.if_supports_color(Stderr, |s| s.bold())
|
||||
.to_string()
|
||||
} else {
|
||||
"all tests scenarios".to_string()
|
||||
}
|
||||
} else {
|
||||
format!(
|
||||
"test{} {}",
|
||||
if matching_names.len() > 1 { "s" } else { "" },
|
||||
matching_names
|
||||
.iter()
|
||||
.map(|s| format!("*{s}*"))
|
||||
.collect::<Vec<_>>()
|
||||
.join(", ")
|
||||
.if_supports_color(Stderr, |s| s.bold())
|
||||
)
|
||||
},
|
||||
module = match matching_module {
|
||||
None => format!(
|
||||
"across {}",
|
||||
if matching_names.is_empty() {
|
||||
"all modules".to_string()
|
||||
} else {
|
||||
"all modules"
|
||||
.if_supports_color(Stderr, |s| s.bold())
|
||||
.to_string()
|
||||
}
|
||||
),
|
||||
Some(module) => format!(
|
||||
"within module(s): {}",
|
||||
format!("*{module}*").if_supports_color(Stderr, |s| s.bold())
|
||||
),
|
||||
}
|
||||
);
|
||||
}
|
||||
Event::RunningTests => {
|
||||
eprintln!(
|
||||
"{} {}",
|
||||
|
|
|
@ -123,6 +123,7 @@ where
|
|||
|
||||
if !json {
|
||||
for warning in &warnings {
|
||||
eprintln!();
|
||||
warning.report()
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue