|
|
@@ -0,0 +1,198 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace Tests\Unit\GameItems;
|
|
|
+
|
|
|
+use App\Module\GameItems\Events\ItemQuantityChanged;
|
|
|
+use Illuminate\Support\Facades\Event;
|
|
|
+use Tests\TestCase;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 物品冻结事件逻辑测试
|
|
|
+ *
|
|
|
+ * 测试物品冻结功能的事件触发逻辑
|
|
|
+ */
|
|
|
+class ItemFreezeEventLogicTest extends TestCase
|
|
|
+{
|
|
|
+ /**
|
|
|
+ * 测试ItemQuantityChanged事件的冻结状态参数
|
|
|
+ */
|
|
|
+ public function test_item_quantity_changed_event_with_freeze_status()
|
|
|
+ {
|
|
|
+ // 创建包含冻结状态的事件
|
|
|
+ $event = new ItemQuantityChanged(
|
|
|
+ 1001, // userId
|
|
|
+ 2001, // itemId
|
|
|
+ null, // instanceId
|
|
|
+ 100, // oldQuantity
|
|
|
+ 70, // newQuantity
|
|
|
+ 5001, // userItemId
|
|
|
+ false, // oldFrozenStatus
|
|
|
+ false, // newFrozenStatus (数量减少,冻结状态不变)
|
|
|
+ [ // options
|
|
|
+ 'freeze_action' => 'freeze',
|
|
|
+ 'change_type' => 'quantity_decrease',
|
|
|
+ 'reason' => 'trade_order'
|
|
|
+ ]
|
|
|
+ );
|
|
|
+
|
|
|
+ // 验证事件属性
|
|
|
+ $this->assertEquals(1001, $event->userId);
|
|
|
+ $this->assertEquals(2001, $event->itemId);
|
|
|
+ $this->assertNull($event->instanceId);
|
|
|
+ $this->assertEquals(100, $event->oldQuantity);
|
|
|
+ $this->assertEquals(70, $event->newQuantity);
|
|
|
+ $this->assertEquals(-30, $event->changeAmount); // 自动计算
|
|
|
+ $this->assertEquals(5001, $event->userItemId);
|
|
|
+ $this->assertFalse($event->oldFrozenStatus);
|
|
|
+ $this->assertFalse($event->newFrozenStatus);
|
|
|
+ $this->assertEquals('quantity_decrease', $event->options['change_type']);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 测试冻结物品创建事件
|
|
|
+ */
|
|
|
+ public function test_frozen_item_create_event()
|
|
|
+ {
|
|
|
+ // 创建冻结物品创建事件
|
|
|
+ $event = new ItemQuantityChanged(
|
|
|
+ 1002, // userId
|
|
|
+ 2002, // itemId
|
|
|
+ null, // instanceId
|
|
|
+ 0, // oldQuantity (新创建的物品)
|
|
|
+ 30, // newQuantity
|
|
|
+ 5002, // userItemId
|
|
|
+ null, // oldFrozenStatus (新创建的物品)
|
|
|
+ true, // newFrozenStatus (冻结状态)
|
|
|
+ [ // options
|
|
|
+ 'freeze_action' => 'freeze',
|
|
|
+ 'change_type' => 'frozen_item_create',
|
|
|
+ 'freeze_log_id' => 1001
|
|
|
+ ]
|
|
|
+ );
|
|
|
+
|
|
|
+ // 验证事件属性
|
|
|
+ $this->assertEquals(1002, $event->userId);
|
|
|
+ $this->assertEquals(2002, $event->itemId);
|
|
|
+ $this->assertEquals(0, $event->oldQuantity);
|
|
|
+ $this->assertEquals(30, $event->newQuantity);
|
|
|
+ $this->assertEquals(30, $event->changeAmount); // 从0增加到30
|
|
|
+ $this->assertNull($event->oldFrozenStatus);
|
|
|
+ $this->assertTrue($event->newFrozenStatus);
|
|
|
+ $this->assertEquals('frozen_item_create', $event->options['change_type']);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 测试冻结状态变更事件
|
|
|
+ */
|
|
|
+ public function test_freeze_status_change_event()
|
|
|
+ {
|
|
|
+ // 创建冻结状态变更事件(全部冻结)
|
|
|
+ $event = new ItemQuantityChanged(
|
|
|
+ 1003, // userId
|
|
|
+ 2003, // itemId
|
|
|
+ null, // instanceId
|
|
|
+ 50, // oldQuantity
|
|
|
+ 50, // newQuantity (数量不变)
|
|
|
+ 5003, // userItemId
|
|
|
+ false, // oldFrozenStatus
|
|
|
+ true, // newFrozenStatus
|
|
|
+ [ // options
|
|
|
+ 'freeze_action' => 'freeze',
|
|
|
+ 'change_type' => 'freeze_status_change',
|
|
|
+ 'freeze_log_id' => 1002
|
|
|
+ ]
|
|
|
+ );
|
|
|
+
|
|
|
+ // 验证事件属性
|
|
|
+ $this->assertEquals(1003, $event->userId);
|
|
|
+ $this->assertEquals(2003, $event->itemId);
|
|
|
+ $this->assertEquals(50, $event->oldQuantity);
|
|
|
+ $this->assertEquals(50, $event->newQuantity);
|
|
|
+ $this->assertEquals(0, $event->changeAmount); // 数量不变
|
|
|
+ $this->assertFalse($event->oldFrozenStatus);
|
|
|
+ $this->assertTrue($event->newFrozenStatus);
|
|
|
+ $this->assertEquals('freeze_status_change', $event->options['change_type']);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 测试解冻事件
|
|
|
+ */
|
|
|
+ public function test_unfreeze_event()
|
|
|
+ {
|
|
|
+ // 创建解冻事件
|
|
|
+ $event = new ItemQuantityChanged(
|
|
|
+ 1004, // userId
|
|
|
+ 2004, // itemId
|
|
|
+ null, // instanceId
|
|
|
+ 40, // oldQuantity
|
|
|
+ 40, // newQuantity (数量不变)
|
|
|
+ 5004, // userItemId
|
|
|
+ true, // oldFrozenStatus
|
|
|
+ false, // newFrozenStatus
|
|
|
+ [ // options
|
|
|
+ 'freeze_action' => 'unfreeze',
|
|
|
+ 'original_freeze_log_id' => 1003
|
|
|
+ ]
|
|
|
+ );
|
|
|
+
|
|
|
+ // 验证事件属性
|
|
|
+ $this->assertEquals(1004, $event->userId);
|
|
|
+ $this->assertEquals(2004, $event->itemId);
|
|
|
+ $this->assertEquals(40, $event->oldQuantity);
|
|
|
+ $this->assertEquals(40, $event->newQuantity);
|
|
|
+ $this->assertEquals(0, $event->changeAmount); // 数量不变
|
|
|
+ $this->assertTrue($event->oldFrozenStatus);
|
|
|
+ $this->assertFalse($event->newFrozenStatus);
|
|
|
+ $this->assertEquals('unfreeze', $event->options['freeze_action']);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 测试单独属性物品冻结事件
|
|
|
+ */
|
|
|
+ public function test_unique_item_freeze_event()
|
|
|
+ {
|
|
|
+ // 创建单独属性物品冻结事件
|
|
|
+ $event = new ItemQuantityChanged(
|
|
|
+ 1005, // userId
|
|
|
+ 2005, // itemId
|
|
|
+ 3001, // instanceId (单独属性物品有实例ID)
|
|
|
+ 1, // oldQuantity (单独属性物品数量为1)
|
|
|
+ 1, // newQuantity (数量不变)
|
|
|
+ 5005, // userItemId
|
|
|
+ false, // oldFrozenStatus
|
|
|
+ true, // newFrozenStatus
|
|
|
+ [ // options
|
|
|
+ 'freeze_action' => 'freeze',
|
|
|
+ 'freeze_log_id' => 1004
|
|
|
+ ]
|
|
|
+ );
|
|
|
+
|
|
|
+ // 验证事件属性
|
|
|
+ $this->assertEquals(1005, $event->userId);
|
|
|
+ $this->assertEquals(2005, $event->itemId);
|
|
|
+ $this->assertEquals(3001, $event->instanceId);
|
|
|
+ $this->assertEquals(1, $event->oldQuantity);
|
|
|
+ $this->assertEquals(1, $event->newQuantity);
|
|
|
+ $this->assertEquals(0, $event->changeAmount); // 数量不变
|
|
|
+ $this->assertFalse($event->oldFrozenStatus);
|
|
|
+ $this->assertTrue($event->newFrozenStatus);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 测试事件的变化量自动计算
|
|
|
+ */
|
|
|
+ public function test_change_amount_auto_calculation()
|
|
|
+ {
|
|
|
+ // 测试增加
|
|
|
+ $increaseEvent = new ItemQuantityChanged(1, 1, null, 10, 15, 1, null, null, []);
|
|
|
+ $this->assertEquals(5, $increaseEvent->changeAmount);
|
|
|
+
|
|
|
+ // 测试减少
|
|
|
+ $decreaseEvent = new ItemQuantityChanged(1, 1, null, 20, 12, 1, null, null, []);
|
|
|
+ $this->assertEquals(-8, $decreaseEvent->changeAmount);
|
|
|
+
|
|
|
+ // 测试不变
|
|
|
+ $noChangeEvent = new ItemQuantityChanged(1, 1, null, 30, 30, 1, false, true, []);
|
|
|
+ $this->assertEquals(0, $noChangeEvent->changeAmount);
|
|
|
+ }
|
|
|
+}
|