From c7e813848be1348f6f4d601dfb97d2bc7c914497 Mon Sep 17 00:00:00 2001 From: Sean Kessler Date: Sun, 3 Mar 2024 22:51:59 -0500 Subject: [PATCH] Initial Commit --- MarketDataUnitTests/.gitignore | 4 + .../.vs/MarketDataUnitTests/v16/.suo | Bin 0 -> 163328 bytes .../v16/TestStore/0/015.testlog | Bin 0 -> 110769 bytes .../v16/TestStore/0/testlog.manifest | Bin 0 -> 24 bytes MarketDataUnitTests/App.config | 23 ++ MarketDataUnitTests/MarketDataFeedTests.cs | 373 ++++++++++++++++++ .../MarketDataUnitTests.csproj | 75 ++++ MarketDataUnitTests/MarketDataUnitTests.sln | 31 ++ .../Properties/AssemblyInfo.cs | 20 + MarketDataUnitTests/packages.config | 5 + 10 files changed, 531 insertions(+) create mode 100644 MarketDataUnitTests/.gitignore create mode 100644 MarketDataUnitTests/.vs/MarketDataUnitTests/v16/.suo create mode 100644 MarketDataUnitTests/.vs/MarketDataUnitTests/v16/TestStore/0/015.testlog create mode 100644 MarketDataUnitTests/.vs/MarketDataUnitTests/v16/TestStore/0/testlog.manifest create mode 100644 MarketDataUnitTests/App.config create mode 100644 MarketDataUnitTests/MarketDataFeedTests.cs create mode 100644 MarketDataUnitTests/MarketDataUnitTests.csproj create mode 100644 MarketDataUnitTests/MarketDataUnitTests.sln create mode 100644 MarketDataUnitTests/Properties/AssemblyInfo.cs create mode 100644 MarketDataUnitTests/packages.config diff --git a/MarketDataUnitTests/.gitignore b/MarketDataUnitTests/.gitignore new file mode 100644 index 0000000..cbc1d6a --- /dev/null +++ b/MarketDataUnitTests/.gitignore @@ -0,0 +1,4 @@ +/TestResults +/bin +/obj +/packages diff --git a/MarketDataUnitTests/.vs/MarketDataUnitTests/v16/.suo b/MarketDataUnitTests/.vs/MarketDataUnitTests/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..ae80e60892124768baf041de79b79eb538f5954c GIT binary patch literal 163328 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 literal 0 HcmV?d00001 diff --git a/MarketDataUnitTests/.vs/MarketDataUnitTests/v16/TestStore/0/testlog.manifest b/MarketDataUnitTests/.vs/MarketDataUnitTests/v16/TestStore/0/testlog.manifest new file mode 100644 index 0000000000000000000000000000000000000000..f55640ac88d4d68fddb5a1ad1502aae9986ee691 GIT binary patch literal 24 bcmXR;&-W=QP7PsZU|`?}Vi0iT5=;UBM7RV7 literal 0 HcmV?d00001 diff --git a/MarketDataUnitTests/App.config b/MarketDataUnitTests/App.config new file mode 100644 index 0000000..cb59fb9 --- /dev/null +++ b/MarketDataUnitTests/App.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MarketDataUnitTests/MarketDataFeedTests.cs b/MarketDataUnitTests/MarketDataFeedTests.cs new file mode 100644 index 0000000..c0da91b --- /dev/null +++ b/MarketDataUnitTests/MarketDataFeedTests.cs @@ -0,0 +1,373 @@ +using MarketData; +using MarketData.DataAccess; +using MarketData.Helper; +using MarketData.MarketDataModel; +using MarketData.Utils; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; + +namespace MarketDataUnitTests +{ + [TestClass] + public class MarketDataFeedTests + { + + [TestMethod] +// [Ignore] + public void ETFHoldsingsYahooRetrieval() // The feed layout has chnaged + { + String etfSymbol="ACWX"; + ETFHoldings etfHoldings=MarketDataHelper.GetETFHoldings(etfSymbol); + Assert.IsTrue(null!=etfHoldings && etfHoldings.Count>0); + } + + [TestMethod] + public void LatestPriceYahoo2Retrieval() // The feed layout has changed + { +// String symbol="AAPL"; +// String symbol="JFNNX"; + String symbol="1234"; + Price price=MarketDataHelper.GetLatestPriceYahoo2(symbol); + Assert.IsTrue(null!=price,"No Price"); + Assert.IsTrue(price.IsValid,"Invalid Price"); + } + + [TestMethod] + [Ignore] + public void LatestPriceYahooRetrieval() // The feed layout has changed + { + String symbol="AAPL"; + Price price=MarketDataHelper.GetLatestPriceYahoo(symbol); + Assert.IsTrue(null!=price,"No Price"); + Assert.IsTrue(price.IsValid,"Invalid Price"); + } + + // This test only passes when the web proxy is bypassed + [TestMethod] + public void FundamentalYahooRetrieval() + { + String symbol = "MIDD"; + Fundamental fundamental=MarketDataHelper.GetFundamental(symbol); + Assert.IsTrue(null!=fundamental); +// Assert.IsTrue(!Utility.IsEpoch(fundamental.NextEarningsDate),"NextEarningsDate"); +// Assert.IsTrue(!double.IsNaN(fundamental.Beta),"Beta"); + Assert.IsTrue(!double.IsNaN(fundamental.Low52),"Low52"); + Assert.IsTrue(!double.IsNaN(fundamental.High52),"High52"); + Assert.IsTrue(!double.IsNaN(fundamental.Volume),"Volume"); +// Assert.IsTrue(!double.IsNaN(fundamental.MarketCap),"MarketCap"); + Assert.IsTrue(!double.IsNaN(fundamental.PE),"PE"); + Assert.IsTrue(!double.IsNaN(fundamental.EPS),"EPS"); +// Assert.IsTrue(!double.IsNaN(fundamental.PEG),"PEG"); + Assert.IsTrue(!double.IsNaN(fundamental.ReturnOnAssets),"ReturnOnAssets"); + Assert.IsTrue(!double.IsNaN(fundamental.ReturnOnEquity),"ReturnOnEquity"); + Assert.IsTrue(!double.IsNaN(fundamental.TotalCash),"TotalCash"); + Assert.IsTrue(!double.IsNaN(fundamental.TotalDebt),"TotalDebt"); +// Assert.IsTrue(!double.IsNaN(fundamental.SharesOutstanding),"SharesOutstanding"); + Assert.IsTrue(!double.IsNaN(fundamental.Revenue),"Revenue"); + Assert.IsTrue(!double.IsNaN(fundamental.RevenuePerShare),"RevenuePerShare"); + Assert.IsTrue(!double.IsNaN(fundamental.QtrlyRevenueGrowth),"QtrlyRevenueGrowth"); +// Assert.IsTrue(!double.IsNaN(fundamental.GrossProfit),"GrossProfit"); + Assert.IsTrue(!double.IsNaN(fundamental.EBITDA),"EBITDA"); + Assert.IsTrue(!double.IsNaN(fundamental.NetIncomeAvailableToCommon),"NetIncomeAvailableToCommon"); + Assert.IsTrue(!double.IsNaN(fundamental.BookValuePerShare),"BookValuePerShare"); + Assert.IsTrue(!double.IsNaN(fundamental.OperatingCashflow),"OperatingCashflow"); + Assert.IsTrue(!double.IsNaN(fundamental.LeveragedFreeCashflow),"LeveragedFreeCashflow"); + Assert.IsTrue(!double.IsNaN(fundamental.Equity),"Equity"); + Assert.IsTrue(!double.IsNaN(fundamental.TrailingPE),"TrailingPE"); + Assert.IsTrue(!double.IsNaN(fundamental.EnterpriseValue),"EnterpriseValue"); +// Assert.IsTrue(!double.IsNaN(fundamental.EBIT),"EBIT"); + Assert.IsTrue(!double.IsNaN(fundamental.DebtToEquity),"DebtToEquity"); + } + + [TestMethod] + public void DividendHistoryRetrieval() + { + Dictionary items=new Dictionary(); + String dividendSymbol="AAPL"; + DividendHistory dividendHistory=MarketDataHelper.GetDividendHistory(dividendSymbol); + Assert.IsTrue(null!=dividendHistory && dividendHistory.Count>0); + } + + [TestMethod] + public void PremarketRetrieval() + { + PremarketElements premarketElements = MarketDataHelper.GetPremarketData(); + Assert.IsTrue(null!=premarketElements && premarketElements.Count>0); + } + + [TestMethod] + public void EarningsAnnouncementsaRetrieval() + { + String symbol="MIDD"; + EarningsAnnouncements earningsAnnouncements=MarketDataHelper.GetEarningsAnnouncements(symbol); + Assert.IsTrue(null!=earningsAnnouncements && earningsAnnouncements.Count>0); + } + + [TestMethod] + public void ZacksRankRetrieval() + { + String symbol="MIDD"; + ZacksRank zacksRank=MarketDataHelper.GetZacksRank(symbol); + Assert.IsTrue(null!=zacksRank && null!=zacksRank.Rank); + } + + [TestMethod] + public void GetSplitsRetrieval() + { + Splits splits=MarketDataHelper.GetSplits(); + Assert.IsTrue(null!=splits && splits.Count>0); + } + + [TestMethod] + public void GDPPerCapitaRetrieval() + { + EconomicIndicators economicIndicators=MarketDataHelper.GetGDPPerCapita(); + Assert.IsTrue(null!=economicIndicators && economicIndicators.Count>0); + } + + [TestMethod] + public void LatestAnalystRatingsRetrieval() + { + AnalystRatings analystRatings=MarketDataHelper.GetLatestAnalystRatings(); + Assert.IsTrue(null!=analystRatings && analystRatings.Count>0); + } + + [TestMethod] + public void AnalystRatingsMarketBeatRetrieval() + { + String symbol="AAPL"; + AnalystRatings analystRatings=MarketDataHelper.GetAnalystRatingsMarketBeat(symbol); + Assert.IsTrue(null!=analystRatings && analystRatings.Count>0); + } + + [TestMethod] + public void SECCIKRetrieval() + { + String symbol="AAPL"; + String strCik=MarketDataHelper.GetCIK(symbol); + Assert.IsTrue(null!=strCik); + } + + [TestMethod] + public void SECFilingsRetrieval() + { + String symbol="AAPL"; + String strCik=MarketDataHelper.GetCIK(symbol); + Assert.IsTrue(null!=strCik); + SECFilings secFilings=MarketDataHelper.GetSECFilings(symbol,strCik,1); + Assert.IsTrue(null!=secFilings && secFilings.Count>0); + } + + [TestMethod] + public void YieldCurveRetrieval() + { + DateGenerator dateGenerator= new DateGenerator(); + DateTime analysisDate=dateGenerator.FindPrevBusinessDay(DateTime.Now); + YieldCurve yieldCurve=MarketDataHelper.GetYieldCurve(analysisDate.Year); + Assert.IsTrue(null!=yieldCurve && yieldCurve.Count>0); + Assert.IsTrue(yieldCurve[yieldCurve.Count-1].Date.Month.Equals(analysisDate.Month)); + } + + [TestMethod] + public void InsiderTransactionRetrieval() + { + DateTime now = DateTime.Now; + DateGenerator dateGenerator = new DateGenerator(); + InsiderTransactions insiderTransactions = InsiderTransactionDA.GetLatestInsiderTransactions(); + Assert.IsTrue(null!=insiderTransactions && insiderTransactions.Count>0); + InsiderTransaction insiderTransaction = insiderTransactions[0]; + int daysBetween = dateGenerator.DaysBetween(now, insiderTransaction.TransactionDate)+1; + Assert.IsTrue(daysBetween<10); + InsiderTransactions latestTransactions=MarketDataHelper.GetInsiderTransactions(insiderTransaction.Symbol,daysBetween); + Assert.IsTrue(null!=latestTransactions && latestTransactions.Count>0); + } + + [TestMethod] + public void CompanyProfileRetrieval() + { + String symbol="MIDD"; + CompanyProfile companyProfile=MarketDataHelper.GetCompanyProfile(symbol); + Assert.IsTrue(null!=companyProfile); + } + + [TestMethod] + public void HeadlinesRetrieval() + { + String symbol="MIDD"; + Headlines headlines = HeadlinesDA.GetLatestHeadlines(); + Assert.IsTrue(null!=headlines && headlines.Count>0); + Headline headline = headlines[0]; + Headlines companyHeadlines = HeadlinesMarketDataHelper.GetHeadlinesEx(headline.Symbol); + Assert.IsTrue(null!=companyHeadlines && companyHeadlines.Count>0); + } + + [TestMethod] + public void AnalystPriceTargetMarketBeatRetrieval() + { + String symbol="MGPI"; + AnalystPriceTarget analystPriceTarget=MarketDataHelper.GetAnalystPriceTargetMarketBeat(symbol); + Assert.IsTrue(null!=analystPriceTarget); + Assert.IsTrue(!Double.IsNaN(analystPriceTarget.HighTargetPrice)); + Assert.IsTrue(!Double.IsNaN(analystPriceTarget.LowTargetPrice)); + Assert.IsTrue(!Double.IsNaN(analystPriceTarget.MeanTargetPrice)); + Assert.IsTrue(!Double.IsNaN(analystPriceTarget.MedianTargetPrice)); + } + + [TestMethod] + public void HistoricalRetrieval() + { + String symbol="AAPL"; + Dictionary timeSeries=MarketDataHelper.GetHistoricalValues(symbol); + Assert.IsTrue(null!=timeSeries); + Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.ROA),"Missing ROA"); + Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.ROIC),"Missing ROIC"); + Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.BVPS),"Missing BVPS"); + Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.Inventory),"Missing Inventory"); + Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.AccountsReceivable),"Missing AccountsReceivable"); + Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.COGS),"Missing COGS"); + Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.OperatingIncome),"Missing OperatingIncome"); + Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.InterestExpense),"Missing InterestExpense"); + Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.TaxRate),"Missing TaxRate"); + Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.Revenue),"Missing Revenue"); + Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.NetIncomeAvailableToCommonShareholders),"Missing NetIncomeAvailableToCommonShareholders"); + Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.OperatingCashflow),"Missing OperatingCashflow"); + } + + [TestMethod] + public void IncomeStatementNASDAQRetrievsl() + { + String symbol="MIDD"; + List incomeStatements=MarketDataHelper.GetIncomeStatementNASDAQ(symbol,IncomeStatement.PeriodType.Annual); + Assert.IsTrue(null!=incomeStatements && incomeStatements.Count>0); + } + + [TestMethod] + public void IncomeStatementFinVizRetrievsl() + { + String symbol="MIDD"; + List incomeStatements=MarketDataHelper.GetIncomeStatementFinViz(symbol,IncomeStatement.PeriodType.Annual); + Assert.IsTrue(null!=incomeStatements && incomeStatements.Count>0); + } + + [TestMethod] + public void BalanceSheetNASDAQRetrieval() + { + String symbol="MIDD"; + List balanceSheets = MarketDataHelper.GetBalanceSheetNASDAQ(symbol, BalanceSheet.PeriodType.Annual); + Assert.IsTrue(null != balanceSheets && balanceSheets.Count > 0); + BalanceSheet balanceSheet = balanceSheets[0]; + Assert.IsTrue(!double.IsNaN(balanceSheet.CashAndCashEquivalents),"CashAndCashEquivalents"); + Assert.IsTrue(!double.IsNaN(balanceSheet.DeferredLongTermLiabilities),"DeferredLongTermLiabilities"); + Assert.IsTrue(!double.IsNaN(balanceSheet.IntangibleAssets),"IntangibleAssets"); + Assert.IsTrue(!double.IsNaN(balanceSheet.Inventory),"Inventory"); + Assert.IsTrue(!double.IsNaN(balanceSheet.LongTermDebt),"LongTermDebt"); + Assert.IsTrue(!double.IsNaN(balanceSheet.NetCurrentAssetValue),"NetCurrentAssetValue"); + Assert.IsTrue(!double.IsNaN(balanceSheet.NetFixedAssets),"NetFixedAssets"); + Assert.IsTrue(!double.IsNaN(balanceSheet.OtherLiabilities),"OtherLiabilities"); + Assert.IsTrue(!double.IsNaN(balanceSheet.PropertyPlantAndEquipment),"PropertyPlantAndEquipment"); + Assert.IsTrue(!double.IsNaN(balanceSheet.TotalAssets),"TotalAssets"); + Assert.IsTrue(!double.IsNaN(balanceSheet.TotalCurrentAssets),"TotalCurrentAssets"); + Assert.IsTrue(!double.IsNaN(balanceSheet.TotalCurrentLiabilities),"TotalCurrentLiabilities"); + Assert.IsTrue(!double.IsNaN(balanceSheet.TotalLiabilities),"TotalLiabilities"); + } + + [TestMethod] + public void CashflowStatementMorningStarRetrieval() + { + String symbol="MIDD"; + List cashflowStatements = MarketDataHelper.GetCashflowStatement(symbol, CashflowStatement.PeriodType.Annual); + Assert.IsTrue(null != cashflowStatements && cashflowStatements.Count > 0); + CashflowStatement cashflowStatement = cashflowStatements[0]; + Assert.IsTrue(!double.IsNaN(cashflowStatement.DepreciationAndAmortization),"DepreciationAndAmortization"); + Assert.IsTrue(!double.IsNaN(cashflowStatement.DeferredIncomeTaxes),"DeferredIncomeTaxes"); + Assert.IsTrue(!double.IsNaN(cashflowStatement.StockBasedCompensation),"StockBasedCompensation"); + Assert.IsTrue(!double.IsNaN(cashflowStatement.AccountsReceivable),"AccountsReceivable"); + Assert.IsTrue(!double.IsNaN(cashflowStatement.Inventory),"Inventory"); + Assert.IsTrue(!double.IsNaN(cashflowStatement.AccountsPayable),"AccountsPayable"); + Assert.IsTrue(!double.IsNaN(cashflowStatement.AccruedLiabilities),"AccruedLiabilities"); + Assert.IsTrue(!double.IsNaN(cashflowStatement.OperatingCashflow),"OperatingCashflow"); + Assert.IsTrue(!double.IsNaN(cashflowStatement.FreeCashflow),"FreeCashflow"); + } + + [TestMethod] + public void CurrencyConversionXERetrieval() + { + DateGenerator dateGenerator = new DateGenerator(); + String sourceCurrency="USD"; + DateTime analysisDate = DateTime.Now; + analysisDate = dateGenerator.GetPrevBusinessDay(analysisDate); + CurrencyConversionCollection currencyConversionCollection = MarketDataHelper.GetCurrencyConversion(sourceCurrency,analysisDate); + Assert.IsTrue(null!=currencyConversionCollection && currencyConversionCollection.Count>0); + } + + [TestMethod] + public void FundamentalFinVizRetrieval() + { + String symbol = "MIDD"; + Fundamental fundamental=MarketDataHelper.GetFundamentalFinViz(symbol); + Assert.IsTrue(null!=fundamental); + Assert.IsTrue(!Utility.IsEpoch(fundamental.NextEarningsDate),"NextEarningsDate"); + Assert.IsTrue(!double.IsNaN(fundamental.Beta),"Beta"); + Assert.IsTrue(!double.IsNaN(fundamental.Low52),"Low52"); + Assert.IsTrue(!double.IsNaN(fundamental.High52),"High52"); + Assert.IsTrue(!double.IsNaN(fundamental.Volume),"Volume"); + Assert.IsTrue(!double.IsNaN(fundamental.MarketCap),"MarketCap"); + Assert.IsTrue(!double.IsNaN(fundamental.PE),"PE"); + Assert.IsTrue(!double.IsNaN(fundamental.EPS),"EPS"); + Assert.IsTrue(!double.IsNaN(fundamental.PEG),"PEG"); + Assert.IsTrue(!double.IsNaN(fundamental.ReturnOnAssets),"ReturnOnAssets"); + Assert.IsTrue(!double.IsNaN(fundamental.ReturnOnEquity),"ReturnOnEquity"); + Assert.IsTrue(!double.IsNaN(fundamental.TotalCash),"TotalCash"); + Assert.IsTrue(!double.IsNaN(fundamental.TotalDebt),"TotalDebt"); + Assert.IsTrue(!double.IsNaN(fundamental.SharesOutstanding),"SharesOutstanding"); + Assert.IsTrue(!double.IsNaN(fundamental.Revenue),"Revenue"); + Assert.IsTrue(!double.IsNaN(fundamental.RevenuePerShare),"RevenuePerShare"); + Assert.IsTrue(!double.IsNaN(fundamental.QtrlyRevenueGrowth),"QtrlyRevenueGrowth"); + Assert.IsTrue(!double.IsNaN(fundamental.GrossProfit),"GrossProfit"); + Assert.IsTrue(!double.IsNaN(fundamental.EBITDA),"EBITDA"); + Assert.IsTrue(!double.IsNaN(fundamental.NetIncomeAvailableToCommon),"NetIncomeAvailableToCommon"); + Assert.IsTrue(!double.IsNaN(fundamental.BookValuePerShare),"BookValuePerShare"); + Assert.IsTrue(!double.IsNaN(fundamental.OperatingCashflow),"OperatingCashflow"); + Assert.IsTrue(!double.IsNaN(fundamental.LeveragedFreeCashflow),"LeveragedFreeCashflow"); + Assert.IsTrue(!double.IsNaN(fundamental.Equity),"Equity"); + Assert.IsTrue(!double.IsNaN(fundamental.TrailingPE),"TrailingPE"); + Assert.IsTrue(!double.IsNaN(fundamental.EnterpriseValue),"EnterpriseValue"); + Assert.IsTrue(!double.IsNaN(fundamental.EBIT),"EBIT"); + Assert.IsTrue(!double.IsNaN(fundamental.DebtToEquity),"DebtToEquity"); + } + + [TestMethod] + public void LatestPriceBigChartsRetrieval() + { + String symbol="MIDD"; + Price price=MarketDataHelper.GetLatestPriceBigCharts(symbol); + Assert.IsTrue(null!=price,"No Price"); + Assert.IsTrue(price.IsValid,"Invalid Price"); + } + + [TestMethod] + public void GetPriceAsOfBigChartsRetrieval() + { + String symbol="MIDD"; + DateTime analysisDate=DateTime.Now; + DateGenerator dateGenerator = new DateGenerator(); + analysisDate=dateGenerator.GetPrevBusinessDay(analysisDate); + Price price=MarketDataHelper.GetPriceAsOf(symbol,analysisDate); + Assert.IsTrue(null!=price,"No Price"); + Assert.IsTrue(price.IsValid,"Invalid Price"); + } + + [TestMethod] + public void GetDailyPricesYahooRetrieval() + { + String symbol="MIDD"; + DateTime analysisDate=DateTime.Now; + DateGenerator dateGenerator = new DateGenerator(); + analysisDate=dateGenerator.GetPrevBusinessDay(analysisDate); + Prices prices=MarketDataHelper.GetDailyPrices(symbol,analysisDate,analysisDate); + Assert.IsTrue(null!=prices && prices.Count>0,"No Price"); + } + + } +} diff --git a/MarketDataUnitTests/MarketDataUnitTests.csproj b/MarketDataUnitTests/MarketDataUnitTests.csproj new file mode 100644 index 0000000..e60c383 --- /dev/null +++ b/MarketDataUnitTests/MarketDataUnitTests.csproj @@ -0,0 +1,75 @@ + + + + + + Debug + AnyCPU + {FB4261E1-0A5D-4A36-8550-0D19AB180E15} + Library + Properties + MarketDataUnitTests + MarketDataUnitTests + v4.6.2 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + packages\MSTest.TestFramework.2.1.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll + + + packages\MSTest.TestFramework.2.1.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll + + + + + + + + + + + + + + + {e807f1ca-9d9c-484a-8e83-269d57707b4b} + MarketDataLib + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + \ No newline at end of file diff --git a/MarketDataUnitTests/MarketDataUnitTests.sln b/MarketDataUnitTests/MarketDataUnitTests.sln new file mode 100644 index 0000000..253ba90 --- /dev/null +++ b/MarketDataUnitTests/MarketDataUnitTests.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32126.315 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarketDataUnitTests", "MarketDataUnitTests.csproj", "{FB4261E1-0A5D-4A36-8550-0D19AB180E15}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarketDataLib", "..\MarketDataLib\MarketDataLib.csproj", "{E807F1CA-9D9C-484A-8E83-269D57707B4B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FB4261E1-0A5D-4A36-8550-0D19AB180E15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB4261E1-0A5D-4A36-8550-0D19AB180E15}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB4261E1-0A5D-4A36-8550-0D19AB180E15}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB4261E1-0A5D-4A36-8550-0D19AB180E15}.Release|Any CPU.Build.0 = Release|Any CPU + {E807F1CA-9D9C-484A-8E83-269D57707B4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E807F1CA-9D9C-484A-8E83-269D57707B4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E807F1CA-9D9C-484A-8E83-269D57707B4B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E807F1CA-9D9C-484A-8E83-269D57707B4B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {05DC6CA7-0B19-4FD8-83C4-7602F080A624} + EndGlobalSection +EndGlobal diff --git a/MarketDataUnitTests/Properties/AssemblyInfo.cs b/MarketDataUnitTests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..08011dc --- /dev/null +++ b/MarketDataUnitTests/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("MarketDataUnitTests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MarketDataUnitTests")] +[assembly: AssemblyCopyright("Copyright © 2024")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("fb4261e1-0a5d-4a36-8550-0d19ab180e15")] + +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/MarketDataUnitTests/packages.config b/MarketDataUnitTests/packages.config new file mode 100644 index 0000000..0b00b86 --- /dev/null +++ b/MarketDataUnitTests/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file