$defaultCurrency->value, 'name' => $defaultCurrency->name, 'success' => true ]; // 测试默认币种的账户映射 $availableAccount = FundLogic::getAvailableAccountType($defaultCurrency); $frozenAccount = FundLogic::getFrozenAccountType($defaultCurrency); $results['default_currency_mapping'] = [ 'available_account' => $availableAccount?->value, 'frozen_account' => $frozenAccount?->value, 'success' => true ]; } catch (\Exception $e) { $results['default_currency'] = [ 'success' => false, 'error' => $e->getMessage() ]; } return $results; } /** * 测试MexOrderValidator的币种支持 */ public static function testMexOrderValidator(): array { $results = []; try { // 模拟验证数据 $testData = [ 'user_id' => 1001, 'itemId' => 10001, 'num' => 10, 'price' => 2.5, 'currency_type' => FUND_CURRENCY_TYPE::ZUANSHI->value, // 钻石币种 ]; // 注意:我们不能直接实例化MexOrderValidator,因为它需要ValidationCore实例 // 我们只测试相关的逻辑 $results['validator_creation'] = [ 'success' => true, 'message' => 'MexOrderValidator逻辑测试(无需实例化)' ]; // 测试币种解析逻辑 $currencyType = FUND_CURRENCY_TYPE::tryFrom($testData['currency_type']); $results['currency_parsing'] = [ 'input_value' => $testData['currency_type'], 'parsed_currency' => $currencyType?->name, 'success' => $currencyType !== null ]; // 测试账户类型获取逻辑 if ($currencyType) { $availableAccountType = FundLogic::getAvailableAccountType($currencyType); $frozenAccountType = FundLogic::getFrozenAccountType($currencyType); $results['account_type_mapping'] = [ 'currency' => $currencyType->name, 'available_account' => $availableAccountType?->value, 'frozen_account' => $frozenAccountType?->value, 'success' => $availableAccountType !== null && $frozenAccountType !== null ]; } } catch (\Exception $e) { $results['validator_test'] = [ 'success' => false, 'error' => $e->getMessage() ]; } return $results; } /** * 测试MatchexchangeAddValidation的币种预处理 */ public static function testValidationPreprocessing(): array { $results = []; try { // 模拟protobuf请求数据 $mockData = [ 'user_id' => 1001, 'itemId' => 10001, 'price' => 2.5, 'num' => 10, 'direction' => 'BUY' // 字符串格式的枚举 ]; // 创建验证对象(模拟) // 注意:这里我们不能直接实例化Validation类,因为它需要特定的上下文 // 我们只测试相关的逻辑 // 测试direction转换逻辑 $direction = $mockData['direction']; $directionValue = match(strtoupper($direction)) { 'SELL' => MEX_DIRECTION::SELL, 'BUY' => MEX_DIRECTION::BUY, 'DIRECTION_NONE' => MEX_DIRECTION::DIRECTION_NONE, default => $direction }; $results['direction_conversion'] = [ 'input' => $direction, 'output' => $directionValue, 'success' => is_int($directionValue) ]; // 测试默认币种添加逻辑 $defaultCurrency = FundLogic::getDefaultCurrency(); $results['default_currency_addition'] = [ 'currency_value' => $defaultCurrency->value, 'currency_name' => $defaultCurrency->name, 'success' => true ]; } catch (\Exception $e) { $results['validation_preprocessing'] = [ 'success' => false, 'error' => $e->getMessage() ]; } return $results; } /** * 测试资金验证逻辑的币种适配 */ public static function testFundValidationLogic(): array { $results = []; try { // 测试不同币种的精度处理 $currencies = [ FUND_CURRENCY_TYPE::JINBI, // 金币 FUND_CURRENCY_TYPE::ZUANSHI, // 钻石 ]; foreach ($currencies as $currency) { $precision = $currency->getPrecision(); $testAmount = 100.5; $storageAmount = (int)bcmul($testAmount, bcpow('10', $precision), 0); $displayAmount = bcdiv($storageAmount, bcpow('10', $precision), $precision); $results['currency_precision'][$currency->name] = [ 'precision' => $precision, 'test_amount' => $testAmount, 'storage_amount' => $storageAmount, 'display_amount' => $displayAmount, 'conversion_correct' => bccomp($displayAmount, $testAmount, $precision) === 0 ]; } } catch (\Exception $e) { $results['fund_validation_logic'] = [ 'success' => false, 'error' => $e->getMessage() ]; } return $results; } /** * 运行所有测试 */ public static function runAllTests(): array { return [ 'default_currency' => self::testDefaultCurrency(), 'validator_test' => self::testMexOrderValidator(), 'validation_preprocessing' => self::testValidationPreprocessing(), 'fund_validation_logic' => self::testFundValidationLogic(), 'test_time' => date('Y-m-d H:i:s'), ]; } }