Skip to content

Commit 5626ca4

Browse files
chore: progress graph
Signed-off-by: Henry Gressmann <[email protected]>
1 parent 278a38c commit 5626ca4

File tree

9 files changed

+759
-8
lines changed

9 files changed

+759
-8
lines changed

Cargo.lock

Lines changed: 643 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,18 @@
1111
[![docs.rs](https://img.shields.io/docsrs/tinywasm?logo=rust)](https://docs.rs/tinywasm) [![Crates.io](https://img.shields.io/crates/v/tinywasm.svg?logo=rust)](https://crates.io/crates/tinywasm) [![Crates.io](https://img.shields.io/crates/l/tinywasm.svg)](./LICENSE-APACHE)
1212

1313

14+
# 🚧 Status
15+
1416
> [!WARNING]
1517
> This project is still in development and is not ready for use.
1618
19+
I'm currently working on supporting the WebAssembly MVP (1.0) specification. You can see the current status graph below. The goal is to support all the features of the MVP specification and then move on to the next version.
20+
21+
<p align="center">
22+
<img align="center" src="./crates/tinywasm/tests/progress-mvp.png" width="500" alt="">
23+
</p>
24+
25+
1726
## Features
1827

1928
- **`std`**\

crates/tinywasm/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ owo-colors={version="3.5"}
2424
eyre={version="0.6"}
2525
serde_json={version="1.0"}
2626
serde={version="1.0", features=["derive"]}
27+
plotters={version="0.3"}
2728

2829
[features]
2930
default=["std", "parser", "logging"]

crates/tinywasm/tests/charts/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
mod progress;
2+
pub use progress::create_progress_chart;
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
use eyre::Result;
2+
use plotters::prelude::*;
3+
use std::fs::File;
4+
use std::io::{self, BufRead};
5+
use std::path::Path;
6+
7+
const FONT: &str = "Victor Mono";
8+
9+
pub fn create_progress_chart(csv_path: &Path, output_path: &Path) -> Result<()> {
10+
let file = File::open(csv_path)?;
11+
let reader = io::BufReader::new(file);
12+
13+
let mut max_tests = 0;
14+
let mut data: Vec<u32> = Vec::new();
15+
let mut versions: Vec<String> = Vec::new();
16+
17+
for line in reader.lines() {
18+
let line = line?;
19+
let parts: Vec<&str> = line.split(',').collect();
20+
21+
if parts.len() > 3 {
22+
let version = format!("v{}", parts[0]);
23+
let failed: u32 = parts[1].parse()?;
24+
let passed: u32 = parts[2].parse()?;
25+
let total = failed + passed;
26+
27+
if total > max_tests {
28+
max_tests = total;
29+
}
30+
31+
versions.push(version);
32+
data.push(passed);
33+
}
34+
}
35+
36+
println!("versions: {:?}", versions);
37+
println!("data: {:?}", data);
38+
39+
let root_area = BitMapBackend::new(output_path, (1000, 400)).into_drawing_area();
40+
root_area.fill(&WHITE)?;
41+
42+
let mut chart = ChartBuilder::on(&root_area)
43+
.x_label_area_size(35)
44+
.y_label_area_size(60)
45+
.margin(10)
46+
.caption("MVP TESTSUITE", (FONT, 30.0, FontStyle::Bold))
47+
.build_cartesian_2d((0..(versions.len() - 1) as u32).into_segmented(), 0..max_tests)?;
48+
49+
chart
50+
.configure_mesh()
51+
.light_line_style(&TRANSPARENT)
52+
.bold_line_style(&BLACK.mix(0.3))
53+
.max_light_lines(10)
54+
.disable_x_mesh()
55+
.x_labels((versions.len()).min(4))
56+
.y_desc("Tests Passed")
57+
.x_desc("TinyWasm Version")
58+
.x_label_formatter(&|x| {
59+
let SegmentValue::CenterOf(value) = x else {
60+
return "".to_string();
61+
};
62+
versions.get(*value as usize).unwrap_or(&"".to_string()).to_string()
63+
})
64+
.axis_desc_style((FONT, 15))
65+
.draw()?;
66+
67+
chart.draw_series(
68+
Histogram::vertical(&chart)
69+
.style(BLUE.mix(0.5).filled())
70+
.data(data.iter().enumerate().map(|(x, y)| (x as u32, *y as u32))),
71+
)?;
72+
73+
root_area.present()?;
74+
75+
Ok(())
76+
}

crates/tinywasm/tests/mvp.csv

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
00.0.4,9258,7567,[{"name":"address.wast","passed":0,"failed":54},{"name":"align.wast","passed":0,"failed":109},{"name":"binary-leb128.wast","passed":66,"failed":25},{"name":"binary.wast","passed":104,"failed":8},{"name":"block.wast","passed":0,"failed":171},{"name":"br.wast","passed":0,"failed":21},{"name":"br_if.wast","passed":0,"failed":30},{"name":"br_table.wast","passed":0,"failed":25},{"name":"call.wast","passed":0,"failed":22},{"name":"call_indirect.wast","passed":0,"failed":56},{"name":"comments.wast","passed":4,"failed":4},{"name":"const.wast","passed":702,"failed":76},{"name":"conversions.wast","passed":0,"failed":93},{"name":"custom.wast","passed":10,"failed":1},{"name":"data.wast","passed":0,"failed":61},{"name":"elem.wast","passed":0,"failed":76},{"name":"endianness.wast","passed":0,"failed":1},{"name":"exports.wast","passed":21,"failed":73},{"name":"f32.wast","passed":1005,"failed":1509},{"name":"f32_bitwise.wast","passed":1,"failed":363},{"name":"f32_cmp.wast","passed":2401,"failed":6},{"name":"f64.wast","passed":1005,"failed":1509},{"name":"f64_bitwise.wast","passed":1,"failed":363},{"name":"f64_cmp.wast","passed":2401,"failed":6},{"name":"fac.wast","passed":0,"failed":2},{"name":"float_exprs.wast","passed":269,"failed":591},{"name":"float_literals.wast","passed":34,"failed":129},{"name":"float_memory.wast","passed":0,"failed":6},{"name":"float_misc.wast","passed":138,"failed":303},{"name":"forward.wast","passed":1,"failed":4},{"name":"func.wast","passed":4,"failed":75},{"name":"func_ptrs.wast","passed":0,"failed":16},{"name":"global.wast","passed":4,"failed":49},{"name":"i32.wast","passed":0,"failed":96},{"name":"i64.wast","passed":0,"failed":42},{"name":"if.wast","passed":0,"failed":118},{"name":"imports.wast","passed":1,"failed":156},{"name":"inline-module.wast","passed":0,"failed":1},{"name":"int_exprs.wast","passed":38,"failed":70},{"name":"int_literals.wast","passed":5,"failed":46},{"name":"labels.wast","passed":1,"failed":28},{"name":"left-to-right.wast","passed":0,"failed":1},{"name":"linking.wast","passed":1,"failed":66},{"name":"load.wast","passed":0,"failed":60},{"name":"local_get.wast","passed":2,"failed":34},{"name":"local_set.wast","passed":5,"failed":48},{"name":"local_tee.wast","passed":0,"failed":42},{"name":"loop.wast","passed":0,"failed":43},{"name":"memory.wast","passed":0,"failed":34},{"name":"memory_grow.wast","passed":0,"failed":19},{"name":"memory_redundancy.wast","passed":0,"failed":1},{"name":"memory_size.wast","passed":0,"failed":6},{"name":"memory_trap.wast","passed":0,"failed":172},{"name":"names.wast","passed":484,"failed":1},{"name":"nop.wast","passed":0,"failed":5},{"name":"return.wast","passed":0,"failed":21},{"name":"select.wast","passed":0,"failed":32},{"name":"skip-stack-guard-page.wast","passed":0,"failed":11},{"name":"stack.wast","passed":0,"failed":2},{"name":"start.wast","passed":0,"failed":10},{"name":"store.wast","passed":0,"failed":59},{"name":"switch.wast","passed":1,"failed":27},{"name":"token.wast","passed":16,"failed":42},{"name":"traps.wast","passed":3,"failed":33},{"name":"type.wast","passed":1,"failed":2},{"name":"unreachable.wast","passed":0,"failed":59},{"name":"unreached-invalid.wast","passed":0,"failed":118},{"name":"unwind.wast","passed":1,"failed":49},{"name":"utf8-custom-section-id.wast","passed":176,"failed":0},{"name":"utf8-import-field.wast","passed":176,"failed":0},{"name":"utf8-import-module.wast","passed":176,"failed":0},{"name":"utf8-invalid-encoding.wast","passed":0,"failed":176}]
1+
0.0.3,9258,7567,[{"name":"address.wast","passed":0,"failed":54},{"name":"align.wast","passed":0,"failed":109},{"name":"binary-leb128.wast","passed":66,"failed":25},{"name":"binary.wast","passed":104,"failed":8},{"name":"block.wast","passed":0,"failed":171},{"name":"br.wast","passed":0,"failed":21},{"name":"br_if.wast","passed":0,"failed":30},{"name":"br_table.wast","passed":0,"failed":25},{"name":"call.wast","passed":0,"failed":22},{"name":"call_indirect.wast","passed":0,"failed":56},{"name":"comments.wast","passed":4,"failed":4},{"name":"const.wast","passed":702,"failed":76},{"name":"conversions.wast","passed":0,"failed":93},{"name":"custom.wast","passed":10,"failed":1},{"name":"data.wast","passed":0,"failed":61},{"name":"elem.wast","passed":0,"failed":76},{"name":"endianness.wast","passed":0,"failed":1},{"name":"exports.wast","passed":21,"failed":73},{"name":"f32.wast","passed":1005,"failed":1509},{"name":"f32_bitwise.wast","passed":1,"failed":363},{"name":"f32_cmp.wast","passed":2401,"failed":6},{"name":"f64.wast","passed":1005,"failed":1509},{"name":"f64_bitwise.wast","passed":1,"failed":363},{"name":"f64_cmp.wast","passed":2401,"failed":6},{"name":"fac.wast","passed":0,"failed":2},{"name":"float_exprs.wast","passed":269,"failed":591},{"name":"float_literals.wast","passed":34,"failed":129},{"name":"float_memory.wast","passed":0,"failed":6},{"name":"float_misc.wast","passed":138,"failed":303},{"name":"forward.wast","passed":1,"failed":4},{"name":"func.wast","passed":4,"failed":75},{"name":"func_ptrs.wast","passed":0,"failed":16},{"name":"global.wast","passed":4,"failed":49},{"name":"i32.wast","passed":0,"failed":96},{"name":"i64.wast","passed":0,"failed":42},{"name":"if.wast","passed":0,"failed":118},{"name":"imports.wast","passed":1,"failed":156},{"name":"inline-module.wast","passed":0,"failed":1},{"name":"int_exprs.wast","passed":38,"failed":70},{"name":"int_literals.wast","passed":5,"failed":46},{"name":"labels.wast","passed":1,"failed":28},{"name":"left-to-right.wast","passed":0,"failed":1},{"name":"linking.wast","passed":1,"failed":66},{"name":"load.wast","passed":0,"failed":60},{"name":"local_get.wast","passed":2,"failed":34},{"name":"local_set.wast","passed":5,"failed":48},{"name":"local_tee.wast","passed":0,"failed":42},{"name":"loop.wast","passed":0,"failed":43},{"name":"memory.wast","passed":0,"failed":34},{"name":"memory_grow.wast","passed":0,"failed":19},{"name":"memory_redundancy.wast","passed":0,"failed":1},{"name":"memory_size.wast","passed":0,"failed":6},{"name":"memory_trap.wast","passed":0,"failed":172},{"name":"names.wast","passed":484,"failed":1},{"name":"nop.wast","passed":0,"failed":5},{"name":"return.wast","passed":0,"failed":21},{"name":"select.wast","passed":0,"failed":32},{"name":"skip-stack-guard-page.wast","passed":0,"failed":11},{"name":"stack.wast","passed":0,"failed":2},{"name":"start.wast","passed":0,"failed":10},{"name":"store.wast","passed":0,"failed":59},{"name":"switch.wast","passed":1,"failed":27},{"name":"token.wast","passed":16,"failed":42},{"name":"traps.wast","passed":3,"failed":33},{"name":"type.wast","passed":1,"failed":2},{"name":"unreachable.wast","passed":0,"failed":59},{"name":"unreached-invalid.wast","passed":0,"failed":118},{"name":"unwind.wast","passed":1,"failed":49},{"name":"utf8-custom-section-id.wast","passed":176,"failed":0},{"name":"utf8-import-field.wast","passed":176,"failed":0},{"name":"utf8-import-module.wast","passed":176,"failed":0},{"name":"utf8-invalid-encoding.wast","passed":0,"failed":176}]
2+
0.0.4,9258,7567,[{"name":"address.wast","passed":0,"failed":54},{"name":"align.wast","passed":0,"failed":109},{"name":"binary-leb128.wast","passed":66,"failed":25},{"name":"binary.wast","passed":104,"failed":8},{"name":"block.wast","passed":0,"failed":171},{"name":"br.wast","passed":0,"failed":21},{"name":"br_if.wast","passed":0,"failed":30},{"name":"br_table.wast","passed":0,"failed":25},{"name":"call.wast","passed":0,"failed":22},{"name":"call_indirect.wast","passed":0,"failed":56},{"name":"comments.wast","passed":4,"failed":4},{"name":"const.wast","passed":702,"failed":76},{"name":"conversions.wast","passed":0,"failed":93},{"name":"custom.wast","passed":10,"failed":1},{"name":"data.wast","passed":0,"failed":61},{"name":"elem.wast","passed":0,"failed":76},{"name":"endianness.wast","passed":0,"failed":1},{"name":"exports.wast","passed":21,"failed":73},{"name":"f32.wast","passed":1005,"failed":1509},{"name":"f32_bitwise.wast","passed":1,"failed":363},{"name":"f32_cmp.wast","passed":2401,"failed":6},{"name":"f64.wast","passed":1005,"failed":1509},{"name":"f64_bitwise.wast","passed":1,"failed":363},{"name":"f64_cmp.wast","passed":2401,"failed":6},{"name":"fac.wast","passed":0,"failed":2},{"name":"float_exprs.wast","passed":269,"failed":591},{"name":"float_literals.wast","passed":34,"failed":129},{"name":"float_memory.wast","passed":0,"failed":6},{"name":"float_misc.wast","passed":138,"failed":303},{"name":"forward.wast","passed":1,"failed":4},{"name":"func.wast","passed":4,"failed":75},{"name":"func_ptrs.wast","passed":0,"failed":16},{"name":"global.wast","passed":4,"failed":49},{"name":"i32.wast","passed":0,"failed":96},{"name":"i64.wast","passed":0,"failed":42},{"name":"if.wast","passed":0,"failed":118},{"name":"imports.wast","passed":1,"failed":156},{"name":"inline-module.wast","passed":0,"failed":1},{"name":"int_exprs.wast","passed":38,"failed":70},{"name":"int_literals.wast","passed":5,"failed":46},{"name":"labels.wast","passed":1,"failed":28},{"name":"left-to-right.wast","passed":0,"failed":1},{"name":"linking.wast","passed":1,"failed":66},{"name":"load.wast","passed":0,"failed":60},{"name":"local_get.wast","passed":2,"failed":34},{"name":"local_set.wast","passed":5,"failed":48},{"name":"local_tee.wast","passed":0,"failed":42},{"name":"loop.wast","passed":0,"failed":43},{"name":"memory.wast","passed":0,"failed":34},{"name":"memory_grow.wast","passed":0,"failed":19},{"name":"memory_redundancy.wast","passed":0,"failed":1},{"name":"memory_size.wast","passed":0,"failed":6},{"name":"memory_trap.wast","passed":0,"failed":172},{"name":"names.wast","passed":484,"failed":1},{"name":"nop.wast","passed":0,"failed":5},{"name":"return.wast","passed":0,"failed":21},{"name":"select.wast","passed":0,"failed":32},{"name":"skip-stack-guard-page.wast","passed":0,"failed":11},{"name":"stack.wast","passed":0,"failed":2},{"name":"start.wast","passed":0,"failed":10},{"name":"store.wast","passed":0,"failed":59},{"name":"switch.wast","passed":1,"failed":27},{"name":"token.wast","passed":16,"failed":42},{"name":"traps.wast","passed":3,"failed":33},{"name":"type.wast","passed":1,"failed":2},{"name":"unreachable.wast","passed":0,"failed":59},{"name":"unreached-invalid.wast","passed":0,"failed":118},{"name":"unwind.wast","passed":1,"failed":49},{"name":"utf8-custom-section-id.wast","passed":176,"failed":0},{"name":"utf8-import-field.wast","passed":176,"failed":0},{"name":"utf8-import-module.wast","passed":176,"failed":0},{"name":"utf8-invalid-encoding.wast","passed":0,"failed":176}]

crates/tinywasm/tests/mvp.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,34 @@
1+
mod charts;
12
mod testsuite;
23

34
use eyre::{eyre, Result};
45
use testsuite::TestSuite;
56

7+
#[test]
8+
#[ignore]
9+
fn generate_charts() -> Result<()> {
10+
// Create a line chart
11+
charts::create_progress_chart(
12+
std::path::Path::new("./tests/mvp.csv"),
13+
std::path::Path::new("./tests/progress-mvp.png"),
14+
)?;
15+
16+
// // Create a bar chart
17+
// charts::create_bar_chart(
18+
// std::path::Path::new("./tests/mvp.csv"),
19+
// std::path::Path::new("./tests/mvp_bar_chart.png"),
20+
// )?;
21+
22+
Ok(())
23+
}
24+
625
#[test]
726
#[ignore]
827
fn test_mvp() -> Result<()> {
928
let mut test_suite = TestSuite::new();
1029
test_suite.run(wasm_testsuite::MVP_TESTS)?;
1130

12-
test_suite.save_csv("./tests/mvp.csv", env!("CARGO_PKG_VERSION").trim_end())?;
31+
test_suite.save_csv("./tests/mvp.csv", env!("CARGO_PKG_VERSION"))?;
1332

1433
if test_suite.failed() {
1534
eprintln!("\n\nfailed one or more tests:\n{:#?}", test_suite);
20.4 KB
Loading

crates/tinywasm/tests/testsuite/mod.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ mod util;
1212
use serde::{Deserialize, Serialize};
1313

1414
#[derive(Serialize, Deserialize)]
15-
struct TestGroupResult {
16-
name: String,
17-
passed: usize,
18-
failed: usize,
15+
pub struct TestGroupResult {
16+
pub name: String,
17+
pub passed: usize,
18+
pub failed: usize,
1919
}
2020

2121
pub struct TestSuite(BTreeMap<String, TestGroup>);
@@ -43,10 +43,11 @@ impl TestSuite {
4343

4444
// Check if the last line starts with the current commit
4545
if let Some(last) = last_line {
46+
println!("last line: {}", last);
4647
if last.starts_with(version) {
4748
// Truncate the file size to remove the last line
4849
let len_to_truncate = last.len() as i64;
49-
file.set_len(file.metadata()?.len() - len_to_truncate as u64)?;
50+
file.set_len(file.metadata()?.len() - len_to_truncate as u64 - 1)?;
5051
}
5152
}
5253

0 commit comments

Comments
 (0)