fusible 0.20.7

Electronic linter: a fuse that blows to block firmware code generation
use std::path::Path;

use super::project::project_json;
use super::run_request::parse;
use super::state::State;
use crate::commands::target::BoardTarget;
use crate::config::FusibleConfig;

fn manifest(assembly: bool) -> FusibleConfig {
    let tail = if assembly {
        "assembly: {parts: {main: {}}}\n"
    } else {
        ""
    };
    FusibleConfig::from_str(&format!("boards: {{main: {{}}}}\n{tail}")).unwrap()
}

#[test]
fn assembly_runs_take_no_board_target() {
    let cfg = manifest(true);
    for body in [
        r#"{"action":"assembly"}"#,
        r#"{"action":"assembly","target":"assembly"}"#,
    ] {
        let spec = parse(body, Some(&cfg)).unwrap();
        assert_eq!(spec.label, "assembly");
        assert_eq!(spec.args, ["assembly"]);
    }
    assert!(parse(r#"{"action":"assembly","target":"main"}"#, Some(&cfg)).is_err());
    assert!(parse(r#"{"action":"assembly","target":"--help"}"#, None).is_err());
}

#[test]
fn project_reports_whether_an_assembly_is_declared() {
    let state = State::new(&[BoardTarget {
        name: Some("main".into()),
        entry: Path::new("/p/c.json").to_path_buf(),
        ..Default::default()
    }]);
    let with =
        FusibleConfig::from_str("boards: {main: {}}\nassembly: {parts: {main: {}}}\n").unwrap();
    let flag = |cfg: Option<&FusibleConfig>| {
        let text = project_json(&state, cfg, Path::new("/p"));
        serde_json::from_str::<serde_json::Value>(&text).unwrap()["assembly"].clone()
    };
    assert_eq!(flag(Some(&with)), true);
    assert_eq!(flag(Some(&manifest(false))), false);
    assert_eq!(flag(None), false);
}