Release beta 2.0.4.1023

This commit is contained in:
JWeBot Contributors
2026-10-23 17:18:29 +08:00
parent 22f5240fa7
commit 6375ab5c79
32 changed files with 2286 additions and 233 deletions
+14 -13
View File
@@ -40,6 +40,7 @@ class Release061Tests(unittest.TestCase):
def test_aliases_are_corresponding_and_case_insensitive(self):
pairs = [("上下文", "Context"), ("摩拉", "wallet"), ("抽奖", "draw"),
("许愿池", "draw"), ("许愿", "draw"),
("买彩票", "lottery"), ("21点", "blackjack"),
("人物列表", "people"), ("人物", "person"), ("游戏帮助", "games")]
for chinese, english in pairs:
@@ -84,46 +85,46 @@ class Release061Tests(unittest.TestCase):
def test_initial_funds_aliases_groups_and_replay(self):
self.assertIn("摩拉 1000", self.command("/wallet", event_id="wallet-1"))
with mock.patch.object(self.local.players.rng, "randrange", return_value=99):
first = self.command("/draw 10", event_id="draw-1")
replay = self.command("/draw 10", sender="a1", event_id="draw-1")
first = self.command("/draw 1000", event_id="draw-1")
replay = self.command("/draw 1000", sender="a1", event_id="draw-1")
self.assertEqual(first, replay)
self.assertEqual(self.state("a1")["balance"], 990)
self.assertIn("许愿池", first)
self.assertEqual(self.state("a1")["balance"], 0)
self.assertIn("摩拉 1000", self.command("/wallet", sender="Bob"))
self.assertIn("摩拉 1000", self.command("/wallet", group="group-b"))
self.engine.ledger.connection.close()
self.engine = MODULE.EdgeApplication(config(self.root))
self.local = self.engine.local
self.assertIn("摩拉 990", self.command("/wallet", event_id="restart"))
self.assertIn("摩拉 0", self.command("/wallet", event_id="restart"))
def test_concurrent_replay_debits_once_and_rolls_back_failure(self):
replies = []
with mock.patch.object(self.local.players.rng, "randrange", return_value=99):
threads = [threading.Thread(target=lambda: replies.append(
self.command("/draw 100", event_id="concurrent"))) for _ in range(8)]
self.command("/draw 1000", event_id="concurrent"))) for _ in range(8)]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
self.assertEqual(len(replies), 8)
self.assertEqual(len(set(replies)), 1)
self.assertEqual(self.state()["balance"], 900)
self.assertEqual(self.state()["balance"], 0)
def broken(state):
state["balance"] = -1
return "bad"
with self.assertRaises(MODULE.LocalCommandError):
self.engine.ledger.apply_player_action("group-a", "Alice", "broken", "test", broken)
self.assertEqual(self.state()["balance"], 900)
self.assertEqual(self.state()["balance"], 0)
with self.assertRaises(MODULE.LocalCommandError):
self.command("/draw 100", sender="Bob", event_id="concurrent")
self.command("/draw 1000", sender="Bob", event_id="concurrent")
def test_invalid_bets_insufficient_funds_and_lottery(self):
for question in ("/draw -1", "/draw 0", "/draw 101", "/lottery xyz",
"/blackjack start -1", "/blackjack hit 10"):
self.assertRegex(self.command(question), "用法|下注")
self.assertRegex(self.command(question), "用法|投入|下注")
with mock.patch.object(self.local.players.rng, "randrange", return_value=99):
for _ in range(10):
self.command("/draw 100")
self.assertIn("摩拉不足", self.command("/draw 2"))
self.command("/draw 1000")
self.assertIn("摩拉不足", self.command("/draw 1000"))
self.assertEqual(self.state()["balance"], 0)
def test_blackjack_is_private_persistent_and_settles_exactly_once(self):
@@ -136,7 +137,7 @@ class Release061Tests(unittest.TestCase):
self.assertIn("暗牌", start)
self.assertEqual(self.state()["balance"], 950)
self.assertIn("没有进行中", self.command("/blackjack status", sender="Bob"))
self.assertIn("已有一局", self.command("/draw"))
self.assertIn("已有一局", self.command("/draw 1000"))
self.engine.ledger.connection.close()
self.engine = MODULE.EdgeApplication(config(self.root))
self.local = self.engine.local