use json_extractor::JsonFragmentScanner;
#[test]
fn test_large_file_single_fragment() {
let mut large_json = String::from("{");
for i in 0..50_000 {
if i > 0 {
large_json.push(',');
}
large_json.push_str(&format!(r#""key_{}": "value_{}""#, i, i));
}
large_json.push('}');
let fragments = JsonFragmentScanner::scan_fragments(large_json.as_bytes());
assert_eq!(fragments.len(), 1);
assert!(fragments[0].is_complete());
assert_eq!(fragments[0].start, 0);
assert_eq!(fragments[0].length, large_json.len());
}
#[test]
fn test_large_file_many_fragments() {
let mut data = Vec::new();
for i in 0..10_000 {
data.extend_from_slice(format!(r#"{{"id":{}}}"#, i).as_bytes());
data.push(b' ');
}
let fragments = JsonFragmentScanner::scan_fragments(&data);
assert_eq!(fragments.len(), 10_000);
for frag in fragments {
assert!(frag.is_complete());
}
}
#[test]
fn test_large_file_chunked_processing() {
let mut large_array = String::from("[");
for i in 0..10_000 {
if i > 0 {
large_array.push(',');
}
large_array.push_str(&i.to_string());
}
large_array.push(']');
assert!(
large_array.len() > 1024,
"Document should be >1KB to cross multiple SIMD chunks"
);
let fragments = JsonFragmentScanner::scan_fragments(large_array.as_bytes());
assert_eq!(fragments.len(), 1);
assert!(fragments[0].is_complete());
assert_eq!(fragments[0].start, 0);
assert_eq!(fragments[0].length, large_array.len());
}
#[test]
fn test_large_nested_array() {
let mut nested = String::from("[");
for i in 0..1_000 {
if i > 0 {
nested.push(',');
}
nested.push_str(&format!("[{}, {}, {}]", i * 3, i * 3 + 1, i * 3 + 2));
}
nested.push(']');
let fragments = JsonFragmentScanner::scan_fragments(nested.as_bytes());
assert_eq!(fragments.len(), 1);
assert!(fragments[0].is_complete());
}
#[test]
fn test_large_file_with_errors() {
let mut data = Vec::new();
for i in 0..10_000 {
if i % 100 == 0 {
data.extend_from_slice(format!(r#"{{"id":{} "#, i).as_bytes());
} else {
data.extend_from_slice(format!(r#"{{"id":{}}} "#, i).as_bytes());
}
}
let fragments = JsonFragmentScanner::scan_fragments(&data);
assert_eq!(
fragments.len(),
10_000,
"Expected 10,000 fragments but got {}",
fragments.len()
);
let complete_count = fragments.iter().filter(|f| f.is_complete()).count();
let incomplete_count = fragments.iter().filter(|f| !f.is_complete()).count();
assert_eq!(complete_count, 9_900);
assert_eq!(incomplete_count, 100);
}
#[test]
fn test_memory_efficiency_no_buffering() {
let mut huge_string_value = String::from(r#"{"data": ""#);
for _ in 0..1_000_000 {
huge_string_value.push('a');
}
huge_string_value.push_str("\"}");
let fragments = JsonFragmentScanner::scan_fragments(huge_string_value.as_bytes());
assert_eq!(fragments.len(), 1);
assert!(fragments[0].is_complete());
assert_eq!(fragments[0].start, 0);
assert_eq!(fragments[0].length, huge_string_value.len());
}