import asyncio from ethicsguard.env import EthicsGuardEnv from ethicsguard.models import EthicsGuardAction def test_env_reset_returns_queue() -> None: result = asyncio.run(EthicsGuardEnv(difficulty="easy", seed=1000).reset()) assert result.done is False assert len(result.observation.remaining_queue) > 0 def test_skip_removes_item_and_keeps_it_unresolved() -> None: env = EthicsGuardEnv(difficulty="easy", seed=1000) initial = asyncio.run(env.reset()) item_id = initial.observation.remaining_queue[0].id after = asyncio.run(env.step(EthicsGuardAction(item_id=item_id, action_type="skip"))) assert all(item.id != item_id for item in after.observation.remaining_queue) state = asyncio.run(env.state()) assert item_id in state.unresolved_item_ids def test_unknown_item_returns_error_without_ending_episode() -> None: env = EthicsGuardEnv(difficulty="easy", seed=1000) asyncio.run(env.reset()) result = asyncio.run(env.step(EthicsGuardAction(item_id="missing", action_type="approve"))) assert result.done is False assert result.last_action_error is not None def test_terminal_score_is_in_open_interval() -> None: env = EthicsGuardEnv(difficulty="easy", seed=1000) result = asyncio.run(env.reset()) while not result.done: item_id = result.observation.remaining_queue[0].id result = asyncio.run(env.step(EthicsGuardAction(item_id=item_id, action_type="approve"))) assert result.score is not None assert 0.0 < result.score < 1.0