mod common;
use std::fs;
use jsxrs::codegen::generate_types;
use common::fixtures_dir;
#[test]
fn should_generate_rust_struct_from_tsx_interface() {
let tsx_path = fixtures_dir().join("typed_interface.tsx");
let output_dir = std::env::temp_dir().join("jsxrs_test_codegen_interface");
fs::create_dir_all(&output_dir).unwrap();
let output_path = output_dir.join("generated.rs");
let result = generate_types(&[tsx_path], &output_path);
assert!(result.is_ok());
let generated = fs::read_to_string(&output_path).unwrap();
assert!(generated.contains("struct CardProps"));
assert!(generated.contains("title"));
assert!(generated.contains("count"));
assert!(generated.contains("active"));
assert!(generated.contains("tags"));
let _ = fs::remove_dir_all(&output_dir);
}
#[test]
fn should_generate_rust_struct_with_correct_field_types() {
let tsx_path = fixtures_dir().join("typed_interface.tsx");
let output_dir = std::env::temp_dir().join("jsxrs_test_codegen_types");
fs::create_dir_all(&output_dir).unwrap();
let output_path = output_dir.join("generated.rs");
generate_types(&[tsx_path], &output_path).unwrap();
let generated = fs::read_to_string(&output_path).unwrap();
assert!(generated.contains("String")); assert!(generated.contains("f64") || generated.contains("i64")); assert!(generated.contains("bool")); assert!(generated.contains("Vec<String>"));
let _ = fs::remove_dir_all(&output_dir);
}
#[test]
fn should_generate_serde_derive_on_struct() {
let tsx_path = fixtures_dir().join("typed_interface.tsx");
let output_dir = std::env::temp_dir().join("jsxrs_test_codegen_serde");
fs::create_dir_all(&output_dir).unwrap();
let output_path = output_dir.join("generated.rs");
generate_types(&[tsx_path], &output_path).unwrap();
let generated = fs::read_to_string(&output_path).unwrap();
assert!(generated.contains("Serialize"));
assert!(generated.contains("Deserialize"));
let _ = fs::remove_dir_all(&output_dir);
}
#[test]
fn should_generate_structs_from_multiple_tsx_files() {
let tsx_paths = vec![
fixtures_dir().join("typed_interface.tsx"),
fixtures_dir().join("typed.tsx"),
];
let output_dir = std::env::temp_dir().join("jsxrs_test_codegen_multi");
fs::create_dir_all(&output_dir).unwrap();
let output_path = output_dir.join("generated.rs");
let result = generate_types(&tsx_paths, &output_path);
assert!(result.is_ok());
let generated = fs::read_to_string(&output_path).unwrap();
assert!(generated.contains("CardProps"));
assert!(generated.contains("Props"));
let _ = fs::remove_dir_all(&output_dir);
}
#[test]
fn should_return_error_when_tsx_file_not_found() {
let tsx_path = fixtures_dir().join("nonexistent.tsx");
let output_dir = std::env::temp_dir().join("jsxrs_test_codegen_missing");
fs::create_dir_all(&output_dir).unwrap();
let output_path = output_dir.join("generated.rs");
let result = generate_types(&[tsx_path], &output_path);
assert!(result.is_err());
let _ = fs::remove_dir_all(&output_dir);
}