stock/tests/integration/test_work_trade_balance_integration.py
2026-02-27 03:17:12 +08:00

188 lines
6.2 KiB
Python

"""Integration tests for work/trade balance system.
Tests the decision-making between trading and learning based on economic status.
"""
import pytest
from datetime import datetime
from openclaw.core.work_trade_balance import (
WorkTradeBalance,
ActivityDecision,
WorkTradeConfig,
)
from openclaw.core.economy import TradingEconomicTracker, SurvivalStatus
class TestWorkTradeBalanceIntegration:
"""Integration tests for work/trade balance."""
def test_work_trade_balance_initialization(self):
"""Test work/trade balance can be initialized."""
tracker = TradingEconomicTracker(agent_id="test_trader")
balance = WorkTradeBalance(
agent_id="test_trader",
economic_tracker=tracker,
)
assert balance.agent_id == "test_trader"
assert balance.economic_tracker == tracker
def test_thriving_status_decision(self):
"""Test decision when agent is thriving."""
tracker = TradingEconomicTracker(agent_id="test_trader")
# Make agent thriving (balance > 1.5x initial)
tracker.record_income(2000.0, "test")
balance = WorkTradeBalance(
agent_id="test_trader",
economic_tracker=tracker,
)
decision = balance.decide_activity()
# Thriving: should allow both trade and learn
assert decision.decision in [
ActivityDecision.TRADE,
ActivityDecision.LEARN,
]
def test_critical_status_decision(self):
"""Test decision when agent is critical."""
tracker = TradingEconomicTracker(agent_id="test_trader", initial_capital=1000.0)
# Critical status - very low balance (below 30% of initial)
tracker.current_balance = 250.0 # 25% of initial = critical
balance = WorkTradeBalance(
agent_id="test_trader",
economic_tracker=tracker,
)
decision = balance.decide_activity()
# Critical: should only allow minimal trade
assert decision.decision in [
ActivityDecision.MINIMAL_TRADE,
ActivityDecision.PAPER_TRADE,
]
def test_struggling_status_limits_trading(self):
"""Test that struggling status limits trading."""
tracker = TradingEconomicTracker(agent_id="test_trader", initial_capital=1000.0)
# Low balance but not critical (between 30% and 80% of initial)
tracker.current_balance = 500.0 # 50% of initial = struggling
balance = WorkTradeBalance(
agent_id="test_trader",
economic_tracker=tracker,
)
decision = balance.decide_activity()
intensity = balance.get_trade_intensity()
# Should have reduced position size (conservative or minimal)
assert intensity.position_size_multiplier <= 0.6
def test_skill_level_affects_learning_priority(self):
"""Test that low skill increases learning priority."""
tracker = TradingEconomicTracker(agent_id="test_trader")
tracker.record_income(1500.0, "test") # Good balance
balance = WorkTradeBalance(
agent_id="test_trader",
economic_tracker=tracker,
skill_level=0.2, # Low skill
)
decision = balance.decide_activity()
# Low skill should increase learning probability
assert decision is not None
def test_win_rate_affects_trade_intensity(self):
"""Test that win rate affects trade intensity."""
tracker = TradingEconomicTracker(agent_id="test_trader")
tracker.record_income(1500.0, "test")
# High win rate
balance_high = WorkTradeBalance(
agent_id="test_trader",
economic_tracker=tracker,
win_rate=0.8,
)
# Low win rate
balance_low = WorkTradeBalance(
agent_id="test_trader",
economic_tracker=tracker,
win_rate=0.3,
)
intensity_high = balance_high.get_trade_intensity()
intensity_low = balance_low.get_trade_intensity()
# Higher win rate should allow more positions
assert intensity_high.max_concurrent_positions >= intensity_low.max_concurrent_positions
class TestEconomicStatusTransitions:
"""Tests for economic status transitions affecting decisions."""
def test_bankrupt_status_blocks_all_trading(self):
"""Test that bankrupt status blocks all trading."""
tracker = TradingEconomicTracker(agent_id="test_trader")
balance = WorkTradeBalance(
agent_id="test_trader",
economic_tracker=tracker,
)
# Simulate bankrupt status
tracker.current_balance = -100.0
decision = balance.decide_activity()
# Bankrupt: no trading allowed
assert decision.decision != ActivityDecision.TRADE
def test_trade_intensity_by_status(self):
"""Test trade intensity varies by economic status."""
tracker = TradingEconomicTracker(agent_id="test_trader")
balance = WorkTradeBalance(
agent_id="test_trader",
economic_tracker=tracker,
)
# Test different balance levels
test_cases = [
(2000.0, "thriving"), # > 150%
(1000.0, "stable"), # 100%
(400.0, "struggling"), # 40%
]
for test_balance, expected_status in test_cases:
tracker.current_balance = test_balance
intensity = balance.get_trade_intensity()
assert intensity is not None
assert intensity.position_size_multiplier > 0
class TestWorkTradeConfig:
"""Tests for work/trade configuration."""
def test_default_config(self):
"""Test default configuration."""
config = WorkTradeConfig()
assert config.thriving_weights is not None
assert config.stable_weights is not None
assert config.struggling_weights is not None
def test_custom_config(self):
"""Test custom configuration."""
config = WorkTradeConfig(
thriving_weights={"trade": 0.8, "learn": 0.2},
stable_weights={"trade": 0.9, "learn": 0.1},
)
assert config.thriving_weights["trade"] == 0.8
assert config.thriving_weights["learn"] == 0.2