@@ -42,15 +42,19 @@ mod tests {
4242 fn chunk_split_across_lines_accumulates ( ) {
4343 let mut pending = String :: new ( ) ;
4444 let mut sink = Vec :: new ( ) ;
45- // 第 1 个对象被切成两半 + 第 2 个对象完整
46- feed_ndjson ( & mut pending, r#"{"heading":"节A","blocks":[]}"# , & mut sink) ;
45+ // 第 1 个对象被切成两半(半个 JSON 分两次到达),第 2 个对象随后完整到达
46+ feed_ndjson ( & mut pending, r#"{"heading":"节A","b"# , & mut sink) ;
47+ assert_eq ! ( sink. len( ) , 0 , "对象残缺未换行前不解析" ) ;
48+ feed_ndjson ( & mut pending, r#"locks":[]}"# , & mut sink) ;
4749 feed_ndjson ( & mut pending, "\n " , & mut sink) ;
50+ assert_eq ! ( sink. len( ) , 1 , "首行补全 + 换行后才解析" ) ;
4851 feed_ndjson ( & mut pending, r#"{"heading":"节B","blocks":[]}"# , & mut sink) ;
49- assert_eq ! ( sink. len( ) , 0 , "首行未换行前不解析 " ) ;
52+ assert_eq ! ( sink. len( ) , 1 , "第二节未换行前不解析 " ) ;
5053 feed_ndjson ( & mut pending, "\n " , & mut sink) ;
5154 assert_eq ! ( sink. len( ) , 2 ) ;
5255 assert_eq ! ( sink[ 0 ] , sec( "节A" ) ) ;
5356 assert_eq ! ( sink[ 1 ] , sec( "节B" ) ) ;
57+ assert ! ( pending. is_empty( ) ) ;
5458 }
5559
5660 #[ test]
@@ -59,11 +63,12 @@ mod tests {
5963 let mut sink = Vec :: new ( ) ;
6064 feed_ndjson ( & mut pending, "{\" heading\" :\" A\" ,\" blocks\" :[]}\r \n {\" heading\" :\" B\" ,\" blocks\" :[]}\n " , & mut sink) ;
6165 assert_eq ! ( sink. len( ) , 2 , "CRLF 尾部 \\ r 应被 trim 忽略" ) ;
62- // 末行无换行 + 尾随解释文本 → flush 只取可解析对象
63- feed_ndjson ( & mut pending, "{\" heading\" :\" C\" ,\" blocks\" :[]}" , & mut sink) ;
66+ // 末行 C 带换行到达(正常解析);随后无换行的尾随解释文本 → flush 忽略垃圾
67+ feed_ndjson ( & mut pending, "{\" heading\" :\" C\" ,\" blocks\" :[]}\n " , & mut sink) ;
68+ assert_eq ! ( sink. len( ) , 3 ) ;
6469 feed_ndjson ( & mut pending, "(以上为整理结果)" , & mut sink) ;
6570 flush_ndjson ( & mut pending, & mut sink) ;
66- assert_eq ! ( sink. len( ) , 3 ) ;
71+ assert_eq ! ( sink. len( ) , 3 , "垃圾尾串不产出伪节" ) ;
6772 assert_eq ! ( sink[ 2 ] , sec( "C" ) ) ;
6873 assert ! ( pending. is_empty( ) ) ;
6974 }
0 commit comments