"""PaperAccount/Order/Trade/Reject 数据类测试。""" from sanguo_trader.models import ( AccountConfig, PaperOrder, PaperTrade, PaperReject, MatchSession, OrderSide, ) def test_account_config_defaults(): cfg = AccountConfig(initial_capital=1_000_000) assert cfg.initial_capital == 1_000_000 assert cfg.rate == 0.0003 assert cfg.min_commission == 5.0 assert cfg.stamp_duty_rate == 0.0005 assert cfg.transfer_fee_rate == 0.00001 assert cfg.slippage == 0 assert cfg.pricetick == 0.01 def test_account_config_is_frozen(): import dataclasses cfg = AccountConfig(initial_capital=1_000_000) assert dataclasses.is_dataclass(cfg) # frozen=True → 不可变 try: cfg.rate = 0.001 # type: ignore[misc] except dataclasses.FrozenInstanceError: pass else: raise AssertionError("AccountConfig 应为 frozen dataclass") def test_paper_order_defaults_next_open(): o = PaperOrder( strategy_id="s1", symbol="600000", side=OrderSide.BUY, price=10.0, volume=100, is_market=True, ) assert o.match_session == MatchSession.NEXT_OPEN def test_paper_order_explicit_current_close(): o = PaperOrder( strategy_id="s1", symbol="600000", side=OrderSide.SELL, price=10.0, volume=100, is_market=False, match_session=MatchSession.CURRENT_CLOSE, ) assert o.match_session == MatchSession.CURRENT_CLOSE assert o.is_market is False def test_paper_trade_fields(): t = PaperTrade( strategy_id="s1", symbol="600000", side=OrderSide.BUY, price=10.0, volume=100, commission=5.0, stamp_duty=0.0, transfer_fee=0.01, bar_date="2024-01-02", match_session=MatchSession.NEXT_OPEN, ) assert t.volume == 100 assert t.commission == 5.0 assert t.bar_date == "2024-01-02" def test_paperReject_records_reason(): r = PaperReject( strategy_id="s1", symbol="600000", reason="limit_up_locked", bar_date="2024-01-02", ) assert r.reason == "limit_up_locked" assert r.symbol == "600000"