using System; using System.IO; namespace YLErp.Modules.EodModule { [TestClass] public class DividendBasketQueryTranslationTest { [TestMethod] public void DividendBasketQueriesUseEfTranslatableCommodityCondition() { var source = ReadDividendServiceSource(); var addDividendQuery = ExtractQuery( source, "var basketList =", "IEnumerable priceList = null;"); var executeStatusQuery = ExtractQuery( source, "var umList = DataCacheProvider.GetUnderlyingDataSource().AsQueryable(", ").Select(O => O.UnderlyingCode).ToArray();"); AssertQueryUsesCommodityCondition(addDividendQuery, "AddDividendInfos"); AssertQueryUsesCommodityCondition(executeStatusQuery, "checkDividendInfoExecuteStatus"); } private static void AssertQueryUsesCommodityCondition(string query, string methodName) { Assert.IsFalse( query.Contains("IsBasket()", StringComparison.Ordinal), $"{methodName} must not put IsBasket() in an IQueryable predicate."); Assert.IsTrue( query.Contains("O.CommodityCode == \"篮子标的\"", StringComparison.Ordinal), $"{methodName} must filter baskets with the EF-translatable CommodityCode condition."); } private static string ExtractQuery(string source, string startMarker, string endMarker) { var start = source.IndexOf(startMarker, StringComparison.Ordinal); Assert.IsTrue(start >= 0, $"Could not find query marker: {startMarker}"); var end = source.IndexOf(endMarker, start + startMarker.Length, StringComparison.Ordinal); Assert.IsTrue(end >= 0, $"Could not find query end marker: {endMarker}"); return source.Substring(start, end + endMarker.Length - start); } private static string ReadDividendServiceSource() { var directory = new DirectoryInfo(AppContext.BaseDirectory); while (directory != null) { var path = Path.Combine( directory.FullName, "YLErpDAL", "Modules", "TradeModule", "DealModule", "DividendService.cs"); if (File.Exists(path)) { return File.ReadAllText(path); } directory = directory.Parent; } Assert.Fail("Could not locate DividendService.cs from the test output directory."); return string.Empty; } } }