| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- <?php
- namespace Tests\Unit;
- use App\Module\Farm\Models\FarmHouseConfig;
- use PHPUnit\Framework\TestCase;
- use Illuminate\Foundation\Testing\RefreshDatabase;
- /**
- * 房屋产出加成测试
- *
- * 验证房屋等级产出加成的数据一致性和计算正确性
- */
- class HouseOutputBonusTest extends TestCase
- {
- use RefreshDatabase;
- /**
- * 测试房屋配置数据的正确性
- */
- public function testHouseConfigDataConsistency()
- {
- // 期望的房屋等级产出加成配置(百分比值)
- $expectedConfigs = [
- 1 => 0, // 0%
- 2 => 5, // 5%
- 3 => 10, // 10%
- 4 => 15, // 15%
- 5 => 20, // 20%
- 6 => 25, // 25%
- 7 => 30, // 30%
- 8 => 35, // 35%
- 9 => 40, // 40%
- 10 => 45, // 45%
- 11 => 50, // 50%
- 12 => 60, // 60%
- ];
- foreach ($expectedConfigs as $level => $expectedBonus) {
- $config = FarmHouseConfig::where('level', $level)->first();
- $this->assertNotNull($config, "房屋等级 {$level} 的配置不存在");
- $this->assertEquals(
- $expectedBonus,
- (float)$config->output_bonus,
- "房屋等级 {$level} 的产出加成应该是 {$expectedBonus},实际是 {$config->output_bonus}"
- );
- }
- }
- /**
- * 测试产出加成计算逻辑
- */
- public function testOutputBonusCalculation()
- {
- // 测试用例:基础产量1000,不同房屋等级的最终产量
- $baseOutput = 1000;
- $testCases = [
- 1 => 1000, // 1000 * (1 + 0.00) = 1000
- 2 => 1050, // 1000 * (1 + 0.05) = 1050
- 3 => 1100, // 1000 * (1 + 0.10) = 1100
- 4 => 1150, // 1000 * (1 + 0.15) = 1150
- 5 => 1200, // 1000 * (1 + 0.20) = 1200
- 6 => 1250, // 1000 * (1 + 0.25) = 1250
- 7 => 1300, // 1000 * (1 + 0.30) = 1300
- 8 => 1350, // 1000 * (1 + 0.35) = 1350
- 9 => 1400, // 1000 * (1 + 0.40) = 1400
- 10 => 1450, // 1000 * (1 + 0.45) = 1450
- 11 => 1500, // 1000 * (1 + 0.50) = 1500
- 12 => 1600, // 1000 * (1 + 0.60) = 1600
- ];
- foreach ($testCases as $level => $expectedOutput) {
- $config = FarmHouseConfig::where('level', $level)->first();
- $actualOutput = (int)($baseOutput * (1 + ($config->output_bonus / 100))); // 将百分比值转换为小数
- $this->assertEquals(
- $expectedOutput,
- $actualOutput,
- "房屋等级 {$level},基础产量 {$baseOutput},期望最终产量 {$expectedOutput},实际计算结果 {$actualOutput}"
- );
- }
- }
- /**
- * 测试百分比显示格式
- */
- public function testPercentageDisplayFormat()
- {
- $testCases = [
- 1 => '0%',
- 2 => '5%',
- 3 => '10%',
- 4 => '15%',
- 5 => '20%',
- 6 => '25%',
- 7 => '30%',
- 8 => '35%',
- 9 => '40%',
- 10 => '45%',
- 11 => '50%',
- 12 => '60%',
- ];
- foreach ($testCases as $level => $expectedPercentage) {
- $config = FarmHouseConfig::where('level', $level)->first();
- $actualPercentage = round($config->output_bonus) . '%'; // 直接使用百分比值
- $this->assertEquals(
- $expectedPercentage,
- $actualPercentage,
- "房屋等级 {$level} 的百分比显示应该是 {$expectedPercentage},实际是 {$actualPercentage}"
- );
- }
- }
- /**
- * 测试复合加成计算(土地+房屋+灾害)
- */
- public function testComplexBonusCalculation()
- {
- $baseOutput = 1000;
- $landBonus = 0.25; // 土地25%加成
- $houseLevel = 7; // 房屋7级30%加成
- $disasterPenalty = 0.10; // 灾害10%减产
- $config = FarmHouseConfig::where('level', $houseLevel)->first();
- $houseBonus = $config->output_bonus / 100; // 将百分比值转换为小数
- // 计算最终产量:基础产量 × (1 + 土地加成) × (1 + 房屋加成) × (1 - 灾害减产)
- $expectedOutput = (int)($baseOutput * (1 + $landBonus) * (1 + $houseBonus) * (1 - $disasterPenalty));
- // 手动计算验证:1000 * 1.25 * 1.30 * 0.90 = 1462.5 -> 1462
- $manualCalculation = (int)(1000 * 1.25 * 1.30 * 0.90);
- $this->assertEquals(1462, $manualCalculation, "手动计算结果应该是1462");
- $this->assertEquals($manualCalculation, $expectedOutput, "复合加成计算结果不正确");
- }
- /**
- * 测试边界情况
- */
- public function testEdgeCases()
- {
- // 测试最低等级(无加成)
- $level1Config = FarmHouseConfig::where('level', 1)->first();
- $this->assertEquals(0.00, (float)$level1Config->output_bonus, "等级1应该没有产出加成");
- // 测试最高等级
- $level12Config = FarmHouseConfig::where('level', 12)->first();
- $this->assertEquals(0.60, (float)$level12Config->output_bonus, "等级12应该有60%产出加成");
- // 测试不存在的等级
- $nonExistentConfig = FarmHouseConfig::where('level', 99)->first();
- $this->assertNull($nonExistentConfig, "不存在的等级应该返回null");
- }
- }
|