public void Should_Generate_ToString_Method_For_Partial_Fields() { // Arrange var updateSummaryMessageType = UpdateSummaryDynamicMessageTypesFactory.GenerateDynamicObjectType(PartialFields); // Act var emptyInstance = Activator.CreateInstance(updateSummaryMessageType); var parseMethod = updateSummaryMessageType.GetMethod("Parse", BindingFlags.Public | BindingFlags.Static); var parsedInstance = parseMethod.Invoke(null, new object[] { "P,AAPL,188.3500,52500,03/30/2021,19:59:14.503633,2" }); // generate the expected string values var expectedStringEmptyInstance = $"Symbol: <NULL>, MostRecentTrade: {default(double)}, MostRecentTradeSize: {default(int)}, " + $"MostRecentTradeDate: {default(DateTime)}, " + $"MostRecentTradeTime: {default(TimeSpan)}, " + $"MostRecentTradeAggressor: {default(int)}"; var expectedStringParsedInstance = $"Symbol: AAPL, MostRecentTrade: 188.35, MostRecentTradeSize: 52500, " + $"MostRecentTradeDate: {FieldParser.ParseDate("03/30/2021", FundamentalMessage.FundamentalDateTimeFormat)}, " + $"MostRecentTradeTime: {FieldParser.ParseTime("19:59:14.503633", UpdateSummaryMessage.UpdateMessageTimeFormat)}, " + $"MostRecentTradeAggressor: 2"; // Assert Assert.IsNotNull(emptyInstance); Assert.AreEqual(expectedStringEmptyInstance, emptyInstance.ToString()); Assert.IsNotNull(parsedInstance); Assert.AreEqual(expectedStringParsedInstance, parsedInstance.ToString()); }
public void Should_Generate_GetHashCode_Method_For_Partial_Fields() { // Arrange var updateSummaryMessageType = UpdateSummaryDynamicMessageTypesFactory.GenerateDynamicObjectType(PartialFields); // Act var emptyInstance = Activator.CreateInstance(updateSummaryMessageType); var parseMethod = updateSummaryMessageType.GetMethod("Parse", BindingFlags.Public | BindingFlags.Static); var parsedInstance = parseMethod.Invoke(null, new object[] { "P,AAPL,188.3500,52500,03/30/2021,19:59:14.503633,2" }); // calculate the expected hashes var expectedHashCodeEmptyInstance = 17; expectedHashCodeEmptyInstance = expectedHashCodeEmptyInstance * 29 + ((string)null).GetHashCodeOrDefault(); expectedHashCodeEmptyInstance = expectedHashCodeEmptyInstance * 29 + default(double).GetHashCode(); expectedHashCodeEmptyInstance = expectedHashCodeEmptyInstance * 29 + default(int).GetHashCode(); expectedHashCodeEmptyInstance = expectedHashCodeEmptyInstance * 29 + default(DateTime).GetHashCode(); expectedHashCodeEmptyInstance = expectedHashCodeEmptyInstance * 29 + default(TimeSpan).GetHashCode(); expectedHashCodeEmptyInstance = expectedHashCodeEmptyInstance * 29 + default(int).GetHashCode(); var expectedHashCodeParsedInstance = 17; expectedHashCodeParsedInstance = expectedHashCodeParsedInstance * 29 + "AAPL".GetHashCode(); expectedHashCodeParsedInstance = expectedHashCodeParsedInstance * 29 + 188.35.GetHashCode(); expectedHashCodeParsedInstance = expectedHashCodeParsedInstance * 29 + 52500.GetHashCode(); expectedHashCodeParsedInstance = expectedHashCodeParsedInstance * 29 + FieldParser.ParseDate("03/30/2021", FundamentalMessage.FundamentalDateTimeFormat).GetHashCode(); expectedHashCodeParsedInstance = expectedHashCodeParsedInstance * 29 + FieldParser.ParseTime("19:59:14.503633", UpdateSummaryMessage.UpdateMessageTimeFormat).GetHashCode(); expectedHashCodeParsedInstance = expectedHashCodeParsedInstance * 29 + 2.GetHashCode(); // Assert Assert.IsNotNull(emptyInstance); Assert.AreEqual(expectedHashCodeEmptyInstance, emptyInstance.GetHashCode()); Assert.IsNotNull(parsedInstance); Assert.AreEqual(expectedHashCodeParsedInstance, parsedInstance.GetHashCode()); }
public void Should_Generate_Parse_Method_For_Partial_Fields() { // Arrange var updateSummaryMessageType = UpdateSummaryDynamicMessageTypesFactory.GenerateDynamicObjectType(PartialFields); // Act var parseMethod = updateSummaryMessageType.GetMethod("Parse", BindingFlags.Public | BindingFlags.Static); var parsedInstance = parseMethod.Invoke(null, new object[] { "P,AAPL,188.3500,52500,03/30/2021,19:59:14.503633,3" }); var typedParsedInstance = parsedInstance as IUpdateSummaryDynamicMessage; // Assert Assert.IsNotNull(parsedInstance); Assert.IsNotNull(typedParsedInstance); Assert.AreEqual("AAPL", typedParsedInstance.Symbol); Assert.AreEqual(188.35, typedParsedInstance.MostRecentTrade); Assert.AreEqual(52500, typedParsedInstance.MostRecentTradeSize); Assert.AreEqual(FieldParser.ParseDate("03/30/2021", FundamentalMessage.FundamentalDateTimeFormat), typedParsedInstance.MostRecentTradeDate); Assert.AreEqual(FieldParser.ParseTime("19:59:14.503633", UpdateSummaryMessage.UpdateMessageTimeFormat), typedParsedInstance.MostRecentTradeTime); Assert.AreEqual(3, typedParsedInstance.MostRecentTradeAggressor); }
public static UpdateSummaryMessage Parse(string message) { var values = message.SplitFeedMessage(); var symbol = values[1]; // field 2 var mostRecentTrade = FieldParser.ParseDouble(values[2]); // field 71 var mostRecentTradeSize = FieldParser.ParseInt(values[3]); // field 72 var mostRecentTradeTime = FieldParser.ParseDate(values[4], UpdateMessageTimeFormat); var mostRecentTradeMarketCenter = FieldParser.ParseInt(values[5]); // field 75 var totalVolume = FieldParser.ParseInt(values[6]); // field 7 var bid = FieldParser.ParseDouble(values[7]); // field 11 var bidSize = FieldParser.ParseInt(values[8]); // field 13 var ask = FieldParser.ParseDouble(values[9]); // field 12 var askSize = FieldParser.ParseInt(values[10]); // field 14 var open = FieldParser.ParseDouble(values[11]); // field 20 var high = FieldParser.ParseDouble(values[12]); // field 9 var low = FieldParser.ParseDouble(values[13]); // field 10 var close = FieldParser.ParseDouble(values[14]); // field 21 var messageContents = values[15]; // field 80 var mostRecentTradeConditions = values[16]; // field 74 return(new UpdateSummaryMessage( symbol, mostRecentTrade, mostRecentTradeSize, mostRecentTradeTime, mostRecentTradeMarketCenter, totalVolume, bid, bidSize, ask, askSize, open, high, low, close, messageContents, mostRecentTradeConditions )); }
public static Level1DynamicFields Parse(string message, DynamicFieldset[] fields) { var values = message.SplitFeedMessage(); #region Variables double sevenDayYield = default; double ask = default; double askChange = default; int askMarketCenter = default; int askSize = default; TimeSpan askTime = default; string availableRegions = default; double averageMaturity = default; double bid = default; double bidChange = default; int bidMarketCenter = default; int bidSize = default; TimeSpan bidTime = default; double change = default; double changeFromOpen = default; double close = default; double closeRange1 = default; double closeRange2 = default; string daysToExpiration = default; string decimalPrecision = default; int delay = default; string exchangeID = default; double extendedTrade = default; DateTime extendedTradeDate = default; int extendedTradeMarketCenter = default; int extendedTradeSize = default; TimeSpan extendedTradeTime = default; double extendedTradingChange = default; double extendedTradingDifference = default; string financialStatusIndicator = default; string fractionDisplayCode = default; double high = default; double last = default; DateTime lastDate = default; int lastMarketCenter = default; int lastSize = default; TimeSpan lastTime = default; double low = default; double marketCapitalization = default; int marketOpen = default; string messageContents = default; double mostRecentTrade = default; int mostRecentTradeAggressor = default; string mostRecentTradeConditions = default; DateTime mostRecentTradeDate = default; int mostRecentTradeDayCode = default; int mostRecentTradeMarketCenter = default; int mostRecentTradeSize = default; TimeSpan mostRecentTradeTime = default; double netAssetValue = default; int numberOfTradesToday = default; double open = default; int openInterest = default; double openRange1 = default; double openRange2 = default; double percentChange = default; double percentOffAverageVolume = default; int previousDayVolume = default; double priceEarningsRatio = default; double range = default; string restrictedCode = default; double settle = default; DateTime settlementDate = default; double spread = default; string symbol = default; int tick = default; int tickID = default; int totalVolume = default; double volatility = default; double vwap = default; #endregion string type = values[0]; for (var i = 0; i < fields.Length; i++) { var field = fields[i]; var value = values[i + 1]; switch (field) { case DynamicFieldset.SevenDayYield: sevenDayYield = FieldParser.ParseDouble(value); break; case DynamicFieldset.Ask: ask = FieldParser.ParseDouble(value); break; case DynamicFieldset.AskChange: askChange = FieldParser.ParseDouble(value); break; case DynamicFieldset.AskMarketCenter: askMarketCenter = FieldParser.ParseInt(value); break; case DynamicFieldset.AskSize: askSize = FieldParser.ParseInt(value); break; case DynamicFieldset.AskTime: askTime = FieldParser.ParseTime(value, UpdateMessageTimeFormat); break; case DynamicFieldset.AvailableRegions: availableRegions = value; break; case DynamicFieldset.AverageMaturity: averageMaturity = FieldParser.ParseDouble(value); break; case DynamicFieldset.Bid: bid = FieldParser.ParseDouble(value); break; case DynamicFieldset.BidChange: bidChange = FieldParser.ParseDouble(value); break; case DynamicFieldset.BidMarketCenter: bidMarketCenter = FieldParser.ParseInt(value); break; case DynamicFieldset.BidSize: bidSize = FieldParser.ParseInt(value); break; case DynamicFieldset.BidTime: bidTime = FieldParser.ParseTime(value, UpdateMessageTimeFormat); break; case DynamicFieldset.Change: change = FieldParser.ParseDouble(value); break; case DynamicFieldset.ChangeFromOpen: changeFromOpen = FieldParser.ParseDouble(value); break; case DynamicFieldset.Close: close = FieldParser.ParseDouble(value); break; case DynamicFieldset.CloseRange1: closeRange1 = FieldParser.ParseDouble(value); break; case DynamicFieldset.CloseRange2: closeRange2 = FieldParser.ParseDouble(value); break; case DynamicFieldset.DaysToExpiration: daysToExpiration = value; break; case DynamicFieldset.DecimalPrecision: decimalPrecision = value; break; case DynamicFieldset.Delay: delay = FieldParser.ParseInt(value); break; case DynamicFieldset.ExchangeID: exchangeID = value; break; case DynamicFieldset.ExtendedTrade: extendedTrade = FieldParser.ParseDouble(value); break; case DynamicFieldset.ExtendedTradeDate: extendedTradeDate = FieldParser.ParseDate(value, UpdateMessageDateFormat); break; case DynamicFieldset.ExtendedTradeMarketCenter: extendedTradeMarketCenter = FieldParser.ParseInt(value); break; case DynamicFieldset.ExtendedTradeSize: extendedTradeSize = FieldParser.ParseInt(value); break; case DynamicFieldset.ExtendedTradeTime: extendedTradeTime = FieldParser.ParseTime(value, UpdateMessageTimeFormat); break; case DynamicFieldset.ExtendedTradingChange: extendedTradingChange = FieldParser.ParseDouble(value); break; case DynamicFieldset.ExtendedTradingDifference: extendedTradingDifference = FieldParser.ParseDouble(value); break; case DynamicFieldset.FinancialStatusIndicator: financialStatusIndicator = value; break; case DynamicFieldset.FractionDisplayCode: fractionDisplayCode = value; break; case DynamicFieldset.High: high = FieldParser.ParseDouble(value); break; case DynamicFieldset.Last: last = FieldParser.ParseDouble(value); break; case DynamicFieldset.LastDate: lastDate = FieldParser.ParseDate(value, UpdateMessageDateFormat); break; case DynamicFieldset.LastMarketCenter: lastMarketCenter = FieldParser.ParseInt(value); break; case DynamicFieldset.LastSize: lastSize = FieldParser.ParseInt(value); break; case DynamicFieldset.LastTime: lastTime = FieldParser.ParseTime(value, UpdateMessageTimeFormat); break; case DynamicFieldset.Low: low = FieldParser.ParseDouble(value); break; case DynamicFieldset.MarketCapitalization: marketCapitalization = FieldParser.ParseDouble(value); break; case DynamicFieldset.MarketOpen: marketOpen = FieldParser.ParseInt(value); break; case DynamicFieldset.MessageContents: messageContents = value; break; case DynamicFieldset.MostRecentTrade: mostRecentTrade = FieldParser.ParseDouble(value); break; case DynamicFieldset.MostRecentTradeAggressor: mostRecentTradeAggressor = FieldParser.ParseInt(value); break; case DynamicFieldset.MostRecentTradeConditions: mostRecentTradeConditions = value; break; case DynamicFieldset.MostRecentTradeDate: mostRecentTradeDate = FieldParser.ParseDate(value, UpdateMessageDateFormat); break; case DynamicFieldset.MostRecentTradeDayCode: mostRecentTradeDayCode = FieldParser.ParseInt(value); break; case DynamicFieldset.MostRecentTradeMarketCenter: mostRecentTradeMarketCenter = FieldParser.ParseInt(value); break; case DynamicFieldset.MostRecentTradeSize: mostRecentTradeSize = FieldParser.ParseInt(value); break; case DynamicFieldset.MostRecentTradeTime: mostRecentTradeTime = FieldParser.ParseTime(value, UpdateMessageTimeFormat); break; case DynamicFieldset.NetAssetValue: netAssetValue = FieldParser.ParseDouble(value); break; case DynamicFieldset.NumberOfTradesToday: numberOfTradesToday = FieldParser.ParseInt(value); break; case DynamicFieldset.Open: open = FieldParser.ParseDouble(value); break; case DynamicFieldset.OpenInterest: openInterest = FieldParser.ParseInt(value); break; case DynamicFieldset.OpenRange1: openRange1 = FieldParser.ParseDouble(value); break; case DynamicFieldset.OpenRange2: openRange2 = FieldParser.ParseDouble(value); break; case DynamicFieldset.PercentChange: percentChange = FieldParser.ParseDouble(value); break; case DynamicFieldset.PercentOffAverageVolume: percentOffAverageVolume = FieldParser.ParseDouble(value); break; case DynamicFieldset.PreviousDayVolume: previousDayVolume = FieldParser.ParseInt(value); break; case DynamicFieldset.PriceEarningsRatio: priceEarningsRatio = FieldParser.ParseDouble(value); break; case DynamicFieldset.Range: range = FieldParser.ParseDouble(value); break; case DynamicFieldset.RestrictedCode: restrictedCode = value; break; case DynamicFieldset.Settle: settle = FieldParser.ParseDouble(value); break; case DynamicFieldset.SettlementDate: settlementDate = FieldParser.ParseDate(value, UpdateMessageDateFormat); break; case DynamicFieldset.Spread: spread = FieldParser.ParseDouble(value); break; case DynamicFieldset.Symbol: symbol = value; break; case DynamicFieldset.Tick: tick = FieldParser.ParseInt(value); break; case DynamicFieldset.TickID: tickID = FieldParser.ParseInt(value); break; case DynamicFieldset.TotalVolume: totalVolume = FieldParser.ParseInt(value); break; case DynamicFieldset.Type: type = value; break; case DynamicFieldset.Volatility: volatility = FieldParser.ParseDouble(value); break; case DynamicFieldset.VWAP: vwap = FieldParser.ParseDouble(value); break; } } return(new Level1DynamicFields( sevenDayYield, ask, askChange, askMarketCenter, askSize, askTime, availableRegions, averageMaturity, bid, bidChange, bidMarketCenter, bidSize, bidTime, change, changeFromOpen, close, closeRange1, closeRange2, daysToExpiration, decimalPrecision, delay, exchangeID, extendedTrade, extendedTradeDate, extendedTradeMarketCenter, extendedTradeSize, extendedTradeTime, extendedTradingChange, extendedTradingDifference, financialStatusIndicator, fractionDisplayCode, high, last, lastDate, lastMarketCenter, lastSize, lastTime, low, marketCapitalization, marketOpen, messageContents, mostRecentTrade, mostRecentTradeAggressor, mostRecentTradeConditions, mostRecentTradeDate, mostRecentTradeDayCode, mostRecentTradeMarketCenter, mostRecentTradeSize, mostRecentTradeTime, netAssetValue, numberOfTradesToday, open, openInterest, openRange1, openRange2, percentChange, percentOffAverageVolume, previousDayVolume, priceEarningsRatio, range, restrictedCode, settle, settlementDate, spread, symbol, tick, tickID, totalVolume, type, volatility, vwap)); }