use crate::description;
use crate::licenses::{License, Licenses};
use crate::manifest;
use crate::package;
use crate::product_name;
use crate::stored_path::StoredPathBuf;
use crate::Error;
use crate::Result;
use crate::Template;
use crate::EXE_FILE_EXTENSION;
use camino::Utf8Path;
use log::{debug, trace, warn};
use mustache::{self, MapBuilder};
use std::path::Path;
use std::{collections::HashMap, str::FromStr};
use cargo_metadata::Package;
use uuid::Uuid;
use super::RenderOutput;
#[derive(Debug, Clone)]
pub struct Builder<'a> {
banner: Option<&'a str>,
binaries: Option<Vec<&'a str>>,
copyright_year: Option<&'a str>,
copyright_holder: Option<&'a str>,
description: Option<&'a str>,
dialog: Option<&'a str>,
eula: Option<&'a str>,
help_url: Option<&'a str>,
input: Option<&'a str>,
license: Option<&'a str>,
manufacturer: Option<&'a str>,
output: Option<&'a str>,
package: Option<&'a str>,
path_guid: Option<&'a str>,
product_icon: Option<&'a str>,
product_name: Option<&'a str>,
upgrade_guid: Option<&'a str>,
}
impl<'a> Builder<'a> {
pub fn new() -> Self {
Builder {
banner: None,
binaries: None,
copyright_year: None,
copyright_holder: None,
description: None,
dialog: None,
eula: None,
help_url: None,
input: None,
license: None,
manufacturer: None,
output: None,
package: None,
path_guid: None,
product_icon: None,
product_name: None,
upgrade_guid: None,
}
}
pub fn banner(&mut self, b: Option<&'a str>) -> &mut Self {
self.banner = b;
self
}
pub fn binaries(&mut self, b: Option<Vec<&'a str>>) -> &mut Self {
self.binaries = b;
self
}
pub fn copyright_holder(&mut self, h: Option<&'a str>) -> &mut Self {
self.copyright_holder = h;
self
}
pub fn copyright_year(&mut self, y: Option<&'a str>) -> &mut Self {
self.copyright_year = y;
self
}
pub fn description(&mut self, d: Option<&'a str>) -> &mut Self {
self.description = d;
self
}
pub fn dialog(&mut self, d: Option<&'a str>) -> &mut Self {
self.dialog = d;
self
}
pub fn eula(&mut self, e: Option<&'a str>) -> &mut Self {
self.eula = e;
self
}
pub fn help_url(&mut self, h: Option<&'a str>) -> &mut Self {
self.help_url = h;
self
}
pub fn input(&mut self, i: Option<&'a str>) -> &mut Self {
self.input = i;
self
}
pub fn license(&mut self, l: Option<&'a str>) -> &mut Self {
self.license = l;
self
}
pub fn manufacturer(&mut self, m: Option<&'a str>) -> &mut Self {
self.manufacturer = m;
self
}
pub fn output(&mut self, o: Option<&'a str>) -> &mut Self {
self.output = o;
self
}
pub fn package(&mut self, p: Option<&'a str>) -> &mut Self {
self.package = p;
self
}
pub fn path_guid(&mut self, p: Option<&'a str>) -> &mut Self {
self.path_guid = p;
self
}
pub fn product_icon(&mut self, p: Option<&'a str>) -> &mut Self {
self.product_icon = p;
self
}
pub fn product_name(&mut self, p: Option<&'a str>) -> &mut Self {
self.product_name = p;
self
}
pub fn upgrade_guid(&mut self, u: Option<&'a str>) -> &mut Self {
self.upgrade_guid = u;
self
}
pub fn build(&self) -> Execution {
Execution {
banner: self.banner.map(StoredPathBuf::from),
binaries: self
.binaries
.as_ref()
.map(|b| b.iter().copied().map(StoredPathBuf::from).collect()),
copyright_holder: self.copyright_holder.map(String::from),
copyright_year: self.copyright_year.map(String::from),
description: self.description.map(String::from),
dialog: self.dialog.map(StoredPathBuf::from),
eula: self.eula.map(StoredPathBuf::from),
help_url: self.help_url.map(String::from),
input: self.input.map(std::path::PathBuf::from),
license: self.license.map(StoredPathBuf::from),
manufacturer: self.manufacturer.map(String::from),
output: self.output.map(std::path::PathBuf::from),
package: self.package.map(String::from),
path_guid: self.path_guid.map(String::from),
product_icon: self.product_icon.map(StoredPathBuf::from),
product_name: self.product_name.map(String::from),
upgrade_guid: self.upgrade_guid.map(String::from),
}
}
}
impl<'a> Default for Builder<'a> {
fn default() -> Self {
Builder::new()
}
}
#[derive(Debug)]
pub struct Execution {
banner: Option<StoredPathBuf>,
binaries: Option<Vec<StoredPathBuf>>,
copyright_holder: Option<String>,
copyright_year: Option<String>,
description: Option<String>,
dialog: Option<StoredPathBuf>,
eula: Option<StoredPathBuf>,
help_url: Option<String>,
input: Option<std::path::PathBuf>,
license: Option<StoredPathBuf>,
manufacturer: Option<String>,
output: Option<std::path::PathBuf>,
package: Option<String>,
path_guid: Option<String>,
product_icon: Option<StoredPathBuf>,
product_name: Option<String>,
upgrade_guid: Option<String>,
}
pub struct WxsRenders {
pub wxs: RenderOutput,
pub license: Option<RenderOutput>,
pub eula: Option<RenderOutput>,
}
impl Execution {
pub fn run(self) -> Result<()> {
let renders = self.render()?;
renders.wxs.write()?;
if let Some(license) = renders.license {
license.write_disk_only()?;
}
if let Some(eula) = renders.eula {
eula.write_disk_only()?;
}
Ok(())
}
pub fn render(self) -> Result<WxsRenders> {
debug!("banner = {:?}", self.banner);
debug!("binaries = {:?}", self.binaries);
debug!("copyright_holder = {:?}", self.copyright_holder);
debug!("copyright_year = {:?}", self.copyright_year);
debug!("description = {:?}", self.description);
debug!("dialog = {:?}", self.description);
debug!("eula = {:?}", self.eula);
debug!("help_url = {:?}", self.help_url);
debug!("input = {:?}", self.input);
debug!("license = {:?}", self.license);
debug!("manufacturer = {:?}", self.manufacturer);
debug!("output = {:?}", self.output);
debug!("package = {:?}", self.package);
debug!("path_guid = {:?}", self.path_guid);
debug!("product_icon = {:?}", self.product_icon);
debug!("product_name = {:?}", self.product_name);
debug!("upgrade_guid = {:?}", self.upgrade_guid);
let manifest = manifest(self.input.as_ref())?;
let package = package(&manifest, self.package.as_deref())?;
let binaries = self.binaries(&package)?;
let licenses = self.licenses(&package)?;
let mut map = MapBuilder::new()
.insert_vec("binaries", |mut builder| {
for binary in &binaries {
builder = builder.push_map(|builder| {
builder
.insert_str("binary-index", binary.get("binary-index").unwrap())
.insert_str("binary-name", binary.get("binary-name").unwrap())
.insert_str("binary-source", binary.get("binary-source").unwrap())
});
}
builder
})
.insert_str(
"product-name",
product_name(self.product_name.as_ref(), &package),
)
.insert_str("manufacturer", self.manufacturer(&package)?)
.insert_str("upgrade-code-guid", self.upgrade_guid(&package)?)
.insert_str("path-component-guid", self.path_guid(&package)?);
if let Some(banner) = self.banner_image(&package) {
map = map.insert_str("banner", banner);
}
if let Some(description) = description(self.description.clone(), &package) {
map = map.insert_str("description", description);
} else {
warn!(
"A description was not specified at the command line or in the package's manifest \
(Cargo.toml). The description can be added manually to the generated WiX \
Source (wxs) file using a text editor."
);
}
if let Some(dialog) = self.dialog_image(&package) {
map = map.insert_str("dialog", dialog);
}
if let Some(eula) = &licenses.end_user {
map = map.insert_str("eula", &eula.stored_path);
}
if let Some(url) = self.help_url(&package) {
map = map.insert_str("help-url", url);
} else {
warn!(
"A help URL could not be found and it will be excluded from the installer. \
A help URL can be added manually to the generated WiX Source (wxs) file \
using a text editor."
);
}
if let Some(license) = &licenses.source {
map = map.insert_str("license-source", &license.stored_path);
if let Some(name) = &license.name {
map = map.insert_str("license-name", name);
}
}
if let Some(icon) = self.product_icon(&package) {
map = map.insert_str("product-icon", icon);
}
let wxs = {
let data = map.build();
let main_destination = self.output.clone();
let template = mustache::compile_str(Template::Wxs.to_str())?;
let rendered = template.render_data_to_string(&data).map_err(Error::from)?;
RenderOutput {
path: main_destination,
rendered,
}
};
let license = self.render_license_string(licenses.source.as_ref())?;
let eula = self.render_license_string(licenses.end_user.as_ref())?;
Ok(WxsRenders { wxs, license, eula })
}
fn render_license_string(&self, license: Option<&License>) -> Result<Option<RenderOutput>> {
let Some(license) = license else {
return Ok(None);
};
let Some((output, template)) = &license.generate else {
return Ok(None);
};
let mut printer = crate::print::license::Builder::new();
printer.copyright_holder(self.copyright_holder.as_ref().map(String::as_ref));
printer.copyright_year(self.copyright_year.as_ref().map(String::as_ref));
printer.input(self.input.as_deref().and_then(Path::to_str));
if self.output.is_some() {
printer.output(Some(output.as_str()));
}
printer.package(self.package.as_deref());
let render = printer.build().render(template)?;
Ok(Some(render))
}
fn binaries(&self, package: &Package) -> Result<Vec<HashMap<&'static str, String>>> {
let mut binaries = Vec::new();
if let Some(binary_paths) = &self.binaries {
let mut map = HashMap::with_capacity(3);
for (index, binary) in binary_paths.iter().enumerate() {
let binary_file_stem = binary.file_stem().ok_or_else(|| {
Error::Generic(format!(
"The '{}' binary path does not have a file name",
binary
))
})?;
map.insert("binary-index", index.to_string());
map.insert("binary-name", binary_file_stem.to_owned());
map.insert("binary-source", binary.to_string());
}
binaries.push(map);
} else {
let mut binaries_list = package
.targets
.iter()
.filter(|v| v.kind.iter().any(|v| v == "bin"))
.collect::<Vec<_>>();
binaries_list.sort_by_key(|k| &k.name);
for (index, binary) in binaries_list.into_iter().enumerate() {
let mut map = HashMap::with_capacity(3);
map.insert("binary-index", index.to_string());
map.insert("binary-name", binary.name.clone());
map.insert(
"binary-source",
Self::default_binary_path(&binary.name).to_string(),
);
binaries.push(map);
}
}
Ok(binaries)
}
fn default_binary_path(name: &str) -> StoredPathBuf {
StoredPathBuf::from(format!(
"$(var.CargoTargetBinDir)\\{name}.{EXE_FILE_EXTENSION}"
))
}
fn help_url(&self, manifest: &Package) -> Option<String> {
self.help_url
.as_ref()
.map(String::from)
.or_else(|| manifest.documentation.clone())
.or_else(|| manifest.homepage.clone())
.or_else(|| manifest.repository.clone())
}
fn licenses(&self, manifest: &Package) -> Result<Licenses> {
let output_dir = self
.output
.as_deref()
.and_then(|p| p.parent())
.and_then(Utf8Path::from_path);
let licenses = Licenses::new(
output_dir,
self.license.as_deref(),
self.eula.as_deref(),
manifest,
)?;
Ok(licenses)
}
fn manufacturer(&self, manifest: &Package) -> Result<String> {
if let Some(ref m) = self.manufacturer {
Ok(m.to_owned())
} else {
super::authors(manifest)
}
}
fn path_guid(&self, manifest: &Package) -> Result<String> {
if let Some(ref u) = self.path_guid {
trace!("An path GUID has been explicitly specified");
Ok(u.to_owned())
} else if let Some(pkg_meta_wix_path_guid) = manifest
.metadata
.get("wix")
.and_then(|w| w.as_object())
.and_then(|t| t.get("path-guid"))
.and_then(|u| u.as_str())
{
Uuid::from_str(pkg_meta_wix_path_guid)
.map(|u| u.as_hyphenated().to_string().to_uppercase())
.map_err(Error::from)
} else {
Ok(Uuid::new_v4().as_hyphenated().to_string().to_uppercase())
}
}
fn upgrade_guid(&self, manifest: &Package) -> Result<String> {
if let Some(ref u) = self.upgrade_guid {
trace!("An upgrade GUID has been explicitly specified");
Ok(u.to_owned())
} else if let Some(pkg_meta_wix_upgrade_guid) = manifest
.metadata
.get("wix")
.and_then(|w| w.as_object())
.and_then(|t| t.get("upgrade-guid"))
.and_then(|u| u.as_str())
{
Uuid::from_str(pkg_meta_wix_upgrade_guid)
.map(|u| u.as_hyphenated().to_string().to_uppercase())
.map_err(Error::from)
} else {
Ok(Uuid::new_v4().as_hyphenated().to_string().to_uppercase())
}
}
fn banner_image(&self, manifest: &Package) -> Option<StoredPathBuf> {
if let Some(path) = &self.banner {
trace!("A banner image has been explicitly specified");
Some(path.clone())
} else {
manifest
.metadata
.get("wix")
.and_then(|w| w.as_object())
.and_then(|t| t.get("banner"))
.and_then(|p| p.as_str())
.map(|p| StoredPathBuf::new(p.to_owned()))
}
}
fn dialog_image(&self, manifest: &Package) -> Option<StoredPathBuf> {
if let Some(path) = &self.dialog {
trace!("A dialog image has been explicitly specified");
Some(path.clone())
} else {
manifest
.metadata
.get("wix")
.and_then(|w| w.as_object())
.and_then(|t| t.get("dialog"))
.and_then(|p| p.as_str())
.map(|p| StoredPathBuf::new(p.to_owned()))
}
}
fn product_icon(&self, manifest: &Package) -> Option<StoredPathBuf> {
if let Some(path) = &self.product_icon {
trace!("A product icon has been explicitly specified");
Some(path.clone())
} else {
manifest
.metadata
.get("wix")
.and_then(|w| w.as_object())
.and_then(|t| t.get("product-icon"))
.and_then(|p| p.as_str())
.map(|p| StoredPathBuf::new(p.to_owned()))
}
}
#[cfg(test)]
pub fn for_test(input: &Path) -> Self {
let input = Utf8Path::from_path(input).expect("utf8 path");
let output = input
.parent()
.expect("Cargo.toml to not be a root")
.join(crate::WIX)
.join(format!(
"{}.{}",
crate::WIX_SOURCE_FILE_NAME,
crate::WIX_SOURCE_FILE_EXTENSION
));
Builder::new()
.input(Some(input.as_str()))
.output(Some(output.as_str()))
.build()
}
}
#[cfg(test)]
mod tests {
use super::*;
use maplit::hashmap;
mod builder {
use super::*;
#[test]
fn banner_works() {
const EXPECTED: &str = "img\\Banner.bmp";
let mut actual = Builder::new();
actual.banner(Some(EXPECTED));
assert_eq!(actual.banner, Some(EXPECTED));
}
#[test]
fn binaries_name_works() {
const EXPECTED: &str = "bin\\Example.exe";
let mut actual = Builder::new();
actual.binaries(Some(vec![EXPECTED]));
assert_eq!(actual.binaries, Some(vec![EXPECTED]));
}
#[test]
fn description_works() {
const EXPECTED: &str = "This is a description.";
let mut actual = Builder::new();
actual.description(Some(EXPECTED));
assert_eq!(actual.description, Some(EXPECTED));
}
#[test]
fn dialog_work() {
const EXPECTED: &str = "img\\Dialog.bmp";
let mut actual = Builder::new();
actual.dialog(Some(EXPECTED));
assert_eq!(actual.dialog, Some(EXPECTED));
}
#[test]
fn eula_works() {
const EXPECTED: &str = "Example_Eula.rtf";
let mut actual = Builder::new();
actual.eula(Some(EXPECTED));
assert_eq!(actual.eula, Some(EXPECTED));
}
#[test]
fn help_url_works() {
const EXPECTED: &str = "http://www.example.com";
let mut actual = Builder::new();
actual.help_url(Some(EXPECTED));
assert_eq!(actual.help_url, Some(EXPECTED));
}
#[test]
fn input_works() {
const EXPECTED: &str = "C:\\example\\Cargo.toml";
let mut actual = Builder::new();
actual.input(Some(EXPECTED));
assert_eq!(actual.input, Some(EXPECTED));
}
#[test]
fn license_works() {
const EXPECTED: &str = "C:\\example\\Example License.rtf";
let mut actual = Builder::new();
actual.license(Some(EXPECTED));
assert_eq!(actual.license, Some(EXPECTED));
}
#[test]
fn manufacturer_works() {
const EXPECTED: &str = "Example";
let mut actual = Builder::new();
actual.manufacturer(Some(EXPECTED));
assert_eq!(actual.manufacturer, Some(EXPECTED));
}
#[test]
fn output_works() {
const EXPECTED: &str = "C:\\example\\output";
let mut actual = Builder::new();
actual.output(Some(EXPECTED));
assert_eq!(actual.output, Some(EXPECTED));
}
#[test]
fn path_guid_works() {
let expected = Uuid::new_v4().as_hyphenated().to_string().to_uppercase();
let mut actual = Builder::new();
actual.path_guid(Some(&expected));
assert_eq!(actual.path_guid, Some(expected.as_ref()));
}
#[test]
fn product_icon_works() {
const EXPECTED: &str = "img\\Product.ico";
let mut actual = Builder::new();
actual.product_icon(Some(EXPECTED));
assert_eq!(actual.product_icon, Some(EXPECTED));
}
#[test]
fn product_name_works() {
const EXPECTED: &str = "Example Product Name";
let mut actual = Builder::new();
actual.product_name(Some(EXPECTED));
assert_eq!(actual.product_name, Some(EXPECTED));
}
#[test]
fn upgrade_guid_works() {
let expected = Uuid::new_v4().as_hyphenated().to_string().to_uppercase();
let mut actual = Builder::new();
actual.upgrade_guid(Some(&expected));
assert_eq!(actual.upgrade_guid, Some(expected.as_ref()));
}
}
mod execution {
extern crate assert_fs;
use super::*;
use crate::tests::setup_project;
use crate::{LICENSE_FILE_NAME, RTF_FILE_EXTENSION, WIX};
use std::fs::File;
const MIN_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
"#;
const MIT_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
"#;
const GPL3_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "GPL-3.0"
"#;
const APACHE2_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "Apache-2.0"
"#;
const UNKNOWN_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "XYZ"
"#;
const MIT_MANIFEST_BIN: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
[[bin]]
name = "Different"
"#;
const MULTIPLE_BIN_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
[[bin]]
name = "binary0"
path = "src/binary0/main.rs"
[[bin]]
name = "binary1"
path = "src/binary1/main.rs"
[[bin]]
name = "binary2"
path = "src/binary2/main.rs"
"#;
const DOCUMENTATION_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
documentation = "http://www.example.com"
"#;
const HOMEPAGE_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
homepage = "http://www.example.com"
"#;
const REPOSITORY_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
repository = "http://www.example.com"
"#;
const LICENSE_FILE_RTF_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license-file = "Example.rtf"
"#;
const LICENSE_FILE_TXT_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license-file = "Example.txt"
"#;
const LICENSE_FALSE_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
[package.metadata.wix]
license = false
eula = true
"#;
const EULA_FALSE_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
[package.metadata.wix]
license = true
eula = false
"#;
const EULA_AND_LICENSE_FALSE_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
[package.metadata.wix]
license = false
eula = false
"#;
const LICENSE_PATH_RTF_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
[package.metadata.wix]
license = "MyLicense.rtf"
"#;
const LICENSE_PATH_TXT_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
[package.metadata.wix]
license = "MyLicense.txt"
"#;
const EULA_PATH_RTF_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
[package.metadata.wix]
eula = "MyEula.rtf"
"#;
const EULA_PATH_TXT_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
[package.metadata.wix]
eula = "MyEula.txt"
"#;
const EULA_AND_LICENSE_PATH_RTF_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
[package.metadata.wix]
license = "MyLicense.rtf"
eula = "MyEula.rtf"
"#;
const EULA_BAD_PATH_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
[package.metadata.wix]
eula = "MyFakeEula.rtf"
"#;
const LICENSE_BAD_PATH_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license = "MIT"
[package.metadata.wix]
eula = "MyFakeLicense.rtf"
"#;
const LICENSE_FILE_BAD_PATH_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
license-file = "MyFakeLicense.rtf"
"#;
const PATH_GUID: &str = "C38A18DB-12CC-4BDC-8A05-DFCB981A0F33";
const UPGRADE_GUID: &str = "71C1A58D-3FD2-493D-BB62-4B27C66FCCF9";
const PATH_GUID_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
[package.metadata.wix]
path-guid = "C38A18DB-12CC-4BDC-8A05-DFCB981A0F33"
"#;
const UPGRADE_GUID_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
[package.metadata.wix]
upgrade-guid = "71C1A58D-3FD2-493D-BB62-4B27C66FCCF9"
"#;
const IMAGES_MANIFEST: &str = r#"[package]
name = "Example"
version = "0.1.0"
authors = ["First Last <first.last@example.com>"]
[package.metadata.wix]
product-icon = "wix/product.ico"
dialog = "wix/dialog.png"
banner = "wix/banner.png"
"#;
#[test]
fn license_name_with_mit_license_field_works() {
let project = setup_project(MIT_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input)
.licenses(&package)
.expect("licenses")
.source
.expect("source license")
.stored_path;
assert_eq!(
actual,
StoredPathBuf::from(format!("{WIX}\\{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}"))
);
}
#[test]
fn license_name_with_gpl3_license_field_works() {
let project = setup_project(GPL3_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input)
.licenses(&package)
.expect("licenses")
.source
.expect("source license")
.stored_path;
assert_eq!(
actual,
StoredPathBuf::from(format!("{WIX}\\{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}"))
);
}
#[test]
fn license_name_with_apache2_license_field_works() {
let project = setup_project(APACHE2_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input)
.licenses(&package)
.expect("licenses")
.source
.expect("source license")
.stored_path;
assert_eq!(
actual,
StoredPathBuf::from(format!("{WIX}\\{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}"))
);
}
#[test]
fn license_name_with_unknown_license_field_works() {
let project = setup_project(UNKNOWN_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input)
.licenses(&package)
.expect("licenses")
.source;
assert!(actual.is_none());
}
#[test]
fn license_source_with_mit_license_field_works() {
let project = setup_project(MIT_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input)
.licenses(&package)
.expect("licenses")
.source
.expect("source license")
.stored_path;
assert_eq!(
actual,
StoredPathBuf::from(format!("{WIX}\\{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}"))
);
}
#[test]
fn license_source_with_gpl3_license_field_works() {
let project = setup_project(GPL3_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input)
.licenses(&package)
.expect("licenses")
.source
.expect("source license")
.stored_path;
assert_eq!(
actual,
StoredPathBuf::from(format!("{WIX}\\{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}"))
);
}
#[test]
fn license_source_with_apache2_license_field_works() {
let project = setup_project(APACHE2_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input)
.licenses(&package)
.expect("licenses")
.source
.expect("source license")
.stored_path;
assert_eq!(
actual,
StoredPathBuf::from(format!("{WIX}\\{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}"))
);
}
#[test]
fn license_source_with_unknown_license_field_works() {
let project = setup_project(UNKNOWN_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input)
.licenses(&package)
.expect("licenses")
.source;
assert!(actual.is_none());
}
#[test]
fn license_false_works() {
let project = setup_project(LICENSE_FALSE_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input)
.licenses(&package)
.expect("licenses");
assert_eq!(licenses.source, None);
assert_eq!(licenses.end_user, None);
}
#[test]
fn eula_false_works() {
let project = setup_project(EULA_FALSE_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input)
.licenses(&package)
.expect("licenses");
assert_eq!(
licenses.source.unwrap().stored_path,
StoredPathBuf::from(format!("{WIX}\\{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}"))
);
assert_eq!(licenses.end_user, None);
}
#[test]
fn eula_and_license_false_works() {
let project = setup_project(EULA_AND_LICENSE_FALSE_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input)
.licenses(&package)
.expect("licenses");
assert_eq!(licenses.source, None);
assert_eq!(licenses.end_user, None);
}
#[test]
fn license_path_rtf_works() {
let project = setup_project(LICENSE_PATH_RTF_MANIFEST);
let license_file_path = project.path().join("MyLicense.rtf");
let _license_file_handle = File::create(license_file_path).expect("Create file");
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input)
.licenses(&package)
.expect("licenses");
assert_eq!(
licenses.source.unwrap().stored_path.as_str(),
"MyLicense.rtf"
);
assert_eq!(
licenses.end_user.unwrap().stored_path.as_str(),
"MyLicense.rtf"
);
}
#[test]
fn license_path_txt_works() {
let project = setup_project(LICENSE_PATH_TXT_MANIFEST);
let license_file_path = project.path().join("MyLicense.txt");
let _license_file_handle = File::create(license_file_path).expect("Create file");
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input)
.licenses(&package)
.expect("licenses");
assert_eq!(
licenses.source.unwrap().stored_path.as_str(),
"MyLicense.txt"
);
assert_eq!(licenses.end_user, None);
}
#[test]
fn eula_path_rtf_works() {
let project = setup_project(EULA_PATH_RTF_MANIFEST);
let license_file_path = project.path().join("MyEula.rtf");
let _license_file_handle = File::create(license_file_path).expect("Create file");
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input)
.licenses(&package)
.expect("licenses");
assert_eq!(
licenses.source.unwrap().stored_path.as_str(),
format!("{WIX}\\{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}")
);
assert_eq!(
licenses.end_user.unwrap().stored_path.as_str(),
"MyEula.rtf"
);
}
#[test]
fn eula_path_txt_works() {
let project = setup_project(EULA_PATH_TXT_MANIFEST);
let license_file_path = project.path().join("MyEula.txt");
let _license_file_handle = File::create(license_file_path).expect("Create file");
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input)
.licenses(&package)
.expect("licenses");
assert_eq!(
licenses.source.unwrap().stored_path.as_str(),
format!("{WIX}\\{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}")
);
assert_eq!(
licenses.end_user.unwrap().stored_path.as_str(),
"MyEula.txt"
);
}
#[test]
fn eula_and_license_path_rtf_works() {
let project = setup_project(EULA_AND_LICENSE_PATH_RTF_MANIFEST);
let license_file_path = project.path().join("MyLicense.rtf");
let _license_file_handle = File::create(license_file_path).expect("Create file");
let eula_file_path = project.path().join("MyEula.rtf");
let _eula_file_handle = File::create(eula_file_path).expect("Create file");
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input)
.licenses(&package)
.expect("licenses");
assert_eq!(
licenses.source.unwrap().stored_path.as_str(),
"MyLicense.rtf"
);
assert_eq!(
licenses.end_user.unwrap().stored_path.as_str(),
"MyEula.rtf"
);
}
#[test]
fn eula_bad_path_errors() {
let project = setup_project(EULA_BAD_PATH_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input).licenses(&package);
assert!(licenses.is_err());
}
#[test]
fn license_bad_path_errors() {
let project = setup_project(LICENSE_BAD_PATH_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input).licenses(&package);
assert!(licenses.is_err());
}
#[test]
fn license_file_bad_path_errors() {
let project = setup_project(LICENSE_FILE_BAD_PATH_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input).licenses(&package);
assert!(licenses.is_err());
}
#[test]
fn binaries_with_no_bin_section_works() {
let project = setup_project(MIT_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input).binaries(&package).unwrap();
assert_eq!(
actual,
vec![hashmap! {
"binary-index" => 0.to_string(),
"binary-name" => String::from("Example"),
"binary-source" => String::from("$(var.CargoTargetBinDir)\\Example.exe")
}]
)
}
#[test]
fn binaries_with_single_bin_section_works() {
let project = setup_project(MIT_MANIFEST_BIN);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input).binaries(&package).unwrap();
assert_eq!(
actual,
vec![hashmap! {
"binary-index" => 0.to_string(),
"binary-name" => String::from("Different"),
"binary-source" => String::from("$(var.CargoTargetBinDir)\\Different.exe")
}]
)
}
#[test]
fn binaries_with_multiple_bin_sections_works() {
let project = setup_project(MULTIPLE_BIN_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input).binaries(&package).unwrap();
assert_eq!(
actual,
vec![
hashmap! {
"binary-index" => 0.to_string(),
"binary-name" => String::from("binary0"),
"binary-source" => String::from("$(var.CargoTargetBinDir)\\binary0.exe")
},
hashmap! {
"binary-index" => 1.to_string(),
"binary-name" => String::from("binary1"),
"binary-source" => String::from("$(var.CargoTargetBinDir)\\binary1.exe")
},
hashmap! {
"binary-index" => 2.to_string(),
"binary-name" => String::from("binary2"),
"binary-source" => String::from("$(var.CargoTargetBinDir)\\binary2.exe")
}
]
)
}
#[test]
fn manufacturer_with_defaults_works() {
const EXPECTED: &str = "First Last";
let project = setup_project(MIN_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input).manufacturer(&package).unwrap();
assert_eq!(actual, String::from(EXPECTED));
}
#[test]
fn manufacturer_with_override_works() {
const EXPECTED: &str = "Example";
let project = setup_project(MIN_MANIFEST);
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Builder::default()
.manufacturer(Some(EXPECTED))
.build()
.manufacturer(&package)
.unwrap();
assert_eq!(actual, String::from(EXPECTED));
}
#[test]
fn help_url_with_defaults_works() {
let project = setup_project(MIN_MANIFEST);
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Builder::default().build().help_url(&package);
assert!(actual.is_none());
}
#[test]
fn help_url_with_documentation_works() {
const EXPECTED: &str = "http://www.example.com";
let project = setup_project(DOCUMENTATION_MANIFEST);
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Builder::default().build().help_url(&package);
assert_eq!(actual, Some(String::from(EXPECTED)));
}
#[test]
fn help_url_with_homepage_works() {
const EXPECTED: &str = "http://www.example.com";
let project = setup_project(HOMEPAGE_MANIFEST);
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Builder::default().build().help_url(&package);
assert_eq!(actual, Some(String::from(EXPECTED)));
}
#[test]
fn help_url_with_repository_works() {
const EXPECTED: &str = "http://www.example.com";
let project = setup_project(REPOSITORY_MANIFEST);
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Builder::default().build().help_url(&package);
assert_eq!(actual, Some(String::from(EXPECTED)));
}
#[test]
fn eula_with_defaults_works() {
let project = setup_project(MIN_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input)
.licenses(&package)
.unwrap()
.end_user;
assert!(actual.is_none());
}
#[test]
fn eula_with_mit_license_field_works() {
let project = setup_project(MIT_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input).licenses(&package).unwrap();
let source = licenses.source.unwrap();
let source_path = source.stored_path;
let (template_out, source_template) = source.generate.unwrap();
let eula_path = licenses.end_user.unwrap().stored_path;
let expected_rel_path = format!("{WIX}\\{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}");
let expected_abs_path = Utf8Path::from_path(input.parent().unwrap())
.unwrap()
.join(WIX)
.join(format!("{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}"));
assert_eq!(source_template, Template::Mit);
assert_eq!(source_path.as_str(), expected_rel_path);
assert_eq!(template_out, expected_abs_path);
assert_eq!(eula_path.as_str(), expected_rel_path);
}
#[test]
fn eula_with_apache2_license_field_works() {
let project = setup_project(APACHE2_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input).licenses(&package).unwrap();
let source = licenses.source.unwrap();
let source_path = source.stored_path;
let (template_out, source_template) = source.generate.unwrap();
let eula_path = licenses.end_user.unwrap().stored_path;
let expected_rel_path = format!("{WIX}\\{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}");
let expected_abs_path = Utf8Path::from_path(input.parent().unwrap())
.unwrap()
.join(WIX)
.join(format!("{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}"));
assert_eq!(source_template, Template::Apache2);
assert_eq!(source_path.as_str(), expected_rel_path);
assert_eq!(template_out, expected_abs_path);
assert_eq!(eula_path.as_str(), expected_rel_path);
}
#[test]
fn eula_with_gpl3_license_field_works() {
let project = setup_project(GPL3_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input).licenses(&package).unwrap();
let source = licenses.source.unwrap();
let source_path = source.stored_path;
let (template_out, source_template) = source.generate.unwrap();
let eula_path = licenses.end_user.unwrap().stored_path;
let expected_rel_path = format!("{WIX}\\{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}");
let expected_abs_path = Utf8Path::from_path(input.parent().unwrap())
.unwrap()
.join(WIX)
.join(format!("{LICENSE_FILE_NAME}.{RTF_FILE_EXTENSION}"));
assert_eq!(source_template, Template::Gpl3);
assert_eq!(source_path.as_str(), expected_rel_path);
assert_eq!(template_out, expected_abs_path);
assert_eq!(eula_path.as_str(), expected_rel_path);
}
#[test]
fn eula_with_unknown_license_field_works() {
let project = setup_project(UNKNOWN_MANIFEST);
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input).licenses(&package).unwrap();
let source = licenses.source;
let eula = licenses.end_user;
assert_eq!(source, None);
assert_eq!(eula, None);
}
#[test]
#[cfg(windows)]
fn eula_with_override_works() {
let project = setup_project(MIT_MANIFEST);
let license_file_path = project.path().join("Example.rtf");
let _license_file_handle = File::create(&license_file_path).expect("Create file");
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Builder::default()
.eula(license_file_path.to_str())
.build()
.licenses(&package)
.unwrap()
.end_user
.unwrap()
.stored_path;
assert_eq!(
actual,
StoredPathBuf::from_std_path(&license_file_path).unwrap(),
);
}
#[test]
fn eula_with_license_file_field_works() {
let project = setup_project(LICENSE_FILE_RTF_MANIFEST);
let license_file_path = project.path().join("Example.rtf");
let _license_file_handle = File::create(license_file_path).expect("Create file");
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Execution::for_test(&input)
.licenses(&package)
.unwrap()
.end_user
.unwrap()
.stored_path;
assert_eq!(actual.as_str(), "Example.rtf");
}
#[test]
fn eula_with_license_file_extension_works() {
let project = setup_project(LICENSE_FILE_TXT_MANIFEST);
let license_file_path = project.path().join("Example.txt");
let _license_file_handle = File::create(license_file_path).expect("Create file");
let input = project.path().join("Cargo.toml");
let manifest = crate::manifest(Some(&input)).unwrap();
let package = crate::package(&manifest, None).unwrap();
let licenses = Execution::for_test(&input).licenses(&package).unwrap();
let source = licenses.source.unwrap();
let eula = licenses.end_user;
assert_eq!(source.generate, None);
assert_eq!(source.name, None);
assert_eq!(source.stored_path.as_str(), "Example.txt");
assert_eq!(eula, None);
}
#[test]
fn eula_with_wrong_file_extension_override_works() {
let project = setup_project(LICENSE_FILE_TXT_MANIFEST);
let license_file_path = project.path().join("Example.txt");
let _license_file_handle = File::create(&license_file_path).expect("Create file");
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let input = license_file_path.to_str().unwrap();
let expected = StoredPathBuf::new(input.to_owned());
let licenses = Builder::default()
.eula(Some(input))
.build()
.licenses(&package)
.unwrap();
let eula = licenses.end_user.unwrap();
assert_eq!(eula.stored_path, expected);
}
#[test]
fn path_guid_with_override_works() {
let expected = Uuid::new_v4().as_hyphenated().to_string().to_uppercase();
let project = setup_project(MIN_MANIFEST);
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Builder::default()
.path_guid(Some(&expected))
.build()
.path_guid(&package)
.unwrap();
assert_eq!(actual, expected);
}
#[test]
fn path_guid_metadata_works() {
let project = setup_project(PATH_GUID_MANIFEST);
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Builder::default().build().path_guid(&package).unwrap();
assert_eq!(actual, PATH_GUID);
}
#[test]
fn path_guid_metadata_and_override_works() {
let expected = Uuid::new_v4().as_hyphenated().to_string().to_uppercase();
let project = setup_project(PATH_GUID_MANIFEST);
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Builder::default()
.path_guid(Some(&expected))
.build()
.path_guid(&package)
.unwrap();
assert_eq!(actual, expected);
}
#[test]
fn upgrade_guid_with_override_works() {
let expected = Uuid::new_v4().as_hyphenated().to_string().to_uppercase();
let project = setup_project(MIN_MANIFEST);
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Builder::default()
.upgrade_guid(Some(&expected))
.build()
.upgrade_guid(&package)
.unwrap();
assert_eq!(actual, expected);
}
#[test]
fn upgrade_guid_metadata_works() {
let project = setup_project(UPGRADE_GUID_MANIFEST);
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Builder::default().build().upgrade_guid(&package).unwrap();
assert_eq!(actual, UPGRADE_GUID);
}
#[test]
fn upgrade_guid_metadata_and_override_works() {
let expected = Uuid::new_v4().as_hyphenated().to_string().to_uppercase();
let project = setup_project(UPGRADE_GUID_MANIFEST);
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Builder::default()
.upgrade_guid(Some(&expected))
.build()
.upgrade_guid(&package)
.unwrap();
assert_eq!(actual, expected);
}
#[test]
fn image_metadata_works() {
let project = setup_project(IMAGES_MANIFEST);
let manifest = crate::manifest(Some(&project.path().join("Cargo.toml"))).unwrap();
let package = crate::package(&manifest, None).unwrap();
let actual = Builder::default().build();
assert_eq!(
actual.product_icon(&package).unwrap().as_str(),
"wix/product.ico"
);
assert_eq!(
actual.dialog_image(&package).unwrap().as_str(),
"wix/dialog.png"
);
assert_eq!(
actual.banner_image(&package).unwrap().as_str(),
"wix/banner.png"
);
}
}
}