ItemFreezeEventLogicTest.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <?php
  2. namespace Tests\Unit\GameItems;
  3. use App\Module\GameItems\Events\ItemQuantityChanged;
  4. use Illuminate\Support\Facades\Event;
  5. use Tests\TestCase;
  6. /**
  7. * 物品冻结事件逻辑测试
  8. *
  9. * 测试物品冻结功能的事件触发逻辑
  10. */
  11. class ItemFreezeEventLogicTest extends TestCase
  12. {
  13. /**
  14. * 测试ItemQuantityChanged事件的冻结状态参数
  15. */
  16. public function test_item_quantity_changed_event_with_freeze_status()
  17. {
  18. // 创建包含冻结状态的事件
  19. $event = new ItemQuantityChanged(
  20. 1001, // userId
  21. 2001, // itemId
  22. null, // instanceId
  23. 100, // oldQuantity
  24. 70, // newQuantity
  25. 5001, // userItemId
  26. false, // oldFrozenStatus
  27. false, // newFrozenStatus (数量减少,冻结状态不变)
  28. [ // options
  29. 'freeze_action' => 'freeze',
  30. 'change_type' => 'quantity_decrease',
  31. 'reason' => 'trade_order'
  32. ]
  33. );
  34. // 验证事件属性
  35. $this->assertEquals(1001, $event->userId);
  36. $this->assertEquals(2001, $event->itemId);
  37. $this->assertNull($event->instanceId);
  38. $this->assertEquals(100, $event->oldQuantity);
  39. $this->assertEquals(70, $event->newQuantity);
  40. $this->assertEquals(-30, $event->changeAmount); // 自动计算
  41. $this->assertEquals(5001, $event->userItemId);
  42. $this->assertFalse($event->oldFrozenStatus);
  43. $this->assertFalse($event->newFrozenStatus);
  44. $this->assertEquals('quantity_decrease', $event->options['change_type']);
  45. }
  46. /**
  47. * 测试冻结物品创建事件
  48. */
  49. public function test_frozen_item_create_event()
  50. {
  51. // 创建冻结物品创建事件
  52. $event = new ItemQuantityChanged(
  53. 1002, // userId
  54. 2002, // itemId
  55. null, // instanceId
  56. 0, // oldQuantity (新创建的物品)
  57. 30, // newQuantity
  58. 5002, // userItemId
  59. null, // oldFrozenStatus (新创建的物品)
  60. true, // newFrozenStatus (冻结状态)
  61. [ // options
  62. 'freeze_action' => 'freeze',
  63. 'change_type' => 'frozen_item_create',
  64. 'freeze_log_id' => 1001
  65. ]
  66. );
  67. // 验证事件属性
  68. $this->assertEquals(1002, $event->userId);
  69. $this->assertEquals(2002, $event->itemId);
  70. $this->assertEquals(0, $event->oldQuantity);
  71. $this->assertEquals(30, $event->newQuantity);
  72. $this->assertEquals(30, $event->changeAmount); // 从0增加到30
  73. $this->assertNull($event->oldFrozenStatus);
  74. $this->assertTrue($event->newFrozenStatus);
  75. $this->assertEquals('frozen_item_create', $event->options['change_type']);
  76. }
  77. /**
  78. * 测试冻结状态变更事件
  79. */
  80. public function test_freeze_status_change_event()
  81. {
  82. // 创建冻结状态变更事件(全部冻结)
  83. $event = new ItemQuantityChanged(
  84. 1003, // userId
  85. 2003, // itemId
  86. null, // instanceId
  87. 50, // oldQuantity
  88. 50, // newQuantity (数量不变)
  89. 5003, // userItemId
  90. false, // oldFrozenStatus
  91. true, // newFrozenStatus
  92. [ // options
  93. 'freeze_action' => 'freeze',
  94. 'change_type' => 'freeze_status_change',
  95. 'freeze_log_id' => 1002
  96. ]
  97. );
  98. // 验证事件属性
  99. $this->assertEquals(1003, $event->userId);
  100. $this->assertEquals(2003, $event->itemId);
  101. $this->assertEquals(50, $event->oldQuantity);
  102. $this->assertEquals(50, $event->newQuantity);
  103. $this->assertEquals(0, $event->changeAmount); // 数量不变
  104. $this->assertFalse($event->oldFrozenStatus);
  105. $this->assertTrue($event->newFrozenStatus);
  106. $this->assertEquals('freeze_status_change', $event->options['change_type']);
  107. }
  108. /**
  109. * 测试解冻事件
  110. */
  111. public function test_unfreeze_event()
  112. {
  113. // 创建解冻事件
  114. $event = new ItemQuantityChanged(
  115. 1004, // userId
  116. 2004, // itemId
  117. null, // instanceId
  118. 40, // oldQuantity
  119. 40, // newQuantity (数量不变)
  120. 5004, // userItemId
  121. true, // oldFrozenStatus
  122. false, // newFrozenStatus
  123. [ // options
  124. 'freeze_action' => 'unfreeze',
  125. 'original_freeze_log_id' => 1003
  126. ]
  127. );
  128. // 验证事件属性
  129. $this->assertEquals(1004, $event->userId);
  130. $this->assertEquals(2004, $event->itemId);
  131. $this->assertEquals(40, $event->oldQuantity);
  132. $this->assertEquals(40, $event->newQuantity);
  133. $this->assertEquals(0, $event->changeAmount); // 数量不变
  134. $this->assertTrue($event->oldFrozenStatus);
  135. $this->assertFalse($event->newFrozenStatus);
  136. $this->assertEquals('unfreeze', $event->options['freeze_action']);
  137. }
  138. /**
  139. * 测试单独属性物品冻结事件
  140. */
  141. public function test_unique_item_freeze_event()
  142. {
  143. // 创建单独属性物品冻结事件
  144. $event = new ItemQuantityChanged(
  145. 1005, // userId
  146. 2005, // itemId
  147. 3001, // instanceId (单独属性物品有实例ID)
  148. 1, // oldQuantity (单独属性物品数量为1)
  149. 1, // newQuantity (数量不变)
  150. 5005, // userItemId
  151. false, // oldFrozenStatus
  152. true, // newFrozenStatus
  153. [ // options
  154. 'freeze_action' => 'freeze',
  155. 'freeze_log_id' => 1004
  156. ]
  157. );
  158. // 验证事件属性
  159. $this->assertEquals(1005, $event->userId);
  160. $this->assertEquals(2005, $event->itemId);
  161. $this->assertEquals(3001, $event->instanceId);
  162. $this->assertEquals(1, $event->oldQuantity);
  163. $this->assertEquals(1, $event->newQuantity);
  164. $this->assertEquals(0, $event->changeAmount); // 数量不变
  165. $this->assertFalse($event->oldFrozenStatus);
  166. $this->assertTrue($event->newFrozenStatus);
  167. }
  168. /**
  169. * 测试事件的变化量自动计算
  170. */
  171. public function test_change_amount_auto_calculation()
  172. {
  173. // 测试增加
  174. $increaseEvent = new ItemQuantityChanged(1, 1, null, 10, 15, 1, null, null, []);
  175. $this->assertEquals(5, $increaseEvent->changeAmount);
  176. // 测试减少
  177. $decreaseEvent = new ItemQuantityChanged(1, 1, null, 20, 12, 1, null, null, []);
  178. $this->assertEquals(-8, $decreaseEvent->changeAmount);
  179. // 测试不变
  180. $noChangeEvent = new ItemQuantityChanged(1, 1, null, 30, 30, 1, false, true, []);
  181. $this->assertEquals(0, $noChangeEvent->changeAmount);
  182. }
  183. }