manual_test_item_consume_frozen.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <?php
  2. /**
  3. * 手动测试物品消耗冻结功能
  4. *
  5. * 使用方法:php tests/manual_test_item_consume_frozen.php
  6. */
  7. require_once __DIR__ . '/../vendor/autoload.php';
  8. use App\Module\GameItems\Services\ItemService;
  9. use App\Module\GameItems\Models\ItemUser;
  10. use Illuminate\Support\Facades\DB;
  11. // 启动Laravel应用
  12. $app = require_once __DIR__ . '/../bootstrap/app.php';
  13. $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
  14. $kernel->bootstrap();
  15. echo "=== 物品消耗冻结功能测试 ===\n";
  16. $testUserId = 99999;
  17. $testItemId = 1001;
  18. try {
  19. // 清理测试数据
  20. DB::transaction(function () use ($testUserId, $testItemId) {
  21. ItemUser::where('user_id', $testUserId)->where('item_id', $testItemId)->delete();
  22. // 创建测试数据
  23. echo "创建测试数据...\n";
  24. // 添加100个未冻结物品
  25. ItemUser::create([
  26. 'user_id' => $testUserId,
  27. 'item_id' => $testItemId,
  28. 'instance_id' => null,
  29. 'quantity' => 100,
  30. 'is_frozen' => false,
  31. 'frozen_log_id' => null,
  32. ]);
  33. // 添加50个冻结物品
  34. ItemUser::create([
  35. 'user_id' => $testUserId,
  36. 'item_id' => $testItemId,
  37. 'instance_id' => null,
  38. 'quantity' => 50,
  39. 'is_frozen' => true,
  40. 'frozen_log_id' => 999, // 假设的冻结日志ID
  41. ]);
  42. echo "测试数据创建完成:100个未冻结 + 50个冻结 = 150个总数\n\n";
  43. });
  44. // 测试1:不包含冻结物品的消耗(默认行为)
  45. echo "=== 测试1:不包含冻结物品的消耗 ===\n";
  46. DB::transaction(function () use ($testUserId, $testItemId) {
  47. $result = ItemService::consumeItem(
  48. $testUserId,
  49. $testItemId,
  50. null,
  51. 80,
  52. ['source_type' => 'test', 'source_id' => 1]
  53. );
  54. if ($result['success']) {
  55. echo "✓ 消耗80个物品成功\n";
  56. // 检查剩余数量
  57. $items = ItemUser::where('user_id', $testUserId)
  58. ->where('item_id', $testItemId)
  59. ->get();
  60. $unfrozenQuantity = $items->where('is_frozen', false)->sum('quantity');
  61. $frozenQuantity = $items->where('is_frozen', true)->sum('quantity');
  62. echo "剩余未冻结物品:{$unfrozenQuantity}个(期望:20个)\n";
  63. echo "剩余冻结物品:{$frozenQuantity}个(期望:50个)\n";
  64. if ($unfrozenQuantity == 20 && $frozenQuantity == 50) {
  65. echo "✓ 测试1通过\n\n";
  66. } else {
  67. echo "✗ 测试1失败\n\n";
  68. }
  69. } else {
  70. echo "✗ 消耗失败:" . ($result['message'] ?? '未知错误') . "\n\n";
  71. }
  72. });
  73. // 重置测试数据
  74. DB::transaction(function () use ($testUserId, $testItemId) {
  75. ItemUser::where('user_id', $testUserId)->where('item_id', $testItemId)->delete();
  76. ItemUser::create([
  77. 'user_id' => $testUserId,
  78. 'item_id' => $testItemId,
  79. 'instance_id' => null,
  80. 'quantity' => 100,
  81. 'is_frozen' => false,
  82. 'frozen_log_id' => null,
  83. ]);
  84. ItemUser::create([
  85. 'user_id' => $testUserId,
  86. 'item_id' => $testItemId,
  87. 'instance_id' => null,
  88. 'quantity' => 50,
  89. 'is_frozen' => true,
  90. 'frozen_log_id' => 999,
  91. ]);
  92. });
  93. // 测试2:包含冻结物品的消耗
  94. echo "=== 测试2:包含冻结物品的消耗 ===\n";
  95. DB::transaction(function () use ($testUserId, $testItemId) {
  96. $result = ItemService::consumeItem(
  97. $testUserId,
  98. $testItemId,
  99. null,
  100. 120,
  101. [
  102. 'source_type' => 'test',
  103. 'source_id' => 1,
  104. 'include_frozen' => true // 包含冻结物品
  105. ]
  106. );
  107. if ($result['success']) {
  108. echo "✓ 消耗120个物品成功(包含冻结物品)\n";
  109. // 检查剩余数量
  110. $totalQuantity = ItemUser::where('user_id', $testUserId)
  111. ->where('item_id', $testItemId)
  112. ->sum('quantity');
  113. echo "剩余总数量:{$totalQuantity}个(期望:30个)\n";
  114. if ($totalQuantity == 30) {
  115. echo "✓ 测试2通过\n\n";
  116. } else {
  117. echo "✗ 测试2失败\n\n";
  118. }
  119. } else {
  120. echo "✗ 消耗失败:" . ($result['message'] ?? '未知错误') . "\n\n";
  121. }
  122. });
  123. // 测试3:不包含冻结物品时数量不足
  124. echo "=== 测试3:不包含冻结物品时数量不足 ===\n";
  125. DB::transaction(function () use ($testUserId, $testItemId) {
  126. // 重置为只有100个未冻结物品
  127. ItemUser::where('user_id', $testUserId)->where('item_id', $testItemId)->delete();
  128. ItemUser::create([
  129. 'user_id' => $testUserId,
  130. 'item_id' => $testItemId,
  131. 'instance_id' => null,
  132. 'quantity' => 100,
  133. 'is_frozen' => false,
  134. 'frozen_log_id' => null,
  135. ]);
  136. ItemUser::create([
  137. 'user_id' => $testUserId,
  138. 'item_id' => $testItemId,
  139. 'instance_id' => null,
  140. 'quantity' => 50,
  141. 'is_frozen' => true,
  142. 'frozen_log_id' => 999,
  143. ]);
  144. try {
  145. $result = ItemService::consumeItem(
  146. $testUserId,
  147. $testItemId,
  148. null,
  149. 120, // 尝试消耗120个,但只有100个未冻结
  150. ['source_type' => 'test', 'source_id' => 1]
  151. );
  152. echo "✗ 测试3失败:应该抛出异常但没有\n\n";
  153. } catch (Exception $e) {
  154. if (strpos($e->getMessage(), '数量不足') !== false) {
  155. echo "✓ 测试3通过:正确抛出数量不足异常\n";
  156. echo "异常信息:" . $e->getMessage() . "\n\n";
  157. } else {
  158. echo "✗ 测试3失败:异常信息不正确\n";
  159. echo "异常信息:" . $e->getMessage() . "\n\n";
  160. }
  161. }
  162. });
  163. // 清理测试数据
  164. DB::transaction(function () use ($testUserId, $testItemId) {
  165. ItemUser::where('user_id', $testUserId)->where('item_id', $testItemId)->delete();
  166. echo "测试数据清理完成\n";
  167. });
  168. echo "=== 所有测试完成 ===\n";
  169. } catch (Exception $e) {
  170. echo "测试过程中发生错误:" . $e->getMessage() . "\n";
  171. echo "堆栈跟踪:\n" . $e->getTraceAsString() . "\n";
  172. }