use std::process::Command;
const SMEP: &str = env!("CARGO_BIN_EXE_smep");
#[test]
fn version_prints_the_crate_version() {
let output = Command::new(SMEP).arg("--version").output().unwrap();
assert!(output.status.success(), "{:?}", output.status);
assert_eq!(
String::from_utf8_lossy(&output.stdout).trim(),
format!("smep {}", env!("CARGO_PKG_VERSION"))
);
}
#[test]
fn help_prints_the_usage() {
let output = Command::new(SMEP).arg("--help").output().unwrap();
assert!(output.status.success(), "{:?}", output.status);
let text = String::from_utf8_lossy(&output.stdout);
assert!(text.starts_with("Usage: smep [FILE]"), "{text}");
assert!(text.contains("--version"), "{text}");
assert!(
text.contains("--css [THEME]") && text.contains("--typst [THEME]"),
"{text}"
);
}
#[test]
fn css_and_typst_print_the_look_of_a_theme() {
let output = Command::new(SMEP).arg("--css").output().unwrap();
assert!(output.status.success(), "{:?}", output.status);
let css = String::from_utf8_lossy(&output.stdout);
assert!(css.starts_with("/* smep: the Paper look."), "{css}");
assert!(css.contains("--paper:#f8f7f3"), "{css}");
let output = Command::new(SMEP)
.args(["--typst", "paper-dark"])
.output()
.unwrap();
assert!(output.status.success(), "{:?}", output.status);
let typst = String::from_utf8_lossy(&output.stdout);
assert!(
typst.starts_with("// smep: the Paper Dark look."),
"{typst}"
);
assert!(typst.contains("#let paper = rgb(\"#121212\")"), "{typst}");
let output = Command::new(SMEP).args(["--css", "nope"]).output().unwrap();
assert_eq!(output.status.code(), Some(2));
let text = String::from_utf8_lossy(&output.stderr);
assert!(
text.starts_with("smep: no preview theme named \"nope\"; one of paper, paper-dark,"),
"{text}"
);
assert!(output.stdout.is_empty());
}
#[test]
fn an_unreadable_file_is_reported_on_stderr() {
let missing = std::env::temp_dir()
.join(format!("smep-missing-dir-{}", std::process::id()))
.join("notes.md");
let output = Command::new(SMEP).arg(&missing).output().unwrap();
assert_eq!(output.status.code(), Some(1));
let text = String::from_utf8_lossy(&output.stderr);
assert!(text.starts_with("smep: cannot read "), "{text}");
}
#[cfg(windows)]
#[test]
fn the_binary_is_a_gui_program() {
let image = std::fs::read(SMEP).unwrap();
let u16_at = |at: usize| u16::from_le_bytes([image[at], image[at + 1]]);
let u32_at = |at: usize| u32::from_le_bytes(image[at..at + 4].try_into().unwrap());
assert_eq!(&image[..2], b"MZ");
let pe = u32_at(0x3c) as usize;
assert_eq!(&image[pe..pe + 4], b"PE\0\0");
let subsystem = u16_at(pe + 4 + 20 + 68);
assert_eq!(subsystem, 2, "IMAGE_SUBSYSTEM_WINDOWS_GUI");
}