SwapDealService的10个private static纯逻辑方法搬到两个新文件: - UnwindNormalizer.cs: NormalizeNotionalValues/FullCloseRequest/Recalculate/IsFullClose/SettledInterestAmounts/EventUnwindDate (6个) - TradingFeeCalc.cs: CalcInitTradingFee/CalcInitTradingFeePending (2个) SwapDealService内21处调用点加类名前缀, 反射测试改为直接调用(public) SwapModule零回归(7基线/510通过)
130 lines
4.4 KiB
C#
130 lines
4.4 KiB
C#
using YLErp.DBModels;
|
|
|
|
namespace YLErp.Modules.SwapModule
|
|
{
|
|
[TestClass]
|
|
public class InitUnwindTradingFeeTest
|
|
{
|
|
private static decimal InvokeCalcInitTradingFee(swap_position position, UnwindData unwindData)
|
|
=> TradingFeeCalc.CalcInitTradingFee(position, unwindData);
|
|
|
|
private static decimal InvokeCalcInitTradingFeePending(swap_position oriPosition, swap_position position, UnwindData unwindData)
|
|
=> TradingFeeCalc.CalcInitTradingFeePending(oriPosition, position, unwindData);
|
|
|
|
[TestMethod]
|
|
public void 百分比模式_按平仓名义本金计算并四舍五入到两位()
|
|
{
|
|
var position = new swap_position
|
|
{
|
|
PosiFeeType = 0,
|
|
PosiTradingFeeUnit = 0.1234m,
|
|
PosiTradingFeePending = 1234.00m
|
|
};
|
|
var unwindData = new UnwindData
|
|
{
|
|
NotionalValue = 1_000_000m,
|
|
CloseNotionalValue = 1_000_000m,
|
|
CloseQty = 8888m
|
|
};
|
|
|
|
var fee = InvokeCalcInitTradingFee(position, unwindData);
|
|
|
|
Assert.AreEqual(1234.00m, fee);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void 单位数量模式_按平仓数量计算并四舍五入到两位()
|
|
{
|
|
var position = new swap_position
|
|
{
|
|
PosiFeeType = 1,
|
|
PosiTradingFeeUnit = 1.235m,
|
|
PosiTradingFeePending = 12.35m
|
|
};
|
|
var unwindData = new UnwindData
|
|
{
|
|
NotionalQty = 10m,
|
|
CloseNotionalValue = 1_000_000m,
|
|
CloseQty = 10m
|
|
};
|
|
|
|
var fee = InvokeCalcInitTradingFee(position, unwindData);
|
|
|
|
Assert.AreEqual(12.35m, fee);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void 空入参_返回零()
|
|
{
|
|
Assert.AreEqual(0m, InvokeCalcInitTradingFee(null, new UnwindData()));
|
|
Assert.AreEqual(0m, InvokeCalcInitTradingFee(new swap_position(), null));
|
|
}
|
|
|
|
[TestMethod]
|
|
public void BaseRatePendingFeeUsesTheSameActualCloseAmountAsCloseFee()
|
|
{
|
|
var oriPosition = new swap_position
|
|
{
|
|
PosiFeeType = 1,
|
|
PosiTradingFeeUnit = 0.2m
|
|
};
|
|
oriPosition.PosiTradingFeePending = 2000m;
|
|
var position = new swap_position { PosiTradingFeePending = 840m };
|
|
var unwindData = new UnwindData { NotionalQty = 10000m, CloseQty = 3000m, CloseNotionalValue = 4200m };
|
|
|
|
var fee = InvokeCalcInitTradingFeePending(oriPosition, position, unwindData);
|
|
|
|
Assert.AreEqual(600m, fee);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void BaseRatePendingFeeAllocatesManuallyAdjustedOriginalPendingFee()
|
|
{
|
|
var oriPosition = new swap_position
|
|
{
|
|
PosiFeeType = 1,
|
|
PosiTradingFeeUnit = 0.2m,
|
|
PosiTradingFeePending = 1500m
|
|
};
|
|
var unwindData = new UnwindData { NotionalQty = 10000m, CloseQty = 3000m };
|
|
|
|
var fee = InvokeCalcInitTradingFeePending(oriPosition, new swap_position(), unwindData);
|
|
|
|
Assert.AreEqual(450m, fee);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void ManuallyAdjustedPendingFeeDoesNotOverrideBaseRateCloseFee()
|
|
{
|
|
var oriPosition = new swap_position
|
|
{
|
|
PosiFeeType = 1,
|
|
PosiTradingFeeUnit = 0.123456m,
|
|
PosiTradingFeePending = 1235.56m
|
|
};
|
|
var unwindData = new UnwindData
|
|
{
|
|
NotionalQty = 10000m,
|
|
CloseQty = 10000m
|
|
};
|
|
|
|
var tradingFee = InvokeCalcInitTradingFee(oriPosition, unwindData);
|
|
var pendingFee = InvokeCalcInitTradingFeePending(oriPosition, new swap_position(), unwindData);
|
|
|
|
Assert.AreEqual(1234.56m, tradingFee);
|
|
Assert.AreEqual(1235.56m, pendingFee);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void LegacyPendingFeeKeepsCurrentPositionValueWhenNoBaseRateIsConfigured()
|
|
{
|
|
var oriPosition = new swap_position { PosiTradingFeeUnit = 0m };
|
|
var position = new swap_position { PosiTradingFeePending = 840m };
|
|
|
|
var fee = InvokeCalcInitTradingFeePending(oriPosition, position, new UnwindData());
|
|
|
|
Assert.AreEqual(840m, fee);
|
|
}
|
|
}
|
|
}
|