use std::sync::{LazyLock, Mutex};
use cairo_lang_compiler::db::RootDatabase;
use cairo_lang_compiler::diagnostics::DiagnosticsReporter;
use cairo_lang_executable_plugin::executable_plugin_suite;
use cairo_lang_filesystem::cfg::{Cfg, CfgSet};
use cairo_lang_semantic::test_utils::setup_test_module;
use cairo_lang_test_utils::parse_test_file::{TestFileRunner, TestRunnerResult};
use cairo_lang_test_utils::{
bool_input, get_direct_or_file_content, verify_diagnostics_expectation,
};
use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
use cairo_vm::types::builtin_name::BuiltinName;
use crate::compile::{self, ExecutableConfig};
pub static SHARED_DB: LazyLock<Mutex<RootDatabase>> = LazyLock::new(|| {
Mutex::new(
RootDatabase::builder()
.skip_auto_withdraw_gas()
.with_cfg(CfgSet::from_iter([Cfg::kv("gas", "disabled")]))
.detect_corelib()
.with_default_plugin_suite(executable_plugin_suite())
.build()
.unwrap(),
)
});
#[derive(Default)]
struct CompileExecutableTestRunner {}
impl TestFileRunner for CompileExecutableTestRunner {
fn run(
&mut self,
inputs: &OrderedHashMap<String, String>,
args: &OrderedHashMap<String, String>,
) -> TestRunnerResult {
let db = SHARED_DB.lock().unwrap().snapshot();
let (_, cairo_code) = get_direct_or_file_content(&inputs["cairo_code"]);
let (test_module, semantic_diagnostics) = setup_test_module(&db, &cairo_code).split();
let mut config = ExecutableConfig::default();
if bool_input(&inputs["standalone_mode"]) {
config.builtin_list = Some(vec![
BuiltinName::output,
BuiltinName::pedersen,
BuiltinName::range_check,
BuiltinName::ecdsa,
BuiltinName::bitwise,
BuiltinName::ec_op,
BuiltinName::keccak,
BuiltinName::poseidon,
BuiltinName::range_check96,
BuiltinName::add_mod,
BuiltinName::mul_mod,
]);
}
let result = compile::compile_executable_in_prepared_db(
&db,
None,
vec![test_module.crate_id],
DiagnosticsReporter::stderr().with_crates(&[test_module
.crate_id
.long(&db)
.clone()
.into_crate_input(&db)]),
config,
)
.map(|compiled| compiled.compiled_function.to_string())
.unwrap_or_else(|e| e.to_string());
let error = verify_diagnostics_expectation(args, &semantic_diagnostics);
TestRunnerResult {
outputs: OrderedHashMap::from([
("result".into(), result),
("expected_diagnostics".into(), semantic_diagnostics),
]),
error,
}
}
fn allowed_arg(&self, arg: &str) -> bool {
arg == "expect_diagnostics"
}
}
cairo_lang_test_utils::test_file_test_with_runner!(
compile_executable,
"src/compile_test_data",
{
basic: "basic",
},
CompileExecutableTestRunner
);