use simplify_baml::*;
#[test]
fn test_null_for_required_enum_field_errors() {
let mut ir = IR::new();
ir.enums.push(Enum {
name: "Status".to_string(),
values: vec!["Active".to_string(), "Inactive".to_string()],
description: None,
});
ir.classes.push(Class {
name: "User".to_string(),
description: None,
fields: vec![
Field {
name: "name".to_string(),
field_type: FieldType::String,
optional: false,
description: None,
},
Field {
name: "status".to_string(),
field_type: FieldType::Enum("Status".to_string()),
optional: false,
description: None,
},
],
});
let response = r#"{"name": "Alice", "status": null}"#;
let result = parse_llm_response_with_ir(
&ir,
response,
&FieldType::Class("User".to_string()),
);
assert!(result.is_err(), "Should error when null is provided for required enum field");
let err = result.unwrap_err();
let err_chain = format!("{:?}", err);
assert!(
err_chain.contains("null") || err_chain.contains("Null"),
"Error should mention null: {}",
err_chain
);
}
#[test]
fn test_null_for_optional_enum_field_succeeds() {
let mut ir = IR::new();
ir.enums.push(Enum {
name: "Status".to_string(),
values: vec!["Active".to_string(), "Inactive".to_string()],
description: None,
});
ir.classes.push(Class {
name: "User".to_string(),
description: None,
fields: vec![
Field {
name: "name".to_string(),
field_type: FieldType::String,
optional: false,
description: None,
},
Field {
name: "status".to_string(),
field_type: FieldType::Enum("Status".to_string()),
optional: true,
description: None,
},
],
});
let response = r#"{"name": "Alice", "status": null}"#;
let result = parse_llm_response_with_ir(
&ir,
response,
&FieldType::Class("User".to_string()),
);
assert!(result.is_ok(), "Should succeed when null is provided for optional enum field");
}
#[test]
fn test_missing_required_enum_field_errors() {
let mut ir = IR::new();
ir.enums.push(Enum {
name: "Status".to_string(),
values: vec!["Active".to_string(), "Inactive".to_string()],
description: None,
});
ir.classes.push(Class {
name: "User".to_string(),
description: None,
fields: vec![
Field {
name: "name".to_string(),
field_type: FieldType::String,
optional: false,
description: None,
},
Field {
name: "status".to_string(),
field_type: FieldType::Enum("Status".to_string()),
optional: false,
description: None,
},
],
});
let response = r#"{"name": "Alice"}"#;
let result = parse_llm_response_with_ir(
&ir,
response,
&FieldType::Class("User".to_string()),
);
assert!(result.is_err(), "Should error when required enum field is missing");
}