Spaces:
Running
Running
| """Unit tests for the Retro Alpha engine.""" | |
| import pytest | |
| import engine | |
| def test_new_game(): | |
| state = engine.new_game() | |
| assert state.cash_balance == 1_000_000 | |
| assert state.total_value() == 1_000_000 | |
| assert state.year == engine.STARTING_YEAR | |
| assert state.month == engine.STARTING_MONTH | |
| assert state.months_elapsed == 0 | |
| assert all(state.portfolio[a] == 0.0 for a in engine.ASSETS) | |
| assert state.game_over is False | |
| def test_trade_buy(): | |
| state = engine.new_game() | |
| engine.execute_player_trade(state, "nifty_50", "buy", 0.5) | |
| assert state.cash_balance < 1_000_000 | |
| assert state.portfolio["nifty_50"] > 0 | |
| assert len(state.ledger) == 1 | |
| def test_trade_sell(): | |
| state = engine.new_game() | |
| engine.execute_player_trade(state, "nifty_50", "buy", 0.5) | |
| engine.execute_player_trade(state, "nifty_50", "sell", 0.5) | |
| assert state.cash_balance > 0 | |
| def test_trade_invalid_asset(): | |
| state = engine.new_game() | |
| with pytest.raises(ValueError): | |
| engine.execute_player_trade(state, "banana", "buy", 0.1) | |
| def test_advance_month(): | |
| state = engine.new_game() | |
| news = {"headline": "Test", "impact": {a: 0.0 for a in engine.ASSETS}, "duration_months": 1} | |
| engine.advance_month(state, news, []) | |
| assert state.months_elapsed == 1 | |
| assert state.month == engine.STARTING_MONTH + 1 | |
| assert state.year == engine.STARTING_YEAR | |
| def test_advance_year_rollover(): | |
| state = engine.new_game() | |
| state.month = 12 | |
| news = {"headline": "Test", "impact": {a: 0.0 for a in engine.ASSETS}, "duration_months": 1} | |
| engine.advance_month(state, news, []) | |
| assert state.month == 1 | |
| assert state.year == engine.STARTING_YEAR + 1 | |
| def test_game_over_at_120_months(): | |
| state = engine.new_game() | |
| state.months_elapsed = 119 | |
| news = {"headline": "Test", "impact": {a: 0.0 for a in engine.ASSETS}, "duration_months": 1} | |
| engine.advance_month(state, news, []) | |
| assert state.months_elapsed == 120 | |
| assert state.game_over is True | |
| def test_cash_price_stable(): | |
| state = engine.new_game() | |
| for _ in range(20): | |
| state.months_elapsed += 1 | |
| engine.random_walk(state) | |
| assert abs(state.prices["cash"] - 1.0) < 1e-9 | |
| def test_winning_threshold(): | |
| state = engine.new_game() | |
| state.cash_balance = 3_000_000 | |
| state.months_elapsed = 119 | |
| news = {"headline": "Test", "impact": {a: 0.0 for a in engine.ASSETS}, "duration_months": 1} | |
| engine.advance_month(state, news, []) | |
| assert state.won is True | |