- cardinal-plugin/ → plugins/ (matches Cardinal's plugin dir convention) - index.html + game-state.json → site/ - OUTPUT_CATALOG.md → docs/ - Core Python files and tests stay flat (no import changes needed)
109 lines
3.2 KiB
Python
109 lines
3.2 KiB
Python
"""Quick smoke test for the monop Cardinal plugin without running Cardinal."""
|
|
import sys
|
|
import os
|
|
import json
|
|
import tempfile
|
|
|
|
# Mock cardinal module before importing plugin
|
|
import types
|
|
cardinal_mod = types.ModuleType('cardinal')
|
|
cardinal_dec = types.ModuleType('cardinal.decorators')
|
|
def _passthrough(*args, **kwargs):
|
|
def wrap(f): return f
|
|
return wrap
|
|
cardinal_dec.command = _passthrough
|
|
cardinal_dec.event = _passthrough
|
|
cardinal_dec.help = _passthrough
|
|
cardinal_mod.decorators = cardinal_dec
|
|
sys.modules['cardinal'] = cardinal_mod
|
|
sys.modules['cardinal.decorators'] = cardinal_dec
|
|
|
|
sys.path.insert(0, os.path.dirname(__file__))
|
|
|
|
# Minimal mock of cardinal
|
|
class MockCardinal:
|
|
storage_path = tempfile.mkdtemp()
|
|
def get_db(self, name): pass
|
|
def sendMsg(self, channel, msg): print(f" [{channel}] {msg}")
|
|
|
|
class MockUser:
|
|
def __init__(self, nick):
|
|
self.nick = nick
|
|
|
|
# Import plugin
|
|
from monop import plugin as monop_plugin
|
|
|
|
# Instantiate
|
|
cardinal = MockCardinal()
|
|
config = {"bot_nick": "monop", "channels": ["#monop"]}
|
|
p = monop_plugin.MonopPlugin(cardinal, config)
|
|
|
|
# Simulate a game
|
|
messages = [
|
|
("monop", "How many players?"),
|
|
("alice", ".3"),
|
|
("monop", "Player 1, say ''me'' please."),
|
|
("alice", ".me"),
|
|
("monop", "Player 2, say ''me'' please."),
|
|
("bob", ".me"),
|
|
("monop", "Player 3, say ''me'' please."),
|
|
("charlie", ".me"),
|
|
("monop", "alice (1) rolls 8"),
|
|
("monop", "bob (2) rolls 5"),
|
|
("monop", "charlie (3) rolls 6"),
|
|
("monop", "alice (1) goes first"),
|
|
("monop", "alice (1) (cash $1500) on === GO ==="),
|
|
("monop", "-- Command: "),
|
|
("alice", "."),
|
|
("monop", "roll is 3, 4"),
|
|
("monop", "That puts you on Chance i"),
|
|
("monop", "bob (2) (cash $1500) on === GO ==="),
|
|
("monop", "-- Command: "),
|
|
("bob", "."),
|
|
("monop", "roll is 2, 4"),
|
|
("monop", "That puts you on Oriental ave. (L)"),
|
|
("monop", "That would cost $100"),
|
|
("monop", "Do you want to buy?"),
|
|
("bob", ".y"),
|
|
("monop", "charlie (3) (cash $1500) on === GO ==="),
|
|
("monop", "-- Command: "),
|
|
]
|
|
|
|
print("=== Feeding messages ===")
|
|
for sender, msg in messages:
|
|
user = MockUser(sender)
|
|
p.on_msg(cardinal, user, "#monop", msg)
|
|
|
|
# Check state
|
|
print("\n=== State ===")
|
|
state = p.parser.get_state()
|
|
if state:
|
|
print(f"Players: {len(state['players'])}")
|
|
for pl in state['players']:
|
|
print(f" {pl['name']} (${pl['money']}) at sq {pl['location']}")
|
|
|
|
# Check bob owns Oriental
|
|
for sq in state['squares']:
|
|
if sq.get('owner'):
|
|
print(f" Owned: {sq['name']} by player {sq['owner']}")
|
|
|
|
print(f"\n=== .monop status ===")
|
|
p.monop_cmd(cardinal, MockUser("test"), "#monop", ".monop")
|
|
|
|
print(f"\n=== .monop players ===")
|
|
p.monop_cmd(cardinal, MockUser("test"), "#monop", ".monop players")
|
|
|
|
print(f"\n=== .monop owned ===")
|
|
p.monop_cmd(cardinal, MockUser("test"), "#monop", ".monop owned")
|
|
else:
|
|
print("No state!")
|
|
|
|
# Check file was written
|
|
if os.path.exists(p.state_path):
|
|
with open(p.state_path) as f:
|
|
saved = json.load(f)
|
|
print(f"\n=== State file written: {p.state_path} ===")
|
|
print(f"Players: {len(saved['players'])}, Squares: {len(saved['squares'])}")
|
|
print("PASS")
|
|
else:
|
|
print("FAIL: state file not written")
|