#![cfg(feature = "compile")]
use keleusma::compiler::compile;
use keleusma::lexer::tokenize;
use keleusma::parser::parse;
fn compiles(src: &str) -> bool {
tokenize(src)
.ok()
.and_then(|t| parse(&t).ok())
.map(|a| compile(&a).is_ok())
.unwrap_or(false)
}
#[test]
fn zero_length_arrays_are_rejected() {
assert!(!compiles(
"struct S { a: [Word; 0] } fn main() -> Word { 0 }"
));
assert!(!compiles(
"struct S { a: [Word; 0], b: Word } fn main() -> Word { let s = S { a: [], b: 5 }; s.b }"
));
assert!(!compiles("enum E { V([Word; 0]) } fn main() -> Word { 0 }"));
assert!(!compiles(
"fn z() -> [Word; 0] { [] } fn main() -> Word { 0 }"
));
assert!(!compiles("fn main() -> Word { let a: [Word; 0] = []; 0 }"));
assert!(!compiles(
"fn first<const n: Word>(a: [Word; n]) -> Word { a[0] }\n\
fn main() -> Word { first::<0>([]) }"
));
}
#[test]
fn positive_length_arrays_still_compile() {
assert!(compiles(
"struct S { a: [Word; 3] } fn main() -> Word { 0 }"
));
assert!(compiles(
"fn first<const n: Word>(a: [Word; n]) -> Word { a[0] }\n\
fn main() -> Word { first::<3>([10, 20, 30]) }"
));
}