#![allow(clippy::expect_used)]
use polyplug_codegen::{GenerateConfig, Lang, Side};
use polyplugc::generate;
use std::path::Path;
use std::path::PathBuf;
fn workspace_root() -> PathBuf {
Path::new(env!("CARGO_MANIFEST_DIR"))
.parent()
.expect("parent of crates/polyplug_codegen")
.parent()
.expect("workspace root")
.to_path_buf()
}
fn generate_csharp_bindings(bundle_toml: &Path, out_dir: &Path) {
let config = GenerateConfig {
api_toml: bundle_toml.to_path_buf(),
lang: Lang::CSharp,
side: Side::Guest,
out_dir: out_dir.to_path_buf(),
};
let output = generate(config).expect("polyplugc::generate failed");
for file in &output.files {
let file_path = out_dir.join(&file.path);
if let Some(parent) = file_path.parent() {
std::fs::create_dir_all(parent).expect("failed to create parent dir");
}
std::fs::write(&file_path, &file.content).expect("failed to write generated file");
}
}
#[test]
fn test_generate_csharp_files_exist() {
let root: PathBuf = workspace_root();
let bundle_toml: PathBuf = root.join("tests").join("fixtures").join("test_bundle.toml");
let out_dir: PathBuf =
PathBuf::from(env!("CARGO_TARGET_TMPDIR")).join("integration_codegen_csharp");
std::fs::create_dir_all(&out_dir).expect("create out_dir");
generate_csharp_bindings(&bundle_toml, &out_dir);
let expected_files: &[&str] = &[
"guest/Types.cs",
"guest/Contracts.cs",
"guest/Interfaces.cs",
"guest/Init.cs",
"guest/BundleConstants.cs",
"manifest.toml",
];
for rel_path in expected_files {
let full_path: PathBuf = out_dir.join(rel_path);
assert!(
full_path.exists(),
"Expected file not found: {}",
full_path.display()
);
}
println!(
"test_generate_csharp_files_exist: all {} files present ✓",
expected_files.len()
);
}
#[test]
fn test_csharp_codegen_generates_enum_types() {
let root: PathBuf = workspace_root();
let api_toml: PathBuf = root.join("tests").join("fixtures").join("test_api.toml");
let out_dir: PathBuf =
PathBuf::from(env!("CARGO_TARGET_TMPDIR")).join("integration_codegen_csharp_enum");
std::fs::create_dir_all(&out_dir).expect("create out_dir");
let config = GenerateConfig {
api_toml: api_toml.to_path_buf(),
lang: Lang::CSharp,
side: Side::Host,
out_dir: out_dir.to_path_buf(),
};
let output = generate(config).expect("polyplugc::generate failed");
for file in &output.files {
let file_path = out_dir.join(&file.path);
if let Some(parent) = file_path.parent() {
std::fs::create_dir_all(parent).expect("failed to create parent dir");
}
std::fs::write(&file_path, &file.content).expect("failed to write generated file");
}
let types_file: PathBuf = out_dir.join("host").join("Types.cs");
let content: String = std::fs::read_to_string(&types_file).expect("read types file");
assert!(
content.contains("public enum PixelFormat : uint"),
"Types.cs must contain PixelFormat enum: {}",
types_file.display()
);
assert!(
content.contains("[Flags]"),
"Types.cs must contain [Flags] attribute for bitflags"
);
assert!(
content.contains("public enum ImageFlags : uint"),
"Types.cs must contain ImageFlags enum"
);
println!("test_csharp_codegen_generates_enum_types: all enum assertions passed ✓");
}