use serde::Deserialize;
use tryparse::parse;
#[cfg(feature = "derive")]
use tryparse::parse_llm;
#[derive(Deserialize, Debug, PartialEq)]
struct User {
name: String,
age: u32,
}
#[test]
fn test_malformed_json_in_prose() {
let response = r#"
Sure! Here's the user data: {name: 'Alice', age: 30}
Hope that helps!
"#;
let result: Result<User, _> = parse(response);
assert!(
result.is_ok(),
"Multi-stage architecture should FIXED this!"
);
let user = result.unwrap();
assert_eq!(user.name, "Alice");
assert_eq!(user.age, 30);
}
#[test]
fn test_multiple_json_objects() {
let response = r#"
{"name": "Alice", "age": 30}
{"name": "Bob", "age": 25}
"#;
let result: Result<Vec<User>, _> = parse(response);
assert!(result.is_ok());
let users = result.unwrap();
assert_eq!(users.len(), 2);
assert_eq!(users[0].name, "Alice");
assert_eq!(users[1].name, "Bob");
}
#[test]
#[ignore] fn test_case_insensitive_fields() {
let response = r#"{"Name": "Alice", "AGE": 30}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
fn test_multiple_consecutive_commas() {
let response = r#"{"name": "Alice",,,, "age": 30}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok(), "Garbage cleaner handles multiple commas");
let user = result.unwrap();
assert_eq!(user.name, "Alice");
assert_eq!(user.age, 30);
}
#[test]
#[ignore] fn test_deeply_nested_errors() {
#[derive(Deserialize, Debug)]
#[allow(dead_code)]
struct Company {
name: String,
users: Vec<User>,
}
let response = r#"{
"name": "ACME",
"users": [
{name: "Alice", age: 30},
{name: 'Bob', age: '25'}
]
}"#;
let result: Result<Company, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[cfg(feature = "yaml")]
fn test_yaml_style() {
let response = "name: Alice\nage: 30";
let result: Result<User, _> = parse(response);
assert!(result.is_ok(), "YAML parsing should work");
let user = result.unwrap();
assert_eq!(user.name, "Alice");
assert_eq!(user.age, 30);
}
#[test]
#[cfg(not(feature = "yaml"))]
#[ignore] fn test_yaml_style() {
let response = "name: Alice\nage: 30";
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[cfg(feature = "derive")]
fn test_field_name_variations() {
use tryparse_derive::LlmDeserialize;
#[derive(Debug, serde::Deserialize, LlmDeserialize)]
struct Config {
user_name: String,
max_count: i64,
}
let response = r#"{"userName": "Alice", "maxCount": 30}"#;
let result: Result<Config, _> = parse_llm(response);
assert!(
result.is_ok(),
"Field fuzzy matching handles camelCase → snake_case"
);
let config = result.unwrap();
assert_eq!(config.user_name, "Alice");
assert_eq!(config.max_count, 30);
}
#[test]
#[cfg(not(feature = "derive"))]
#[ignore] fn test_field_name_variations() {}
#[test]
#[ignore] fn test_mixed_quote_styles() {
let response = r#"{"name": 'Alice', "age": "30"}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_template_literals() {
let response = r#"{"name": `Alice`, "age": 30}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_unescaped_newlines_in_strings() {
let response = r#"{
"name": "Alice
Bob",
"age": 30
}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_double_escaped() {
let response = r#"{\"name\": \"Alice\", \"age\": 30}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_stringified_json() {
let response = r#""{\"name\": \"Alice\", \"age\": 30}""#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_duplicate_keys() {
let response = r#"{"name": "Alice", "age": 30, "name": "Bob"}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_infinity_nan() {
let response = r#"{"name": "Alice", "age": Infinity}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_err(), "Infinity is not valid JSON");
}
#[test]
#[ignore] fn test_scientific_notation() {
let response = r#"{"name": "Alice", "age": 3e1}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_hex_numbers() {
let response = r#"{"name": "Alice", "age": 0x1E}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_zero_width_characters() {
let response = "{\"name\"\u{200B}: \"Alice\", \"age\": 30}";
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_byte_order_mark() {
let response = "\u{FEFF}{\"name\": \"Alice\", \"age\": 30}";
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_html_entities() {
let response = r#"{"name": "Alice Bob", "age": 30}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_multiple_code_blocks() {
let response = r#"
Here's an example:
```json
{"name": "Example", "age": 999}
```
But here's the real data:
```json
{"name": "Alice", "age": 30}
```
"#;
let result: Result<User, _> = parse(response);
assert_eq!(result.unwrap().name, "Alice", "Should pick the 'real' data");
}
#[test]
#[ignore] fn test_mixed_content() {
let response = r#"
Let me calculate that for you.
```python
user = {"name": "Example"}
print(user)
```
The actual result is: {"name": "Alice", "age": 30}
Hope this helps!
"#;
let result: Result<User, _> = parse(response);
assert_eq!(result.unwrap().name, "Alice");
}
#[test]
#[ignore] fn test_markdown_table() {
let response = r#"
| name | age |
|-------|-----|
| Alice | 30 |
"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok(), "Should parse markdown tables");
}
#[test]
#[ignore] fn test_plain_text_key_value() {
let response = "name: Alice\nage: 30";
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_xml() {
let response = "<user><name>Alice</name><age>30</age></user>";
let result: Result<User, _> = parse(response);
assert!(result.is_ok(), "Should parse XML");
}
#[test]
#[ignore] fn test_javascript_object() {
let response = r#"{
name: "Alice",
age: 30,
greet: function() { return "Hi"; }
}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_complex_comments() {
let response = r#"{
"name": "Alice", /* comment with } and { inside */
"age": 30 // another comment with }
}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_very_deep_nesting() {
let response = format!(
"{}{{\"name\": \"Alice\", \"age\": 30}}{}",
"{".repeat(100),
"}".repeat(100)
);
let result: Result<User, _> = parse(&response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_very_large_input() {
let huge_array = format!("[{}]", "1,".repeat(1_000_000));
let result: Result<Vec<i32>, _> = parse(&huge_array);
let _ = result;
}
#[test]
#[ignore] fn test_circular_reference_string() {
let response = r#"{"name": "Alice", "age": 30, "self": "[Circular]"}"#;
let result: Result<User, _> = parse(response);
assert!(result.is_ok());
}
#[test]
#[ignore] fn test_no_memoization() {
}
#[test]
#[ignore] fn test_excessive_allocations() {
}
#[test]
#[ignore] fn test_no_early_termination() {
}