diff options
Diffstat (limited to 'scripts/src/bin')
| -rw-r--r-- | scripts/src/bin/generate-charts/main.rs | 35 | ||||
| -rw-r--r-- | scripts/src/bin/generate-charts/progress.rs | 77 |
2 files changed, 112 insertions, 0 deletions
diff --git a/scripts/src/bin/generate-charts/main.rs b/scripts/src/bin/generate-charts/main.rs new file mode 100644 index 0000000..1206e5f --- /dev/null +++ b/scripts/src/bin/generate-charts/main.rs @@ -0,0 +1,35 @@ +mod progress; +use std::{path::PathBuf, str::FromStr}; + +use eyre::Result; + +fn main() -> Result<()> { + generate_charts() +} + +fn generate_charts() -> Result<()> { + let results_dir = PathBuf::from_str("./crates/tinywasm/tests/generated")?; + + // check if the folder exists + if !results_dir.exists() { + return Err(eyre::eyre!( + "This script should be run from the root of the project, and the test results should be generated first." + )); + } + + progress::create_progress_chart( + "WebAssembly 1.0 Test Suite", + &results_dir.join("mvp.csv"), + &results_dir.join("progress-mvp.svg"), + )?; + println!("created progress chart: {}", results_dir.join("progress-mvp.svg").display()); + + progress::create_progress_chart( + "WebAssembly 2.0 Test Suite", + &results_dir.join("2.0.csv"), + &results_dir.join("progress-2.0.svg"), + )?; + println!("created progress chart: {}", results_dir.join("progress-2.0.svg").display()); + + Ok(()) +} diff --git a/scripts/src/bin/generate-charts/progress.rs b/scripts/src/bin/generate-charts/progress.rs new file mode 100644 index 0000000..1ecc09c --- /dev/null +++ b/scripts/src/bin/generate-charts/progress.rs @@ -0,0 +1,77 @@ +use eyre::Result; +use plotters::prelude::*; +use std::fs::File; +use std::io::{self, BufRead}; +use std::path::Path; + +const FONT: &str = "Victor Mono"; + +pub fn create_progress_chart(name: &str, csv_path: &Path, output_path: &Path) -> Result<()> { + let file = File::open(csv_path)?; + let reader = io::BufReader::new(file); + + let mut max_tests = 0; + let mut data: Vec<u32> = Vec::new(); + let mut versions: Vec<String> = Vec::new(); + + for line in reader.lines() { + let line = line?; + let parts: Vec<&str> = line.split(',').collect(); + + if parts.len() > 3 { + let version = format!("v{}", parts[0]); + let passed: u32 = parts[1].parse()?; + let failed: u32 = parts[2].parse()?; + let total = failed + passed; + + if total > max_tests { + max_tests = total; + } + + versions.push(version); + data.push(passed); + } + } + + let root_area = SVGBackend::new(output_path, (1000, 400)).into_drawing_area(); + root_area.fill(&WHITE)?; + + let mut chart = ChartBuilder::on(&root_area) + .x_label_area_size(45) + .y_label_area_size(70) + .margin(10) + .margin_top(20) + .caption(name, (FONT, 30.0, FontStyle::Bold)) + .build_cartesian_2d((0..(versions.len() - 1) as u32).into_segmented(), 0..max_tests)?; + + chart + .configure_mesh() + .light_line_style(TRANSPARENT) + .bold_line_style(BLACK.mix(0.3)) + .max_light_lines(10) + .disable_x_mesh() + .y_desc("Tests Passed") + .y_label_style((FONT, 15)) + .x_desc("TinyWasm Version") + .x_labels((versions.len()).min(4)) + .x_label_style((FONT, 15)) + .x_label_formatter(&|x| { + let SegmentValue::CenterOf(value) = x else { + return "".to_string(); + }; + let v = versions.get(*value as usize).unwrap_or(&"".to_string()).to_string(); + format!("{} ({})", v, data[*value as usize]) + }) + .axis_desc_style((FONT, 15, FontStyle::Bold)) + .draw()?; + + chart.draw_series( + Histogram::vertical(&chart) + .style(BLUE.mix(0.5).filled()) + .data(data.iter().enumerate().map(|(x, y)| (x as u32, *y))), + )?; + + root_area.present()?; + + Ok(()) +} |
