kiln-sv 0.1.12

The `kiln` binary: a Cargo-style CLI for SystemVerilog.
use assert_cmd::Command;
use predicates::prelude::*;
use tempfile::tempdir;

fn kiln() -> Command {
    Command::cargo_bin("kiln").expect("kiln binary should be built")
}

#[test]
fn init_uses_directory_name_as_package_name() {
    let tmp = tempdir().unwrap();
    let project = tmp.path().join("counter_top");
    std::fs::create_dir_all(&project).unwrap();

    kiln()
        .arg("init")
        .current_dir(&project)
        .assert()
        .success()
        .stderr(predicate::str::contains(
            "Initialized kiln project `counter_top`",
        ));

    let manifest = std::fs::read_to_string(project.join("Kiln.toml")).unwrap();
    assert!(manifest.contains("name = \"counter_top\""));
    assert!(project.join("src/counter_top.sv").exists());
    assert!(project.join("tests/.gitkeep").exists());
    assert!(project.join(".gitignore").exists());
}

#[test]
fn init_with_explicit_name_overrides_directory() {
    let tmp = tempdir().unwrap();
    let project = tmp.path().join("not_a_valid_sv_name__no_actually_it_is");
    std::fs::create_dir_all(&project).unwrap();

    kiln()
        .args(["init", "--name", "explicit_name"])
        .current_dir(&project)
        .assert()
        .success();

    let manifest = std::fs::read_to_string(project.join("Kiln.toml")).unwrap();
    assert!(manifest.contains("name = \"explicit_name\""));
    assert!(project.join("src/explicit_name.sv").exists());
}

#[test]
fn init_refuses_when_manifest_exists() {
    let tmp = tempdir().unwrap();
    let project = tmp.path().join("already_inited");
    std::fs::create_dir_all(&project).unwrap();
    std::fs::write(project.join("Kiln.toml"), "[package]\nname=\"x\"\n").unwrap();

    kiln()
        .args(["init", "--name", "fresh"])
        .current_dir(&project)
        .assert()
        .failure()
        .stderr(predicate::str::contains("already exists"));
}