Browse Source

allow regeneration of output tests

Getty Ritter 2 years ago
parent
commit
661e5a3d92
5 changed files with 46 additions and 10 deletions
  1. 1 1
      Cargo.toml
  2. 7 4
      tests/fixed.output
  3. 4 1
      tests/hello.output
  4. 7 4
      tests/simple.output
  5. 27 0
      tools/regenerate.rs

+ 1 - 1
Cargo.toml

@@ -30,6 +30,7 @@ anyhow = "*"
 titlecase = "*"
 serde = { version = "1.0", features = ["derive"] }
 clap = "2.33"
+serde_yaml = "0.8"
 
 [build-dependencies]
 vergen = "*"
@@ -40,4 +41,3 @@ features = ["lexer"]
 
 [dev-dependencies]
 pretty_assertions = "*"
-serde_yaml = "0.8"

+ 7 - 4
tests/fixed.output

@@ -1,4 +1,7 @@
-0: baba
-2: papa
-4: bubu
-5: pupu
+# generated for e1b43e99e592dbd6921859bd7f17277c3e0f81ae
+---
+"0": baba
+"2": papa
+"4": bubu
+"5": pupu
+

+ 4 - 1
tests/hello.output

@@ -1 +1,4 @@
-'0': 'Hello, world!'
+# generated for e1b43e99e592dbd6921859bd7f17277c3e0f81ae
+---
+"0": "Hello, world!"
+

+ 7 - 4
tests/simple.output

@@ -1,4 +1,7 @@
-2: pa
-5: pu
-0: ba
-4: bu
+# generated for e1b43e99e592dbd6921859bd7f17277c3e0f81ae
+---
+"0": ba
+"2": pa
+"4": bu
+"5": pu
+

+ 27 - 0
tools/regenerate.rs

@@ -1,8 +1,27 @@
 use matzo::grammar;
 use matzo::lexer;
+use matzo::interp;
 
+use std::collections::BTreeMap;
 use std::io::Write;
 
+const MAX_RUN_EXPECTATIONS: u64 = 64;
+
+fn generate_runs(source: &str) -> Result<BTreeMap<String, String>, Box<dyn std::error::Error>> {
+    let mut found_results: BTreeMap<String, u64> = BTreeMap::new();
+    for seed in 0..MAX_RUN_EXPECTATIONS {
+        let state = interp::State::new_from_seed(seed);
+        let mut out = Vec::new();
+        state.run_with_writer(source, &mut out)?;
+        let out = std::str::from_utf8(&out).unwrap().trim().to_string();
+        if !found_results.contains_key(&out) {
+            let _ = found_results.insert(out, seed);
+        }
+    }
+    let output = found_results.into_iter().map(|(k, v)| (format!("{}", v), k)).collect();
+    Ok(output)
+}
+
 fn main() -> Result<(), Box<dyn std::error::Error>> {
     for exp in std::fs::read_dir("tests")? {
         let exp = exp?.path().canonicalize()?;
@@ -25,6 +44,14 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
                     writeln!(f, "{:#?}", stmt.show(&ast))?;
                 }
             }
+
+            if let Ok(_) = std::fs::read_to_string(exp_filename("output")) {
+                println!("  generating output for {}", fname);
+                let map = generate_runs(&src)?;
+                let mut f = std::fs::File::create(exp_filename("output"))?;
+                writeln!(f, "# generated for {}", env!("VERGEN_GIT_SHA"))?;
+                writeln!(f, "{}", serde_yaml::to_string(&map)?)?;
+            }
         }
     }