#[cfg(feature = "derive")]
use tryparse::parse_llm;
#[cfg(feature = "derive")]
use tryparse_derive::LlmDeserialize;
#[cfg(feature = "derive")]
#[derive(Debug, PartialEq, serde::Deserialize, LlmDeserialize)]
struct User {
user_name: String,
max_count: i64,
}
#[cfg(feature = "derive")]
#[derive(Debug, PartialEq, serde::Deserialize, LlmDeserialize)]
struct Config {
xml_parser: String,
io_error: String,
}
#[cfg(feature = "derive")]
#[test]
fn test_camel_case_to_snake_case() {
let response = r#"{"userName": "Alice", "maxCount": 30}"#;
let result: Result<User, _> = parse_llm(response);
assert!(
result.is_ok(),
"Should match camelCase to snake_case via fuzzy matching"
);
let user = result.unwrap();
assert_eq!(user.user_name, "Alice");
assert_eq!(user.max_count, 30);
}
#[cfg(feature = "derive")]
#[test]
fn test_pascal_case_to_snake_case() {
let response = r#"{"UserName": "Bob", "MaxCount": 25}"#;
let result: Result<User, _> = parse_llm(response);
assert!(
result.is_ok(),
"Should match PascalCase to snake_case via fuzzy matching"
);
let user = result.unwrap();
assert_eq!(user.user_name, "Bob");
assert_eq!(user.max_count, 25);
}
#[cfg(feature = "derive")]
#[test]
#[ignore] fn test_acronyms_in_field_names() {
let response = r#"{"XMLParser": "parser1", "IOError": "error1"}"#;
let result: Result<Config, _> = parse_llm(response);
assert!(
result.is_ok(),
"Should match acronyms correctly (XMLParser → xml_parser)"
);
let config = result.unwrap();
assert_eq!(config.xml_parser, "parser1");
assert_eq!(config.io_error, "error1");
}
#[cfg(feature = "derive")]
#[test]
fn test_already_snake_case() {
let response = r#"{"user_name": "Charlie", "max_count": 35}"#;
let result: Result<User, _> = parse_llm(response);
assert!(
result.is_ok(),
"Should handle already snake_case field names"
);
let user = result.unwrap();
assert_eq!(user.user_name, "Charlie");
assert_eq!(user.max_count, 35);
}
#[cfg(feature = "derive")]
#[test]
fn test_kebab_case_to_snake_case() {
let response = r#"{"user-name": "Dave", "max-count": 40}"#;
let result: Result<User, _> = parse_llm(response);
assert!(
result.is_ok(),
"Should match kebab-case to snake_case via fuzzy matching"
);
let user = result.unwrap();
assert_eq!(user.user_name, "Dave");
assert_eq!(user.max_count, 40);
}
#[cfg(feature = "derive")]
#[test]
fn test_dot_notation_to_snake_case() {
let response = r#"{"user.name": "Eve", "max.count": 45}"#;
let result: Result<User, _> = parse_llm(response);
assert!(
result.is_ok(),
"Should match dot.notation to snake_case via fuzzy matching"
);
let user = result.unwrap();
assert_eq!(user.user_name, "Eve");
assert_eq!(user.max_count, 45);
}