diff --git a/c2rust-transpile/tests/snapshots.rs b/c2rust-transpile/tests/snapshots.rs index c0bf83e678..1c9041b36c 100644 --- a/c2rust-transpile/tests/snapshots.rs +++ b/c2rust-transpile/tests/snapshots.rs @@ -1,7 +1,6 @@ use std::env::current_dir; -use std::ffi::OsString; use std::fs; -use std::path::{Path, PathBuf}; +use std::path::Path; use std::process::Command; use c2rust_transpile::{ReplaceMode, TranspilerConfig}; @@ -47,22 +46,7 @@ fn config() -> TranspilerConfig { } } -fn transpile(c_path: &Path) { - let parent_dir_name = c_path - .parent() - .and_then(|dir| dir.file_name()) - .and_then(|file_name| file_name.to_str()) - .unwrap_or_default(); - // Some things transpile differently on Linux vs. macOS, - // as they use `unsigned long` and `unsigned long long` differently for builtins. - // This makes snapshot tests trickier, as the output will be OS-dependent. - // We only test Linux here, as that should be sufficient for these specific tests, - // and because cross-compiling with transpilation is not super straightforward, - // so generating the macOS snapshots locally on Linux is annoying. - if parent_dir_name == "linux" && !cfg!(target_os = "linux") { - return; - } - +fn transpile(platform: Option<&str>, c_path: &Path) { let status = Command::new("clang") .args(&["-c", "-o", "/dev/null"]) .arg(c_path) @@ -77,28 +61,37 @@ fn transpile(c_path: &Path) { let rs_path = c_path.with_extension("rs"); let rs = fs::read_to_string(&rs_path).unwrap(); let debug_expr = format!("cat {}", rs_path.display()); - insta::assert_snapshot!("transpile", &rs, &debug_expr); + + let name = platform + .map(|platform| ["transpile", platform].join("-")) + .unwrap_or("transpile".into()); + + insta::assert_snapshot!(name, &rs, &debug_expr); let status = Command::new("rustc") - .args(&["--crate-type", "lib", "--edition", "2021"]) + .args(&["--crate-type", "lib", "--edition", "2021", "-o", "-"]) .arg(&rs_path) .status(); assert!(status.unwrap().success()); - let rlib_path = { - let mut file_name = OsString::new(); - file_name.push("lib"); - file_name.push(rs_path.file_stem().unwrap()); - file_name.push(".rlib"); - PathBuf::from(file_name) - }; - fs::remove_file(&rlib_path).unwrap(); } #[test] fn transpile_all() { - // We need to do this as a single glob, - // as `insta` removes the common prefix to all matches files, - // and if we do this as separate globs (for linux-only files), - // they'll overwrite each other. - insta::glob!("snapshots/**/*.c", transpile); + insta::glob!("snapshots/*.c", |x| transpile(None, x)); + + // Some things transpile differently on Linux vs. macOS, + // as they use `unsigned long` and `unsigned long long` differently for builtins. + // This makes snapshot tests trickier, as the output will be OS-dependent. + // We handle this by adding OS name to the snapshot result filename. + #[allow(unused)] + let platform = "unknown"; + + #[cfg(target_os = "linux")] + let platform = "linux"; + #[cfg(target_os = "macos")] + let platform = "macos"; + + insta::with_settings!({snapshot_suffix => platform}, { + insta::glob!("snapshots/platform-specific/*.c", |x| transpile(Some(platform), x)); + }); } diff --git a/c2rust-transpile/tests/snapshots/platform-specific/dummy.c b/c2rust-transpile/tests/snapshots/platform-specific/dummy.c new file mode 100644 index 0000000000..f658d3bd1e --- /dev/null +++ b/c2rust-transpile/tests/snapshots/platform-specific/dummy.c @@ -0,0 +1,2 @@ +/* empty file until we have multiple tests; if we glob only one test, insta +omits the `@file.c` suffix from snapshots */ diff --git a/c2rust-transpile/tests/snapshots/platform-specific/dummy.rs b/c2rust-transpile/tests/snapshots/platform-specific/dummy.rs new file mode 100644 index 0000000000..d5e9115dc0 --- /dev/null +++ b/c2rust-transpile/tests/snapshots/platform-specific/dummy.rs @@ -0,0 +1,9 @@ +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] diff --git a/c2rust-transpile/tests/snapshots/linux/rotate.c b/c2rust-transpile/tests/snapshots/platform-specific/rotate.c similarity index 100% rename from c2rust-transpile/tests/snapshots/linux/rotate.c rename to c2rust-transpile/tests/snapshots/platform-specific/rotate.c diff --git a/c2rust-transpile/tests/snapshots/linux/rotate.rs b/c2rust-transpile/tests/snapshots/platform-specific/rotate.rs similarity index 100% rename from c2rust-transpile/tests/snapshots/linux/rotate.rs rename to c2rust-transpile/tests/snapshots/platform-specific/rotate.rs diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile-linux@dummy.c.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile-linux@dummy.c.snap new file mode 100644 index 0000000000..99cb238cc0 --- /dev/null +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile-linux@dummy.c.snap @@ -0,0 +1,16 @@ +--- +source: c2rust-transpile/tests/snapshots.rs +assertion_line: 69 +expression: cat tests/snapshots/platform-specific/dummy.rs +input_file: c2rust-transpile/tests/snapshots/platform-specific/dummy.c +--- +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] + diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@linux__rotate.c.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile-linux@rotate.c.snap similarity index 82% rename from c2rust-transpile/tests/snapshots/snapshots__transpile@linux__rotate.c.snap rename to c2rust-transpile/tests/snapshots/snapshots__transpile-linux@rotate.c.snap index 74df72303f..a561a6ebc9 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@linux__rotate.c.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile-linux@rotate.c.snap @@ -1,7 +1,8 @@ --- source: c2rust-transpile/tests/snapshots.rs -expression: cat tests/snapshots/linux/rotate.rs -input_file: c2rust-transpile/tests/snapshots/linux/rotate.c +assertion_line: 67 +expression: cat tests/snapshots/platform-specific/rotate.rs +input_file: c2rust-transpile/tests/snapshots/platform-specific/rotate.c --- #![allow( dead_code, @@ -28,3 +29,4 @@ pub unsafe extern "C" fn rotate_right_64( .rotate_right(4 as std::ffi::c_int as std::ffi::c_ulong as u32) as std::ffi::c_ulonglong; } + diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile-macos@dummy.c.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile-macos@dummy.c.snap new file mode 100644 index 0000000000..99cb238cc0 --- /dev/null +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile-macos@dummy.c.snap @@ -0,0 +1,16 @@ +--- +source: c2rust-transpile/tests/snapshots.rs +assertion_line: 69 +expression: cat tests/snapshots/platform-specific/dummy.rs +input_file: c2rust-transpile/tests/snapshots/platform-specific/dummy.c +--- +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] + diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile-macos@rotate.c.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile-macos@rotate.c.snap new file mode 100644 index 0000000000..fb5f40cf2d --- /dev/null +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile-macos@rotate.c.snap @@ -0,0 +1,28 @@ +--- +source: c2rust-transpile/tests/snapshots.rs +assertion_line: 67 +expression: cat tests/snapshots/platform-specific/rotate.rs +input_file: c2rust-transpile/tests/snapshots/platform-specific/rotate.c +--- +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] +#[no_mangle] +pub unsafe extern "C" fn rotate_left_64( + mut x: std::ffi::c_ulonglong, +) -> std::ffi::c_ulonglong { + return x.rotate_left(4 as std::ffi::c_int as std::ffi::c_ulonglong as u32); +} +#[no_mangle] +pub unsafe extern "C" fn rotate_right_64( + mut x: std::ffi::c_ulonglong, +) -> std::ffi::c_ulonglong { + return x.rotate_right(4 as std::ffi::c_int as std::ffi::c_ulonglong as u32); +} + diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@atomics.c.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@atomics.c.snap index 2d30f83366..a8ec9c9c96 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@atomics.c.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@atomics.c.snap @@ -1,5 +1,6 @@ --- source: c2rust-transpile/tests/snapshots.rs +assertion_line: 67 expression: cat tests/snapshots/atomics.rs input_file: c2rust-transpile/tests/snapshots/atomics.c --- @@ -44,3 +45,4 @@ pub unsafe extern "C" fn c11_atomics(mut x: std::ffi::c_int) -> std::ffi::c_int fresh1.1; return x; } + diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@factorial.c.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@factorial.c.snap index 0d31d37d0c..1ff9dfe04f 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@factorial.c.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@factorial.c.snap @@ -1,5 +1,6 @@ --- source: c2rust-transpile/tests/snapshots.rs +assertion_line: 67 expression: cat tests/snapshots/factorial.rs input_file: c2rust-transpile/tests/snapshots/factorial.c --- @@ -24,3 +25,4 @@ pub unsafe extern "C" fn factorial(mut n: std::ffi::c_ushort) -> std::ffi::c_ush } return result; } + diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@gotos.c.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@gotos.c.snap index a4f8e51968..ec9f9677e8 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@gotos.c.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@gotos.c.snap @@ -1,5 +1,6 @@ --- source: c2rust-transpile/tests/snapshots.rs +assertion_line: 67 expression: cat tests/snapshots/gotos.rs input_file: c2rust-transpile/tests/snapshots/gotos.c --- @@ -22,3 +23,4 @@ pub unsafe extern "C" fn sum(mut count: std::ffi::c_int) -> std::ffi::c_int { } return x; } + diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@insertion.c.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@insertion.c.snap index 326a924cb8..cc5365d755 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@insertion.c.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@insertion.c.snap @@ -1,5 +1,6 @@ --- source: c2rust-transpile/tests/snapshots.rs +assertion_line: 67 expression: cat tests/snapshots/insertion.rs input_file: c2rust-transpile/tests/snapshots/insertion.c --- @@ -30,3 +31,4 @@ pub unsafe extern "C" fn insertion_sort(n: std::ffi::c_int, p: *mut std::ffi::c_ i; } } + diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@rotate.c.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@rotate.c.snap index 9f97b7f70b..347ff2f214 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@rotate.c.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@rotate.c.snap @@ -1,5 +1,6 @@ --- source: c2rust-transpile/tests/snapshots.rs +assertion_line: 67 expression: cat tests/snapshots/rotate.rs input_file: c2rust-transpile/tests/snapshots/rotate.c --- @@ -40,3 +41,4 @@ pub unsafe extern "C" fn rotate_right_16( pub unsafe extern "C" fn rotate_right_32(mut x: std::ffi::c_uint) -> std::ffi::c_uint { return x.rotate_right(3 as std::ffi::c_int as std::ffi::c_uint as u32); } + diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@spin.c.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@spin.c.snap index 3fcad2fc11..c1ce5a5f52 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@spin.c.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@spin.c.snap @@ -1,5 +1,6 @@ --- source: c2rust-transpile/tests/snapshots.rs +assertion_line: 67 expression: cat tests/snapshots/spin.rs input_file: c2rust-transpile/tests/snapshots/spin.c --- @@ -16,3 +17,4 @@ input_file: c2rust-transpile/tests/snapshots/spin.c pub unsafe extern "C" fn spin() { ::core::hint::spin_loop(); } +