Skip to content

Commit 7ef768a

Browse files
committed
tests
1 parent 5fc10a8 commit 7ef768a

18 files changed

+711
-226
lines changed

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ For any code modification task: run dotnet build before applying changes to capt
3232
Target `net9.0` with C# 13, `Nullable` and `ImplicitUsings` enabled; favour modern language features when they improve clarity. Stick to four-space indentation, braces on new lines, PascalCase for types, methods, and public properties, camelCase for locals and parameters, and ALL_CAPS only for constants. Keep namespaces aligned with folder paths under `ManagedCode.TimeSeries`.
3333

3434
## Testing Guidelines
35-
Use xUnit `[Fact]` and `[Theory]` patterns with FluentAssertions for expectations; prefer descriptive test method names (`MethodUnderTest_State_Expectation`). Ensure new logic includes coverage and leaves no skipped tests behind; if a skip is unavoidable, document the unblocker in-code. Generate fresh coverage via the command above before opening a PR and verify lcov output lands under `ManagedCode.TimeSeries.Tests/`.
35+
Use xUnit `[Fact]` and `[Theory]` patterns with Shouldly for assertions; prefer descriptive test method names (`MethodUnderTest_State_Expectation`). Ensure new logic includes coverage and leaves no skipped tests behind; if a skip is unavoidable, document the unblocker in-code. Generate fresh coverage via the command above before opening a PR and verify lcov output lands under `ManagedCode.TimeSeries.Tests/`.
3636

3737
## Commit & Pull Request Guidelines
3838
Follow the repo’s concise commit style (`scope summary` or short imperative lines under ~60 characters, e.g., `bench improve queue path`). Each PR should describe the change, reference related issues, and call out API or serialization impacts. Include evidence of local `dotnet test` runs (and benchmarks when relevant) plus screenshots for user-facing changes. Highlight breaking changes or version bumps so release automation remains accurate.

Directory.Packages.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
88
<PackageVersion Include="coverlet.msbuild" Version="6.0.4" />
99
<PackageVersion Include="DotNet.ReproducibleBuilds" Version="1.2.39" />
10-
<PackageVersion Include="FluentAssertions" Version="8.7.1" />
10+
<PackageVersion Include="Shouldly" Version="4.2.1" />
1111
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.10" />
1212
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
1313
<PackageVersion Include="Microsoft.Orleans.Sdk" Version="9.2.1" />

ManagedCode.TimeSeries.Orleans/Accumulators/Converters/DoubleTimeSeriesAccumulatorConverter.cs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
using System;
12
using System.Collections.Concurrent;
23
using System.Collections.Generic;
3-
using System.Linq;
44
using ManagedCode.TimeSeries.Accumulators;
55
using Orleans;
66

@@ -12,18 +12,27 @@ public sealed class DoubleTimeSeriesAccumulatorConverter<T> : IConverter<DoubleT
1212
public DoubleTimeSeriesAccumulator ConvertFromSurrogate(in TimeSeriesAccumulatorsSurrogate<double> surrogate)
1313
{
1414
var series = new DoubleTimeSeriesAccumulator(surrogate.SampleInterval, surrogate.MaxSamplesCount);
15-
var converted = surrogate.Samples.ToDictionary(
16-
static kvp => kvp.Key,
17-
static kvp => new ConcurrentQueue<double>(kvp.Value));
15+
var converted = new Dictionary<DateTimeOffset, ConcurrentQueue<double>>(surrogate.Samples.Count);
16+
17+
foreach (var pair in surrogate.Samples)
18+
{
19+
converted[pair.Key] = new ConcurrentQueue<double>(pair.Value);
20+
}
21+
1822
series.InitInternal(converted, surrogate.Start, surrogate.End, surrogate.LastDate, surrogate.DataCount);
1923
return series;
2024
}
2125

2226
public TimeSeriesAccumulatorsSurrogate<double> ConvertToSurrogate(in DoubleTimeSeriesAccumulator value)
2327
{
24-
var converted = value.Samples.ToDictionary(
25-
static kvp => kvp.Key,
26-
static kvp => new Queue<double>(kvp.Value));
28+
var samples = value.Samples;
29+
var converted = new Dictionary<DateTimeOffset, Queue<double>>(samples.Count);
30+
31+
foreach (var pair in samples)
32+
{
33+
converted[pair.Key] = new Queue<double>(pair.Value);
34+
}
35+
2736
return new TimeSeriesAccumulatorsSurrogate<double>(converted, value.Start, value.End,
2837
value.SampleInterval, value.MaxSamplesCount, value.LastDate, value.DataCount);
2938
}

ManagedCode.TimeSeries.Orleans/Accumulators/Converters/FloatTimeSeriesAccumulatorConverter.cs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
using System;
12
using System.Collections.Concurrent;
23
using System.Collections.Generic;
3-
using System.Linq;
44
using ManagedCode.TimeSeries.Accumulators;
55
using Orleans;
66

@@ -12,18 +12,27 @@ public sealed class FloatTimeSeriesAccumulatorConverter<T> : IConverter<FloatTim
1212
public FloatTimeSeriesAccumulator ConvertFromSurrogate(in TimeSeriesAccumulatorsSurrogate<float> surrogate)
1313
{
1414
var series = new FloatTimeSeriesAccumulator(surrogate.SampleInterval, surrogate.MaxSamplesCount);
15-
var converted = surrogate.Samples.ToDictionary(
16-
static kvp => kvp.Key,
17-
static kvp => new ConcurrentQueue<float>(kvp.Value));
15+
var converted = new Dictionary<DateTimeOffset, ConcurrentQueue<float>>(surrogate.Samples.Count);
16+
17+
foreach (var pair in surrogate.Samples)
18+
{
19+
converted[pair.Key] = new ConcurrentQueue<float>(pair.Value);
20+
}
21+
1822
series.InitInternal(converted, surrogate.Start, surrogate.End, surrogate.LastDate, surrogate.DataCount);
1923
return series;
2024
}
2125

2226
public TimeSeriesAccumulatorsSurrogate<float> ConvertToSurrogate(in FloatTimeSeriesAccumulator value)
2327
{
24-
var converted = value.Samples.ToDictionary(
25-
static kvp => kvp.Key,
26-
static kvp => new Queue<float>(kvp.Value));
28+
var samples = value.Samples;
29+
var converted = new Dictionary<DateTimeOffset, Queue<float>>(samples.Count);
30+
31+
foreach (var pair in samples)
32+
{
33+
converted[pair.Key] = new Queue<float>(pair.Value);
34+
}
35+
2736
return new TimeSeriesAccumulatorsSurrogate<float>(converted, value.Start, value.End,
2837
value.SampleInterval, value.MaxSamplesCount, value.LastDate, value.DataCount);
2938
}

ManagedCode.TimeSeries.Orleans/Accumulators/Converters/IntTimeSeriesAccumulatorConverter.cs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
using System;
12
using System.Collections.Concurrent;
23
using System.Collections.Generic;
3-
using System.Linq;
44
using ManagedCode.TimeSeries.Abstractions;
55
using ManagedCode.TimeSeries.Accumulators;
66
using ManagedCode.TimeSeries.Summers;
@@ -15,18 +15,27 @@ public sealed class IntTimeSeriesAccumulatorConverter<T> : IConverter<IntTimeSer
1515
public IntTimeSeriesAccumulator ConvertFromSurrogate(in TimeSeriesAccumulatorsSurrogate<int> surrogate)
1616
{
1717
var series = new IntTimeSeriesAccumulator(surrogate.SampleInterval, surrogate.MaxSamplesCount);
18-
var converted = surrogate.Samples.ToDictionary(
19-
static kvp => kvp.Key,
20-
static kvp => new ConcurrentQueue<int>(kvp.Value));
18+
var converted = new Dictionary<DateTimeOffset, ConcurrentQueue<int>>(surrogate.Samples.Count);
19+
20+
foreach (var pair in surrogate.Samples)
21+
{
22+
converted[pair.Key] = new ConcurrentQueue<int>(pair.Value);
23+
}
24+
2125
series.InitInternal(converted, surrogate.Start, surrogate.End, surrogate.LastDate, surrogate.DataCount);
2226
return series;
2327
}
2428

2529
public TimeSeriesAccumulatorsSurrogate<int> ConvertToSurrogate(in IntTimeSeriesAccumulator value)
2630
{
27-
var converted = value.Samples.ToDictionary(
28-
static kvp => kvp.Key,
29-
static kvp => new Queue<int>(kvp.Value));
31+
var samples = value.Samples;
32+
var converted = new Dictionary<DateTimeOffset, Queue<int>>(samples.Count);
33+
34+
foreach (var pair in samples)
35+
{
36+
converted[pair.Key] = new Queue<int>(pair.Value);
37+
}
38+
3039
return new TimeSeriesAccumulatorsSurrogate<int>(converted, value.Start, value.End,
3140
value.SampleInterval, value.MaxSamplesCount, value.LastDate, value.DataCount);
3241
}

ManagedCode.TimeSeries.Orleans/Summers/Converters/DoubleTimeSeriesSummerConverter.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using System;
2-
using System.Collections.Concurrent;
32
using System.Collections.Generic;
4-
using System.Linq;
53
using ManagedCode.TimeSeries.Summers;
64
using Orleans;
75

@@ -13,18 +11,27 @@ public sealed class DoubleTimeSeriesSummerConverter<T> : IConverter<DoubleTimeSe
1311
public DoubleTimeSeriesSummer ConvertFromSurrogate(in TimeSeriesSummerSurrogate<double> surrogate)
1412
{
1513
var series = new DoubleTimeSeriesSummer(surrogate.SampleInterval, surrogate.MaxSamplesCount, surrogate.Strategy);
16-
var converted = surrogate.Samples.ToDictionary(
17-
static kvp => kvp.Key,
18-
static kvp => kvp.Value);
14+
var converted = new Dictionary<DateTimeOffset, double>(surrogate.Samples.Count);
15+
16+
foreach (var pair in surrogate.Samples)
17+
{
18+
converted[pair.Key] = pair.Value;
19+
}
20+
1921
series.InitInternal(converted, surrogate.Start, surrogate.End, surrogate.LastDate, surrogate.DataCount);
2022
return series;
2123
}
2224

2325
public TimeSeriesSummerSurrogate<double> ConvertToSurrogate(in DoubleTimeSeriesSummer value)
2426
{
25-
var converted = value.Samples.ToDictionary(
26-
static kvp => kvp.Key,
27-
static kvp => kvp.Value);
27+
var samples = value.Samples;
28+
var converted = new Dictionary<DateTimeOffset, double>(samples.Count);
29+
30+
foreach (var pair in samples)
31+
{
32+
converted[pair.Key] = pair.Value;
33+
}
34+
2835
return new TimeSeriesSummerSurrogate<double>(converted, value.Start, value.End,
2936
value.SampleInterval, value.MaxSamplesCount, value.LastDate, value.DataCount, value.Strategy);
3037
}

ManagedCode.TimeSeries.Orleans/Summers/Converters/FloatTimeSeriesSummerConverter.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using System;
2-
using System.Collections.Concurrent;
32
using System.Collections.Generic;
4-
using System.Linq;
53
using ManagedCode.TimeSeries.Summers;
64
using Orleans;
75

@@ -13,18 +11,27 @@ public sealed class FloatTimeSeriesSummerConverter<T> : IConverter<FloatTimeSeri
1311
public FloatTimeSeriesSummer ConvertFromSurrogate(in TimeSeriesSummerSurrogate<float> surrogate)
1412
{
1513
var series = new FloatTimeSeriesSummer(surrogate.SampleInterval, surrogate.MaxSamplesCount, surrogate.Strategy);
16-
var converted = surrogate.Samples.ToDictionary(
17-
static kvp => kvp.Key,
18-
static kvp => kvp.Value);
14+
var converted = new Dictionary<DateTimeOffset, float>(surrogate.Samples.Count);
15+
16+
foreach (var pair in surrogate.Samples)
17+
{
18+
converted[pair.Key] = pair.Value;
19+
}
20+
1921
series.InitInternal(converted, surrogate.Start, surrogate.End, surrogate.LastDate, surrogate.DataCount);
2022
return series;
2123
}
2224

2325
public TimeSeriesSummerSurrogate<float> ConvertToSurrogate(in FloatTimeSeriesSummer value)
2426
{
25-
var converted = value.Samples.ToDictionary(
26-
static kvp => kvp.Key,
27-
static kvp => kvp.Value);
27+
var samples = value.Samples;
28+
var converted = new Dictionary<DateTimeOffset, float>(samples.Count);
29+
30+
foreach (var pair in samples)
31+
{
32+
converted[pair.Key] = pair.Value;
33+
}
34+
2835
return new TimeSeriesSummerSurrogate<float>(converted, value.Start, value.End,
2936
value.SampleInterval, value.MaxSamplesCount, value.LastDate, value.DataCount, value.Strategy);
3037
}

ManagedCode.TimeSeries.Orleans/Summers/Converters/IntTimeSeriesSummerConverter.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using System;
2-
using System.Collections.Concurrent;
32
using System.Collections.Generic;
4-
using System.Linq;
53
using ManagedCode.TimeSeries.Summers;
64
using Orleans;
75

@@ -14,18 +12,27 @@ public sealed class IntTimeSeriesSummerConverter<T> : IConverter<IntTimeSeriesSu
1412
public IntTimeSeriesSummer ConvertFromSurrogate(in TimeSeriesSummerSurrogate<int> surrogate)
1513
{
1614
var series = new IntTimeSeriesSummer(surrogate.SampleInterval, surrogate.MaxSamplesCount, surrogate.Strategy);
17-
var converted = surrogate.Samples.ToDictionary(
18-
static kvp => kvp.Key,
19-
static kvp => kvp.Value);
15+
var converted = new Dictionary<DateTimeOffset, int>(surrogate.Samples.Count);
16+
17+
foreach (var pair in surrogate.Samples)
18+
{
19+
converted[pair.Key] = pair.Value;
20+
}
21+
2022
series.InitInternal(converted, surrogate.Start, surrogate.End, surrogate.LastDate, surrogate.DataCount);
2123
return series;
2224
}
2325

2426
public TimeSeriesSummerSurrogate<int> ConvertToSurrogate(in IntTimeSeriesSummer value)
2527
{
26-
var converted = value.Samples.ToDictionary(
27-
static kvp => kvp.Key,
28-
static kvp => kvp.Value);
28+
var samples = value.Samples;
29+
var converted = new Dictionary<DateTimeOffset, int>(samples.Count);
30+
31+
foreach (var pair in samples)
32+
{
33+
converted[pair.Key] = pair.Value;
34+
}
35+
2936
return new TimeSeriesSummerSurrogate<int>(converted, value.Start, value.End,
3037
value.SampleInterval, value.MaxSamplesCount, value.LastDate, value.DataCount, value.Strategy);
3138
}

0 commit comments

Comments
 (0)