"""End-to-end: INIGenerator picks the right MT5 Symbol from explicit alias map. Run: python tests/test_ini_generator.py """ import os import sys import tempfile HERE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, os.path.normpath(os.path.join(HERE, "..", "scripts"))) from ini_generator import INIGenerator def _make_cfg(aliases, symbols, out_dir): return { "mt5_settings": {"terminal_path": "", "data_dir": "", "reports_dir": "{PROJECT_ROOT}/reports", "ini_dir": out_dir}, "backtest_settings": { "currency": "USD", "date_range": {"from": "2010.01.01", "to": "2024.12.31"}, "deposit": 10000, "execution_delay": 0, "forward_date": "", "forward_mode": 0, "leverage": "1:100", "model": 0, "optimization": 0, "replace_report": True, "shutdown_terminal": True, "symbols": symbols, "timeframes": ["H1"], "visual": 0, "symbol_aliases": aliases, }, "eas": [{"name": "DummyEA", "filename": "MQL5/Experts/DummyEA.ex5", "parameters": {}}], } def _grep_symbol(ini_path, target): with open(ini_path, "r", encoding="utf-8") as f: for line in f: if line.startswith("Symbol="): return line.strip().split("=", 1)[1] == target return False def _get_ini_value(ini_path, key): with open(ini_path, "r", encoding="utf-8") as f: for line in f: if line.startswith(f"{key}="): return line.strip().split("=", 1)[1] return None def expect(label, ok): print(f" {'PASS' if ok else 'FAIL'} {label}") if not ok: raise AssertionError(label) def main(): with tempfile.TemporaryDirectory() as tmp: cfg = _make_cfg({"XAUUSD": "XAUUSDc"}, ["XAUUSD", "EURUSD"], tmp) files = INIGenerator(cfg).generate_ini_files() expect("2 files", len(files) == 2) expect("XAUUSD alias applied", any(_grep_symbol(f, "XAUUSDc") for f in files)) expect("EURUSD passes through", any(_grep_symbol(f, "EURUSD") for f in files)) with tempfile.TemporaryDirectory() as tmp: cfg = _make_cfg({}, ["XAUUSD"], tmp) files = INIGenerator(cfg).generate_ini_files() expect("no alias -> bare", any(_grep_symbol(f, "XAUUSD") for f in files)) with tempfile.TemporaryDirectory() as tmp: cfg = _make_cfg({"XAUUSD": "XAUUSDm"}, ["XAUUSD"], tmp) files = INIGenerator(cfg).generate_ini_files() expect("explicit override wins", any(_grep_symbol(f, "XAUUSDm") for f in files)) with tempfile.TemporaryDirectory() as tmp: cfg = _make_cfg({}, ["XAUUSD"], tmp) cfg["backtest_settings"]["execution_delay"] = 0 files = INIGenerator(cfg).generate_ini_files() expect("delay=0 -> ExecutionMode=0", _get_ini_value(files[0], "ExecutionMode") == "0") expect("delay=0 -> no ExecutionDelay line", _get_ini_value(files[0], "ExecutionDelay") is None) with tempfile.TemporaryDirectory() as tmp: cfg = _make_cfg({}, ["XAUUSD"], tmp) cfg["backtest_settings"]["execution_delay"] = -1 files = INIGenerator(cfg).generate_ini_files() expect("delay=-1 -> ExecutionMode=-1", _get_ini_value(files[0], "ExecutionMode") == "-1") with tempfile.TemporaryDirectory() as tmp: cfg = _make_cfg({}, ["XAUUSD"], tmp) cfg["backtest_settings"]["execution_delay"] = 250 files = INIGenerator(cfg).generate_ini_files() expect("delay=250 -> ExecutionMode=250", _get_ini_value(files[0], "ExecutionMode") == "250") print("\nAll INI generator alias checks passed.") if __name__ == "__main__": main()