runlet 0.1.0

A semantic executable model for the Runlet orchestration language
Documentation
use std::{fs, process::Command};

#[test]
fn runs_a_core_program_from_a_file() {
    let output = Command::new(env!("CARGO_BIN_EXE_runlet"))
        .arg(concat!(
            env!("CARGO_MANIFEST_DIR"),
            "/examples/02_operators.rnlt"
        ))
        .output()
        .unwrap();

    assert!(
        output.status.success(),
        "{}",
        String::from_utf8_lossy(&output.stderr)
    );
    let stdout = String::from_utf8(output.stdout).unwrap();
    assert!(stdout.contains("\"total\":57"));
    assert!(stdout.ends_with('\n'));
}

#[test]
fn streams_graph_updates_in_graph_mode() {
    let output = Command::new(env!("CARGO_BIN_EXE_runlet"))
        .arg("graph")
        .arg(concat!(
            env!("CARGO_MANIFEST_DIR"),
            "/examples/02_operators.rnlt"
        ))
        .output()
        .unwrap();

    assert!(output.status.success());
    assert!(String::from_utf8_lossy(&output.stderr).contains("succeeded"));
    assert!(String::from_utf8_lossy(&output.stdout).contains("\"total\":57"));
}

#[test]
fn reports_source_diagnostics_and_fails() {
    let path = std::env::temp_dir().join(format!("runlet-invalid-{}.rnlt", std::process::id()));
    fs::write(&path, "return missing_name\n").unwrap();
    let output = Command::new(env!("CARGO_BIN_EXE_runlet"))
        .arg(&path)
        .output()
        .unwrap();
    fs::remove_file(path).unwrap();

    assert_eq!(output.status.code(), Some(1));
    let stderr = String::from_utf8(output.stderr).unwrap();
    assert!(stderr.contains("error[RL2101]"));
    assert!(stderr.contains(":1:8:"));
}

#[test]
fn requires_a_program_path() {
    let output = Command::new(env!("CARGO_BIN_EXE_runlet")).output().unwrap();
    assert_eq!(output.status.code(), Some(2));
    assert!(String::from_utf8(output.stderr).unwrap().contains("usage:"));
}