| #[cfg(test)] |
| mod tests { |
| use crate::compiler::lexer::Lexer; |
| use crate::compiler::lexer::Token; |
| use crate::engine::backtester::{Backtester, BacktestConfig, OrderType}; |
|
|
| #[test] |
| fn test_mql5_lexer() { |
| let code = r#" |
| double input lotSize = 0.1; |
| void OnTick() { |
| OrderSend("EURUSD", OP_BUY, lotSize, Ask, 10, 0, 0); |
| } |
| "#; |
| |
| |
| let result = Lexer::tokenize(code); |
| assert!(result.is_ok()); |
| |
| let (_, tokens) = result.unwrap(); |
| assert!(!tokens.is_empty()); |
| assert!(tokens.contains(&Token::Double)); |
| assert!(tokens.contains(&Token::Input)); |
| assert!(tokens.contains(&Token::Identifier("lotSize".to_string()))); |
| } |
| |
| #[test] |
| fn test_backtest_engine_equity() { |
| let config = BacktestConfig { |
| initial_deposit: 10000.0, |
| leverage: 100.0, |
| spread_modifier: 0, |
| }; |
| |
| let mut bt = Backtester::new(config); |
| |
| |
| bt.update_tick("EURUSD", 1.00000, 1.00010); |
| |
| let ticket = bt.market_order("EURUSD", OrderType::Buy, 1.0, None, None, "10:00".to_string()).unwrap(); |
| |
| |
| bt.update_tick("EURUSD", 1.00100, 1.00110); |
| |
| |
| |
| assert!(bt.equity > 10080.0 && bt.equity < 10100.0); |
| |
| |
| bt.close_position(ticket, "10:05".to_string()).unwrap(); |
| assert!(bt.balance > 10080.0 && bt.balance < 10100.0); |
| assert_eq!(bt.open_positions.len(), 0); |
| assert_eq!(bt.history.len(), 1); |
| } |
| } |
|
|