diff --git a/tests/snapshots/sample.modified.rs b/tests/snapshots/sample.modified.rs index f1a030ce..d66799f0 100644 --- a/tests/snapshots/sample.modified.rs +++ b/tests/snapshots/sample.modified.rs @@ -18,4 +18,4 @@ fn area(rectangle: &Rectangle) -> u32 { fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 -} \ No newline at end of file +} diff --git a/tests/tester.rs b/tests/tester.rs new file mode 100644 index 00000000..21a7829d --- /dev/null +++ b/tests/tester.rs @@ -0,0 +1,75 @@ +use std::env; +use std::fs::{self, File}; +use std::io::Read; +use std::path::PathBuf; +use std::process::Command; + +pub struct BatTester { + exe: PathBuf, +} + +impl BatTester { + pub fn new() -> Self { + modify_sample_file(); + // Lifted from fd :) + let root = env::current_exe() + .expect("tests executable") + .parent() + .expect("tests executable directory") + .parent() + .expect("bat executable directory") + .to_path_buf(); + + let exe_name = if cfg!(windows) { "bat.exe" } else { "bat" }; + + BatTester { + exe: root.join(exe_name), + } + } + + pub fn test_snapshot(&self, style: &str) { + let output = Command::new(&self.exe) + .args(&[ + "tests/snapshots/sample.rs", + &format!("--style={}", style), + ]) + .output() + .expect("bat failed"); + // have to do the replace because the filename in the header changes based on the current working directory + let actual = String::from_utf8_lossy(&output.stdout) + .as_ref() + .replace("tests/snapshots/", ""); + + let mut expected = String::new(); + let mut file = File::open(format!("tests/snapshots/output/{}.snapshot.txt", style)) + .expect("snapshot file missing"); + file.read_to_string(&mut expected) + .expect("could not read snapshot file"); + + assert_eq!(expected, actual); + } +} + +impl Drop for BatTester { + fn drop(&mut self) { + undo_sample_file_modification(); + } +} + +fn modify_sample_file() { + fs::copy( + "tests/snapshots/sample.modified.rs", + "tests/snapshots/sample.rs", + ).expect("generating modified sample file failed"); +} + +fn undo_sample_file_modification() { + let output = Command::new("git") + .args(&["checkout", "--", "tests/snapshots/sample.rs"]) + .output() + .expect("git checkout failed"); + + if !output.status.success() { + panic!("undoing modified sample changes failed") + } +} diff --git a/tests/tests.rs b/tests/tests.rs new file mode 100644 index 00000000..0f14ae15 --- /dev/null +++ b/tests/tests.rs @@ -0,0 +1,33 @@ +mod tester; + +use tester::BatTester; + +static STYLES: &'static [&'static str] = &[ + "changes", + "grid", + "header", + "numbers", + "changes,grid", + "changes,header", + "changes,numbers", + "grid,header", + "grid,numbers", + "header,numbers", + "changes,grid,header", + "changes,grid,numbers", + "changes,header,numbers", + "grid,header,numbers", + "changes,grid,header,numbers", + "full", + "plain", +]; + +#[test] +fn test_snapshots() { + let bat_tester = BatTester::new(); + + for style in STYLES { + println!("testing {}", style); + bat_tester.test_snapshot(&*style); + } +}