regast-cli 0.1.0

Command-line interface for regast
use std::process::Command;

fn regast() -> Command {
    Command::new(env!("CARGO_BIN_EXE_regast"))
}

#[test]
fn ast_and_parse_commands_emit_public_formats() {
    let ast = regast()
        .args(["ast", "(a|b)*c", "--shape", "arena"])
        .output()
        .unwrap();
    assert!(ast.status.success());
    assert!(
        String::from_utf8(ast.stdout)
            .unwrap()
            .contains("\"schema_version\": 1")
    );

    let tree = regast()
        .args(["parse", "(a|b)*c", "abac", "--format", "sexpr"])
        .output()
        .unwrap();
    assert!(tree.status.success());
    assert!(String::from_utf8(tree.stdout).unwrap().contains("repeat"));
}

#[test]
fn check_uses_status_one_for_a_non_match() {
    let success = regast().args(["check", "a+", "aaa"]).status().unwrap();
    assert!(success.success());

    let failure = regast().args(["check", "a+", "bbb"]).status().unwrap();
    assert_eq!(failure.code(), Some(1));
}

#[test]
fn find_supports_anchors_and_antimirov_backend() {
    let output = regast()
        .args([
            "find",
            "ab+$",
            "zabbb",
            "--backend",
            "antimirov",
            "--format",
            "json",
        ])
        .output()
        .unwrap();
    assert!(output.status.success());
    let stdout = String::from_utf8(output.stdout).unwrap();
    assert!(stdout.contains("\"match_span\": ["));
    assert!(stdout.contains("\"input\": \"zabbb\""));
}

#[test]
fn tagged_nfa_backend_is_available_to_parse_and_check() {
    let parsed = regast()
        .args(["parse", "^([ab]+)$", "abba", "--backend", "tagged-nfa"])
        .output()
        .unwrap();
    assert!(parsed.status.success());
    assert!(
        String::from_utf8(parsed.stdout)
            .unwrap()
            .contains("\"group\"")
    );

    let rejected = regast()
        .args(["check", "^a$", "ba", "--backend", "tagged-nfa"])
        .status()
        .unwrap();
    assert_eq!(rejected.code(), Some(1));
}