mirror of
https://github.com/Shu-Ying/main_plugin_farm.git
synced 2026-11-02 18:50:08 +08:00
add # 新增经验获取方式
This commit is contained in:
+29
-2
@@ -118,14 +118,41 @@ class PestTests(unittest.IsolatedAsyncioTestCase):
|
||||
await self.service.clear_pests(self.who, "failed-clear")
|
||||
self.assertEqual(await self.store.snapshot(self.who), before)
|
||||
|
||||
async def test_empty_clear_and_ripe_clear_reward_no_assets(self):
|
||||
async def test_empty_clear_has_no_reward_and_clear_awards_per_pest(self):
|
||||
with self.assertRaisesRegex(FarmError, "nothing_to_clear"):
|
||||
await self.service.clear_pests(self.who, "empty-clear")
|
||||
self.now = 4600
|
||||
before = await self.service.snapshot(self.who)
|
||||
await self.service.clear_pests(self.who, "clear")
|
||||
after = await self.service.snapshot(self.who)
|
||||
self.assertEqual(before.account, after.account)
|
||||
self.assertEqual(after.account.experience, before.account.experience+1)
|
||||
self.assertEqual(after.account.point, before.account.point)
|
||||
self.assertEqual(after.account.vip_point, before.account.vip_point)
|
||||
|
||||
async def test_multi_plot_pest_rewards_replay_and_transaction_rollback(self):
|
||||
await self.service.buy(self.who, '虫害测试菜', 1, 'buy-second')
|
||||
await self.service.sow(self.who, '虫害测试菜', 1, 'sow-second')
|
||||
self.now = 11800
|
||||
before = await self.store.snapshot(self.who)
|
||||
ledger = await self.store.ledger(self.who)
|
||||
with patch.object(SQLiteRepository, 'asset',
|
||||
side_effect=RuntimeError('reward failure')):
|
||||
with self.assertRaises(RuntimeError):
|
||||
await self.service.clear_pests(self.who, 'clear-six')
|
||||
self.assertEqual(await self.store.snapshot(self.who), before)
|
||||
self.assertEqual(await self.store.ledger(self.who), ledger)
|
||||
receipts = await asyncio.gather(*(
|
||||
self.service.clear_pests(self.who, 'clear-six') for _ in range(3)
|
||||
))
|
||||
self.assertTrue(all(r == receipts[0] for r in receipts))
|
||||
self.assertEqual(receipts[0].data['quantity'], 6)
|
||||
self.assertEqual(receipts[0].data['experience'], 6)
|
||||
after = await self.service.snapshot(self.who)
|
||||
self.assertEqual(after.account.experience, before.account.experience+6)
|
||||
with self.assertRaisesRegex(FarmError, 'nothing_to_clear'):
|
||||
await self.service.clear_pests(self.who, 'empty-after')
|
||||
self.assertEqual((await self.service.snapshot(self.who)).account,
|
||||
after.account)
|
||||
|
||||
async def test_projection_is_independent_of_query_frequency(self):
|
||||
initial = (await self.store.snapshot(self.who)).plots[0]
|
||||
|
||||
@@ -137,8 +137,8 @@ class RenderTests(unittest.TestCase):
|
||||
def test_web_panel_fields_fit_their_prefab_rectangles(self):
|
||||
options = RenderOptions(width=3072)
|
||||
for exp, level, current, threshold in (
|
||||
(0, 0, 0, 200), (199, 0, 199, 200), (200, 1, 0, 600),
|
||||
(599, 1, 399, 600), (600, 2, 0, 1200), (3420, 5, 420, 4200),
|
||||
(0, 0, 0, 200), (199, 0, 199, 200), (200, 1, 0, 400),
|
||||
(599, 1, 399, 400), (600, 2, 0, 600), (3420, 5, 420, 1200),
|
||||
):
|
||||
data = snapshot(name="农场", point=12580, vip_point=36,
|
||||
experience=exp)
|
||||
@@ -173,7 +173,10 @@ class RenderTests(unittest.TestCase):
|
||||
original = self.renderer.assets.image(
|
||||
'webgl/panel/ExpProgress.png', (172, 18),
|
||||
)
|
||||
for exp in (0, 100, 199):
|
||||
for exp, current, required in (
|
||||
(0, 0, 200), (100, 100, 200), (199, 199, 200),
|
||||
(599, 399, 400), (1199, 599, 600),
|
||||
):
|
||||
scene = self.renderer.scene(
|
||||
self.who, snapshot(experience=exp), 0,
|
||||
)
|
||||
@@ -185,7 +188,7 @@ class RenderTests(unittest.TestCase):
|
||||
self.assertEqual(len(calls), 6)
|
||||
else:
|
||||
self.assertEqual(len(calls), 7)
|
||||
filled = exp * 172 // 200
|
||||
filled = current * 172 // required
|
||||
self.assertEqual(calls[4].args[0].tobytes(),
|
||||
original.crop((0, 0, filled, 18)).tobytes())
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ class TransactionTests(unittest.IsolatedAsyncioTestCase):
|
||||
sale = await self.service.sell(self.identity, None, None, "sell")
|
||||
self.assertEqual(sale.data["proceeds"], 20)
|
||||
self.assertEqual(sale.data["account"]["point"], 510)
|
||||
self.assertEqual(sale.data["account"]["experience"], 20)
|
||||
self.assertEqual(sale.data["account"]["experience"], 22)
|
||||
snapshot = await self.service.snapshot(self.identity)
|
||||
self.assertEqual(snapshot.inventory[0].seeds, 0)
|
||||
self.assertEqual(snapshot.inventory[0].crops, 0)
|
||||
@@ -106,7 +106,7 @@ class TransactionTests(unittest.IsolatedAsyncioTestCase):
|
||||
await self.mature_radish()
|
||||
self.assertEqual(
|
||||
(await self.service.snapshot(self.identity)).account.experience,
|
||||
120,
|
||||
122,
|
||||
)
|
||||
await self.seed("balance-100", lambda repo: (
|
||||
repo.asset(Asset.POINT, -390) or {}
|
||||
@@ -185,7 +185,7 @@ class TransactionTests(unittest.IsolatedAsyncioTestCase):
|
||||
snapshot = await self.service.snapshot(self.identity)
|
||||
self.assertTrue(snapshot.plots[0].withered)
|
||||
self.assertEqual(snapshot.inventory[0].crops, 6)
|
||||
self.assertEqual(snapshot.account.experience, 60)
|
||||
self.assertEqual(snapshot.account.experience, 62)
|
||||
with self.assertRaisesRegex(FarmError, "nothing_to_harvest"):
|
||||
await self.service.harvest(self.identity, "third")
|
||||
|
||||
@@ -338,7 +338,62 @@ class TransactionTests(unittest.IsolatedAsyncioTestCase):
|
||||
self.assertEqual(sum(not isinstance(r, Exception) for r in results), 1)
|
||||
snapshot = await self.service.snapshot(self.identity)
|
||||
self.assertEqual(snapshot.inventory[0].crops, 2)
|
||||
self.assertEqual(snapshot.account.experience, 20)
|
||||
self.assertEqual(snapshot.account.experience, 22)
|
||||
|
||||
async def test_sowing_awards_two_per_plot_and_replay_once(self):
|
||||
await self.service.buy(self.identity, '萝卜', 3, 'buy')
|
||||
first = await self.service.sow(self.identity, '萝卜', 2, 'sow-two')
|
||||
self.assertEqual(first.data['experience'], 4)
|
||||
self.assertEqual(first.data['account']['experience'], 4)
|
||||
self.assertIn('本次经验:+4', receipt_text(first))
|
||||
repeated = await asyncio.gather(*(
|
||||
self.service.sow(self.identity, '萝卜', 2, 'sow-two')
|
||||
for _ in range(4)
|
||||
))
|
||||
self.assertTrue(all(result == first for result in repeated))
|
||||
await self.service.sow(self.identity, '萝卜', None, 'sow-rest')
|
||||
self.assertEqual(
|
||||
(await self.service.snapshot(self.identity)).account.experience, 6,
|
||||
)
|
||||
|
||||
async def test_eradication_rewards_each_plot_once_and_rolls_back(self):
|
||||
await self.mature_radish(count=2)
|
||||
before = await self.service.snapshot(self.identity)
|
||||
ledger = await self.store.ledger(self.identity)
|
||||
with patch.object(SQLiteRepository, 'asset',
|
||||
side_effect=sqlite3.OperationalError('injected')):
|
||||
with self.assertRaises(StorageError):
|
||||
await self.service.eradicate(self.identity, 'clear')
|
||||
self.assertEqual(await self.service.snapshot(self.identity), before)
|
||||
self.assertEqual(await self.store.ledger(self.identity), ledger)
|
||||
receipts = await asyncio.gather(*(
|
||||
self.service.eradicate(self.identity, 'clear') for _ in range(3)
|
||||
))
|
||||
self.assertTrue(all(r == receipts[0] for r in receipts))
|
||||
self.assertEqual(receipts[0].data['experience'], 4)
|
||||
after = await self.service.snapshot(self.identity)
|
||||
self.assertEqual(after.account.experience, before.account.experience+4)
|
||||
self.assertTrue(all(p.plant is None for p in after.plots))
|
||||
with self.assertRaisesRegex(FarmError, 'nothing_to_eradicate'):
|
||||
await self.service.eradicate(self.identity, 'empty')
|
||||
self.assertEqual(await self.service.snapshot(self.identity), after)
|
||||
|
||||
async def test_failed_sowing_rolls_back_experience_seeds_and_plots(self):
|
||||
await self.service.buy(self.identity, '萝卜', 2, 'buy')
|
||||
before = await self.service.snapshot(self.identity)
|
||||
ledger = await self.store.ledger(self.identity)
|
||||
with self.assertRaisesRegex(FarmError, 'insufficient_stock'):
|
||||
await self.service.sow(self.identity, '萝卜', 3, 'too-many')
|
||||
with patch.object(SQLiteRepository, 'asset',
|
||||
side_effect=sqlite3.OperationalError('injected')):
|
||||
with self.assertRaises(StorageError):
|
||||
await self.service.sow(self.identity, '萝卜', 2, 'sow-fail')
|
||||
self.assertEqual(await self.service.snapshot(self.identity), before)
|
||||
self.assertEqual(await self.store.ledger(self.identity), ledger)
|
||||
receipt = await self.service.sow(
|
||||
self.identity, '萝卜', 2, 'sow-fail',
|
||||
)
|
||||
self.assertEqual(receipt.data['account']['experience'], 4)
|
||||
|
||||
async def test_restart_and_cancelled_request_can_replay_result(self):
|
||||
entered = threading.Event()
|
||||
|
||||
Reference in New Issue
Block a user