Skip to content

Commit b6e5e71

Browse files
committed
Release 0.0.1.4 preparations
1 parent 9e0f3ff commit b6e5e71

File tree

10 files changed

+252
-151
lines changed

10 files changed

+252
-151
lines changed
Lines changed: 82 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,93 @@
11
using System;
22
using Xunit;
3-
using async_enumerable_dotnet;
4-
using System.Threading.Tasks;
3+
using async_enumerable_dotnet.impl;
54

65
namespace async_enumerable_dotnet_test
76
{
8-
public class UnitTest1
7+
public class ExceptionHelperTest
98
{
9+
private Exception _error;
10+
1011
[Fact]
11-
public async void Test1()
12+
public void AddException()
1213
{
13-
await Task.CompletedTask;
14+
var ex = new InvalidOperationException();
15+
Assert.True(ExceptionHelper.AddException(ref _error, ex));
16+
17+
Assert.Same(ex, _error);
1418
}
19+
20+
[Fact]
21+
public void AddException_Existing()
22+
{
23+
_error = new IndexOutOfRangeException();
24+
var ex = new InvalidOperationException();
25+
Assert.True(ExceptionHelper.AddException(ref _error, ex));
26+
27+
Assert.True(_error is AggregateException);
28+
29+
var g = (AggregateException)_error;
30+
31+
Assert.Equal(2, g.InnerExceptions.Count);
32+
33+
Assert.True(g.InnerExceptions[0] is IndexOutOfRangeException);
34+
Assert.True(g.InnerExceptions[1] is InvalidOperationException);
35+
}
36+
37+
[Fact]
38+
public void AddException_Terminated()
39+
{
40+
var ex = new InvalidOperationException();
41+
42+
Assert.True(ExceptionHelper.AddException(ref _error, ex));
43+
44+
Assert.Same(ExceptionHelper.Terminate(ref _error), ex);
45+
}
46+
47+
[Fact]
48+
public void AddException_Terminated_2()
49+
{
50+
Assert.Same(ExceptionHelper.Terminate(ref _error), null);
51+
52+
var ex = new InvalidOperationException();
53+
54+
Assert.False(ExceptionHelper.AddException(ref _error, ex));
55+
}
56+
57+
[Fact]
58+
public void Terminate()
59+
{
60+
Assert.Same(ExceptionHelper.Terminate(ref _error), null);
61+
62+
Assert.Same(ExceptionHelper.Terminate(ref _error), ExceptionHelper.Terminated);
63+
}
64+
65+
[Fact]
66+
public void Unaggregate_Aggregated_Solo()
67+
{
68+
var ex = new InvalidOperationException();
69+
70+
Assert.Same(ExceptionHelper.Unaggregate(new AggregateException(ex)), ex);
71+
}
72+
73+
[Fact]
74+
public void Unaggregate_Aggregated_Not_Solo()
75+
{
76+
var ex = new InvalidOperationException();
77+
var ex2 = new IndexOutOfRangeException();
78+
79+
var g = new AggregateException(ex, ex2);
80+
81+
Assert.Same(ExceptionHelper.Unaggregate(g), g);
82+
}
83+
84+
[Fact]
85+
public void Unaggregate_Not_Aggregated()
86+
{
87+
var ex = new InvalidOperationException();
88+
89+
Assert.Same(ExceptionHelper.Unaggregate(ex), ex);
90+
}
91+
1592
}
1693
}
Lines changed: 98 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,110 @@
11
using System;
2+
using System.Threading;
23
using Xunit;
3-
using async_enumerable_dotnet;
44
using System.Threading.Tasks;
5+
using async_enumerable_dotnet.impl;
56

67
namespace async_enumerable_dotnet_test
78
{
8-
public class UnitTest1
9+
public class ResumeHelperTest
910
{
11+
private TaskCompletionSource<bool> _tcs;
12+
1013
[Fact]
11-
public async void Test1()
14+
public void Value_Cancelled()
1215
{
13-
await Task.CompletedTask;
16+
var source = new TaskCompletionSource<bool>();
17+
source.TrySetCanceled();
18+
19+
ResumeHelper.ResumeWhen(new ValueTask(source.Task), ref _tcs);
20+
21+
Assert.True(_tcs.Task.IsCanceled);
1422
}
23+
24+
[Fact]
25+
public void Value_Error()
26+
{
27+
var source = new TaskCompletionSource<bool>();
28+
var ex = new InvalidOperationException();
29+
source.TrySetException(ex);
30+
31+
ResumeHelper.ResumeWhen(new ValueTask(source.Task), ref _tcs);
32+
33+
Assert.True(_tcs.Task.IsFaulted);
34+
Assert.Same(ex, ExceptionHelper.Unaggregate(ExceptionHelper.Unaggregate(_tcs.Task.Exception)));
35+
}
36+
37+
38+
[Fact]
39+
public void Value_Success()
40+
{
41+
var source = new TaskCompletionSource<bool>();
42+
source.TrySetResult(true);
43+
44+
ResumeHelper.ResumeWhen(new ValueTask(source.Task), ref _tcs);
45+
46+
Assert.True(_tcs.Task.IsCompleted);
47+
Assert.True(_tcs.Task.Result);
48+
}
49+
50+
[Fact]
51+
public async void Async_Cancelled()
52+
{
53+
var source = new TaskCompletionSource<bool>();
54+
55+
ResumeHelper.ResumeWhen(new ValueTask(source.Task), ref _tcs);
56+
57+
source.TrySetCanceled();
58+
59+
try
60+
{
61+
await _tcs.Task;
62+
}
63+
catch (Exception)
64+
{
65+
66+
}
67+
68+
Assert.True(_tcs.Task.IsCanceled);
69+
}
70+
71+
[Fact]
72+
public async void Async_Error()
73+
{
74+
var source = new TaskCompletionSource<bool>();
75+
76+
ResumeHelper.ResumeWhen(new ValueTask(source.Task), ref _tcs);
77+
78+
var ex = new InvalidOperationException();
79+
source.TrySetException(ex);
80+
81+
try
82+
{
83+
await _tcs.Task;
84+
}
85+
catch (AggregateException g)
86+
{
87+
Assert.Same(ex, ExceptionHelper.Unaggregate(ExceptionHelper.Unaggregate(g)));
88+
}
89+
90+
Assert.True(_tcs.Task.IsFaulted);
91+
}
92+
93+
94+
[Fact]
95+
public async void Async_Success()
96+
{
97+
var source = new TaskCompletionSource<bool>();
98+
99+
ResumeHelper.ResumeWhen(new ValueTask(source.Task), ref _tcs);
100+
101+
source.TrySetResult(true);
102+
103+
await _tcs.Task;
104+
105+
Assert.True(_tcs.Task.IsCompleted);
106+
Assert.True(_tcs.Task.Result);
107+
}
108+
15109
}
16110
}

async-enumerable-dotnet-test/TimerTest.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ public async void Token()
1414
var value = 0;
1515

1616
var cts = new CancellationTokenSource();
17+
#pragma warning disable 4014
1718
AsyncEnumerable.Timer(TimeSpan.FromSeconds(200), cts.Token)
1819
.DoOnNext(v => value = 1)
1920
.GetAsyncEnumerator()
2021
.MoveNextAsync();
22+
#pragma warning restore 4014
2123

2224
await Task.Delay(100);
2325

async-enumerable-dotnet-test/ToObservableTest.cs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,33 @@ public async void Normal()
1616

1717
var consumer = new BasicObserver<int>();
1818

19-
result.Subscribe(consumer);
19+
using (result.Subscribe(consumer))
20+
{
21+
await consumer.TerminateTask;
2022

21-
await consumer.TerminateTask;
23+
Assert.Equal(new List<int>(new[] {1, 2, 3, 4, 5}), consumer.values);
24+
Assert.Null(consumer.error);
25+
Assert.True(consumer.completed);
26+
}
27+
}
28+
29+
[Fact]
30+
public async void Error()
31+
{
32+
var ex = new InvalidOperationException();
33+
var result = AsyncEnumerable.Error<int>(ex)
34+
.ToObservable();
2235

23-
Assert.Equal(new List<int>(new[] { 1, 2, 3, 4, 5 }), consumer.values);
24-
Assert.Null(consumer.error);
25-
Assert.True(consumer.completed);
36+
var consumer = new BasicObserver<int>();
37+
38+
using (result.Subscribe(consumer))
39+
{
40+
await consumer.TerminateTask;
41+
42+
Assert.Empty(consumer.values);
43+
Assert.Same(ex, consumer.error);
44+
Assert.False(consumer.completed);
45+
}
2646
}
2747

2848
internal sealed class BasicObserver<T> : IObserver<T>

async-enumerable-dotnet/async-enumerable-dotnet.csproj

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,23 @@
99
<Version>0.0.1.3</Version>
1010
<Authors>David Karnok</Authors>
1111
<Company />
12-
<AssemblyVersion>0.0.1.3</AssemblyVersion>
12+
<AssemblyVersion>0.0.1.4</AssemblyVersion>
1313
<FileVersion>0.0.1.3</FileVersion>
1414
<PackageTags>async, concurrency, async-enumerable, operators, async-sequence</PackageTags>
1515
<RepositoryUrl>https://github.com/akarnokd/async-enumerable-dotnet</RepositoryUrl>
1616
<PackageProjectUrl>https://github.com/akarnokd/async-enumerable-dotnet#getting-started</PackageProjectUrl>
1717
<Description>Experimental operators for the upcoming C# 8 IAsyncEnumerables.</Description>
1818
<Copyright>(C) David Karnok</Copyright>
1919
<PackageLicenseUrl>https://www.apache.org/licenses/LICENSE-2.0</PackageLicenseUrl>
20-
<PackageReleaseNotes>Support for NETStandard 2.0 added.
20+
<PackageReleaseNotes>Bugfixes in various operators.
2121

2222
New operators:
23-
- GroupBy
24-
- Sample
25-
- ToList
26-
- ToListAsync
27-
- ToArray</PackageReleaseNotes>
23+
- Prefetch
24+
- Debounce
25+
- Latest
26+
27+
Renames
28+
- DoOnDisposeAsync -&gt; DoOnDispose</PackageReleaseNotes>
2829
<RepositoryType>Github</RepositoryType>
2930
<Product>Async Enumerable operators for .NET</Product>
3031
</PropertyGroup>

async-enumerable-dotnet/impl/ExceptionHelper.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace async_enumerable_dotnet.impl
88
/// <summary>
99
/// Helper methods for aggregating multiple Exceptions atomically.
1010
/// </summary>
11-
internal sealed class ExceptionHelper
11+
internal static class ExceptionHelper
1212
{
1313
/// <summary>
1414
/// The singleton exception indicating a terminal state so
@@ -36,7 +36,7 @@ internal static bool AddException(ref Exception field, Exception ex)
3636
var b = default(Exception);
3737
if (a == null)
3838
{
39-
b = a;
39+
b = ex;
4040
}
4141
else if (a is AggregateException g)
4242
{
@@ -69,7 +69,7 @@ internal static Exception Terminate(ref Exception field)
6969
/// <summary>
7070
/// An exception indicating a terminal state within an Exception field.
7171
/// </summary>
72-
sealed class TerminatedException : Exception
72+
private sealed class TerminatedException : Exception
7373
{
7474
internal TerminatedException() : base("No further exceptions.")
7575
{

async-enumerable-dotnet/impl/Prefetch.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ void SourceHandler(Task<bool> t)
110110
{
111111
if (Interlocked.Decrement(ref disposeWip) != 0)
112112
{
113-
ResumeHelper.ResumeWhen(source.DisposeAsync(), disposeTask);
113+
ResumeHelper.ResumeWhen(source.DisposeAsync(), ref disposeTask);
114114
}
115115
else if (t.IsFaulted)
116116
{

0 commit comments

Comments
 (0)