"));
assert!(args["xml_snippet"]
.as_str()
.unwrap()
.contains("
value
"#;
let (_normal_text, tools) = parser.parse_complete(input).await.unwrap();
assert_eq!(tools.len(), 1);
let args: serde_json::Value = serde_json::from_str(&tools[0].function.arguments).unwrap();
assert_eq!(args["empty"], "");
assert_eq!(args["whitespace"], ""); // Trimmed
assert_eq!(args["normal"], "value");
}
// ============================================================================
// HTML Entity and Python Literal Tests
// ============================================================================
#[tokio::test]
async fn test_qwen_coder_html_entity_decoding() {
let parser = QwenCoderParser::new();
// Test HTML entities in parameter values
let input = r#"
Tom & Jerry
5 < 10 && 10 > 5
"Hello" & 'World'
"#;
let (_normal_text, tools) = parser.parse_complete(input).await.unwrap();
assert_eq!(tools.len(), 1);
let args: serde_json::Value = serde_json::from_str(&tools[0].function.arguments).unwrap();
assert_eq!(args["ampersand"], "Tom & Jerry");
assert_eq!(args["comparison"], "5 < 10 && 10 > 5");
assert_eq!(args["quotes"], "\"Hello\" & 'World'");
}
#[tokio::test]
async fn test_qwen_coder_html_numeric_entities() {
let parser = QwenCoderParser::new();
// Test numeric HTML entities
let input = r#"
<tag>
<tag>
"#;
let (_normal_text, tools) = parser.parse_complete(input).await.unwrap();
assert_eq!(tools.len(), 1);
let args: serde_json::Value = serde_json::from_str(&tools[0].function.arguments).unwrap();
assert_eq!(args["decimal"], "");
assert_eq!(args["hex"], "");
}
#[tokio::test]
async fn test_qwen_coder_python_literals() {
let parser = QwenCoderParser::new();
// Test Python-style literals (True, False, None)
let input = r#"
True
False
None
true
false
null
"#;
let (_normal_text, tools) = parser.parse_complete(input).await.unwrap();
assert_eq!(tools.len(), 1);
let args: serde_json::Value = serde_json::from_str(&tools[0].function.arguments).unwrap();
// Python literals should be converted
assert_eq!(args["py_true"], true);
assert_eq!(args["py_false"], false);
assert_eq!(args["py_none"], serde_json::Value::Null);
// JSON literals should also work
assert_eq!(args["json_true"], true);
assert_eq!(args["json_false"], false);
assert_eq!(args["json_null"], serde_json::Value::Null);
}
#[tokio::test]
async fn test_qwen_coder_mixed_html_and_json() {
let parser = QwenCoderParser::new();
// Test HTML entities within JSON structures
let input = r#"
price < 100 && rating > 4
{"operator": "&&", "escape": true}
"#;
let (_normal_text, tools) = parser.parse_complete(input).await.unwrap();
assert_eq!(tools.len(), 1);
let args: serde_json::Value = serde_json::from_str(&tools[0].function.arguments).unwrap();
assert_eq!(args["query"], "price < 100 && rating > 4");
// JSON with HTML entity inside - the entity gets decoded first, then JSON parsed
assert!(args["config"].is_object());
assert_eq!(args["config"]["operator"], "&&");
}