Add Unit Tests (#4)
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import os
|
||||
import asyncio
|
||||
import pytest
|
||||
from unittest.mock import AsyncMock, patch, MagicMock
|
||||
from agentscope.agent import ReActAgent
|
||||
from agentscope.model import ChatModelBase
|
||||
from agentscope.formatter import FormatterBase
|
||||
|
||||
# Import modules to test
|
||||
from games.game_werewolves import game, utils, structured_model
|
||||
|
||||
|
||||
class HunterModelMock:
|
||||
def __init__(self, **kwargs):
|
||||
self._data = {
|
||||
"name": kwargs.get("name", None),
|
||||
"shoot": kwargs.get("shoot", False),
|
||||
}
|
||||
self.metadata = {"shoot": self._data["name"] is not None}
|
||||
|
||||
def model_dump(self):
|
||||
return self._data
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
return self._data["name"]
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_werewolves_discussion() -> None:
|
||||
mock_hub = AsyncMock()
|
||||
mock_hub.__aenter__.return_value = mock_hub
|
||||
mock_hub.__aexit__.return_value = AsyncMock()
|
||||
|
||||
with patch("games.game_werewolves.game.MsgHub", return_value=mock_hub):
|
||||
mock_agent = AsyncMock()
|
||||
mock_agent.name = "Player1"
|
||||
|
||||
agents = [mock_agent for _ in range(9)]
|
||||
await game.werewolves_game(agents)
|
||||
assert True
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_witch_resurrect() -> None:
|
||||
async def mock_model(**kwargs):
|
||||
return {"resurrect": kwargs.get("resurrect", False)}
|
||||
|
||||
with patch("games.game_werewolves.game.WitchResurrectModel", side_effect=mock_model):
|
||||
result = await game.WitchResurrectModel(**{"resurrect": True})
|
||||
assert result["resurrect"] == True
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Test: utils.py
|
||||
# -----------------------------
|
||||
def test_majority_vote() -> None:
|
||||
votes = ["Player1", "Player1", "Player2"]
|
||||
result, _ = utils.majority_vote(votes)
|
||||
assert result == "Player1"
|
||||
|
||||
|
||||
def test_names_to_str_single() -> None:
|
||||
assert utils.names_to_str(["Player1"]) == "Player1"
|
||||
|
||||
|
||||
def test_players_role_mapping() -> None:
|
||||
players = utils.Players()
|
||||
mock_agent = utils.EchoAgent()
|
||||
mock_agent.name = "Player1"
|
||||
|
||||
players.add_player(mock_agent, "werewolf")
|
||||
assert players.name_to_role["Player1"] == "werewolf"
|
||||
assert len(players.werewolves) == 1
|
||||
|
||||
|
||||
def test_vote_model_generation() -> None:
|
||||
mock_model = MagicMock(spec=ChatModelBase)
|
||||
mock_formatter = MagicMock(spec=FormatterBase)
|
||||
|
||||
agents = [
|
||||
ReActAgent(
|
||||
name=f"Player{i}",
|
||||
sys_prompt=f"Vote system prompt {i}",
|
||||
model=mock_model,
|
||||
formatter=mock_formatter
|
||||
) for i in range(3)
|
||||
]
|
||||
|
||||
VoteModel = structured_model.get_vote_model(agents)
|
||||
assert "vote" in VoteModel.model_fields
|
||||
assert (
|
||||
VoteModel.model_fields["vote"].description
|
||||
== "The name of the player you want to vote for"
|
||||
)
|
||||
|
||||
|
||||
def test_witch_poison_model_fields() -> None:
|
||||
mock_model = MagicMock(spec=ChatModelBase)
|
||||
mock_formatter = MagicMock(spec=FormatterBase)
|
||||
|
||||
agents = [
|
||||
ReActAgent(
|
||||
name="Player1",
|
||||
sys_prompt="Poison system prompt",
|
||||
model=mock_model,
|
||||
formatter=mock_formatter
|
||||
)
|
||||
]
|
||||
|
||||
PoisonModel = structured_model.get_poison_model(agents)
|
||||
assert "poison" in PoisonModel.model_fields
|
||||
assert "name" in PoisonModel.model_fields
|
||||
Reference in New Issue
Block a user