Skip to content

Conversation

manandre
Copy link
Contributor

Follow the same pattern as used for Task.WhenAny in

[Fact]
public static void Task_WhenAny_TwoTasks_InvalidArgs_Throws()
{
AssertExtensions.Throws<ArgumentNullException>("task1", () => Task.WhenAny(null, Task.CompletedTask));
AssertExtensions.Throws<ArgumentNullException>("task2", () => Task.WhenAny(Task.CompletedTask, null));
AssertExtensions.Throws<ArgumentNullException>("task1", () => Task.WhenAny(null, Task.FromResult(1)));
AssertExtensions.Throws<ArgumentNullException>("task2", () => Task.WhenAny(Task.FromResult(2), null));
}
[Fact]
public static void Task_WhenAny_NoTasks_Throws()
{
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new Task[0]); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new List<Task>()); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(EmptyIterator<Task>()); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new Task<int>[0]); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new List<Task<int>>()); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(EmptyIterator<Task<int>>()); });
static IEnumerable<T> EmptyIterator<T>() { yield break; }
}
[Fact]
public static async Task Task_WhenAny_TwoTasks_OnePreCompleted()
{
Task<int> t1 = Task.FromResult(1);
Task<int> t2 = new TaskCompletionSource<int>().Task;
Assert.Same(t1, await Task.WhenAny((Task)t1, (Task)t2));
Assert.Same(t1, await Task.WhenAny((Task)t2, (Task)t1));
Assert.Same(t1, await Task.WhenAny(t1, t2));
Assert.Same(t1, await Task.WhenAny(t2, t1));
}
[Fact]
public static async Task Task_WhenAny_TwoTasks_BothPreCompleted()
{
Task<int> t1 = Task.FromResult(1);
Task<int> t2 = Task.FromResult(2);
Assert.Same(t1, await Task.WhenAny((Task)t1, (Task)t2));
Assert.Same(t1, await Task.WhenAny((Task)t1, (Task)t1));
Assert.Same(t2, await Task.WhenAny((Task)t2, (Task)t1));
Assert.Same(t1, await Task.WhenAny(t1, t2));
Assert.Same(t1, await Task.WhenAny(t1, t1));
Assert.Same(t2, await Task.WhenAny(t2, t1));
}
[Fact]
public static async Task Task_WhenAny_TwoTasks_WakesOnFirstCompletion()
{
// Non-generic, first completes
{
var t1 = new TaskCompletionSource<int>();
var t2 = new TaskCompletionSource<int>();
Task<Task> twa = Task.WhenAny((Task)t1.Task, (Task)t2.Task);
Assert.False(twa.IsCompleted);
t1.SetResult(42);
Assert.Same(t1.Task, await twa);
}
// Generic, first completes
{
var t1 = new TaskCompletionSource<int>();
var t2 = new TaskCompletionSource<int>();
Task<Task<int>> twa = Task.WhenAny(t1.Task, t2.Task);
Assert.False(twa.IsCompleted);
t1.SetResult(42);
Assert.Same(t1.Task, await twa);
}
// Non-generic, second completes
{
var t1 = new TaskCompletionSource<int>();
var t2 = new TaskCompletionSource<int>();
Task<Task> twa = Task.WhenAny((Task)t1.Task, (Task)t2.Task);
Assert.False(twa.IsCompleted);
t2.SetResult(42);
Assert.Same(t2.Task, await twa);
}
// Generic, second completes
{
var t1 = new TaskCompletionSource<int>();
var t2 = new TaskCompletionSource<int>();
Task<Task<int>> twa = Task.WhenAny(t1.Task, t2.Task);
Assert.False(twa.IsCompleted);
t2.SetResult(42);
Assert.Same(t2.Task, await twa);
}
}

@ghost ghost added area-System.Threading community-contribution Indicates that the PR has been added by a community member labels Oct 17, 2023
@ghost
Copy link

ghost commented Oct 17, 2023

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

Issue Details

Follow the same pattern as used for Task.WhenAny in

[Fact]
public static void Task_WhenAny_TwoTasks_InvalidArgs_Throws()
{
AssertExtensions.Throws<ArgumentNullException>("task1", () => Task.WhenAny(null, Task.CompletedTask));
AssertExtensions.Throws<ArgumentNullException>("task2", () => Task.WhenAny(Task.CompletedTask, null));
AssertExtensions.Throws<ArgumentNullException>("task1", () => Task.WhenAny(null, Task.FromResult(1)));
AssertExtensions.Throws<ArgumentNullException>("task2", () => Task.WhenAny(Task.FromResult(2), null));
}
[Fact]
public static void Task_WhenAny_NoTasks_Throws()
{
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new Task[0]); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new List<Task>()); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(EmptyIterator<Task>()); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new Task<int>[0]); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new List<Task<int>>()); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(EmptyIterator<Task<int>>()); });
static IEnumerable<T> EmptyIterator<T>() { yield break; }
}
[Fact]
public static async Task Task_WhenAny_TwoTasks_OnePreCompleted()
{
Task<int> t1 = Task.FromResult(1);
Task<int> t2 = new TaskCompletionSource<int>().Task;
Assert.Same(t1, await Task.WhenAny((Task)t1, (Task)t2));
Assert.Same(t1, await Task.WhenAny((Task)t2, (Task)t1));
Assert.Same(t1, await Task.WhenAny(t1, t2));
Assert.Same(t1, await Task.WhenAny(t2, t1));
}
[Fact]
public static async Task Task_WhenAny_TwoTasks_BothPreCompleted()
{
Task<int> t1 = Task.FromResult(1);
Task<int> t2 = Task.FromResult(2);
Assert.Same(t1, await Task.WhenAny((Task)t1, (Task)t2));
Assert.Same(t1, await Task.WhenAny((Task)t1, (Task)t1));
Assert.Same(t2, await Task.WhenAny((Task)t2, (Task)t1));
Assert.Same(t1, await Task.WhenAny(t1, t2));
Assert.Same(t1, await Task.WhenAny(t1, t1));
Assert.Same(t2, await Task.WhenAny(t2, t1));
}
[Fact]
public static async Task Task_WhenAny_TwoTasks_WakesOnFirstCompletion()
{
// Non-generic, first completes
{
var t1 = new TaskCompletionSource<int>();
var t2 = new TaskCompletionSource<int>();
Task<Task> twa = Task.WhenAny((Task)t1.Task, (Task)t2.Task);
Assert.False(twa.IsCompleted);
t1.SetResult(42);
Assert.Same(t1.Task, await twa);
}
// Generic, first completes
{
var t1 = new TaskCompletionSource<int>();
var t2 = new TaskCompletionSource<int>();
Task<Task<int>> twa = Task.WhenAny(t1.Task, t2.Task);
Assert.False(twa.IsCompleted);
t1.SetResult(42);
Assert.Same(t1.Task, await twa);
}
// Non-generic, second completes
{
var t1 = new TaskCompletionSource<int>();
var t2 = new TaskCompletionSource<int>();
Task<Task> twa = Task.WhenAny((Task)t1.Task, (Task)t2.Task);
Assert.False(twa.IsCompleted);
t2.SetResult(42);
Assert.Same(t2.Task, await twa);
}
// Generic, second completes
{
var t1 = new TaskCompletionSource<int>();
var t2 = new TaskCompletionSource<int>();
Task<Task<int>> twa = Task.WhenAny(t1.Task, t2.Task);
Assert.False(twa.IsCompleted);
t2.SetResult(42);
Assert.Same(t2.Task, await twa);
}
}

Author: manandre
Assignees: -
Labels:

area-System.Threading, community-contribution

Milestone: -

@ghost
Copy link

ghost commented Nov 13, 2023

Tagging subscribers to this area: @dotnet/area-system-threading-tasks
See info in area-owners.md if you want to be subscribed.

Issue Details

Follow the same pattern as used for Task.WhenAny in

[Fact]
public static void Task_WhenAny_TwoTasks_InvalidArgs_Throws()
{
AssertExtensions.Throws<ArgumentNullException>("task1", () => Task.WhenAny(null, Task.CompletedTask));
AssertExtensions.Throws<ArgumentNullException>("task2", () => Task.WhenAny(Task.CompletedTask, null));
AssertExtensions.Throws<ArgumentNullException>("task1", () => Task.WhenAny(null, Task.FromResult(1)));
AssertExtensions.Throws<ArgumentNullException>("task2", () => Task.WhenAny(Task.FromResult(2), null));
}
[Fact]
public static void Task_WhenAny_NoTasks_Throws()
{
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new Task[0]); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new List<Task>()); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(EmptyIterator<Task>()); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new Task<int>[0]); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new List<Task<int>>()); });
AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(EmptyIterator<Task<int>>()); });
static IEnumerable<T> EmptyIterator<T>() { yield break; }
}
[Fact]
public static async Task Task_WhenAny_TwoTasks_OnePreCompleted()
{
Task<int> t1 = Task.FromResult(1);
Task<int> t2 = new TaskCompletionSource<int>().Task;
Assert.Same(t1, await Task.WhenAny((Task)t1, (Task)t2));
Assert.Same(t1, await Task.WhenAny((Task)t2, (Task)t1));
Assert.Same(t1, await Task.WhenAny(t1, t2));
Assert.Same(t1, await Task.WhenAny(t2, t1));
}
[Fact]
public static async Task Task_WhenAny_TwoTasks_BothPreCompleted()
{
Task<int> t1 = Task.FromResult(1);
Task<int> t2 = Task.FromResult(2);
Assert.Same(t1, await Task.WhenAny((Task)t1, (Task)t2));
Assert.Same(t1, await Task.WhenAny((Task)t1, (Task)t1));
Assert.Same(t2, await Task.WhenAny((Task)t2, (Task)t1));
Assert.Same(t1, await Task.WhenAny(t1, t2));
Assert.Same(t1, await Task.WhenAny(t1, t1));
Assert.Same(t2, await Task.WhenAny(t2, t1));
}
[Fact]
public static async Task Task_WhenAny_TwoTasks_WakesOnFirstCompletion()
{
// Non-generic, first completes
{
var t1 = new TaskCompletionSource<int>();
var t2 = new TaskCompletionSource<int>();
Task<Task> twa = Task.WhenAny((Task)t1.Task, (Task)t2.Task);
Assert.False(twa.IsCompleted);
t1.SetResult(42);
Assert.Same(t1.Task, await twa);
}
// Generic, first completes
{
var t1 = new TaskCompletionSource<int>();
var t2 = new TaskCompletionSource<int>();
Task<Task<int>> twa = Task.WhenAny(t1.Task, t2.Task);
Assert.False(twa.IsCompleted);
t1.SetResult(42);
Assert.Same(t1.Task, await twa);
}
// Non-generic, second completes
{
var t1 = new TaskCompletionSource<int>();
var t2 = new TaskCompletionSource<int>();
Task<Task> twa = Task.WhenAny((Task)t1.Task, (Task)t2.Task);
Assert.False(twa.IsCompleted);
t2.SetResult(42);
Assert.Same(t2.Task, await twa);
}
// Generic, second completes
{
var t1 = new TaskCompletionSource<int>();
var t2 = new TaskCompletionSource<int>();
Task<Task<int>> twa = Task.WhenAny(t1.Task, t2.Task);
Assert.False(twa.IsCompleted);
t2.SetResult(42);
Assert.Same(t2.Task, await twa);
}
}

Author: manandre
Assignees: -
Labels:

area-System.Threading.Tasks, community-contribution

Milestone: -

@ericstj
Copy link
Member

ericstj commented Nov 27, 2023

I merged in the rename from #94644 to resolve conflicts. @stephentoub can you have a look at these tests?

Copy link
Member

@stephentoub stephentoub left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. Thanks for improving the test suite.

@stephentoub stephentoub merged commit 28ad7e9 into dotnet:main Jan 30, 2024
@manandre manandre deleted the whenall-tests branch January 30, 2024 18:03
@github-actions github-actions bot locked and limited conversation to collaborators Mar 1, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
area-System.Threading.Tasks community-contribution Indicates that the PR has been added by a community member
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants