id = 1; $groupDto->name = '测试奖励组'; $groupDto->code = 'test_group'; $groupDto->isRandom = false; // 非随机模式 $groupDto->randomCount = 2; // 这个值在非随机模式下应该被忽略 $groupDto->rewardMode = 2; // 独立概率模式 // 创建奖励项(设置高概率确保命中) $item1 = new RewardItemDto(); $item1->id = 1; $item1->groupId = 1; $item1->rewardType = 1; $item1->targetId = 1001; $item1->param1 = 0; $item1->param2 = 0; $item1->quantity = 1; $item1->weight = 1.0; $item1->probability = 100.0; // 100%概率 $item1->minQuantity = null; $item1->maxQuantity = null; $item1->isGuaranteed = false; $item1->extraData = null; $item2 = new RewardItemDto(); $item2->id = 2; $item2->groupId = 1; $item2->rewardType = 1; $item2->targetId = 1002; $item2->param1 = 0; $item2->param2 = 0; $item2->quantity = 1; $item2->weight = 1.0; $item2->probability = 100.0; // 100%概率 $item2->minQuantity = null; $item2->maxQuantity = null; $item2->isGuaranteed = false; $item2->extraData = null; $item3 = new RewardItemDto(); $item3->id = 3; $item3->groupId = 1; $item3->rewardType = 1; $item3->targetId = 1003; $item3->param1 = 0; $item3->param2 = 0; $item3->quantity = 1; $item3->weight = 1.0; $item3->probability = 100.0; // 100%概率 $item3->minQuantity = null; $item3->maxQuantity = null; $item3->isGuaranteed = false; $item3->extraData = null; $groupDto->items = [$item1, $item2, $item3]; // 执行处理 $result = IndependentProbabilityReward::process($groupDto); // 验证结果:非随机模式应该返回所有3个命中的奖励项 $this->assertCount(3, $result, '非随机模式应该返回所有命中的奖励项'); } /** * 测试随机模式:应该限制返回的奖励项数量 */ public function testRandomModeLimitsReturnedItems() { // 创建奖励组DTO(随机模式) $groupDto = new RewardGroupDto(); $groupDto->id = 1; $groupDto->name = '测试奖励组'; $groupDto->code = 'test_group'; $groupDto->isRandom = true; // 随机模式 $groupDto->randomCount = 2; // 限制返回2个奖励项 $groupDto->rewardMode = 2; // 独立概率模式 // 创建奖励项(设置高概率确保命中) $item1 = new RewardItemDto(); $item1->id = 1; $item1->groupId = 1; $item1->rewardType = 1; $item1->targetId = 1001; $item1->param1 = 0; $item1->param2 = 0; $item1->quantity = 1; $item1->weight = 1.0; $item1->probability = 100.0; // 100%概率 $item1->minQuantity = null; $item1->maxQuantity = null; $item1->isGuaranteed = false; $item1->extraData = null; $item2 = new RewardItemDto(); $item2->id = 2; $item2->groupId = 1; $item2->rewardType = 1; $item2->targetId = 1002; $item2->param1 = 0; $item2->param2 = 0; $item2->quantity = 1; $item2->weight = 1.0; $item2->probability = 100.0; // 100%概率 $item2->minQuantity = null; $item2->maxQuantity = null; $item2->isGuaranteed = false; $item2->extraData = null; $item3 = new RewardItemDto(); $item3->id = 3; $item3->groupId = 1; $item3->rewardType = 1; $item3->targetId = 1003; $item3->param1 = 0; $item3->param2 = 0; $item3->quantity = 1; $item3->weight = 1.0; $item3->probability = 100.0; // 100%概率 $item3->minQuantity = null; $item3->maxQuantity = null; $item3->isGuaranteed = false; $item3->extraData = null; $groupDto->items = [$item1, $item2, $item3]; // 执行处理 $result = IndependentProbabilityReward::process($groupDto); // 验证结果:随机模式应该限制返回的奖励项数量为2个 $this->assertCount(2, $result, '随机模式应该限制返回的奖励项数量'); } /** * 测试必中项优先级:必中项应该优先选择 */ public function testGuaranteedItemsPriority() { // 创建奖励组DTO(随机模式) $groupDto = new RewardGroupDto(); $groupDto->id = 1; $groupDto->name = '测试奖励组'; $groupDto->code = 'test_group'; $groupDto->isRandom = true; // 随机模式 $groupDto->randomCount = 2; // 限制返回2个奖励项 $groupDto->rewardMode = 2; // 独立概率模式 // 创建必中项 $guaranteedItem = new RewardItemDto(); $guaranteedItem->id = 1; $guaranteedItem->groupId = 1; $guaranteedItem->rewardType = 1; $guaranteedItem->targetId = 1001; $guaranteedItem->param1 = 0; $guaranteedItem->param2 = 0; $guaranteedItem->quantity = 1; $guaranteedItem->weight = 1.0; $guaranteedItem->probability = 0; // 概率无关紧要 $guaranteedItem->minQuantity = null; $guaranteedItem->maxQuantity = null; $guaranteedItem->isGuaranteed = true; // 必中 $guaranteedItem->extraData = null; // 创建普通项(高概率) $normalItem1 = new RewardItemDto(); $normalItem1->id = 2; $normalItem1->groupId = 1; $normalItem1->rewardType = 1; $normalItem1->targetId = 1002; $normalItem1->param1 = 0; $normalItem1->param2 = 0; $normalItem1->quantity = 1; $normalItem1->weight = 1.0; $normalItem1->probability = 100.0; // 100%概率 $normalItem1->minQuantity = null; $normalItem1->maxQuantity = null; $normalItem1->isGuaranteed = false; $normalItem1->extraData = null; $normalItem2 = new RewardItemDto(); $normalItem2->id = 3; $normalItem2->groupId = 1; $normalItem2->rewardType = 1; $normalItem2->targetId = 1003; $normalItem2->param1 = 0; $normalItem2->param2 = 0; $normalItem2->quantity = 1; $normalItem2->weight = 1.0; $normalItem2->probability = 100.0; // 100%概率 $normalItem2->minQuantity = null; $normalItem2->maxQuantity = null; $normalItem2->isGuaranteed = false; $normalItem2->extraData = null; $groupDto->items = [$guaranteedItem, $normalItem1, $normalItem2]; // 执行处理 $result = IndependentProbabilityReward::process($groupDto); // 验证结果 $this->assertCount(2, $result, '应该返回2个奖励项'); // 验证必中项在结果中 $targetIds = array_map(function($item) { return $item->targetId; }, $result); $this->assertContains(1001, $targetIds, '必中项应该在结果中'); } /** * 测试必中项数量超过限制:应该只返回限制数量的必中项 */ public function testTooManyGuaranteedItems() { // 创建奖励组DTO(随机模式) $groupDto = new RewardGroupDto(); $groupDto->id = 1; $groupDto->name = '测试奖励组'; $groupDto->code = 'test_group'; $groupDto->isRandom = true; // 随机模式 $groupDto->randomCount = 2; // 限制返回2个奖励项 $groupDto->rewardMode = 2; // 独立概率模式 // 创建3个必中项(超过限制数量) $guaranteedItem1 = new RewardItemDto(); $guaranteedItem1->id = 1; $guaranteedItem1->groupId = 1; $guaranteedItem1->rewardType = 1; $guaranteedItem1->targetId = 1001; $guaranteedItem1->param1 = 0; $guaranteedItem1->param2 = 0; $guaranteedItem1->quantity = 1; $guaranteedItem1->weight = 1.0; $guaranteedItem1->probability = null; $guaranteedItem1->minQuantity = null; $guaranteedItem1->maxQuantity = null; $guaranteedItem1->isGuaranteed = true; $guaranteedItem1->extraData = null; $guaranteedItem2 = new RewardItemDto(); $guaranteedItem2->id = 2; $guaranteedItem2->groupId = 1; $guaranteedItem2->rewardType = 1; $guaranteedItem2->targetId = 1002; $guaranteedItem2->param1 = 0; $guaranteedItem2->param2 = 0; $guaranteedItem2->quantity = 1; $guaranteedItem2->weight = 1.0; $guaranteedItem2->probability = null; $guaranteedItem2->minQuantity = null; $guaranteedItem2->maxQuantity = null; $guaranteedItem2->isGuaranteed = true; $guaranteedItem2->extraData = null; $guaranteedItem3 = new RewardItemDto(); $guaranteedItem3->id = 3; $guaranteedItem3->groupId = 1; $guaranteedItem3->rewardType = 1; $guaranteedItem3->targetId = 1003; $guaranteedItem3->param1 = 0; $guaranteedItem3->param2 = 0; $guaranteedItem3->quantity = 1; $guaranteedItem3->weight = 1.0; $guaranteedItem3->probability = null; $guaranteedItem3->minQuantity = null; $guaranteedItem3->maxQuantity = null; $guaranteedItem3->isGuaranteed = true; $guaranteedItem3->extraData = null; $groupDto->items = [$guaranteedItem1, $guaranteedItem2, $guaranteedItem3]; // 执行处理 $result = IndependentProbabilityReward::process($groupDto); // 验证结果:应该只返回2个必中项(按限制数量) $this->assertCount(2, $result, '必中项数量超过限制时,应该只返回限制数量的必中项'); } }