use super::write_materialized_files;
use crate::core::backend::GeneratedFile;
fn read(path: &std::path::Path) -> String {
std::fs::read_to_string(path).unwrap_or_else(|e| panic!("read {}: {e}", path.display()))
}
#[test]
fn strips_trailing_whitespace_from_every_line() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("Sources/RustBridgeC/RustBridgeC.h");
let content =
"#ifndef RUST_BRIDGE_C_H\n#define RUST_BRIDGE_C_H\n\n#include <stdbool.h> \n#include <stdint.h>\n\n#endif\n";
write_materialized_files(vec![GeneratedFile {
path: path.clone(),
content: content.to_string(),
generated_header: false,
}])
.expect("write materialized files");
let written = read(&path);
assert!(
written.lines().all(|line| line == line.trim_end()),
"no emitted line may end in whitespace, got:\n{written:?}"
);
assert!(
written.contains("#include <stdbool.h>\n"),
"the include line's own text must survive, only the trailing space must go, got:\n{written:?}"
);
}
#[test]
fn ensures_a_single_trailing_newline() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("Sources/RustBridge/Demo.swift");
let content = "public struct Demo {}";
write_materialized_files(vec![GeneratedFile {
path: path.clone(),
content: content.to_string(),
generated_header: false,
}])
.expect("write materialized files");
let written = read(&path);
assert_eq!(
written, "public struct Demo {}\n",
"content with no trailing newline must gain exactly one, got:\n{written:?}"
);
}
#[test]
fn collapses_runs_of_blank_lines_to_the_non_markdown_cap_of_two() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("Sources/RustBridgeC/RustBridgeC.h");
let content = "#ifndef X\n#define X\n\n\n\n\n#endif\n";
write_materialized_files(vec![GeneratedFile {
path: path.clone(),
content: content.to_string(),
generated_header: false,
}])
.expect("write materialized files");
let written = read(&path);
assert_eq!(
written, "#ifndef X\n#define X\n\n\n#endif\n",
"a run of 4 blank lines must collapse to exactly 2 (three consecutive newlines) -- fewer \
would be the markdown-only single-blank-line policy misapplied to a `.h` file, and more \
would mean the cap did not apply at all, got:\n{written:?}"
);
assert!(
!written.contains("\n\n\n\n"),
"no run of 3+ blank lines (four or more consecutive newlines) may survive, got:\n{written:?}"
);
}
#[test]
fn creates_missing_parent_directories() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("Sources").join("RustBridgeC").join("RustBridgeC.h");
assert!(
!path.parent().expect("parent").exists(),
"precondition: parent must not exist yet"
);
write_materialized_files(vec![GeneratedFile {
path: path.clone(),
content: "#endif\n".to_string(),
generated_header: false,
}])
.expect("write materialized files");
assert!(
path.is_file(),
"file must exist under the newly created parent directory"
);
}