use similar::DiffableStr; use std::ffi::OsStr; use tempdir::TempDir; fn run_test(arg: &str, input: &str) -> String { let mut cmd = assert_cmd::Command::cargo_bin("merge-lists").unwrap(); let temp_dir = TempDir::new("test").unwrap(); let base_path = temp_dir.path().join("base"); let local_path = temp_dir.path().join("local"); let other_path = temp_dir.path().join("other"); let rest = input.strip_prefix("\nbase:\n").unwrap(); let mut split = rest.split("\nlocal:\n"); std::fs::write(&base_path, split.next().unwrap()).unwrap(); let rest = split.next().unwrap(); let mut split = rest.split("\nother:\n"); std::fs::write(&local_path, split.next().unwrap()).unwrap(); std::fs::write(&other_path, split.next().unwrap()).unwrap(); cmd.args(&[ OsStr::new(arg), local_path.as_os_str(), base_path.as_os_str(), other_path.as_os_str(), ]) .assert() .success(); let new_base_bytes = std::fs::read(&base_path).unwrap(); let new_local_bytes = std::fs::read(&local_path).unwrap(); let new_other_bytes = std::fs::read(&other_path).unwrap(); // No newline before "base:" because of https://github.com/mitsuhiko/insta/issues/117 format!( "base:\n{}\nlocal:\n{}\nother:\n{}", new_base_bytes.as_str().unwrap(), new_local_bytes.as_str().unwrap(), new_other_bytes.as_str().unwrap() ) } #[test] fn test_merge_lists_basic() { let output = run_test( "--python-imports", r" base: import lib1 import lib2 local: import lib2 import lib3 other: import lib3 import lib4 ", ); insta::assert_snapshot!(output, @r###" base: import lib3 import lib4 local: import lib3 import lib4 other: import lib3 import lib4 "###); } #[test] fn test_merge_lists_from() { // Test some "from x import y" statements and some non-import conflicts // (unresolvable) let output = run_test( "--python-imports", r" base: from . import x 1+1 local: from . import x from a import b 2+2 other: from a import c 3+3 ", ); insta::assert_snapshot!(output, @r###" base: from a import b from a import c 1+1 local: from a import b from a import c 2+2 other: from a import b from a import c 3+3 "###); } #[test] fn test_merge_lists_not_sorted() { // Test that nothing is done if the elements in the conflicting hunks are // not sorted let output = run_test( "--python-imports", r" base: import x 1+1 local: import a import x 2+2 other: import z import y 3+3 ", ); insta::assert_snapshot!(output, @r###" base: import x 1+1 local: import a import x 2+2 other: import z import y 3+3 "###); } #[test] fn test_custom_regex() { // Test merging of all lines (by matching anything) let output = run_test( "--pattern=.*", r" base: aardvark baboon camel local: aardvark camel eagle other: aardvark camel deer ", ); insta::assert_snapshot!(output, @r###" base: aardvark camel deer eagle local: aardvark camel deer eagle other: aardvark camel deer eagle "###); }