Skip to content

Commit 21a5bfd

Browse files
committed
Merge branch 'dev'
2 parents 190f800 + 9b54fa0 commit 21a5bfd

6 files changed

Lines changed: 231 additions & 16 deletions

File tree

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
using Noggog;
2+
using Shouldly;
3+
4+
namespace CSharpExt.UnitTests;
5+
6+
public class PercentTests
7+
{
8+
[Fact]
9+
public void Typical()
10+
{
11+
var p = new Percent(0.5);
12+
p.Value.ShouldBe(0.5);
13+
}
14+
15+
[Fact]
16+
public void OutOfRange()
17+
{
18+
Assert.Throws<ArgumentOutOfRangeException>(() =>
19+
{
20+
new Percent(-0.1);
21+
});
22+
Assert.Throws<ArgumentOutOfRangeException>(() =>
23+
{
24+
new Percent(1.1);
25+
});
26+
}
27+
28+
[Fact]
29+
public void Inverse()
30+
{
31+
var p = new Percent(0.7);
32+
p.Inverse.Value.EqualsWithin(0.3).ShouldBeTrue();
33+
p.Inverse.Inverse.Value.EqualsWithin(0.7).ShouldBeTrue();
34+
}
35+
36+
[Fact]
37+
public void Add()
38+
{
39+
var p = new Percent(0.15d);
40+
var p2 = new Percent(0.25d);
41+
var p3 = p + p2;
42+
p3.Value.ShouldBe(0.4d);
43+
var p4 = new Percent(0.7);
44+
Assert.Throws<ArgumentOutOfRangeException>(() =>
45+
{
46+
var p5 = p3 + p4;
47+
});
48+
}
49+
50+
[Fact]
51+
public void Subtract()
52+
{
53+
var p = new Percent(0.7d);
54+
var p2 = new Percent(0.25d);
55+
var p3 = p - p2;
56+
p3.Value.EqualsWithin(0.45d).ShouldBeTrue();
57+
var p4 = new Percent(0.7);
58+
Assert.Throws<ArgumentOutOfRangeException>(() =>
59+
{
60+
var p5 = p3 - p4;
61+
});
62+
}
63+
64+
[Fact]
65+
public void Multiply()
66+
{
67+
var p = new Percent(0.5d);
68+
var p2 = new Percent(0.25d);
69+
var p3 = p * p2;
70+
p3.Value.ShouldBe(0.125d);
71+
}
72+
73+
[Fact]
74+
public void Divide()
75+
{
76+
var p = new Percent(0.5d);
77+
var p2 = new Percent(0.25d);
78+
var p3 = p / p2;
79+
p3.ShouldBe(2d);
80+
}
81+
82+
[Fact]
83+
public void PutInRange()
84+
{
85+
var p1 = Percent.FactoryPutInRange(1.1);
86+
p1.Value.ShouldBe(1);
87+
var p2 = Percent.FactoryPutInRange(-0.1);
88+
p2.Value.ShouldBe(0);
89+
var p3 = Percent.FactoryPutInRange(0.5);
90+
p3.Value.ShouldBe(0.5);
91+
}
92+
93+
[Fact]
94+
public void PutInRangeWithMax()
95+
{
96+
var p1 = Percent.FactoryPutInRange(500, 255);
97+
p1.Value.ShouldBe(1);
98+
var p2 = Percent.FactoryPutInRange(-5, 255);
99+
p2.Value.ShouldBe(0);
100+
var p3 = Percent.FactoryPutInRange(50, 255);
101+
p3.Value.EqualsWithin(0.196078431372549).ShouldBeTrue();
102+
}
103+
104+
[Fact]
105+
public void PutInRangeWithMaxLong()
106+
{
107+
var p1 = Percent.FactoryPutInRange(500L, 255L);
108+
p1.Value.ShouldBe(1);
109+
var p2 = Percent.FactoryPutInRange(-5L, 255L);
110+
p2.Value.ShouldBe(0);
111+
var p3 = Percent.FactoryPutInRange(50L, 255L);
112+
p3.Value.EqualsWithin(0.196078431372549).ShouldBeTrue();
113+
}
114+
115+
[Fact]
116+
public void Equality()
117+
{
118+
var p1 = new Percent(0.123);
119+
var p2 = new Percent(0.123);
120+
p1.ShouldBe(p2);
121+
p1.GetHashCode().ShouldBe(p2.GetHashCode());
122+
var b = p1 == p2;
123+
b.ShouldBeTrue();
124+
var b2 = p1 != p2;
125+
b2.ShouldBeFalse();
126+
}
127+
128+
[Fact]
129+
public void NonEquality()
130+
{
131+
var p1 = new Percent(0.123);
132+
var p2 = new Percent(0.124);
133+
p1.ShouldNotBe(p2);
134+
p1.GetHashCode().ShouldNotBe(p2.GetHashCode());
135+
var b = p1 == p2;
136+
b.ShouldBeFalse();
137+
var b2 = p1 != p2;
138+
b2.ShouldBeTrue();
139+
}
140+
141+
[Fact]
142+
public void LessThanCompare()
143+
{
144+
var p1 = new Percent(0.1);
145+
var p2 = new Percent(0.2);
146+
var c = p1 < p2;
147+
c.ShouldBeTrue();
148+
c = p2 < p1;
149+
c.ShouldBeFalse();
150+
c = p1 < p1;
151+
c.ShouldBeFalse();
152+
}
153+
154+
[Fact]
155+
public void LessThanOrEqualCompare()
156+
{
157+
var p1 = new Percent(0.1);
158+
var p2 = new Percent(0.2);
159+
var c = p1 <= p2;
160+
c.ShouldBeTrue();
161+
c = p2 <= p1;
162+
c.ShouldBeFalse();
163+
c = p1 <= p1;
164+
c.ShouldBeTrue();
165+
}
166+
167+
[Fact]
168+
public void GreaterThanOrEqualCompare()
169+
{
170+
var p1 = new Percent(0.1);
171+
var p2 = new Percent(0.2);
172+
var c = p1 >= p2;
173+
c.ShouldBeFalse();
174+
c = p2 >= p1;
175+
c.ShouldBeTrue();
176+
c = p1 >= p1;
177+
c.ShouldBeTrue();
178+
}
179+
180+
[Fact]
181+
public void GreaterThanCompare()
182+
{
183+
var p1 = new Percent(0.1);
184+
var p2 = new Percent(0.2);
185+
var c = p1 > p2;
186+
c.ShouldBeFalse();
187+
c = p2 > p1;
188+
c.ShouldBeTrue();
189+
c = p1 > p1;
190+
c.ShouldBeFalse();
191+
}
192+
}

CSharpExt.UnitTests/ShouldlyExtTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,20 @@ public void ShouldEqualFilePathStringArray(
8686
{
8787
paths.Select(x => x.Path).ShouldEqualEnumerable(paths.ToArray());
8888
}
89+
90+
[Fact]
91+
public void ShouldEqualEnumerableMemorySlice()
92+
{
93+
ReadOnlyMemorySlice<byte> b1 = new byte[] { 1, 2, 3 };
94+
ReadOnlyMemorySlice<byte> b2 = new byte[] { 1, 2, 3 };
95+
b1.ShouldEqualEnumerable(b2);
96+
}
97+
98+
[Fact]
99+
public void ShouldEqualEnumerableMemorySliceNullable()
100+
{
101+
ReadOnlyMemorySlice<byte> b1 = new byte[] { 1, 2, 3 };
102+
ReadOnlyMemorySlice<byte>? b2 = new byte[] { 1, 2, 3 };
103+
b1.ShouldEqualEnumerable(b2);
104+
}
89105
}

Directory.Packages.props

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,10 @@
4747
</PackageVersion>
4848
<PackageVersion Include="ReactiveUI.Testing" Version="20.2.45" />
4949
<PackageVersion Include="ReactiveUI.WPF" Version="20.2.45" />
50-
<PackageVersion Include="System.Buffers" Version="4.6.0" />
51-
<PackageVersion Include="System.Buffers" Version="4.6.1" />
52-
<PackageVersion Include="System.Buffers" Version="4.6.1" />
5350
<PackageVersion Include="System.Buffers" Version="4.6.1" />
5451
<PackageVersion Include="System.IO.Abstractions" Version="22.0.14" />
5552
<PackageVersion Include="System.IO.Abstractions.TestingHelpers" Version="22.0.14" />
5653
<PackageVersion Include="System.Linq.Async" Version="6.0.1" />
57-
<PackageVersion Include="System.Memory" Version="4.6.0" />
58-
<PackageVersion Include="System.Memory" Version="4.6.3" />
59-
<PackageVersion Include="System.Memory" Version="4.6.3" />
6054
<PackageVersion Include="System.Memory" Version="4.6.3" />
6155
<PackageVersion Include="System.Reactive" Version="6.0.1" />
6256
<PackageVersion Include="Verify.DiffPlex" Version="3.1.2" />

Noggog.CSharpExt/Extensions/XmlExt.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Diagnostics.CodeAnalysis;
2+
using System.Globalization;
23
using System.Reflection;
34
using System.Text;
45
using System.Xml.Linq;
@@ -69,7 +70,7 @@ public static bool TryGetAttribute<P>(this XElement node, string str, [MaybeNull
6970
return true;
7071
}
7172

72-
public static bool TryGetAttribute<P>(this XElement node, string str, [MaybeNullWhen(false)] out P val, bool throwException = false)
73+
public static bool TryGetAttribute<P>(this XElement node, string str, [MaybeNullWhen(false)] out P val, bool throwException = false, CultureInfo? culture = null)
7374
{
7475
var ret = TryGetAttribute<P>(node, str, out val, (strVal) =>
7576
{
@@ -90,7 +91,7 @@ public static bool TryGetAttribute<P>(this XElement node, string str, [MaybeNull
9091
}
9192
else
9293
{
93-
return (P)Convert.ChangeType(strVal, t);
94+
return (P)Convert.ChangeType(strVal, t, culture);
9495
}
9596
}
9697
catch (Exception)

Noggog.CSharpExt/Structs/Numbers/Percent.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ private Percent(double d, bool check)
1616
}
1717
else
1818
{
19-
throw new ArgumentException("Element out of range: " + d);
19+
throw new ArgumentOutOfRangeException("Element out of range: " + d);
2020
}
2121
}
2222

@@ -27,7 +27,7 @@ public Percent(double d)
2727

2828
public static bool InRange(double d)
2929
{
30-
return d >= 0 || d <= 1;
30+
return d >= 0 && d <= 1;
3131
}
3232

3333
public static Percent operator +(Percent c1, Percent c2)
@@ -45,9 +45,9 @@ public static bool InRange(double d)
4545
return new Percent(c1.Value - c2.Value);
4646
}
4747

48-
public static Percent operator /(Percent c1, Percent c2)
48+
public static double operator /(Percent c1, Percent c2)
4949
{
50-
return new Percent(c1.Value / c2.Value);
50+
return c1.Value / c2.Value;
5151
}
5252

5353
public static implicit operator double(Percent c1)

Noggog.Testing/Extensions/ShouldlyExt.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,27 +73,39 @@ internal static bool RoughlyEqual<TLhs>(TLhs actual, object? expected)
7373
}
7474

7575
[MethodImpl(MethodImplOptions.NoInlining)]
76-
public static void ShouldEqualEnumerable<T, TRhs>(this IEnumerable<T> actual, params TRhs?[] expected)
76+
public static void ShouldEqualEnumerable<T, TRhs>(this IEnumerable<T>? actual, params TRhs?[] expected)
7777
where TRhs : T
7878
{
7979
ShouldEqualEnumerableInternal(actual, expected);
8080
}
8181

8282
[MethodImpl(MethodImplOptions.NoInlining)]
83-
public static void ShouldEqualEnumerable<T>(this IEnumerable<T> actual, params object?[] expected)
83+
public static void ShouldEqualEnumerable<T>(this IEnumerable<T>? actual, params object?[] expected)
8484
{
8585
ShouldEqualEnumerableInternal(actual, expected);
8686
}
8787

8888
[MethodImpl(MethodImplOptions.NoInlining)]
89-
public static void ShouldEqualEnumerable<TLhs, TRhs>(this IEnumerable<TLhs> actual, IEnumerable<TRhs> expected)
89+
public static void ShouldEqualEnumerable<TLhs, TRhs>(this IEnumerable<TLhs>? actual, IEnumerable<TRhs>? expected)
9090
{
9191
ShouldEqualEnumerableInternal(actual, expected);
9292
}
9393

9494
[MethodImpl(MethodImplOptions.NoInlining)]
95-
private static void ShouldEqualEnumerableInternal(IEnumerable actual, IEnumerable expected)
95+
public static void ShouldEqualEnumerable<TLhs, TRhs>(this IEnumerable<TLhs>? actual, ReadOnlyMemorySlice<TRhs>? expected)
9696
{
97+
ShouldEqualEnumerableInternal(actual, expected);
98+
}
99+
100+
[MethodImpl(MethodImplOptions.NoInlining)]
101+
private static void ShouldEqualEnumerableInternal(IEnumerable? actual, IEnumerable? expected)
102+
{
103+
if (actual == null && expected == null) return;
104+
if (actual == null || expected == null)
105+
{
106+
throw new ShouldAssertException(
107+
new ExpectedActualShouldlyMessage(expected, actual, null).ToString());
108+
}
97109
var actualList = new List<object>();
98110
foreach (var item in actual)
99111
{

0 commit comments

Comments
 (0)