"""Symbol resolver self-check (pure lookup, no auto logic). Run: python tests/test_symbol_resolver.py """ import os import sys HERE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, os.path.normpath(os.path.join(HERE, "..", "scripts"))) from symbol_resolver import resolve_symbol def _bt(aliases=None): return {"symbol_aliases": aliases or {}} def expect(label, got, want): ok = got == want print(f" {'PASS' if ok else 'FAIL'} {label}: got={got!r} want={want!r}") if not ok: raise AssertionError(label) def main(): print("[1] has alias -> use alias") expect("XAUUSD -> XAUUSDc", resolve_symbol("XAUUSD", _bt({"XAUUSD": "XAUUSDc"})), "XAUUSDc") print("[2] has alias for another symbol -> that one passes through") expect("EURUSD no alias", resolve_symbol("EURUSD", _bt({"XAUUSD": "XAUUSDc"})), "EURUSD") print("[3] no aliases config -> bare (back-compat)") expect("no config", resolve_symbol("XAUUSD", _bt()), "XAUUSD") print("[4] alias value can be any string (suffix, full name, even identical)") expect("alias = c suffix", resolve_symbol("XAUUSD", _bt({"XAUUSD": "c"})), "c") print("[5] empty symbol -> empty") expect("empty", resolve_symbol("", _bt({"": "XAUUSDc"})), "") print("[6] aliases value None -> bare") expect("None value", resolve_symbol("XAUUSD", _bt({"XAUUSD": None})), "XAUUSD") print("[7] symbol_aliases missing key entirely -> bare") expect("missing key", resolve_symbol("XAUUSD", {"date_range": {"from": "2020.01.01", "to": "2024.01.01"}}), "XAUUSD") print("[8] long date span does NOT auto-switch (explicit override only)") expect("long span no alias", resolve_symbol("XAUUSD", {"date_range": {"from": "2010.01.01", "to": "2024.01.01"}}), "XAUUSD") print("[9] explicit alias always wins regardless of date/optimization context") ctx = {"date_range": {"from": "2010.01.01", "to": "2024.01.01"}, "optimization": 1, "symbol_aliases": {"XAUUSD": "XAUUSDm"}} expect("explicit + opt", resolve_symbol("XAUUSD", ctx), "XAUUSDm") print("\nAll symbol resolver checks passed.") if __name__ == "__main__": main()