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"); } }