Files
core/test/rust/compiler/id.rs
T
2026-11-03 03:32:07 +00:00

64 lines
2.3 KiB
Rust

use dever::compiler::{check, model::Program};
use dever::syntax::{diagnostic::Diagnostic, source::Source};
fn linked(text: &str) -> Result<Program, Diagnostic> {
let sources = [
Source::new(0, "main.dever", text.into()),
Source::new(
1,
"lib/dever/id.dever",
include_str!("../../../lib/dever/id.dever").into(),
),
];
let modules = sources
.iter()
.map(dever::syntax::parse)
.collect::<Result<Vec<_>, _>>()?;
check::check(modules, &["main".into(), "dever.id".into()])
}
#[test]
fn ids_are_opaque_and_distinct_from_text() {
for source in [
"main(text: Text) (answer: Id) { answer = text }",
"main(id: Id) (answer: Text) { answer = id }",
"main(id: Id) (answer: Int) { answer = length(id) }",
"main(id: Id) (answer: Bool) { answer = id == \"x\" }",
"main(id: Id) (answer: Bool) { answer = id < id }",
"main(id: Id) (answer: Id) { answer = id + id }",
"main(id: Id) (answer: Text) { answer = id.value }",
"main() (answer: Id) { answer = Id { value = \"x\" } }",
"main(id: Id) () { value = dever.id.fromText(id) }",
"main() () { value = dever.id.toText(\"x\") }",
] {
assert!(linked(source).is_err(), "{source}");
}
assert_eq!(
linked("main() (answer: Id) { answer = dever.system.idFromText(\"x\") }")
.unwrap_err()
.code,
"C006"
);
}
#[test]
fn ids_can_be_keys_and_nullable_values_without_implicit_conversion() {
for source in [
"main(id: Id) (answer: Map<Id, Int>) { answer = { id = 1 } }",
"main(id: Id, values: Map<Id, Text>) (answer: Text?) { answer = get(values, id) }",
"main(id: Id, values: Map<Id, Id?>) (answer: Id?) { answer = get(values, id) }",
"main(values: List<Text>) (answer: List<Id>) { answer = each(dever.id.fromText, values) }",
"main(id: Id?) (answer: Id?) { answer = id }",
] {
let result = linked(source);
assert!(result.is_ok(), "{result:?}");
}
assert_eq!(
linked("main(id: Id) () { alias = id\n value = { id = 1\n alias = 2 } }")
.unwrap_err()
.code,
"C002"
);
assert!(linked("main(values: Map<Id, Int>) () { found = get(values, \"x\") }").is_err());
}