use json_extractor::JsonFragmentScanner;
fn generate_nested_objects(depth: usize) -> String {
let mut json = String::new();
for i in 0..depth {
json.push('{');
json.push_str(&format!(r#""level_{}":"#, i));
}
json.push_str(r#"{"value": 123}"#);
for _ in 0..depth {
json.push('}');
}
json
}
fn generate_nested_arrays(depth: usize) -> String {
let mut json = String::from("[");
for _ in 1..depth {
json.push('[');
}
json.push_str("123");
for _ in 0..depth {
json.push(']');
}
json
}
fn generate_mixed_nesting(depth: usize) -> String {
let mut json = String::new();
for i in 0..depth {
if i % 2 == 0 {
json.push('{');
json.push_str(&format!(r#""key_{}":"#, i));
} else {
json.push('[');
}
}
json.push_str("42");
for i in (0..depth).rev() {
if i % 2 == 0 {
json.push('}');
} else {
json.push(']');
}
}
json
}
#[test]
fn test_deep_nesting_50_levels() {
let json = generate_nested_objects(50);
let fragments = JsonFragmentScanner::scan_fragments(json.as_bytes());
assert_eq!(fragments.len(), 1);
assert!(fragments[0].is_complete());
}
#[test]
fn test_deep_nesting_100_levels() {
let json = generate_nested_objects(100);
let fragments = JsonFragmentScanner::scan_fragments(json.as_bytes());
assert_eq!(fragments.len(), 1);
assert!(fragments[0].is_complete());
}
#[test]
fn test_deep_nesting_200_levels() {
let json = generate_nested_objects(200);
let fragments = JsonFragmentScanner::scan_fragments(json.as_bytes());
assert_eq!(fragments.len(), 1);
assert!(fragments[0].is_complete());
}
#[test]
fn test_deep_array_nesting_100_levels() {
let json = generate_nested_arrays(100);
let fragments = JsonFragmentScanner::scan_fragments(json.as_bytes());
assert_eq!(fragments.len(), 1);
assert!(fragments[0].is_complete());
}
#[test]
fn test_mixed_nesting_100_levels() {
let json = generate_mixed_nesting(100);
let fragments = JsonFragmentScanner::scan_fragments(json.as_bytes());
assert_eq!(fragments.len(), 1);
assert!(fragments[0].is_complete());
}
#[test]
fn test_deep_nesting_with_chunk_boundaries() {
let json = generate_nested_objects(80);
assert!(
json.len() > 128,
"Document should be larger than 2 AVX2 chunks (128 bytes)"
);
let fragments = JsonFragmentScanner::scan_fragments(json.as_bytes());
assert_eq!(fragments.len(), 1, "Should find exactly one fragment");
assert!(
fragments[0].is_complete(),
"Deeply nested fragment should be complete"
);
}
#[test]
fn test_deep_nesting_multiple_fragments() {
let mut data = String::new();
for _ in 0..10 {
data.push_str(&generate_nested_objects(50));
data.push(' ');
}
let fragments = JsonFragmentScanner::scan_fragments(data.as_bytes());
assert_eq!(fragments.len(), 10);
for frag in fragments {
assert!(frag.is_complete());
}
}
#[test]
fn test_deep_nesting_error_recovery() {
let mut bad_json = String::from("{");
for i in 0..50 {
bad_json.push_str(&format!(r#""level_{}":{{"#, i));
}
bad_json.push_str("!!!"); bad_json.push(' ');
bad_json.push_str(&generate_nested_objects(30));
let fragments = JsonFragmentScanner::scan_fragments(bad_json.as_bytes());
assert_eq!(fragments.len(), 2);
assert!(!fragments[0].is_complete());
assert!(fragments[1].is_complete());
}
#[test]
fn test_deep_nesting_with_values_at_each_level() {
let json = generate_nested_objects(60);
let fragments = JsonFragmentScanner::scan_fragments(json.as_bytes());
assert_eq!(fragments.len(), 1);
assert!(fragments[0].is_complete());
}
#[test]
fn test_smallvec_stack_to_heap_transition() {
for depth in [5, 8, 9, 15, 20] {
let json = generate_nested_objects(depth);
let fragments = JsonFragmentScanner::scan_fragments(json.as_bytes());
assert_eq!(
fragments.len(),
1,
"Failed at depth {}: expected 1 fragment",
depth
);
assert!(
fragments[0].is_complete(),
"Failed at depth {}: fragment not complete",
depth
);
}
}