You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.9 KiB
65 lines
1.9 KiB
#![feature(fs_try_exists)]
|
|
|
|
#[path = "./common.rs"]
|
|
mod common;
|
|
use common::*;
|
|
|
|
use basic_to_mindustry::{
|
|
interpreter::{run, StopCondition, Value},
|
|
optimize::{optimize_constant, optimize_jump_always, optimize_jump_op},
|
|
parse_and_translate,
|
|
prelude::MindustryProgram,
|
|
};
|
|
|
|
/// Verifies that each test file in the `tests/print-success` test suite return `success` in the `@print` buffer.
|
|
#[test]
|
|
fn test_interprete_success() {
|
|
fn test(program: &MindustryProgram, file_name: &str, opt_name: &str) {
|
|
let result = run(&program, StopCondition::End);
|
|
|
|
assert_eq!(
|
|
result.get("@print"),
|
|
Some(&Value::String(String::from("success"))),
|
|
"File {file_name} did not print 'success' in the {opt_name} configuration: {:?}",
|
|
result.get("@print").cloned().unwrap_or_default()
|
|
);
|
|
}
|
|
|
|
macro_rules! chain {
|
|
( $( $optimizer:expr ),* ) => {
|
|
Box::new(|prog| {
|
|
let res = prog;
|
|
$(
|
|
let res = $optimizer(res);
|
|
)*
|
|
res
|
|
})
|
|
}
|
|
}
|
|
|
|
let optimizations: Vec<(
|
|
&'static str,
|
|
Box<dyn Fn(MindustryProgram) -> MindustryProgram>,
|
|
)> = vec![
|
|
("unoptimized", chain!()),
|
|
("constant", chain!(optimize_constant)),
|
|
(
|
|
"constant+jump_op",
|
|
chain!(optimize_constant, optimize_jump_op),
|
|
),
|
|
(
|
|
"level-1",
|
|
chain!(optimize_constant, optimize_jump_op, optimize_jump_always),
|
|
),
|
|
];
|
|
|
|
for (file_name, file) in read_basic_files("./tests/print-success/") {
|
|
let unoptimized = parse_and_translate(&file, &Default::default()).unwrap();
|
|
|
|
for (opt_name, optimizer) in optimizations.iter() {
|
|
let optimized = optimizer(unoptimized.clone());
|
|
test(&optimized, &file_name, opt_name);
|
|
}
|
|
}
|
|
}
|