@@ -154,3 +154,56 @@ fn correct_subtitles_clamps_negative() {
154154 assert_eq ! ( corrected[ 0 ] . end_ms, 0 ) ;
155155 assert_eq ! ( corrected[ 1 ] . start_ms, 6_000 ) ;
156156}
157+
158+ // ── correct_drift_if_any(REQ-264 生产接线包装)──
159+
160+ #[ test]
161+ fn correction_applies_within_band ( ) {
162+ // Arrange:字幕超前 800ms(在 [200, 15000] 带内)
163+ let ( subs, asrs) = synthetic_session ( 6 , 800 , 0 ) ;
164+ // Act
165+ let r = correct_drift_if_any ( & subs, & asrs, 3 , 200 , 15_000 ) ;
166+ // Assert:测量 ≈-800 且已采纳;回校后误差归零
167+ let m = r. measured_ms . unwrap ( ) ;
168+ assert ! ( ( m + 800 ) . abs( ) <= 100 , "测得 {}" , m) ;
169+ assert_eq ! ( r. applied_ms, Some ( m) ) ;
170+ for ( i, s) in r. corrected . iter ( ) . enumerate ( ) {
171+ let err = ( s. start_ms as i64 - asrs[ i] . start_ms as i64 ) . abs ( ) ;
172+ assert ! ( err <= 100 , "第 {} 段误差 {}ms" , i, err) ;
173+ }
174+ }
175+
176+ #[ test]
177+ fn correction_skips_small_jitter ( ) {
178+ // Arrange:仅 50ms 偏移(抖动噪声,不值得动)
179+ let ( subs, asrs) = synthetic_session ( 6 , 50 , 0 ) ;
180+ // Act
181+ let r = correct_drift_if_any ( & subs, & asrs, 3 , 200 , 15_000 ) ;
182+ // Assert:测量存在但不采纳(原样克隆)
183+ assert ! ( r. measured_ms. is_some( ) ) ;
184+ assert_eq ! ( r. applied_ms, None ) ;
185+ assert_eq ! ( r. corrected, subs) ;
186+ }
187+
188+ #[ test]
189+ fn correction_rejects_absurd_drift ( ) {
190+ // Arrange:超大步进(-40s,首尾强对齐误差/异常数据)
191+ let ( subs, asrs) = synthetic_session ( 6 , -40_000 , 0 ) ;
192+ // Act
193+ let r = correct_drift_if_any ( & subs, & asrs, 3 , 200 , 15_000 ) ;
194+ // Assert:不采纳(但保留测量,供统计)
195+ assert ! ( r. measured_ms. is_some( ) ) ;
196+ assert_eq ! ( r. applied_ms, None ) ;
197+ }
198+
199+ #[ test]
200+ fn correction_skips_when_too_few_segments ( ) {
201+ // Arrange:字幕 2 段 < min_segs=3(残片不足以估漂移)
202+ let ( subs, asrs) = synthetic_session ( 2 , 800 , 0 ) ;
203+ // Act
204+ let r = correct_drift_if_any ( & subs, & asrs, 3 , 200 , 15_000 ) ;
205+ // Assert:不测量不校正(原样)
206+ assert_eq ! ( r. measured_ms, None ) ;
207+ assert_eq ! ( r. applied_ms, None ) ;
208+ assert_eq ! ( r. corrected, subs) ;
209+ }
0 commit comments