vize_l4 0.568.0

L4 - the Davinci emission level (codename Stesura): writer, expression rewriting, module assembly and targets
Documentation
use super::support;
use vize_l0::Allocator;
use vize_l1::embed::Lang;
use vize_l4::targets::ts::project_program;

#[test]
fn real_typescript_checker_diagnostics_match_original_source_and_exact_mapping() {
    use std::io::Write;
    use std::process::{Command, Stdio};
    let pack: serde_json::Value =
        serde_json::from_str(include_str!("../fixtures/program-checker.json")).unwrap();
    let mut projected = Vec::new();
    for case in pack["cases"].as_array().unwrap() {
        let arena = Allocator::default();
        let source = case["source"].as_str().unwrap();
        let lang = if case["kind"] == "js" {
            Lang::Js
        } else {
            Lang::Ts
        };
        let file = support::file(&arena, source, lang).unwrap();
        assert!(file.is_complete(), "{}: {:?}", case["id"], file.issues());
        let projection = project_program(&file).unwrap();
        projected.push(serde_json::json!({"case":case,"extension":projection.source_kind().extension(),"projected":projection.document().as_str()}));
    }
    let mut child = Command::new("node")
        .args([
            "--input-type=module",
            "-e",
            include_str!("../../../../tests/tooling/support/native-program-typescript.ts"),
        ])
        .current_dir(concat!(env!("CARGO_MANIFEST_DIR"), "/../.."))
        .stdin(Stdio::piped())
        .stdout(Stdio::piped())
        .stderr(Stdio::piped())
        .spawn()
        .unwrap();
    child
        .stdin
        .take()
        .unwrap()
        .write_all(&serde_json::to_vec(&projected).unwrap())
        .unwrap();
    let result = child.wait_with_output().unwrap();
    assert!(
        result.status.success(),
        "{}",
        std::str::from_utf8(&result.stderr).unwrap_or("non-UTF8 stderr")
    );
    let evidence: serde_json::Value = serde_json::from_slice(&result.stdout).unwrap();
    assert_eq!(evidence["version"], "6.0.3");
    assert_eq!(
        evidence["cases"].as_array().unwrap().len(),
        pack["cases"].as_array().unwrap().len()
    );
    for (case, result) in pack["cases"]
        .as_array()
        .unwrap()
        .iter()
        .zip(evidence["cases"].as_array().unwrap())
    {
        let arena = Allocator::default();
        let source = case["source"].as_str().unwrap();
        let file = support::file(
            &arena,
            source,
            if case["kind"] == "js" {
                Lang::Js
            } else {
                Lang::Ts
            },
        )
        .unwrap();
        let projection = project_program(&file).unwrap();
        for diagnostic in result["diagnostics"].as_array().unwrap() {
            let start = u32::try_from(diagnostic["start"].as_u64().unwrap()).unwrap();
            let length = u32::try_from(diagnostic["length"].as_u64().unwrap()).unwrap();
            let authored = projection.map_utf16(start, length).unwrap();
            assert_eq!(
                source.get(authored.start as usize..authored.end as usize),
                diagnostic["authored"].as_str()
            );
        }
    }
    if let Ok(path) = std::env::var("VIZE_L4_PROGRAM_CHECK_CAPTURE") {
        std::fs::write(path, serde_json::to_vec_pretty(&evidence).unwrap()).unwrap();
    }
}