Skip to content

Commit 995d93f

Browse files
committed
Add Option Tests
1 parent 1eae7ed commit 995d93f

File tree

2 files changed

+205
-17
lines changed

2 files changed

+205
-17
lines changed

tests/Core.Tests/Class1.cs

Lines changed: 0 additions & 17 deletions
This file was deleted.

tests/Core.Tests/OptionTests.cs

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
using EHonda.Optional.Core;
2+
3+
namespace Tests;
4+
5+
public class OptionTests
6+
{
7+
[Test]
8+
public async Task Default_Option_Should_Be_None()
9+
{
10+
Option<int> option = default;
11+
12+
await Assert.That(option.HasValue).IsFalse();
13+
await Assert.That(option.Value).IsEqualTo(0); // default(int)
14+
}
15+
16+
[Test]
17+
public async Task Option_None_Should_Be_Equivalent_To_Default()
18+
{
19+
var none = Option.None<int>();
20+
Option<int> def = default;
21+
22+
await Assert.That(none).IsEqualTo(def);
23+
await Assert.That(none.HasValue).IsFalse();
24+
}
25+
26+
[Test]
27+
public async Task Option_Some_Should_Have_Value()
28+
{
29+
var option = Option.Some(42);
30+
31+
await Assert.That(option.HasValue).IsTrue();
32+
await Assert.That(option.Value).IsEqualTo(42);
33+
}
34+
35+
[Test]
36+
public async Task Option_Some_Null_Should_Be_Some()
37+
{
38+
var option = Option.Some<string?>(null);
39+
40+
await Assert.That(option.HasValue).IsTrue();
41+
await Assert.That(option.Value).IsNull();
42+
}
43+
44+
[Test]
45+
public async Task Equality_Two_Defaults_Should_Be_Equal()
46+
{
47+
Option<int> a = default;
48+
Option<int> b = default;
49+
50+
await Assert.That(a).IsEqualTo(b);
51+
}
52+
53+
[Test]
54+
public async Task Equality_Some_And_None_Should_Not_Be_Equal()
55+
{
56+
var some = Option.Some(5);
57+
Option<int> none = default;
58+
59+
await Assert.That(some).IsNotEqualTo(none);
60+
}
61+
62+
[Test]
63+
public async Task Equality_Two_Somes_With_Same_Value_Should_Be_Equal()
64+
{
65+
var a = Option.Some(5);
66+
var b = Option.Some(5);
67+
68+
await Assert.That(a).IsEqualTo(b);
69+
}
70+
71+
[Test]
72+
public async Task Equality_Two_Somes_With_Different_Values_Should_Not_Be_Equal()
73+
{
74+
var a = Option.Some(5);
75+
var b = Option.Some(6);
76+
77+
await Assert.That(a).IsNotEqualTo(b);
78+
}
79+
80+
[Test]
81+
public async Task Equality_Some_Null_Should_Not_Equal_None()
82+
{
83+
var someNull = Option.Some<string?>(null);
84+
Option<string?> none = default;
85+
86+
await Assert.That(someNull).IsNotEqualTo(none);
87+
}
88+
89+
[Test]
90+
public async Task Equality_Two_Some_Nulls_Should_Be_Equal()
91+
{
92+
var a = Option.Some<string?>(null);
93+
var b = Option.Some<string?>(null);
94+
95+
await Assert.That(a).IsEqualTo(b);
96+
}
97+
98+
[Test]
99+
public async Task Implicit_Conversion_From_Value_Should_Create_Some()
100+
{
101+
Option<int> option = 42;
102+
103+
await Assert.That(option.HasValue).IsTrue();
104+
await Assert.That(option.Value).IsEqualTo(42);
105+
}
106+
107+
[Test]
108+
public async Task Implicit_Conversion_From_Null_Should_Create_Some_Null()
109+
{
110+
Option<string?> option = null;
111+
112+
await Assert.That(option.HasValue).IsTrue();
113+
await Assert.That(option.Value).IsNull();
114+
}
115+
116+
[Test]
117+
public async Task Explicit_Conversion_To_Value_Should_Return_Value()
118+
{
119+
var option = Option.Some(42);
120+
int value = (int)option;
121+
122+
await Assert.That(value).IsEqualTo(42);
123+
}
124+
125+
[Test]
126+
public async Task Explicit_Conversion_From_None_Should_Throw()
127+
{
128+
Option<int> none = default;
129+
130+
await Assert.ThrowsAsync<InvalidOperationException>(() =>
131+
{
132+
var _ = (int)none;
133+
return Task.CompletedTask;
134+
});
135+
}
136+
137+
[Test]
138+
public async Task Or_Value_Should_Return_Content_Or_Fallback()
139+
{
140+
await Assert.That(Option.Some(5).Or(10)).IsEqualTo(5);
141+
await Assert.That(Option.None<int>().Or(10)).IsEqualTo(10);
142+
}
143+
144+
[Test]
145+
public async Task Or_Factory_Should_Return_Content_Or_Invoke_Factory()
146+
{
147+
await Assert.That(Option.Some(5).Or(() => 10)).IsEqualTo(5);
148+
await Assert.That(Option.None<int>().Or(() => 10)).IsEqualTo(10);
149+
}
150+
151+
[Test]
152+
public async Task OrDefault_Should_Return_Content_Or_Type_Default()
153+
{
154+
await Assert.That(Option.Some(5).OrDefault()).IsEqualTo(5);
155+
await Assert.That(Option.None<int>().OrDefault()).IsEqualTo(0);
156+
}
157+
158+
[Test]
159+
public async Task OrThrow_Should_Return_Value_Or_Throw()
160+
{
161+
await Assert.That(Option.Some(5).OrThrow()).IsEqualTo(5);
162+
163+
await Assert.ThrowsAsync<InvalidOperationException>(async () =>
164+
{
165+
Option.None<int>().OrThrow();
166+
await Task.CompletedTask;
167+
});
168+
169+
await Assert.ThrowsAsync<InvalidOperationException>(async () =>
170+
{
171+
Option.None<int>().OrThrow("Custom message");
172+
await Task.CompletedTask;
173+
});
174+
175+
await Assert.ThrowsAsync<ArgumentException>(async () =>
176+
{
177+
Option.None<int>().OrThrow(() => new ArgumentException());
178+
await Task.CompletedTask;
179+
});
180+
}
181+
182+
[Test]
183+
public async Task Deconstruct_Should_Support_Pattern_Matching()
184+
{
185+
var some = Option.Some(42);
186+
if (some is (true, var val))
187+
{
188+
await Assert.That(val).IsEqualTo(42);
189+
}
190+
else
191+
{
192+
Assert.Fail("Should have matched Some pattern");
193+
}
194+
195+
var none = Option.None<int>();
196+
if (none is (false, _))
197+
{
198+
// Success
199+
}
200+
else
201+
{
202+
Assert.Fail("Should have matched None pattern");
203+
}
204+
}
205+
}

0 commit comments

Comments
 (0)