Exercise rename refusals directly on the bounded test stack
This commit is contained in:
+31
-36
@@ -34,18 +34,7 @@ fn renamed(layer: Layer) -> Project {
|
||||
p
|
||||
}
|
||||
fn rejected(bundle: &SourceBundle, desired: &Project, contains: &str) {
|
||||
fn phase(message: &str) {
|
||||
use std::io::Write;
|
||||
let mut stderr = std::io::stderr().lock();
|
||||
writeln!(stderr, "rename rejected helper: {message}").unwrap();
|
||||
stderr.flush().unwrap();
|
||||
}
|
||||
phase("entered; before authored");
|
||||
let source = authored(bundle);
|
||||
phase("after authored; before plan");
|
||||
let result = source.plan_rename(desired);
|
||||
phase("after plan; before result match");
|
||||
let e = match result {
|
||||
let e = match authored(bundle).plan_rename(desired) {
|
||||
Ok(_) => panic!("unexpected accepted target"),
|
||||
Err(e) => e,
|
||||
};
|
||||
@@ -489,16 +478,9 @@ fn combined_shrink_offsets_typed_growth_and_counts_untouched_files() {
|
||||
}
|
||||
#[test]
|
||||
fn deep_and_wide_equality_and_late_refusal_drop_on_small_stack() {
|
||||
fn phase(message: &str) {
|
||||
use std::io::Write;
|
||||
let mut stderr = std::io::stderr().lock();
|
||||
writeln!(stderr, "rename small-stack: {message}").unwrap();
|
||||
stderr.flush().unwrap();
|
||||
}
|
||||
std::thread::Builder::new()
|
||||
.stack_size(128 * 1024)
|
||||
.spawn(|| {
|
||||
phase("entered worker");
|
||||
for (expression, result, nodes) in [
|
||||
(
|
||||
format!("{}1{}", "abs(".repeat(127), ")".repeat(127)),
|
||||
@@ -515,30 +497,43 @@ fn deep_and_wide_equality_and_late_refusal_drop_on_small_stack() {
|
||||
"calculation c \"C\" id \"{}\" {{ result {result}; body {expression}; }}",
|
||||
id(2)
|
||||
));
|
||||
phase(if nodes == 128 {
|
||||
"deep: before authored"
|
||||
} else {
|
||||
"wide: before authored"
|
||||
});
|
||||
let source = authored(&bundle);
|
||||
phase("after authored; before original clone");
|
||||
assert_eq!(source.indexed.resolved.expressions.len(), nodes);
|
||||
let original = source.project().clone();
|
||||
phase("after original clone; before plan");
|
||||
let plan = source.plan_rename(&original).unwrap();
|
||||
phase("after plan; before plan drop");
|
||||
drop(plan);
|
||||
phase("after plan drop; before desired clone");
|
||||
drop(source.plan_rename(&original).unwrap());
|
||||
|
||||
// Keep the complete admission pipeline on this worker, without
|
||||
// nesting it inside the general rejection assertion helper.
|
||||
let mut desired = original.clone();
|
||||
desired.definitions.get_mut(&id(2)).unwrap().alias = "p".into();
|
||||
phase("before collision rejection");
|
||||
rejected(&bundle, &desired, "collide");
|
||||
phase("after collision rejection; before second desired clone");
|
||||
let source = authored(&bundle);
|
||||
let failure = match source.plan_rename(&desired) {
|
||||
Ok(_) => panic!("colliding rename accepted"),
|
||||
Err(failure) => failure,
|
||||
};
|
||||
assert_eq!(failure.diagnostics.len(), 1);
|
||||
assert_eq!(
|
||||
failure.diagnostics[0].diagnostic.message,
|
||||
"Rename aliases collide in their final namespace."
|
||||
);
|
||||
drop(failure);
|
||||
drop(desired);
|
||||
|
||||
let mut desired = original.clone();
|
||||
calculation(&mut desired, 2).body = a::Binding::Unbound;
|
||||
phase("before semantic rejection");
|
||||
rejected(&bundle, &desired, "non-name");
|
||||
phase("after semantic rejection; before iteration drop");
|
||||
let source = authored(&bundle);
|
||||
let failure = match source.plan_rename(&desired) {
|
||||
Ok(_) => panic!("non-name mutation accepted"),
|
||||
Err(failure) => failure,
|
||||
};
|
||||
assert_eq!(failure.diagnostics.len(), 1);
|
||||
assert_eq!(
|
||||
failure.diagnostics[0].diagnostic.message,
|
||||
"Rename target changes non-name project semantics."
|
||||
);
|
||||
drop(failure);
|
||||
drop(desired);
|
||||
drop(original);
|
||||
}
|
||||
})
|
||||
.unwrap()
|
||||
|
||||
Reference in New Issue
Block a user