Skip to content

Commit

Permalink
Merge pull request #252 from moonbitlang/check_panic
Browse files Browse the repository at this point in the history
driver: move check_panic into moon
  • Loading branch information
Young-Flash authored Sep 4, 2024
2 parents a1bf66a + ede5fb2 commit 2ac9377
Show file tree
Hide file tree
Showing 14 changed files with 315 additions and 279 deletions.
64 changes: 35 additions & 29 deletions crates/moon/src/cli/generate_test_driver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ use colored::Colorize;
use mooncake::pkg::sync::auto_sync;
use moonutil::cli::UniversalFlags;
use moonutil::common::{
lower_surface_targets, DriverKind, MoonbuildOpt, RunMode, TargetBackend, TestOpt,
BLACKBOX_TEST_DRIVER, INTERNAL_TEST_DRIVER, MOONBITLANG_CORE, MOON_TEST_DELIMITER_BEGIN,
MOON_TEST_DELIMITER_END, WHITEBOX_TEST_DRIVER,
lower_surface_targets, DriverKind, MoonbuildOpt, MooncGenTestInfo, RunMode, TargetBackend,
TestOpt, BLACKBOX_TEST_DRIVER, INTERNAL_TEST_DRIVER, MOONBITLANG_CORE,
MOON_TEST_DELIMITER_BEGIN, MOON_TEST_DELIMITER_END, TEST_INFO_FILE, WHITEBOX_TEST_DRIVER,
};
use moonutil::dirs::PackageDirs;
use moonutil::mooncakes::sync::AutoSyncFlags;
use moonutil::mooncakes::RegistryConfig;
use std::io::Read;
use std::io::{Read, Write};
use std::path::{Path, PathBuf};

/// Test the current package
Expand All @@ -45,9 +45,10 @@ pub struct GeneratedTestDriverSubcommand {
pub driver_kind: DriverKind,
}

fn moonc_gen_test_info(files: &[PathBuf]) -> anyhow::Result<String> {
fn moonc_gen_test_info(files: &[PathBuf], target_dir: &Path) -> anyhow::Result<String> {
let mut generated = std::process::Command::new("moonc")
.arg("gen-test-info")
.arg("-json")
.args(files)
.stdout(std::process::Stdio::piped())
.spawn()
Expand All @@ -60,7 +61,28 @@ fn moonc_gen_test_info(files: &[PathBuf]) -> anyhow::Result<String> {
.read_to_string(&mut out)
.with_context(|| gen_error_message(files))?;
generated.wait()?;
return Ok(out);

// append whitebox blackbox internal test info to test_info.json
{
let test_info_json_path = target_dir.join(TEST_INFO_FILE);
out.push('\n');
std::fs::OpenOptions::new()
.create(true)
.append(true)
.open(&test_info_json_path)
.context(format!(
"failed to open file: {}",
test_info_json_path.display()
))?
.write_all(out.as_bytes())
.context(format!(
"failed to write file: {}",
test_info_json_path.display()
))?;
}

let t: MooncGenTestInfo = serde_json_lenient::from_str(&out)?;
return Ok(t.to_mbt());

fn gen_error_message(files: &[PathBuf]) -> String {
format!(
Expand Down Expand Up @@ -153,7 +175,8 @@ pub fn generate_test_driver(

let backend_filtered: Vec<PathBuf> =
moonutil::common::backend_filter(files, moonc_opt.link_opt.target_backend);
let mbts_test_data = moonc_gen_test_info(&backend_filtered)?;
let mbts_test_data =
moonc_gen_test_info(&backend_filtered, &target_dir.join(pkg.rel.fs_full_name()))?;

if pkg.is_main && mbts_test_data.contains("(__test_") {
eprintln!(
Expand All @@ -175,7 +198,7 @@ pub fn generate_test_driver(
}

fn generate_driver(data: &str, pkgname: &str, target_backend: Option<TargetBackend>) -> String {
let index = data.find(" let with_args_tests =").unwrap_or(data.len());
let index = data.find("let with_args_tests =").unwrap_or(data.len());
let only_no_arg_tests = !data[index..].contains("__test_");

// TODO: need refactor
Expand All @@ -196,16 +219,11 @@ fn generate_driver(data: &str, pkgname: &str, target_backend: Option<TargetBacke
test_driver_template
.replace("\r\n", "\n")
.replace(
"let tests: Map[String, Array[(() -> Unit!Error, Array[String])]] = { } // WILL BE REPLACED\n\
let no_args_tests: Map[String, Map[Int, (() -> Unit!Error, Array[String])]] = { } // WILL BE REPLACED\n",
"let no_args_tests: Map[String, Map[Int, (() -> Unit!Error, Array[String])]] = { } // WILL BE REPLACED\n",
&data[0..index],
)
.replace(
"let tests = {",
"let _tests: Map[String, Array[(() -> Unit!Error, Array[String])]] = {",
)
.replace(
" let no_args_tests = {",
"let no_args_tests = {",
"let no_args_tests: Map[String, Map[Int, (() -> Unit!Error, Array[String])]] = {",
)
.replace("{PACKAGE}", pkgname)
Expand All @@ -225,11 +243,9 @@ fn generate_driver(data: &str, pkgname: &str, target_backend: Option<TargetBacke
};
test_driver_template
.replace("\r\n", "\n")
.replace("let tests : Map[String, Array[(() -> Unit!Error, Array[String])]] = { }\n", "")
.replace("let no_args_tests : Map[String, Map[Int, (() -> Unit!Error, Array[String])]] = { }\n", "")
.replace("let with_args_tests : Map[String, Map[Int, ((@test.T) -> Unit!Error, Array[String])]] = { }\n", "")
.replace("// REPLACE ME 0\n", &data.replace(" let", "let"))
.replace("let tests =", "let tests : Map[String, Array[(() -> Unit!Error, Array[String])]] =")
.replace("let no_args_tests =", "let no_args_tests : Map[String, Map[Int, (() -> Unit!Error, Array[String])]] =")
.replace("let with_args_tests =", "let with_args_tests : Map[String, Map[Int, ((@test.T) -> Unit!Error, Array[String])]] =")
.replace("{PACKAGE}", pkgname)
Expand All @@ -253,14 +269,9 @@ fn generate_driver(data: &str, pkgname: &str, target_backend: Option<TargetBacke
test_driver_template
.replace("\r\n", "\n")
.replace(
"let tests: Map[String, Array[(() -> Unit!Error, Array[String])]] = { } // WILL BE REPLACED\n\
let no_args_tests: Map[String, Map[Int, (() -> Unit!Error, Array[String])]] = { } // WILL BE REPLACED\n",
"let no_args_tests: Map[String, Map[Int, (() -> Unit!Error, Array[String])]] = { } // WILL BE REPLACED\n",
&data[0..index].replace(" let", "let"),
)
.replace(
"let tests = {",
"let _tests: Map[String, Array[(() -> Unit!Error, Array[String])]] = {",
)
.replace(
"let no_args_tests = {",
"let no_args_tests: Map[String, Map[Int, (() -> Unit!Error, Array[String])]] = {",
Expand All @@ -283,15 +294,10 @@ fn generate_driver(data: &str, pkgname: &str, target_backend: Option<TargetBacke
test_driver_template
.replace("\r\n", "\n")
.replace(
"let tests: Map[String, Array[(() -> Unit!Error, Array[String])]] = { } // WILL BE REPLACED\n\
let no_args_tests : Map[String, Map[Int, (() -> Unit!Error, Array[String])]] = { } // WILL BE REPLACED\n\
"let no_args_tests : Map[String, Map[Int, (() -> Unit!Error, Array[String])]] = { } // WILL BE REPLACED\n\
let with_args_tests : Map[String, Map[Int, ((@test.T) -> Unit!Error, Array[String])]] = { } // WILL BE REPLACED\n",
&data.replace(" let ", "let "),
)
.replace(
"let tests = {",
"let _tests: Map[String, Array[(() -> Unit!Error, Array[String])]] = {",
)
.replace(
"let no_args_tests = {",
"let no_args_tests: Map[String, Map[Int, (() -> Unit!Error, Array[String])]] = {",
Expand Down
67 changes: 0 additions & 67 deletions crates/moon/src/cli/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

use anyhow::Context;
use colored::Colorize;
use indexmap::IndexMap;
use moonbuild::dry_run;
use moonbuild::entry;
use mooncake::pkg::sync::auto_sync;
Expand Down Expand Up @@ -231,72 +230,6 @@ fn run_test_internal(
pkg.generated_test_drivers
.push(GeneratedTestDriver::BlackboxTest(blackbox_generated_file));
}

let no_exist = (None, IndexMap::new());
module.test_info.insert(
pkgname.clone(),
[no_exist.clone(), no_exist.clone(), no_exist.clone()],
);
let current_pkg_test_info = module.test_info.get_mut(pkgname).unwrap();

let backend_filter_files =
moonutil::common::backend_filter(&pkg.files, moonc_opt.link_opt.target_backend);
let backend_filter_wbtest_files =
moonutil::common::backend_filter(&pkg.wbtest_files, moonc_opt.link_opt.target_backend);
let backend_filter_test_files =
moonutil::common::backend_filter(&pkg.test_files, moonc_opt.link_opt.target_backend);

for file in backend_filter_files
.iter()
.chain(backend_filter_wbtest_files.iter())
.chain(backend_filter_test_files.iter())
{
// workaround for skip test coverage.mbt in builtin when --enable-coverage is specified
if moonc_opt.build_opt.enable_coverage
&& pkgname == "moonbitlang/core/builtin"
&& file.to_str().unwrap().contains("coverage.mbt")
{
continue;
}
let content = std::fs::read_to_string(file)?;
let filename = file.file_name().unwrap().to_str().unwrap();
if let Some(ref filter_file) = filter_file {
if filter_file != filename {
continue;
}
}

// todo: refactor this when we have a json info from moonc
let (test_type, index) = if filename.ends_with("_test.mbt") {
("blackbox", 0)
} else if filename.ends_with("_wbtest.mbt") {
("whitebox", 1)
} else {
("internal", 2)
};

let mut test_block_nums_in_current_file = 0;
let artifact_path = pkg
.artifact
.with_file_name(format!("{}.{test_type}_test.wat", pkg.last_name()))
.with_extension(moonc_opt.link_opt.output_format.to_str());

for line in content.lines() {
if line.starts_with("test ") {
pkg.files_contain_test_block.push(file.clone());
test_block_nums_in_current_file += 1;
}
}

if test_block_nums_in_current_file > 0 {
let (artifact_opt, map) = &mut current_pkg_test_info[index];
if artifact_opt.is_none() {
*artifact_opt = Some(artifact_path.clone());
}
let test_block_count = map.entry(filename.into()).or_insert(0);
*test_block_count += test_block_nums_in_current_file;
}
}
}

moonc_opt.build_opt.warn_lists = module
Expand Down
Loading

0 comments on commit 2ac9377

Please sign in to comment.