Initial Dever 0.0.1
This commit is contained in:
commit
81233d098c
1479 files changed
+163782
No files matched your search
@@ -0,0 +1,63 @@
|
||||
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());
|
||||
}
|
||||
Reference in new issue
Block a user