//! Conformance corpus for the browser sink (`live-conformance/browser/`,
//! extensions/browser-sink.md §12).
//!
//!   wai_browser_sink_vectors gen     <corpus-dir>   write vectors.json and int_motion.wai
//!   wai_browser_sink_vectors verify  <corpus-dir>   every file regenerates byte for byte, and
//!                                                   every case gets the outcome it states
//!
//! The generator and this verifier are one implementation. The corpus's second
//! implementation is `live-conformance/browser_sink_verify.py`, written from the
//! extension's text and sharing no code with this binary.

use std::path::Path;
use wai::browser_sink::corpus;

fn main() {
    let a: Vec<String> = std::env::args().collect();
    match (a.get(1).map(String::as_str), a.get(2)) {
        (Some("gen"), Some(d)) => {
            if let Err(e) = std::fs::create_dir_all(d) {
                eprintln!("{d}: {e}");
                std::process::exit(1);
            }
            for (name, bytes) in corpus::files() {
                let p = Path::new(d).join(name);
                if let Err(e) = std::fs::write(&p, bytes) {
                    eprintln!("write {}: {e}", p.display());
                    std::process::exit(1);
                }
                println!("wrote {}", p.display());
            }
        }
        (Some("verify"), Some(d)) => std::process::exit(verify(Path::new(d))),
        _ => {
            eprintln!("usage: wai_browser_sink_vectors gen|verify <corpus-dir>");
            std::process::exit(2);
        }
    }
}

fn verify(dir: &Path) -> i32 {
    let mut fail = 0;
    for (name, bytes) in corpus::files() {
        let same = std::fs::read(dir.join(name)).is_ok_and(|b| b == bytes);
        println!("{} {name} regenerates byte for byte", if same { "PASS" } else { "FAIL" });
        fail += (!same) as i32;
    }
    let doc = std::fs::read_to_string(dir.join(corpus::VECTORS)).unwrap_or_default();
    let fails = corpus::verify(&doc);
    for f in &fails {
        println!("FAIL {f}");
    }
    println!("{} every case gets the outcome the corpus states", if fails.is_empty() { "PASS" } else { "FAIL" });
    fail += (!fails.is_empty()) as i32;
    (fail != 0) as i32
}
