From 50da32fdcbf6f6e491ec64d3e134f5fa4edec9d4 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Thu, 8 Jul 2021 21:16:52 +0100 Subject: [PATCH] jstest: Programattically generate a test csase, wip Signed-off-by: Ian Jackson --- Cargo.lock | 2 + jstest/Cargo.toml | 5 +- jstest/jst-lower.rs | 123 ++++++++++++++++++++++++++++++++++++++++---- jstest/jstest.rs | 3 ++ jstest/lower.nodejs | 6 ++- src/imports.rs | 1 + 6 files changed, 128 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a22ed55a..be9cdf3d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2567,6 +2567,8 @@ dependencies = [ "fehler", "indexmap", "otter", + "otter-api-tests", + "serde", "structopt", ] diff --git a/jstest/Cargo.toml b/jstest/Cargo.toml index ef376d6b..d2ea7271 100644 --- a/jstest/Cargo.toml +++ b/jstest/Cargo.toml @@ -29,12 +29,15 @@ path="jst-lower.rs" otter.path=".." otter.version="=0.7.1" +otter-api-tests.path="../apitest" +otter-api-tests.version="=0.7.1" + indexmap = "1.6" fehler="1" structopt="0.3" -#serde = { version="1" , features=["derive", "rc"] } +serde = { version="1" , features=["derive", "rc"] } #strum = { version="0.21" , features=["derive" ] } diff --git a/jstest/jst-lower.rs b/jstest/jst-lower.rs index a75b594a..26a7352d 100644 --- a/jstest/jst-lower.rs +++ b/jstest/jst-lower.rs @@ -27,6 +27,7 @@ macro_rules! sp { #[derive(Debug,Clone)] #[derive(Eq,PartialEq,Ord,PartialOrd)] +#[derive(Serialize)] pub struct StartPiece { id: String, pinned: bool, @@ -36,11 +37,99 @@ pub struct StartPiece { #[derive(Debug,Clone,Default)] pub struct Tests { - tests: IndexMap>, + tests: IndexMap, } -impl Tests { - pub fn add_test(&mut self, name: &'static str, pieces: Vec) { +#[derive(Debug,Clone,Default)] +#[derive(Serialize)] +pub struct Test { + name: String, + pieces: Vec, + targets: Vec, +} + +#[derive(Debug)] +pub struct TestsAccumulator { + tests: Tests, + script: BufWriter, + tera: tera::Tera, +} + +static TEMPLATE: &'static str = r#" +//-------------------- {{ name }} -------------------- + +jstest_did = fs.openSync('{{ name }}.did', 'w'); + +pieces = { +{% for p in pieces %} + '{{ p.id }}': { + pinned: {{ p.pinned }}, + moveable: '{{ p.moveable }}', + z: '{{ p.z }}', + }, +{% endfor %} +} + +fake_dom = [ + { special: "pieces_marker", dataset: { } }, +{% for p in pieces %} + { dataset: { piece: "{{ p.id }}" } }, +{% endfor %} + { special: "defs_marker", dataset: { } }, +]; + +pieces_marker = fake_dom[0]; +defs_marker = fake_dom[{{ pieces | length + 1 }}]; + +{% for p in pieces %} +fake_dom[{{ loop.index0 }}].nextElementSibling = fake_dom[{{ loop.index }}]; +{% endfor %} +fake_dom[{{ pieces | length }}].nextElementSibling = fake_dom[{{ pieces | length + 1 }}]; + +{% for t in targets %} +uorecord = { + targets: ['{{ t }}'], +}; +{% endfor %} + +lower_targets(uorecord); + +fs.closeSync(jstest_did); +jstest_did = -1; + +"#; + + +impl TestsAccumulator { + #[throws(Explode)] + pub fn new(opts: &Opts) -> Self { + let mut tera = tera::Tera::default(); + tera.add_raw_template("js", TEMPLATE)?; + + let script = fs::OpenOptions::new() + .write(true) + .append(true) + .truncate(false) + .create(false) + .open(&opts.script)?; + let script = BufWriter::new(script); + + TestsAccumulator { + tests: default(), + script, tera, + } + } + + #[throws(Explode)] + pub fn finalise(mut self) -> Tests { + self.script.flush()?; + self.tests + } + + #[throws(Explode)] + pub fn add_test(&mut self, name: &'static str, + pieces: Vec, + targets: Vec<&'_ str>) { let mut zm = ZCoord::default().clone_mut(); let pieces = pieces.into_iter().map( |StartPieceSpec { id, pinned, moveable }| { @@ -49,20 +138,36 @@ impl Tests { StartPiece { id, pinned, moveable, z } } ).collect_vec(); - let already = self.tests.insert(name.to_owned(), pieces); - assert_eq!(already, None); + + let targets = targets.into_iter().map(|s| s.to_owned()).collect_vec(); + + let test = Test { + name: name.into(), + pieces, targets, + }; + let context = tera::Context::from_serialize(&test)?; + self.tera.render_to("js", &context, &mut self.script)?; + + let already = self.tests.tests.insert(name.to_owned(), test); + assert!(already.is_none(), "{:?}", &name); } } -#[throws(AE)] +#[throws(Explode)] fn main() { let opts = Opts::from_args(); - let mut tests = Tests::default(); - tests.add_test("simple", vec![ + let mut ta = TestsAccumulator::new(&opts)?; + + ta.add_test("simple", vec![ sp!("1.1", false, Yes), sp!("2.1", false, Yes), - ]); + ], vec![ + "2.1", + ])?; + + let tests = ta.finalise()?; + eprintln!("TESTS={:?}", &tests); let mut cmd = Command::new(opts.nodejs); cmd.arg(opts.script); diff --git a/jstest/jstest.rs b/jstest/jstest.rs index a077b6a1..74de17d4 100644 --- a/jstest/jstest.rs +++ b/jstest/jstest.rs @@ -4,5 +4,8 @@ pub use otter::prelude::*; +pub use otter_api_tests::Explode; +pub use otter::imports::tera_standalone as tera; + pub use indexmap::IndexMap; pub use structopt::StructOpt; diff --git a/jstest/lower.nodejs b/jstest/lower.nodejs index 1bc56a49..d69f4728 100644 --- a/jstest/lower.nodejs +++ b/jstest/lower.nodejs @@ -11,6 +11,8 @@ let wasm_bindgen = require('otter_wasm.js'); let jstest_did; +let fake_dom; +let uorecord; function piece_set_zlevel(piece, p, f) { f(null); } function api_piece(op, piece, p, args) { @@ -34,7 +36,7 @@ pieces = { }, } -let fake_dom = [ +fake_dom = [ { special: "pieces_marker", dataset: { } }, { dataset: { piece: "1.1" } }, { dataset: { piece: "2.1" } }, @@ -48,7 +50,7 @@ fake_dom[0].nextElementSibling = fake_dom[1]; fake_dom[1].nextElementSibling = fake_dom[2]; fake_dom[2].nextElementSibling = fake_dom[3]; -let uorecord = { +uorecord = { targets: ["2.1"], }; diff --git a/src/imports.rs b/src/imports.rs index 3baa6e54..450d3cc0 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -34,6 +34,7 @@ pub use regex; pub use rmp_serde; pub use sha2; pub use slotmap; +pub use tera_standalone; pub use toml; pub use uds; pub use unicode_width; -- 2.30.2