Skip to content

Commit 59a1630

Browse files
authored
fix: public interface (#973)
* add missing public tuple method * update unit tests * fix Numerix tests
1 parent ae70593 commit 59a1630

4 files changed

Lines changed: 105 additions & 9 deletions

File tree

src/_common/Results/Result.Utilities.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public static IEnumerable<TResult> Condense<TResult>(
3636
List<TResult> resultsList = results
3737
.ToList();
3838

39-
resultsList
39+
_ = resultsList
4040
.RemoveAll(match:
4141
x => x.Value is null or (double and double.NaN));
4242

@@ -128,7 +128,7 @@ public static IEnumerable<TResultR> SyncIndex<TResultR, TResultM>(
128128
}
129129
}
130130

131-
resultsList.RemoveAll(x => toRemove.Contains(x));
131+
_ = resultsList.RemoveAll(x => toRemove.Contains(x));
132132
}
133133

134134
return resultsList.ToSortedList();
@@ -160,9 +160,14 @@ public static IEnumerable<TResultR> SyncIndex<TResultR, TResultM>(
160160
}
161161

162162
// CONVERT TO TUPLE with nullable value option and no pruning
163+
public static Collection<(DateTime Date, double? Value)> ToTupleCollection(
164+
this IEnumerable<IReusableResult> reusable, NullTo nullTo)
165+
=> reusable
166+
.ToTuple(nullTo)
167+
.ToCollection();
168+
163169
internal static List<(DateTime Date, double? Value)> ToTuple(
164-
this IEnumerable<IReusableResult> reusable,
165-
NullTo nullTo)
170+
this IEnumerable<IReusableResult> reusable, NullTo nullTo)
166171
{
167172
List<IReusableResult> reList = reusable.ToList();
168173
int length = reList.Count;
Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44
namespace Internal.Tests;
55

66
[TestClass]
7-
public class NumericsTests : TestBase
7+
public class NumerixTests : TestBase
88
{
99
private readonly double[] closePrice = longishQuotes
1010
.Select(x => (double)x.Close)
1111
.ToArray();
1212

13+
private readonly double[] x = { 1, 2, 3, 4, 5 };
14+
private readonly double[] y = { 0, 0, 0, 0 };
15+
1316
[TestMethod]
1417
public void StdDev()
1518
{
@@ -18,6 +21,42 @@ public void StdDev()
1821
Assert.AreEqual(633.932098287, Math.Round(sd, 9));
1922
}
2023

24+
[TestMethod]
25+
[ExpectedException(typeof(ArgumentNullException), "Null parameter.")]
26+
public void StdDevNull()
27+
{
28+
double sd = Numerix.StdDev(null);
29+
}
30+
31+
[TestMethod]
32+
public void Slope()
33+
{
34+
double s = Numerix.Slope(x, x);
35+
36+
Assert.AreEqual(1d, s);
37+
}
38+
39+
[TestMethod]
40+
[ExpectedException(typeof(ArgumentNullException), "Null X parameter.")]
41+
public void SlopeXnull()
42+
{
43+
double s = Numerix.Slope(null, x);
44+
}
45+
46+
[TestMethod]
47+
[ExpectedException(typeof(ArgumentNullException), "Null Y parameter.")]
48+
public void SlopeYnull()
49+
{
50+
double s = Numerix.Slope(x, null);
51+
}
52+
53+
[TestMethod]
54+
[ExpectedException(typeof(ArgumentException), "X and Y different lengths.")]
55+
public void SlopeMismatch()
56+
{
57+
double s = Numerix.Slope(x, y);
58+
}
59+
2160
[TestMethod]
2261
public void RoundDownDate()
2362
{

tests/indicators/_common/Test.QuoteUtility.cs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.ObjectModel;
12
using Microsoft.VisualStudio.TestTools.UnitTesting;
23
using Skender.Stock.Indicators;
34

@@ -64,14 +65,39 @@ public void QuoteToTuple()
6465
NullMath.Round(q.ToTuple(CandlePart.OHLC4).value, 10));
6566

6667
// bad argument
67-
Assert.ThrowsException<ArgumentOutOfRangeException>(() =>
68+
_ = Assert.ThrowsException<ArgumentOutOfRangeException>(() =>
6869
q.ToTuple((CandlePart)999));
6970

7071
// bad argument
71-
Assert.ThrowsException<ArgumentOutOfRangeException>(() =>
72+
_ = Assert.ThrowsException<ArgumentOutOfRangeException>(() =>
7273
q.ToBasicData((CandlePart)999));
7374
}
7475

76+
[TestMethod]
77+
public void ToTupleCollection()
78+
{
79+
Collection<(DateTime, double)> collection = quotes
80+
.OrderBy(x => x.Date)
81+
.ToTupleCollection(CandlePart.Close);
82+
83+
Assert.IsNotNull(collection);
84+
Assert.AreEqual(502, collection.Count);
85+
Assert.AreEqual(collection.LastOrDefault().Item2, 245.28d);
86+
}
87+
88+
[TestMethod]
89+
public void ToSortedList()
90+
{
91+
Collection<(DateTime, double)> collection = quotes
92+
.OrderBy(x => x.Date)
93+
.ToTuple(CandlePart.Close)
94+
.ToSortedCollection();
95+
96+
Assert.IsNotNull(collection);
97+
Assert.AreEqual(502, collection.Count);
98+
Assert.AreEqual(collection.LastOrDefault().Item2, 245.28d);
99+
}
100+
75101
[TestMethod]
76102
public void QuoteToBasicData()
77103
{
@@ -130,7 +156,7 @@ public void QuoteToBasicData()
130156
NullMath.Round(q.ToBasicData(CandlePart.OHLC4).Value, 10));
131157

132158
// bad argument
133-
Assert.ThrowsException<ArgumentOutOfRangeException>(() =>
159+
_ = Assert.ThrowsException<ArgumentOutOfRangeException>(() =>
134160
q.ToBasicData((CandlePart)999));
135161
}
136162

@@ -192,7 +218,7 @@ public void QuoteDToTuple()
192218
NullMath.Round(q.ToTuple(CandlePart.OHLC4).Item2, 10));
193219

194220
// bad argument
195-
Assert.ThrowsException<ArgumentOutOfRangeException>(() =>
221+
_ = Assert.ThrowsException<ArgumentOutOfRangeException>(() =>
196222
q.ToTuple((CandlePart)999));
197223
}
198224
}

tests/indicators/_common/Test.ResultUtility.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.ObjectModel;
12
using Microsoft.VisualStudio.TestTools.UnitTesting;
23
using Skender.Stock.Indicators;
34

@@ -194,5 +195,30 @@ public void ToTuple()
194195

195196
Assert.AreEqual(0, nullableResults.Count(x => x.Value is null));
196197
Assert.AreEqual(4, nullableResults.Count(x => x.Value is double.NaN));
198+
199+
// PUBLIC VARIANT
200+
// default to NaN with pruning
201+
Collection<(DateTime Date, double Value)> cnaNresults = baseline.ToTupleCollection();
202+
203+
Assert.AreEqual(5, cnaNresults.Count(x => !double.IsNaN(x.Value)));
204+
Assert.AreEqual(2, cnaNresults.Count(x => double.IsNaN(x.Value)));
205+
206+
// with null option
207+
Collection<(DateTime Date, double? Value)> cnullResults = baseline.ToTupleCollection(NullTo.Null);
208+
209+
Assert.AreEqual(3, cnullResults.Count(x => x.Value is null));
210+
Assert.AreEqual(1, cnullResults.Count(x => x.Value is double.NaN));
211+
212+
// with explicit nullable NaN option
213+
Collection<(DateTime Date, double? Value)> cnullableResults = baseline.ToTupleCollection(NullTo.NaN);
214+
215+
Assert.AreEqual(0, cnullableResults.Count(x => x.Value is null));
216+
Assert.AreEqual(4, cnullableResults.Count(x => x.Value is double.NaN));
217+
218+
// PUBLIC VARIANT Sorted Collection
219+
Collection<SmaResult> sortResults = baseline
220+
.ToSortedCollection();
221+
222+
Assert.AreEqual(5, sortResults[4].Sma);
197223
}
198224
}

0 commit comments

Comments
 (0)