using YLErp.Modules.UnderlyingModule; namespace YLErp.UnitTestProject.Modules.UnderlyingModule { [TestClass] public class UnderlyingHelperTest : YLUnitTestBase { [TestMethod] public void GetApplicableMarginTerm_RuleTable_AllCases() { // 发行期限不限(OpenDate=null),测试(0.00,2.00],应返回2年 var code1 = "UNLIMITED_2Y"; var maturity1 = new DateTime(2030, 1, 1); var underlying1 = CreateTestUnderlying ( code1, null,maturity1); var valueDate1 = maturity1.AddYears(-1); // 剩余1年 var result1=UnderlyingHelper.GetApplicableMarginTerm(code1, valueDate1); Assert.AreEqual(ConsMarginTerm.TwoYear, result1, "(0,2]年 不限 应为2年"); // (2.00,2.25] <5年,应返回2年 var code2 = "LT5_2_25"; var open2 = new DateTime(2020, 1, 1); var maturity2 = new DateTime(2024, 3, 1); // 4.17年 var underlying2 = CreateTestUnderlying(code2, open2, maturity2); var valueDate2 = maturity2.AddYears(-2).AddMonths(-2); // 剩余约2.17年 var result2 = UnderlyingHelper.GetApplicableMarginTerm(code2, valueDate2); Assert.AreEqual(ConsMarginTerm.TwoYear, result2, "(2,2.25]年 <5 应为2年"); // (2.00,2.25] >=5年,应返回5年 var code3 = "GE5_2_25"; var open3 = new DateTime(2020, 1, 1); var maturity3 = new DateTime(2026, 1, 1); // 6年 var underlying3 = CreateTestUnderlying(code3, open3, maturity3); var valueDate3_2 = maturity3.AddYears(-2).AddMonths(-1); // 剩余约2.08年 var result3 = UnderlyingHelper.GetApplicableMarginTerm(code3, valueDate3_2); Assert.AreEqual(ConsMarginTerm.FiveYear, result3, "(2,2.25]年 >=5 应为5年"); // (2.25,5.00] 不限,应返回5年 var code4 = "UNLIMITED_5Y"; var maturity4 = new DateTime(2030, 1, 1); var underlying4 = CreateTestUnderlying(code4, null, maturity4); var valueDate4 = maturity4.AddYears(-3); // 剩余3年 var result4 = UnderlyingHelper.GetApplicableMarginTerm(code4, valueDate4); Assert.AreEqual(ConsMarginTerm.FiveYear, result4, "(2.25,5]年 不限 应为5年"); // (5.00,5.25] <7年,应返回5年 var code5 = "LT7_5_25"; var open5 = new DateTime(2020, 1, 1); var maturity5 = new DateTime(2026, 1, 1); // 6年 var underlying5 = CreateTestUnderlying(code5, open5, maturity5); var valueDate5 = maturity5.AddYears(-5).AddMonths(-1); // 剩余约5.08年 var result5 = UnderlyingHelper.GetApplicableMarginTerm(underlying5.UnderlyingCode, valueDate5); Assert.AreEqual(ConsMarginTerm.FiveYear, result5, "(5,5.25]年 <7 应为5年"); // (5.00,5.25] >=7年,应返回10年 var code6 = "GE7_5_25"; var open6 = new DateTime(2015, 1, 1); var maturity6 = new DateTime(2023, 2, 1); // 8.08年 var underlying6 = CreateTestUnderlying(code6, open6, maturity6); var valueDate6 = maturity6.AddYears(-5).AddMonths(-1); // 剩余约5.08年 var result6 = UnderlyingHelper.GetApplicableMarginTerm(code6, valueDate6); Assert.AreEqual(ConsMarginTerm.TenYear, result6, "(5,5.25]年 >=7 应为10年"); // (5.25,25.00] 不限,应返回10年 var code7 = "UNLIMITED_10Y"; var maturity7 = new DateTime(2040, 1, 1); var underlying7 = CreateTestUnderlying(code7, null, maturity7); var valueDate7 = maturity7.AddYears(-10); // 剩余10年 var result7 = UnderlyingHelper.GetApplicableMarginTerm(code7, valueDate7); Assert.AreEqual(ConsMarginTerm.TenYear, result7, "(5.25,25]年 不限 应为10年"); // (25.00,30.00] 不限,应返回30年 var code8 = "UNLIMITED_30Y"; var maturity8 = new DateTime(2050, 1, 1); var underlying8 = CreateTestUnderlying(code8, null, maturity8); var valueDate8 = maturity8.AddYears(-28); // 剩余28年 var result8 = UnderlyingHelper.GetApplicableMarginTerm(code8, valueDate8); Assert.AreEqual(ConsMarginTerm.ThirtyYear, result8, "(25,30]年 不限 应为30年"); var code9 = "INVALID_TERM"; DateTime? maturity9 = null; var underlying9 = CreateTestUnderlying(code9, null, maturity9); var valueDate9 = DateTime.Now.Date; var result9 = UnderlyingHelper.GetApplicableMarginTerm(code9, valueDate9); Assert.AreEqual(ConsMarginTerm.Default, result9, "无效的到期日 不限 应为默认"); } #region 辅助方法 /// /// 创建测试用的标的对象 /// private underlying_manager CreateTestUnderlying(string code, DateTime? openDate, DateTime? maturityDate) { DbContext.Database.ExecuteSqlRaw($"DELETE FROM underlying_manager WHERE UnderlyingCode = '{code}'"); var underlying = new underlying_manager { UnderlyingCode = code, OpenDate = openDate, MaturityDate = maturityDate, UnderlyingName = $"测试标的{code}", MarketCode = "TEST", MarketName = "测试市场", OptDate = DateTime.Now, OptId = UserId, OptName = UserName }; // 添加到数据库 DbContext.underlying_manager.Add(underlying); DbContext.SaveChanges(); // 添加到清理列表 AddClearSQL($"DELETE FROM underlying_manager WHERE UnderlyingCode = '{code}';"); return underlying; } /// /// 添加清理SQL /// private void AddClearSQL(string sql) { // _clearSQL 字段在 YLUnitTestBase 中定义 // 这里假设 _clearSQL 是 protected 或 internal if (!string.IsNullOrWhiteSpace(sql)) { _clearSQL.AppendLine(sql); } } #endregion } }