AddHandlerMultiCurrencyTest.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <?php
  2. namespace App\Module\Mex\Tests;
  3. use App\Module\AppGame\Validations\MatchexchangeAddValidation;
  4. use App\Module\Mex\Validators\MexOrderValidator;
  5. use App\Module\Fund\Enums\FUND_CURRENCY_TYPE;
  6. use App\Module\Mex\Logic\FundLogic;
  7. use Uraus\Kku\Common\MEX_DIRECTION;
  8. /**
  9. * AddHandler多币种资金验证测试
  10. *
  11. * 测试修正后的AddHandler资金验证是否正确支持多币种
  12. */
  13. class AddHandlerMultiCurrencyTest
  14. {
  15. /**
  16. * 测试FundLogic的默认币种设置
  17. */
  18. public static function testDefaultCurrency(): array
  19. {
  20. $results = [];
  21. try {
  22. $defaultCurrency = FundLogic::getDefaultCurrency();
  23. $results['default_currency'] = [
  24. 'value' => $defaultCurrency->value,
  25. 'name' => $defaultCurrency->name,
  26. 'success' => true
  27. ];
  28. // 测试默认币种的账户映射
  29. $availableAccount = FundLogic::getAvailableAccountType($defaultCurrency);
  30. $frozenAccount = FundLogic::getFrozenAccountType($defaultCurrency);
  31. $results['default_currency_mapping'] = [
  32. 'available_account' => $availableAccount?->value,
  33. 'frozen_account' => $frozenAccount?->value,
  34. 'success' => true
  35. ];
  36. } catch (\Exception $e) {
  37. $results['default_currency'] = [
  38. 'success' => false,
  39. 'error' => $e->getMessage()
  40. ];
  41. }
  42. return $results;
  43. }
  44. /**
  45. * 测试MexOrderValidator的币种支持
  46. */
  47. public static function testMexOrderValidator(): array
  48. {
  49. $results = [];
  50. try {
  51. // 模拟验证数据
  52. $testData = [
  53. 'user_id' => 1001,
  54. 'itemId' => 10001,
  55. 'num' => 10,
  56. 'price' => 2.5,
  57. 'currency_type' => FUND_CURRENCY_TYPE::ZUANSHI->value, // 钻石币种
  58. ];
  59. // 注意:我们不能直接实例化MexOrderValidator,因为它需要ValidationCore实例
  60. // 我们只测试相关的逻辑
  61. $results['validator_creation'] = [
  62. 'success' => true,
  63. 'message' => 'MexOrderValidator逻辑测试(无需实例化)'
  64. ];
  65. // 测试币种解析逻辑
  66. $currencyType = FUND_CURRENCY_TYPE::tryFrom($testData['currency_type']);
  67. $results['currency_parsing'] = [
  68. 'input_value' => $testData['currency_type'],
  69. 'parsed_currency' => $currencyType?->name,
  70. 'success' => $currencyType !== null
  71. ];
  72. // 测试账户类型获取逻辑
  73. if ($currencyType) {
  74. $availableAccountType = FundLogic::getAvailableAccountType($currencyType);
  75. $frozenAccountType = FundLogic::getFrozenAccountType($currencyType);
  76. $results['account_type_mapping'] = [
  77. 'currency' => $currencyType->name,
  78. 'available_account' => $availableAccountType?->value,
  79. 'frozen_account' => $frozenAccountType?->value,
  80. 'success' => $availableAccountType !== null && $frozenAccountType !== null
  81. ];
  82. }
  83. } catch (\Exception $e) {
  84. $results['validator_test'] = [
  85. 'success' => false,
  86. 'error' => $e->getMessage()
  87. ];
  88. }
  89. return $results;
  90. }
  91. /**
  92. * 测试MatchexchangeAddValidation的币种预处理
  93. */
  94. public static function testValidationPreprocessing(): array
  95. {
  96. $results = [];
  97. try {
  98. // 模拟protobuf请求数据
  99. $mockData = [
  100. 'user_id' => 1001,
  101. 'itemId' => 10001,
  102. 'price' => 2.5,
  103. 'num' => 10,
  104. 'direction' => 'BUY' // 字符串格式的枚举
  105. ];
  106. // 创建验证对象(模拟)
  107. // 注意:这里我们不能直接实例化Validation类,因为它需要特定的上下文
  108. // 我们只测试相关的逻辑
  109. // 测试direction转换逻辑
  110. $direction = $mockData['direction'];
  111. $directionValue = match(strtoupper($direction)) {
  112. 'SELL' => MEX_DIRECTION::SELL,
  113. 'BUY' => MEX_DIRECTION::BUY,
  114. 'DIRECTION_NONE' => MEX_DIRECTION::DIRECTION_NONE,
  115. default => $direction
  116. };
  117. $results['direction_conversion'] = [
  118. 'input' => $direction,
  119. 'output' => $directionValue,
  120. 'success' => is_int($directionValue)
  121. ];
  122. // 测试默认币种添加逻辑
  123. $defaultCurrency = FundLogic::getDefaultCurrency();
  124. $results['default_currency_addition'] = [
  125. 'currency_value' => $defaultCurrency->value,
  126. 'currency_name' => $defaultCurrency->name,
  127. 'success' => true
  128. ];
  129. } catch (\Exception $e) {
  130. $results['validation_preprocessing'] = [
  131. 'success' => false,
  132. 'error' => $e->getMessage()
  133. ];
  134. }
  135. return $results;
  136. }
  137. /**
  138. * 测试资金验证逻辑的币种适配
  139. */
  140. public static function testFundValidationLogic(): array
  141. {
  142. $results = [];
  143. try {
  144. // 测试不同币种的精度处理
  145. $currencies = [
  146. FUND_CURRENCY_TYPE::JINBI, // 金币
  147. FUND_CURRENCY_TYPE::ZUANSHI, // 钻石
  148. ];
  149. foreach ($currencies as $currency) {
  150. $precision = $currency->getPrecision();
  151. $testAmount = 100.5;
  152. $storageAmount = (int)bcmul($testAmount, bcpow('10', $precision), 0);
  153. $displayAmount = bcdiv($storageAmount, bcpow('10', $precision), $precision);
  154. $results['currency_precision'][$currency->name] = [
  155. 'precision' => $precision,
  156. 'test_amount' => $testAmount,
  157. 'storage_amount' => $storageAmount,
  158. 'display_amount' => $displayAmount,
  159. 'conversion_correct' => bccomp($displayAmount, $testAmount, $precision) === 0
  160. ];
  161. }
  162. } catch (\Exception $e) {
  163. $results['fund_validation_logic'] = [
  164. 'success' => false,
  165. 'error' => $e->getMessage()
  166. ];
  167. }
  168. return $results;
  169. }
  170. /**
  171. * 运行所有测试
  172. */
  173. public static function runAllTests(): array
  174. {
  175. return [
  176. 'default_currency' => self::testDefaultCurrency(),
  177. 'validator_test' => self::testMexOrderValidator(),
  178. 'validation_preprocessing' => self::testValidationPreprocessing(),
  179. 'fund_validation_logic' => self::testFundValidationLogic(),
  180. 'test_time' => date('Y-m-d H:i:s'),
  181. ];
  182. }
  183. }