diff options
-rw-r--r-- | .github/workflows/ci.yml | 7 | ||||
-rw-r--r-- | src/main.rs | 74 |
2 files changed, 44 insertions, 37 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index da7d95c9..c78ae786 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,11 @@ -on: [pull_request] name: Continuous Integration +on: + push: + branches: + - master + pull_request: + jobs: unit_tests: diff --git a/src/main.rs b/src/main.rs index 36239b67..31576463 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,6 +27,7 @@ mod syntect_color; mod tests; use std::io::{self, ErrorKind, Read, Write}; +use std::mem; use std::path::PathBuf; use std::process; @@ -80,12 +81,14 @@ fn main() -> std::io::Result<()> { let mut writer = output_type.handle().unwrap(); if atty::is(atty::Stream::Stdin) { - process::exit(diff( + let exit_code = diff( config.minus_file.as_ref(), config.plus_file.as_ref(), &config, &mut writer, - )); + ); + mem::drop(output_type); + process::exit(exit_code); } if let Err(error) = delta(io::stdin().lock().byte_lines(), &mut writer, &config) { @@ -426,6 +429,7 @@ pub fn _list_syntax_themes_for_machines(writer: &mut dyn Write) -> std::io::Resu #[cfg(test)] mod main_tests { use super::*; + use std::fs; use std::io::{Cursor, Seek, SeekFrom}; use crate::ansi; @@ -487,55 +491,53 @@ mod main_tests { #[test] #[cfg_attr(target_os = "windows", ignore)] fn test_diff_same_empty_file() { - let config = integration_test_utils::make_config_from_args(&[]); - let mut writer = Cursor::new(vec![]); - let exit_code = diff( - Some(&PathBuf::from("/dev/null")), - Some(&PathBuf::from("/dev/null")), - &config, - &mut writer, - ); - assert_eq!(exit_code, 0); - let mut s = String::new(); - writer.seek(SeekFrom::Start(0)).unwrap(); - writer.read_to_string(&mut s).unwrap(); - assert!(s.is_empty()); + _do_diff_test("/dev/null", "/dev/null", false, None); } #[test] #[cfg_attr(target_os = "windows", ignore)] fn test_diff_same_non_empty_file() { - let config = integration_test_utils::make_config_from_args(&[]); - let mut writer = Cursor::new(vec![]); - let exit_code = diff( - Some(&PathBuf::from("/etc/passwd")), - Some(&PathBuf::from("/etc/passwd")), - &config, - &mut writer, - ); - assert_eq!(exit_code, 0); - let mut s = String::new(); - writer.seek(SeekFrom::Start(0)).unwrap(); - writer.read_to_string(&mut s).unwrap(); - assert!(s.is_empty()); + _do_diff_test("/etc/passwd", "/etc/passwd", false, None); + } + + #[test] + #[cfg_attr(target_os = "windows", ignore)] + fn test_diff_empty_vs_non_empty_file() { + _do_diff_test("/dev/null", "/etc/passwd", true, Some("/etc/passwd")); } #[test] #[cfg_attr(target_os = "windows", ignore)] - fn test_diff_differing_files() { + fn test_diff_two_non_empty_files() { + _do_diff_test("/etc/group", "/etc/passwd", true, None); + } + + fn _do_diff_test(file_a: &str, file_b: &str, expect_diff: bool, expected_diff: Option<&str>) { let config = integration_test_utils::make_config_from_args(&[]); let mut writer = Cursor::new(vec![]); let exit_code = diff( - Some(&PathBuf::from("/dev/null")), - Some(&PathBuf::from("/etc/passwd")), + Some(&PathBuf::from(file_a)), + Some(&PathBuf::from(file_b)), &config, &mut writer, ); - assert_eq!(exit_code, 1); + let s = ansi::strip_ansi_codes(&_read_to_string(&mut writer)); + if expect_diff { + assert_eq!(exit_code, 1); + assert!(s.contains(&format!("comparing: {} ⟶ {}\n", file_a, file_b))); + if let Some(expected_diff) = expected_diff { + assert!(s.contains(&fs::read_to_string(expected_diff).unwrap())); + } + } else { + assert_eq!(exit_code, 0); + assert!(s.is_empty()); + } + } + + fn _read_to_string(cursor: &mut Cursor<Vec<u8>>) -> String { let mut s = String::new(); - writer.seek(SeekFrom::Start(0)).unwrap(); - writer.read_to_string(&mut s).unwrap(); - let s = ansi::strip_ansi_codes(&s); - assert!(s.contains("comparing: /dev/null ⟶ /etc/passwd\n")); + cursor.seek(SeekFrom::Start(0)).unwrap(); + cursor.read_to_string(&mut s).unwrap(); + s } } |