1+ using FluentAssertions ;
2+ using ManagedCode . TimeSeries . Accumulators ;
3+ using Xunit ;
4+
5+ namespace ManagedCode . TimeSeries . Tests ;
6+
7+ public class AccumulatorsTests
8+ {
9+
10+ [ Fact ]
11+ public async Task IntTimeSeriesAccumulator ( )
12+ {
13+ int count = 1050 ;
14+ var series = new IntTimeSeriesAccumulator ( TimeSpan . FromSeconds ( 0.1 ) ) ;
15+ for ( int i = 0 ; i < count ; i ++ )
16+ {
17+ await Task . Delay ( new Random ( ) . Next ( 1 , 5 ) ) ;
18+ series . AddNewData ( i ) ;
19+ }
20+
21+ series . DataCount . Should ( ) . Be ( Convert . ToUInt64 ( count ) ) ;
22+
23+ var step = 0 ;
24+ foreach ( var queue in series . Samples )
25+ {
26+ foreach ( var item in queue . Value )
27+ {
28+ item . Should ( ) . Be ( step ) ;
29+ step ++ ;
30+ }
31+ }
32+ }
33+
34+ [ Fact ]
35+ public async Task IntTimeSeriesAccumulatorMaxSamplesCount ( )
36+ {
37+ int samplesCount = 105 ;
38+ int count = 1050 ;
39+ var series = new IntTimeSeriesAccumulator ( TimeSpan . FromSeconds ( 0.1 ) , samplesCount ) ;
40+ for ( int i = 0 ; i < count ; i ++ )
41+ {
42+ await Task . Delay ( new Random ( ) . Next ( 1 , 5 ) ) ;
43+ series . AddNewData ( i ) ;
44+ }
45+
46+ series . DataCount . Should ( ) . Be ( Convert . ToUInt64 ( count ) ) ; //because it's total; number of samples
47+ series . Samples . Count . Should ( ) . Be ( samplesCount ) ; //because it's total; number of samples
48+
49+ var step = count - samplesCount - 1 ;
50+ foreach ( var queue in series . Samples )
51+ {
52+ foreach ( var item in queue . Value )
53+ {
54+ item . Should ( ) . Be ( step ) ;
55+ step ++ ;
56+ }
57+ }
58+ }
59+
60+
61+
62+
63+
64+
65+
66+
67+
68+
69+
70+
71+ [ Fact ]
72+ public async Task Accumulator ( )
73+ {
74+ var series = new IntTimeSeriesAccumulator ( TimeSpan . FromSeconds ( 0.1 ) ) ;
75+ for ( var i = 0 ; i < 1000 ; i ++ )
76+ {
77+ await Task . Delay ( new Random ( ) . Next ( 1 , 5 ) ) ;
78+ series . AddNewData ( i ) ;
79+ }
80+
81+ series . DataCount . Should ( ) . Be ( 1000 ) ;
82+
83+ var step = 0 ;
84+ foreach ( var queue in series . Samples )
85+ {
86+ foreach ( var item in queue . Value )
87+ {
88+ item . Should ( ) . Be ( step ) ;
89+ step ++ ;
90+ }
91+ }
92+ }
93+
94+ // [Fact]
95+ // public async Task AccumulatorByString()
96+ // {
97+ // var rnd = new Random();
98+ // var series = new StringTimeSeriesAccumulator(TimeSpan.FromSeconds(0.1));
99+ //
100+ // var dt = DateTimeOffset.Now;
101+ // series.AddNewData(dt, "1");
102+ // series.AddNewData(dt, "1");
103+ // series.AddNewData(dt, "2");
104+ // series.AddNewData(dt, "3");
105+ // series.AddNewData(dt, "3");
106+ // series.AddNewData(dt, "2");
107+ //
108+ //
109+ // dt = dt.AddHours(5);
110+ // series.AddNewData(dt, "1");
111+ // series.AddNewData(dt, "1");
112+ // series.AddNewData(dt, "2");
113+ // series.AddNewData(dt, "3");
114+ // series.AddNewData(dt, "3");
115+ // series.AddNewData(dt, "2");
116+ //
117+ // series.DataCount.Should().Be(12);
118+ // series.Samples.First().Value.Count.Should().Be(3);
119+ // series.Samples.Last().Value.Count.Should().Be(3);
120+ // }
121+
122+ [ Fact ]
123+ public async Task AccumulatorLimit ( )
124+ {
125+ var series = new IntTimeSeriesAccumulator ( TimeSpan . FromSeconds ( 0.1 ) , 10 ) ;
126+
127+ for ( var i = 0 ; i < 1000 ; i ++ )
128+ {
129+ await Task . Delay ( new Random ( ) . Next ( 1 , 5 ) ) ;
130+ series . AddNewData ( i ) ;
131+ }
132+
133+ series . Samples . Count . Should ( ) . Be ( 10 ) ;
134+ }
135+
136+ [ Fact ]
137+ public async Task IsFull ( )
138+ {
139+ var series = new IntTimeSeriesAccumulator ( TimeSpan . FromSeconds ( 0.1 ) , 10 ) ;
140+
141+ for ( var i = 0 ; i < 1000 ; i ++ )
142+ {
143+ await Task . Delay ( new Random ( ) . Next ( 1 , 5 ) ) ;
144+
145+ if ( series . IsFull )
146+ {
147+ break ;
148+ }
149+
150+ series . AddNewData ( i ) ;
151+ }
152+
153+ series . IsFull . Should ( ) . BeTrue ( ) ;
154+ }
155+
156+ [ Fact ]
157+ public void IsEmpty ( )
158+ {
159+ var series = new IntTimeSeriesAccumulator ( TimeSpan . FromSeconds ( 0.1 ) , 10 ) ;
160+ series . IsEmpty . Should ( ) . BeTrue ( ) ;
161+ }
162+
163+ [ Fact ]
164+ public async Task AccumulatorMerge ( )
165+ {
166+ Func < Task < IntTimeSeriesAccumulator > > FillFunc = async ( ) =>
167+ {
168+ var series = new IntTimeSeriesAccumulator ( TimeSpan . FromSeconds ( 0.1 ) , 10 ) ;
169+ for ( var i = 0 ; i < 1000 ; i ++ )
170+ {
171+ await Task . Delay ( new Random ( ) . Next ( 1 , 5 ) ) ;
172+ series . AddNewData ( i ) ;
173+ }
174+
175+ return series ;
176+ } ;
177+
178+ var seriesA = FillFunc ( ) ;
179+ var seriesB = FillFunc ( ) ;
180+
181+ await Task . WhenAll ( seriesA , seriesB ) ;
182+
183+ seriesA . Result . Samples . Count . Should ( ) . Be ( 10 ) ;
184+ seriesB . Result . Samples . Count . Should ( ) . Be ( 10 ) ;
185+
186+ seriesA . Result . Merge ( seriesB . Result ) ;
187+
188+ seriesA . Result . Samples . Count . Should ( ) . Be ( 10 ) ;
189+
190+ var seriesList = new List < IntTimeSeriesAccumulator > ( ) ;
191+ seriesList . Add ( await FillFunc ( ) ) ;
192+ seriesList . Add ( await FillFunc ( ) ) ;
193+ seriesList . Add ( await FillFunc ( ) ) ;
194+ seriesList . Add ( new IntTimeSeriesAccumulator ( TimeSpan . FromSeconds ( 0.1 ) , 10 ) ) ;
195+
196+ IntTimeSeriesAccumulator onlineExpertsPerHourTimeSeries = null ;
197+ foreach ( var item in seriesList . ToArray ( ) )
198+ {
199+ if ( onlineExpertsPerHourTimeSeries == null )
200+ {
201+ onlineExpertsPerHourTimeSeries = item ;
202+ }
203+ else
204+ {
205+ onlineExpertsPerHourTimeSeries . Merge ( item ) ;
206+ }
207+ }
208+
209+ onlineExpertsPerHourTimeSeries . Samples . Count . Should ( ) . Be ( 10 ) ;
210+ }
211+
212+
213+ [ Fact ]
214+ public async Task Resample ( )
215+ {
216+ var seriesFeature = new IntTimeSeriesAccumulator ( TimeSpan . FromMilliseconds ( 2 ) , 100 ) ;
217+
218+ for ( var i = 0 ; i < 100 ; i ++ )
219+ {
220+ seriesFeature . AddNewData ( i ) ;
221+
222+ await Task . Delay ( 1 ) ;
223+ }
224+
225+ seriesFeature . Resample ( TimeSpan . FromMilliseconds ( 4 ) , 100 ) ;
226+ var sad = seriesFeature ;
227+ }
228+
229+
230+
231+ [ Fact ]
232+ public void MarkupAllSamples ( )
233+ {
234+ var seriesFeature = new IntTimeSeriesAccumulator ( TimeSpan . FromMilliseconds ( 10 ) , 100 ) ;
235+ seriesFeature . MarkupAllSamples ( MarkupDirection . Feature ) ;
236+ seriesFeature . AddNewData ( 1 ) ;
237+ ( seriesFeature . Samples . Keys . Max ( ) - seriesFeature . Samples . Keys . Min ( ) ) . TotalMilliseconds . Should ( ) . BeGreaterThanOrEqualTo ( 990 ) ;
238+ ( seriesFeature . Samples . Keys . Max ( ) - seriesFeature . Samples . Keys . Min ( ) ) . TotalMilliseconds . Should ( ) . BeLessThanOrEqualTo ( 1000 ) ;
239+ var seriesFeatureOrdered = seriesFeature . Samples . OrderBy ( o => o . Key ) . Take ( 10 ) ;
240+ seriesFeatureOrdered . Any ( a => a . Value . Count == 1 ) . Should ( ) . BeTrue ( ) ;
241+
242+ var seriesPast = new IntTimeSeriesAccumulator ( TimeSpan . FromMilliseconds ( 10 ) ) ;
243+ seriesPast . MarkupAllSamples ( ) ;
244+ seriesPast . AddNewData ( 1 ) ;
245+ ( seriesPast . Samples . Keys . Max ( ) - seriesPast . Samples . Keys . Min ( ) ) . TotalMilliseconds . Should ( ) . BeGreaterThanOrEqualTo ( 990 ) ;
246+ ( seriesPast . Samples . Keys . Max ( ) - seriesPast . Samples . Keys . Min ( ) ) . TotalMilliseconds . Should ( ) . BeLessThanOrEqualTo ( 1000 ) ;
247+ var seriesPastOrdered = seriesPast . Samples . OrderBy ( o => o . Key ) . TakeLast ( 10 ) ;
248+ seriesPastOrdered . Any ( a => a . Value . Count == 1 ) . Should ( ) . BeTrue ( ) ;
249+
250+ var seriesMiddle = new IntTimeSeriesAccumulator ( TimeSpan . FromMilliseconds ( 10 ) , 100 ) ;
251+ seriesMiddle . MarkupAllSamples ( MarkupDirection . Middle ) ;
252+ seriesMiddle . AddNewData ( 1 ) ;
253+ ( seriesMiddle . Samples . Keys . Max ( ) - seriesMiddle . Samples . Keys . Min ( ) ) . TotalMilliseconds . Should ( ) . BeGreaterThanOrEqualTo ( 990 ) ;
254+ ( seriesMiddle . Samples . Keys . Max ( ) - seriesMiddle . Samples . Keys . Min ( ) ) . TotalMilliseconds . Should ( ) . BeLessThanOrEqualTo ( 1000 ) ;
255+ var seriesMiddleOrdered = seriesMiddle . Samples . OrderBy ( o => o . Key ) . Skip ( 45 ) . Take ( 10 ) ;
256+ seriesMiddleOrdered . Any ( a => a . Value . Count == 1 ) . Should ( ) . BeTrue ( ) ;
257+ }
258+ }
0 commit comments