1+ using System . Globalization ;
2+
3+ namespace Taxes . Tests ;
4+
5+ [ TestClass ]
6+ public class CryptoQuotesReaderTest
7+ {
8+ private const string ReportsPath = "../../../../Taxes/Reports" ;
9+
10+ public static IEnumerable < object [ ] > AllCryptoQuoteFiles
11+ {
12+ get
13+ {
14+ var files = Directory . GetFiles ( ReportsPath , "MarketQuotes_*.csv" ) ;
15+ foreach ( var file in files )
16+ {
17+ yield return new object [ ] { file } ;
18+ }
19+ }
20+ }
21+
22+ [ TestMethod ]
23+ [ DynamicData ( nameof ( AllCryptoQuoteFiles ) ) ]
24+ public void Read_AllFiles_DoesNotThrowAndIsNotEmpty ( string filePath )
25+ {
26+ // Act
27+ var quotes = CryptoQuotesReader . Read ( filePath ) . ToList ( ) ;
28+
29+ // Assert
30+ Assert . IsNotNull ( quotes ) ;
31+ Assert . IsTrue ( quotes . Count > 0 , $ "File { filePath } should contain at least one quote.") ;
32+
33+ // Check that dates are parsed correctly and not default
34+ Assert . IsTrue ( quotes [ 0 ] . Date > new DateTime ( 2000 , 1 , 1 ) , $ "First quote in { filePath } has an invalid date.") ;
35+ }
36+
37+ [ TestMethod ]
38+ public void Read_SpecificFile_ParsesFirstLineCorrectly ( )
39+ {
40+ // Arrange
41+ var filePath = Path . Combine ( ReportsPath , "MarketQuotes_ADAEUR.csv" ) ;
42+ // From file: 1747699200000,2025-05-20,ADAEUR,0.6615,0.6703,0.6433,0.6607,2884102.0,1885827.80505,10704
43+ var expectedQuote = new CryptoQuote
44+ {
45+ Unix = 1747699200000 ,
46+ Date = DateTime . ParseExact ( "2025-05-20 00:00:00" , "yyyy-MM-dd HH:mm:ss" , CultureInfo . InvariantCulture ) ,
47+ Symbol = "ADAEUR" ,
48+ Open = 0.6615m ,
49+ High = 0.6703m ,
50+ Low = 0.6433m ,
51+ Close = 0.6607m ,
52+ VolumeCrypto = 2884102.0m ,
53+ VolumeBase = 1885827.80505m ,
54+ TradeCount = 10704
55+ } ;
56+
57+ // Act
58+ var firstQuote = CryptoQuotesReader . Read ( filePath ) . FirstOrDefault ( ) ;
59+
60+ // Assert
61+ Assert . IsNotNull ( firstQuote ) ;
62+ Assert . AreEqual ( expectedQuote . Unix , firstQuote . Unix ) ;
63+ Assert . AreEqual ( expectedQuote . Date , firstQuote . Date ) ;
64+ Assert . AreEqual ( expectedQuote . Symbol , firstQuote . Symbol ) ;
65+ Assert . AreEqual ( expectedQuote . Open , firstQuote . Open ) ;
66+ Assert . AreEqual ( expectedQuote . High , firstQuote . High ) ;
67+ Assert . AreEqual ( expectedQuote . Low , firstQuote . Low ) ;
68+ Assert . AreEqual ( expectedQuote . Close , firstQuote . Close ) ;
69+ Assert . AreEqual ( expectedQuote . VolumeCrypto , firstQuote . VolumeCrypto ) ;
70+ Assert . AreEqual ( expectedQuote . VolumeBase , firstQuote . VolumeBase ) ;
71+ Assert . AreEqual ( expectedQuote . TradeCount , firstQuote . TradeCount ) ;
72+ }
73+ }
0 commit comments