#[test]
fn test_deep_grcov_grammar_masker_multi_char_token_first_invalid() {
let mut grammar = Grammar::with_root("root");
grammar.add_rule(GrammarRule::single("root", vec![GrammarElement::Char('a')]));
let mut token_strings = HashMap::new();
token_strings.insert(0, "xy".to_string());
let masker = GrammarTokenMasker::new(grammar, token_strings, 99).expect("should create");
let mask = masker.get_mask();
assert!(!mask.is_allowed(0)); }
#[test]
fn test_deep_grcov_grammar_masker_empty_token() {
let mut grammar = Grammar::with_root("root");
grammar.add_rule(GrammarRule::single("root", vec![GrammarElement::Char('a')]));
let mut token_strings = HashMap::new();
token_strings.insert(0, String::new());
let masker = GrammarTokenMasker::new(grammar, token_strings, 99).expect("should create");
let mask = masker.get_mask();
assert!(!mask.is_allowed(0));
}
#[test]
fn test_deep_grcov_find_matching_brace_escaped_quote() {
let text = r#"{"key": "value with \" escaped"}"#;
let result = find_matching_brace(text);
assert!(result.is_some());
}
#[test]
fn test_deep_grcov_find_matching_brace_escaped_backslash() {
let text = r#"{"path": "C:\\Users\\test"}"#;
let result = find_matching_brace(text);
assert!(result.is_some());
}
#[test]
fn test_deep_grcov_extract_xml_tag_unclosed() {
let text = "<name>test";
let result = extract_xml_tag(text, "name");
assert!(result.is_none());
}
#[test]
fn test_deep_grcov_parse_anthropic_format_unclosed() {
let tools = vec![ToolDefinition::new("test", "Test", vec![])];
let mut parser = ToolCallParser::new(tools).with_format(ToolCallFormat::Anthropic);
let text = "<tool_use><name>test</name><input>{}</input>"; let calls = parser.parse(text);
assert!(calls.is_empty());
}
#[test]
fn test_deep_grcov_parse_anthropic_format_missing_name() {
let tools = vec![ToolDefinition::new("test", "Test", vec![])];
let mut parser = ToolCallParser::new(tools).with_format(ToolCallFormat::Anthropic);
let text = "<tool_use><input>{}</input></tool_use>";
let calls = parser.parse(text);
assert!(calls.is_empty());
}
#[test]
fn test_deep_grcov_parse_anthropic_format_unknown_tool() {
let tools = vec![ToolDefinition::new("known_tool", "Known", vec![])];
let mut parser = ToolCallParser::new(tools).with_format(ToolCallFormat::Anthropic);
let text = "<tool_use><name>unknown_tool</name><input>{}</input></tool_use>";
let calls = parser.parse(text);
assert!(calls.is_empty());
}
#[test]
fn test_deep_grcov_parse_hermes_format_unclosed() {
let tools = vec![ToolDefinition::new("test", "Test", vec![])];
let mut parser = ToolCallParser::new(tools).with_format(ToolCallFormat::Hermes);
let text = r#"<tool_call>{"name": "test", "arguments": {}}"#; let calls = parser.parse(text);
assert!(calls.is_empty());
}
#[test]
fn test_deep_grcov_parse_hermes_format_invalid_json() {
let tools = vec![ToolDefinition::new("test", "Test", vec![])];
let mut parser = ToolCallParser::new(tools).with_format(ToolCallFormat::Hermes);
let text = "<tool_call>not valid json</tool_call>";
let calls = parser.parse(text);
assert!(calls.is_empty());
}
#[test]
fn test_deep_grcov_parse_hermes_format_string_arguments() {
let tools = vec![ToolDefinition::new("test", "Test", vec![])];
let mut parser = ToolCallParser::new(tools).with_format(ToolCallFormat::Hermes);
let text =
r#"<tool_call>{"name": "test", "arguments": "{\"key\": \"value\"}"}</tool_call>"#;
let calls = parser.parse(text);
assert_eq!(calls.len(), 1);
}
#[test]
fn test_deep_grcov_parse_hermes_format_unknown_tool() {
let tools = vec![ToolDefinition::new("known", "Known", vec![])];
let mut parser = ToolCallParser::new(tools).with_format(ToolCallFormat::Hermes);
let text = r#"<tool_call>{"name": "unknown", "arguments": {}}</tool_call>"#;
let calls = parser.parse(text);
assert!(calls.is_empty());
}
#[test]
fn test_deep_grcov_generate_tool_grammar_with_all_param_types() {
let tools = vec![ToolDefinition::new(
"complex_tool",
"A complex tool",
vec![
ToolParameter {
name: "str_param".to_string(),
description: "String".to_string(),
param_type: ToolParameterType::String,
required: true,
default: None,
},
ToolParameter {
name: "int_param".to_string(),
description: "Integer".to_string(),
param_type: ToolParameterType::Integer,
required: true,
default: None,
},
ToolParameter {
name: "num_param".to_string(),
description: "Number".to_string(),
param_type: ToolParameterType::Number,
required: true,
default: None,
},
ToolParameter {
name: "bool_param".to_string(),
description: "Boolean".to_string(),
param_type: ToolParameterType::Boolean,
required: true,
default: None,
},
ToolParameter {
name: "enum_param".to_string(),
description: "Enum".to_string(),
param_type: ToolParameterType::Enum(vec!["a".to_string(), "b".to_string()]),
required: true,
default: None,
},
ToolParameter {
name: "array_param".to_string(),
description: "Array".to_string(),
param_type: ToolParameterType::Array {
items: Box::new(ToolParameterType::Integer),
},
required: true,
default: None,
},
ToolParameter {
name: "object_param".to_string(),
description: "Object".to_string(),
param_type: ToolParameterType::Object {
properties: vec![ToolParameter::required_string("nested", "Nested")],
},
required: true,
default: None,
},
],
)];
let grammar = generate_tool_grammar(&tools);
assert!(grammar.get_rule("root").is_some());
}
#[test]
fn test_deep_grcov_generate_params_grammar_empty() {
let tools = vec![ToolDefinition::new("no_params", "No params", vec![])];
let grammar = generate_tool_grammar(&tools);
assert!(grammar.get_rule("root").is_some());
}
#[test]
fn test_deep_grcov_tool_call_parser_get_tool() {
let tools = vec![
ToolDefinition::new("tool1", "Tool 1", vec![]),
ToolDefinition::new("tool2", "Tool 2", vec![]),
];
let parser = ToolCallParser::new(tools);
assert!(parser.get_tool("tool1").is_some());
assert!(parser.get_tool("tool2").is_some());
assert!(parser.get_tool("tool3").is_none());
}
#[test]
fn test_deep_grcov_grammar_rule_names() {
let mut grammar = Grammar::with_root("root");
grammar.add_rule(GrammarRule::single("root", vec![GrammarElement::Char('a')]));
grammar.add_rule(GrammarRule::single(
"other",
vec![GrammarElement::Char('b')],
));
let names: Vec<_> = grammar.rule_names().collect();
assert_eq!(names.len(), 2);
assert!(names.contains(&&"root".to_string()));
assert!(names.contains(&&"other".to_string()));
}
#[test]
fn test_deep_grcov_state_machine_has_valid_continuation_empty() {
let mut grammar = Grammar::with_root("root");
grammar.add_rule(GrammarRule::single("root", vec![GrammarElement::Char('a')]));
let mut sm = GrammarStateMachine::new(grammar).expect("should create");
assert!(sm.has_valid_continuation());
let advanced = sm.advance('x'); assert!(!advanced); assert!(sm.has_valid_continuation());
}
#[test]
fn test_deep_grcov_grammar_with_root() {
let grammar = Grammar::with_root("my_root");
assert_eq!(grammar.root(), "my_root");
assert!(grammar.is_empty());
}
#[test]
fn test_deep_grcov_grammar_set_root() {
let mut grammar = Grammar::new();
grammar.set_root("new_root");
assert_eq!(grammar.root(), "new_root");
}
#[test]
fn test_deep_grcov_state_machine_rule_ref_none_alternatives() {
let mut grammar = Grammar::with_root("root");
grammar.add_rule(GrammarRule::single(
"root",
vec![GrammarElement::RuleRef("sub".to_string())],
));
grammar.add_rule(GrammarRule::single("sub", vec![GrammarElement::Char('x')]));
let mut sm = GrammarStateMachine::new(grammar).expect("should create");
assert!(!sm.advance('y')); }
#[test]
fn test_deep_grcov_parse_openai_nested_json() {
let tools = vec![ToolDefinition::new("nested", "Nested", vec![])];
let mut parser = ToolCallParser::new(tools);
let text = r#"{"name": "nested", "arguments": {"level1": {"level2": {"level3": "deep"}}}}"#;
let calls = parser.parse(text);
assert_eq!(calls.len(), 1);
}
#[test]
fn test_deep_grcov_parse_openai_multiple_json_blocks() {
let tools = vec![ToolDefinition::new("tool", "Tool", vec![])];
let mut parser = ToolCallParser::new(tools);
let text = r#"{"other": "json"} {"name": "tool", "arguments": {}} {"another": "block"}"#;
let calls = parser.parse(text);
assert_eq!(calls.len(), 1);
}
#[test]
fn test_deep_grcov_grammar_validate_undefined_rule_ref() {
let mut grammar = Grammar::with_root("root");
grammar.add_rule(GrammarRule::single(
"root",
vec![
GrammarElement::Char('a'),
GrammarElement::RuleRef("undefined".to_string()),
],
));
let result = grammar.validate();
assert!(result.is_err());
}
#[test]
fn test_deep_grcov_grammar_element_clone_and_eq() {
let elem1 = GrammarElement::CharRange('a', 'z');
let elem2 = elem1.clone();
assert_eq!(elem1, elem2);
let elem3 = GrammarElement::RuleRef("test".to_string());
let elem4 = elem3.clone();
assert_eq!(elem3, elem4);
}
#[test]
fn test_deep_grcov_grammar_alternative_clone() {
let alt1 =
GrammarAlternative::new(vec![GrammarElement::Char('a'), GrammarElement::Char('b')]);
let alt2 = alt1.clone();
assert_eq!(alt1, alt2);
}
#[test]
fn test_deep_grcov_grammar_rule_clone() {
let rule1 = GrammarRule::single("test", vec![GrammarElement::Char('x')]);
let rule2 = rule1.clone();
assert_eq!(rule1, rule2);
}
#[test]
fn test_deep_grcov_grammar_state_clone_and_hash() {
use std::collections::HashSet;
let state1 = GrammarState::initial("root");
let state2 = state1.clone();
assert_eq!(state1, state2);
let mut set = HashSet::new();
set.insert(state1.clone());
assert!(set.contains(&state2));
}
#[test]
fn test_deep_grcov_token_mask_num_allowed() {
let allowed: HashSet<u32> = vec![1, 2, 3, 4, 5].into_iter().collect();
let mask = TokenMask::from_allowed(allowed, true);
assert_eq!(mask.num_allowed(), 5);
}
#[test]
fn test_deep_grcov_tool_result_default_success() {
let json = r#"{"tool_call_id": "id", "content": "data"}"#;
let result: ToolResult = serde_json::from_str(json).expect("should parse");
assert!(result.success); }
#[test]
fn test_deep_grcov_tool_parameter_type_object_serialization() {
let obj_type = ToolParameterType::Object {
properties: vec![ToolParameter::required_int("count", "Count value")],
};
let json = serde_json::to_string(&obj_type).expect("should serialize");
let deserialized: ToolParameterType =
serde_json::from_str(&json).expect("should deserialize");
match deserialized {
ToolParameterType::Object { properties } => {
assert_eq!(properties.len(), 1);
assert_eq!(properties[0].name, "count");
},
_ => panic!("Expected Object type"),
}
}
#[test]
fn test_deep_grcov_state_machine_advance_any() {
let mut grammar = Grammar::with_root("root");
grammar.add_rule(GrammarRule::single(
"root",
vec![GrammarElement::Any, GrammarElement::Char('!')],
));
let mut sm = GrammarStateMachine::new(grammar).expect("should create");
assert!(sm.advance('x')); assert!(sm.advance('!')); assert!(sm.is_complete());
}
#[test]
fn test_deep_grcov_state_machine_advance_char_not() {
let mut grammar = Grammar::with_root("root");
grammar.add_rule(GrammarRule::single(
"root",
vec![GrammarElement::CharNot(vec!['x'])],
));
let mut sm = GrammarStateMachine::new(grammar.clone()).expect("should create");
assert!(sm.advance('a'));
let mut sm2 = GrammarStateMachine::new(grammar).expect("should create");
assert!(!sm2.advance('x')); }
#[test]
fn test_deep_grcov_json_schema_nested_array() {
let schema = JsonSchemaType::Array(Box::new(JsonSchemaType::Array(Box::new(
JsonSchemaType::Integer,
))));
let grammar = grammar_from_json_schema(&schema);
assert!(grammar.get_rule("root").is_some());
assert!(grammar.get_rule("root_item").is_some());
}