修复 观察者混合扩展边界问题

This commit is contained in:
YuWuKunCheng
2026-06-07 20:45:09 +08:00
parent 11d897ebaa
commit 8a2afb9ed0
4 changed files with 160 additions and 12 deletions
+73 -2
View File
@@ -322,7 +322,8 @@ impl 观察者 {
}
// Step 6: 混合扩展线段分析 — 3 级递归 (源 = 线段序列组[i])
for i in 0..self.线 {
// NOTE: 当 线段分析层次=0 时 线段序列组 为空,用 min 避免越界
for i in 0..self.线.min(self.线.len()) {
let = self.线[i].clone();
线::(&, &mut self.线[i], &self.);
::(
@@ -422,7 +423,7 @@ impl 观察者 {
);
}
for i in 0..self.线 {
for i in 0..self.线.min(self.线.len()) {
let = self.线[i].clone();
线::(&, &mut self.线[i], &self.);
::(
@@ -1135,4 +1136,74 @@ mod tests {
assert_eq!(, "ethusd");
assert_eq!(, 7200);
}
#[test]
fn test_处理数据_线段分析层次为零_不崩溃() {
let mut config = ::default();
config. = test_data_path();
let obs = ::new("btcusd".into(), 300, config);
let mut obs_w = obs.write().unwrap();
obs_w.线 = 0;
obs_w.();
drop(obs_w);
// 逐根投喂K线,不应因 线段分析层次=0 而 panic
let data = std::fs::read(test_data_path()).unwrap();
let size = 48;
for i in 0..(data.len() / size).min(500) {
let offset = i * size;
if let Some(k线) = K线::from_bytes(&data[offset..offset + size], 300, "btcusd") {
obs.write().unwrap().K线(k线);
}
}
let obs_r = obs.read().unwrap();
assert!(obs_r.K线序列.len() > 0, "缠K序列应有数据");
assert!(obs_r..len() > 0, "分型序列应有数据");
assert!(obs_r.线.is_empty(), "线段序列组应为空");
// 混合扩展线段序列组 有 3 个空 Vec(因为 混合扩展线段分析层次 仍是 3),
// 但所有条目应为空(min(3, 0) = 0,循环未执行)
assert!(
obs_r.线.iter().all(|s| s.is_empty()),
"混合扩展线段序列组所有条目应为空"
);
info!(
"线段分析层次=0 处理数据 OK: {} 缠K, {} 分型, {} 笔",
obs_r.K线序列.len(),
obs_r..len(),
obs_r..len()
);
}
#[test]
fn test_静态重新分析_线段分析层次为零_不崩溃() {
let mut config = ::default();
config. = test_data_path();
let obs = ::new("btcusd".into(), 300, config);
// 先正常投喂数据
obs.write()
.unwrap()
.(&test_data_path(), Default::default())
.unwrap();
// 设为0后执行静态重新分析,不应 panic
let mut obs_w = obs.write().unwrap();
obs_w.线 = 0;
obs_w.();
drop(obs_w);
let obs_r = obs.read().unwrap();
assert!(obs_r..len() > 0, "静态重新分析后分型序列应有数据");
assert!(obs_r.线.is_empty(), "线段序列组应为空");
assert!(
obs_r.线.iter().all(|s| s.is_empty()),
"混合扩展线段序列组所有条目应为空"
);
info!(
"线段分析层次=0 静态重新分析 OK: {} 分型, {} 笔",
obs_r..len(),
obs_r..len()
);
}
}