mod common;
use common::{Capture, wait_until};
use ek_data::{
ContractData, Direction, EVENT_CONTRACT, EVENT_LOG, Exchange, LEVEL_ERROR, LEVEL_INFO,
LEVEL_WARNING, LogData, Offset, OrderRequest, OrderType,
};
use ek_event::Event;
use std::sync::Arc;
use std::time::Duration;
#[test]
fn f8_contract_flow_single_put() {
let eng = ek_event::EventEngine::new();
let cap = Capture::<ContractData>::new();
cap.register_on(&eng, EVENT_CONTRACT);
eng.start();
let c = ContractData {
gateway_name: "xt".into(),
symbol: "IF2506".into(),
exchange: Exchange::CFFEX,
name: "沪深300股指期货06".into(),
..Default::default()
};
assert_eq!(c.size, 1.0);
assert_eq!(c.price_tick, 0.01);
eng.put(Event::with_data(EVENT_CONTRACT, Arc::new(c)))
.unwrap();
assert!(wait_until(Duration::from_secs(2), || cap.len() == 1));
eng.stop();
let dict = cap.last().unwrap();
assert_eq!(dict.en_symbol(), "CFFEX.IF2506");
let sub = OrderRequest {
symbol: dict.symbol.clone(),
exchange: dict.exchange,
direction: Direction::LONG,
order_type: OrderType::LIMIT,
volume: 1.0,
price: ek_data::round_to(3520.28, dict.price_tick),
offset: Offset::OPEN,
reference: "demo".into(),
old_order_id: String::new(),
};
assert_eq!(sub.price, 3520.28, "0.01 tick 下 3520.28 即合法价签");
}
#[test]
fn f8_contract_no_composed_key() {
let eng = ek_event::EventEngine::new();
let bare = Capture::<ContractData>::new();
let composed = Capture::<ContractData>::new();
bare.register_on(&eng, EVENT_CONTRACT);
composed.register_on(&eng, format!("{EVENT_CONTRACT}CFFEX.IF2506"));
eng.start();
let c = ContractData {
gateway_name: "xt".into(),
symbol: "IF2506".into(),
exchange: Exchange::CFFEX,
..Default::default()
};
eng.put(Event::with_data(EVENT_CONTRACT, Arc::new(c)))
.unwrap();
let settle = common::drained(&eng, 1);
assert!(wait_until(Duration::from_secs(2), || settle.len() == 1));
eng.stop();
assert_eq!(bare.len(), 1);
assert_eq!(
composed.len(),
0,
"发的是字面键 eContract.CFFEX.IF2506,字典前缀订阅(eContract.)精确匹配收不到 —— 原作同样只发裸键"
);
}
#[test]
fn f9_elog_single_shape() {
let eng = ek_event::EventEngine::new();
let logs = Capture::<LogData>::new();
logs.register_on(&eng, EVENT_LOG);
eng.start();
let conn = LogData::info("xt", "连接成功");
assert_eq!(conn.gateway_name, "xt");
assert!(!conn.is_warning_or_above());
let burst = LogData {
gateway_name: "xt".into(),
msg: "重连退避(3)".into(),
level: LEVEL_WARNING,
};
let fatal = LogData {
gateway_name: "xt".into(),
msg: "交易前置不可达".into(),
level: LEVEL_ERROR,
};
assert!(burst.is_warning_or_above());
assert!(fatal.is_warning_or_above());
assert_eq!(LEVEL_INFO, 20);
assert_eq!(LEVEL_WARNING, 30);
assert_eq!(LEVEL_ERROR, 40);
eng.put(Event::with_data(EVENT_LOG, Arc::new(conn)))
.unwrap();
eng.put(Event::with_data(EVENT_LOG, Arc::new(burst)))
.unwrap();
eng.put(Event::with_data(EVENT_LOG, Arc::new(fatal)))
.unwrap();
assert!(wait_until(Duration::from_secs(2), || logs.len() == 3));
eng.stop();
let all = logs.all();
assert!(all.iter().all(|l| l.gateway_name == "xt"));
assert!(all[1].is_warning_or_above());
assert_eq!(all[2].level, LEVEL_ERROR);
}