iter ctt.1: env-overlay shape ratification + DuplicateCtor pin
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
//! Pin for `CheckError::DuplicateCtor` — same-named ctors in two
|
||||
//! different ADTs within one module. Ratifies the load-bearing
|
||||
//! consumer of the per-module `env.ctor_index` rebuild in
|
||||
//! `check_in_workspace` that DESIGN.md §"Env construction" rests
|
||||
//! on as the asymmetry-with-mono-side argument. If the
|
||||
//! per-module rebuild is ever removed without an equivalent
|
||||
//! replacement path, this test goes red.
|
||||
|
||||
use ailang_check::check_workspace;
|
||||
use ailang_core::ast::{Ctor, Def, Module, TypeDef};
|
||||
use ailang_core::workspace::{Registry, Workspace};
|
||||
use ailang_core::SCHEMA;
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
#[test]
|
||||
fn duplicate_ctor_across_two_adts_in_one_module() {
|
||||
let m = Module {
|
||||
schema: SCHEMA.into(),
|
||||
name: "M".into(),
|
||||
imports: vec![],
|
||||
defs: vec![
|
||||
Def::Type(TypeDef {
|
||||
name: "Cat".into(),
|
||||
vars: vec![],
|
||||
ctors: vec![Ctor {
|
||||
name: "Twins".into(),
|
||||
fields: vec![],
|
||||
}],
|
||||
doc: None,
|
||||
drop_iterative: false,
|
||||
}),
|
||||
Def::Type(TypeDef {
|
||||
name: "Dog".into(),
|
||||
vars: vec![],
|
||||
ctors: vec![Ctor {
|
||||
name: "Twins".into(),
|
||||
fields: vec![],
|
||||
}],
|
||||
doc: None,
|
||||
drop_iterative: false,
|
||||
}),
|
||||
],
|
||||
};
|
||||
let mut modules = BTreeMap::new();
|
||||
modules.insert(m.name.clone(), m.clone());
|
||||
let ws = Workspace {
|
||||
entry: m.name.clone(),
|
||||
modules,
|
||||
root_dir: std::path::PathBuf::from("."),
|
||||
registry: Registry::default(),
|
||||
};
|
||||
|
||||
let diags = check_workspace(&ws);
|
||||
let dup = diags
|
||||
.iter()
|
||||
.find(|d| d.code == "duplicate-ctor")
|
||||
.unwrap_or_else(|| {
|
||||
panic!(
|
||||
"expected at least one `duplicate-ctor` diagnostic, got: {diags:?}"
|
||||
)
|
||||
});
|
||||
assert!(
|
||||
dup.message.contains("Twins"),
|
||||
"expected message to name the duplicate ctor `Twins`, got: {}",
|
||||
dup.message
|
||||
);
|
||||
assert!(
|
||||
dup.message.contains("Cat") && dup.message.contains("Dog"),
|
||||
"expected message to name both ADTs `Cat` and `Dog`, got: {}",
|
||||
dup.message
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user