use std::fs;
use anyhow::{Context, Result};
use assert_cmd::prelude::*;
use predicates::str::contains;
use crate::support::*;
mod support;
#[test]
fn help() {
for arg in ["help build", "build -h", "build --help"] {
wit(arg.split_whitespace())
.assert()
.stdout(contains("Build a binary WIT package"))
.success();
}
}
#[test]
fn it_fails_with_missing_toml_file() -> Result<()> {
wit(["build"])
.assert()
.stderr(contains(
"error: failed to find configuration file `wit.toml`",
))
.failure();
Ok(())
}
#[test]
fn it_builds() -> Result<()> {
let project = Project::new("foo")?;
project.file(
"bar.wit",
r#"package foo:bar@1.2.3;
@since(version = 1.2.3)
interface bar {}
@since(version = 1.2.3)
world bar-world {}
"#,
)?;
project.file(
"baz.wit",
r#"package foo:bar@1.2.3;
interface baz {}
world baz-world {}
"#,
)?;
project
.wit(["build"])
.assert()
.stderr(contains("Created package `bar.wasm`"))
.success();
validate_component(&project.root().join("bar.wasm"))?;
let path = project.root().join("wit.lock");
let contents = fs::read_to_string(&path)
.with_context(|| format!("failed to read lock file `{path}`", path = path.display()))?;
let contents = contents.replace("\r\n", "\n");
assert_eq!(
contents,
"# This file is automatically generated by wit.\n# It is not intended for manual editing.\nversion = 1\n",
"unexpected lock file contents"
);
Ok(())
}
#[test]
fn it_adds_a_producers_field() -> Result<()> {
let project = Project::new("foo")?;
project.file("producers.wit", "package test:producers;")?;
project
.wit(["build"])
.assert()
.stderr(contains("Created package `producers.wasm`"))
.success();
let path = project.root().join("producers.wasm");
validate_component(&path)?;
let wasm = fs::read(&path)
.with_context(|| format!("failed to read wasm file `{path}`", path = path.display()))?;
let section = wasm_metadata::Producers::from_wasm(&wasm)?.expect("missing producers section");
assert_eq!(
section
.get("processed-by")
.expect("missing processed-by field")
.get(env!("CARGO_PKG_NAME"))
.expect("missing wit field"),
option_env!("WIT_VERSION_INFO").unwrap_or(env!("CARGO_PKG_VERSION"))
);
Ok(())
}