SowHandlerSimpleTest.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <?php
  2. namespace Tests\Unit\AppGame;
  3. use Tests\TestCase;
  4. use App\Module\AppGame\Handler\Land\SowHandler;
  5. use App\Module\Farm\Validations\CropPlantValidation;
  6. use App\Module\Farm\Validators\SeedLandTypeValidator;
  7. use App\Module\Farm\Models\FarmLand;
  8. use App\Module\Farm\Models\FarmSeed;
  9. use App\Module\Farm\Enums\LAND_TYPE;
  10. use App\Module\Farm\Enums\LAND_STATUS;
  11. use Uraus\Kku\Request\RequestLandSow;
  12. use Uraus\Kku\Response\ResponseLandSow;
  13. /**
  14. * SowHandler简化单元测试
  15. *
  16. * 重点测试玫瑰种子的土地类型限制功能
  17. */
  18. class SowHandlerSimpleTest extends TestCase
  19. {
  20. /**
  21. * 测试用户ID
  22. */
  23. private int $testUserId = 1;
  24. /**
  25. * 玫瑰种子物品ID
  26. */
  27. private int $roseSeedItemId = 17;
  28. /**
  29. * 测试RequestLandSow请求对象结构
  30. */
  31. public function testRequestLandSowStructure()
  32. {
  33. $request = new RequestLandSow();
  34. // 测试设置土地ID
  35. $request->setLandId(1);
  36. $this->assertEquals(1, $request->getLandId());
  37. // 测试设置种子物品ID
  38. $request->setItemId(17);
  39. $this->assertEquals(17, $request->getItemId());
  40. // 测试设置种子实例ID
  41. $request->setItemInstanceId(100);
  42. $this->assertEquals(100, $request->getItemInstanceId());
  43. }
  44. /**
  45. * 测试ResponseLandSow响应对象结构
  46. */
  47. public function testResponseLandSowStructure()
  48. {
  49. $response = new ResponseLandSow();
  50. $this->assertInstanceOf(ResponseLandSow::class, $response);
  51. }
  52. /**
  53. * 测试SowHandler类结构
  54. */
  55. public function testSowHandlerStructure()
  56. {
  57. $this->assertTrue(class_exists(SowHandler::class));
  58. // 验证SowHandler是BaseHandler的子类
  59. $reflection = new \ReflectionClass(SowHandler::class);
  60. $this->assertTrue($reflection->isSubclassOf(\App\Module\AppGame\Handler\BaseHandler::class));
  61. }
  62. /**
  63. * 测试种子土地类型验证器 - 玫瑰种子在普通土地种植失败
  64. */
  65. public function testSeedLandTypeValidator_RoseSeedOnNormalLandFails()
  66. {
  67. // 创建模拟的验证对象
  68. $validation = new CropPlantValidation([]);
  69. // 创建模拟的普通土地
  70. $normalLand = new FarmLand();
  71. $normalLand->id = 1;
  72. $normalLand->user_id = $this->testUserId;
  73. $normalLand->land_type = LAND_TYPE::NORMAL->value;
  74. $normalLand->status = LAND_STATUS::IDLE->value;
  75. // 设置土地到验证对象
  76. $validation->land = $normalLand;
  77. // 创建验证器
  78. $validator = new SeedLandTypeValidator($validation, ['land']);
  79. // 验证应该失败
  80. $result = $validator->validate($this->roseSeedItemId, []);
  81. $this->assertFalse($result);
  82. }
  83. /**
  84. * 测试种子土地类型验证器 - 玫瑰种子在金土地种植成功
  85. */
  86. public function testSeedLandTypeValidator_RoseSeedOnGoldLandSucceeds()
  87. {
  88. // 创建模拟的验证对象
  89. $validation = new CropPlantValidation([]);
  90. // 创建模拟的金土地
  91. $goldLand = new FarmLand();
  92. $goldLand->id = 2;
  93. $goldLand->user_id = $this->testUserId;
  94. $goldLand->land_type = LAND_TYPE::GOLD->value;
  95. $goldLand->status = LAND_STATUS::IDLE->value;
  96. // 设置土地到验证对象
  97. $validation->land = $goldLand;
  98. // 创建验证器
  99. $validator = new SeedLandTypeValidator($validation, ['land']);
  100. // 验证应该成功
  101. $result = $validator->validate($this->roseSeedItemId, []);
  102. $this->assertTrue($result);
  103. }
  104. /**
  105. * 测试FarmSeed模型的土地类型检查方法
  106. */
  107. public function testFarmSeedLandTypeCheckMethods()
  108. {
  109. // 创建模拟的玫瑰种子(有土地类型限制)
  110. $roseSeed = new FarmSeed();
  111. $roseSeed->item_id = 17;
  112. $roseSeed->allowed_land_types = [
  113. LAND_TYPE::GOLD,
  114. LAND_TYPE::BLUE,
  115. LAND_TYPE::PURPLE
  116. ];
  117. // 测试不能在普通土地种植
  118. $this->assertFalse($roseSeed->canPlantOnLandType(LAND_TYPE::NORMAL->value));
  119. $this->assertFalse($roseSeed->canPlantOnLandTypeOrHigher(LAND_TYPE::NORMAL->value));
  120. // 测试不能在红土地种植
  121. $this->assertFalse($roseSeed->canPlantOnLandType(LAND_TYPE::RED->value));
  122. $this->assertFalse($roseSeed->canPlantOnLandTypeOrHigher(LAND_TYPE::RED->value));
  123. // 测试不能在黑土地种植
  124. $this->assertFalse($roseSeed->canPlantOnLandType(LAND_TYPE::BLACK->value));
  125. $this->assertFalse($roseSeed->canPlantOnLandTypeOrHigher(LAND_TYPE::BLACK->value));
  126. // 测试可以在金土地种植
  127. $this->assertTrue($roseSeed->canPlantOnLandType(LAND_TYPE::GOLD->value));
  128. $this->assertTrue($roseSeed->canPlantOnLandTypeOrHigher(LAND_TYPE::GOLD->value));
  129. // 测试可以在蓝土地种植
  130. $this->assertTrue($roseSeed->canPlantOnLandType(LAND_TYPE::BLUE->value));
  131. $this->assertTrue($roseSeed->canPlantOnLandTypeOrHigher(LAND_TYPE::BLUE->value));
  132. // 测试可以在紫土地种植
  133. $this->assertTrue($roseSeed->canPlantOnLandType(LAND_TYPE::PURPLE->value));
  134. $this->assertTrue($roseSeed->canPlantOnLandTypeOrHigher(LAND_TYPE::PURPLE->value));
  135. }
  136. /**
  137. * 测试普通种子(无土地类型限制)
  138. */
  139. public function testNormalSeedWithoutLandTypeRestriction()
  140. {
  141. // 创建模拟的普通种子(无土地类型限制)
  142. $normalSeed = new FarmSeed();
  143. $normalSeed->item_id = 1;
  144. $normalSeed->allowed_land_types = null;
  145. // 测试普通种子可以在所有土地种植
  146. $this->assertTrue($normalSeed->canPlantOnLandType(LAND_TYPE::NORMAL->value));
  147. $this->assertTrue($normalSeed->canPlantOnLandType(LAND_TYPE::RED->value));
  148. $this->assertTrue($normalSeed->canPlantOnLandType(LAND_TYPE::BLACK->value));
  149. $this->assertTrue($normalSeed->canPlantOnLandType(LAND_TYPE::GOLD->value));
  150. $this->assertTrue($normalSeed->canPlantOnLandType(LAND_TYPE::BLUE->value));
  151. $this->assertTrue($normalSeed->canPlantOnLandType(LAND_TYPE::PURPLE->value));
  152. // 测试"及以上等级"方法
  153. $this->assertTrue($normalSeed->canPlantOnLandTypeOrHigher(LAND_TYPE::NORMAL->value));
  154. $this->assertTrue($normalSeed->canPlantOnLandTypeOrHigher(LAND_TYPE::GOLD->value));
  155. }
  156. /**
  157. * 测试土地等级概念
  158. */
  159. public function testLandTypeHierarchy()
  160. {
  161. // 创建只能在金土地种植的种子
  162. $goldOnlySeed = new FarmSeed();
  163. $goldOnlySeed->item_id = 99;
  164. $goldOnlySeed->allowed_land_types = [LAND_TYPE::GOLD];
  165. // 测试等级概念:金土地(4)及以上等级包括蓝土地(5)和紫土地(6)
  166. $this->assertTrue($goldOnlySeed->canPlantOnLandTypeOrHigher(LAND_TYPE::GOLD->value));
  167. $this->assertTrue($goldOnlySeed->canPlantOnLandTypeOrHigher(LAND_TYPE::BLUE->value));
  168. $this->assertTrue($goldOnlySeed->canPlantOnLandTypeOrHigher(LAND_TYPE::PURPLE->value));
  169. // 但不能在低等级土地种植
  170. $this->assertFalse($goldOnlySeed->canPlantOnLandTypeOrHigher(LAND_TYPE::NORMAL->value));
  171. $this->assertFalse($goldOnlySeed->canPlantOnLandTypeOrHigher(LAND_TYPE::RED->value));
  172. $this->assertFalse($goldOnlySeed->canPlantOnLandTypeOrHigher(LAND_TYPE::BLACK->value));
  173. }
  174. /**
  175. * 测试AllowedLandTypesCast的基本功能
  176. */
  177. public function testAllowedLandTypesCastBasicFunctionality()
  178. {
  179. $cast = new \App\Module\Farm\Casts\AllowedLandTypesCast();
  180. // 测试null值处理
  181. $this->assertNull($cast->get(new FarmSeed(), 'allowed_land_types', null, []));
  182. $this->assertNull($cast->set(new FarmSeed(), 'allowed_land_types', null, []));
  183. // 测试空数组处理
  184. $this->assertEquals('[]', $cast->set(new FarmSeed(), 'allowed_land_types', [], []));
  185. // 测试枚举数组处理
  186. $landTypes = [LAND_TYPE::GOLD, LAND_TYPE::BLUE];
  187. $jsonResult = $cast->set(new FarmSeed(), 'allowed_land_types', $landTypes, []);
  188. $this->assertEquals('[4,5]', $jsonResult);
  189. }
  190. }