| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- <?php
- namespace Tests\Unit\Game;
- use Tests\TestCase;
- use App\Module\Game\Dtos\RewardGroupDto;
- use App\Module\Game\Dtos\RewardItemDto;
- use App\Module\Game\Logics\IndependentProbabilityReward;
- /**
- * 独立概率模式随机数量限制测试
- */
- class IndependentProbabilityRandomCountTest extends TestCase
- {
- /**
- * 测试非随机模式:应该返回所有命中的奖励项
- */
- public function testNonRandomModeReturnsAllHitItems()
- {
- // 创建奖励组DTO(非随机模式)
- $groupDto = new RewardGroupDto();
- $groupDto->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, '必中项数量超过限制时,应该只返回限制数量的必中项');
- }
- }
|