| /* |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| namespace DotPulsar.Tests.Internal |
| { |
| using DotPulsar.Internal; |
| using FluentAssertions; |
| using System.Threading; |
| using System.Threading.Tasks; |
| using Xunit; |
| |
| public class AsyncQueueTests |
| { |
| [Fact] |
| public async Task Enqueue_GivenDequeueTaskWasWaiting_ShouldCompleteDequeueTask() |
| { |
| //Arrange |
| const int expected = 1; |
| var queue = new AsyncQueue<int>(); |
| var dequeueTask = queue.Dequeue(); |
| queue.Enqueue(expected); |
| |
| //Act |
| var actual = await dequeueTask.ConfigureAwait(false); |
| |
| //Assert |
| actual.Should().Be(expected); |
| |
| //Annihilate |
| queue.Dispose(); |
| } |
| |
| [Fact] |
| public async Task DequeueAsync_GivenQueueWasNotEmpty_ShouldCompleteDequeueTask() |
| { |
| //Arrange |
| const int expected = 1; |
| var queue = new AsyncQueue<int>(); |
| queue.Enqueue(expected); |
| |
| //Act |
| var actual = await queue.Dequeue().ConfigureAwait(false); |
| |
| //Assert |
| actual.Should().Be(expected); |
| |
| //Annihilate |
| queue.Dispose(); |
| } |
| |
| [Fact] |
| public async Task DequeueAsync_GivenMultipleDequeues_ShouldCompleteInOrderedSequence() |
| { |
| //Arrange |
| const int expected1 = 1, expected2 = 2; |
| var queue = new AsyncQueue<int>(); |
| var dequeue1 = queue.Dequeue(); |
| var dequeue2 = queue.Dequeue(); |
| queue.Enqueue(expected1); |
| queue.Enqueue(expected2); |
| |
| //Act |
| var actual1 = await dequeue1.ConfigureAwait(false); |
| var actual2 = await dequeue2.ConfigureAwait(false); |
| |
| //Assert |
| actual1.Should().Be(expected1); |
| actual2.Should().Be(expected2); |
| |
| //Annihilate |
| queue.Dispose(); |
| } |
| |
| [Fact] |
| public async Task DequeueAsync_GivenSequenceOfInput_ShouldReturnSameSequenceOfOutput() |
| { |
| //Arrange |
| const int expected1 = 1, expected2 = 2; |
| var queue = new AsyncQueue<int>(); |
| queue.Enqueue(expected1); |
| queue.Enqueue(expected2); |
| |
| //Act |
| var actual1 = await queue.Dequeue().ConfigureAwait(false); |
| var actual2 = await queue.Dequeue().ConfigureAwait(false); |
| |
| //Assert |
| actual1.Should().Be(expected1); |
| actual2.Should().Be(expected2); |
| |
| //Annihilate |
| queue.Dispose(); |
| } |
| |
| [Fact] |
| public async Task DequeueAsync_GivenTokenIsCanceled_ShouldCancelTask() |
| { |
| //Arrange |
| CancellationTokenSource source1 = new(), source2 = new(); |
| const int excepted = 1; |
| var queue = new AsyncQueue<int>(); |
| var task1 = queue.Dequeue(source1.Token).AsTask(); |
| var task2 = queue.Dequeue(source2.Token).AsTask(); |
| |
| //Act |
| source1.Cancel(); |
| queue.Enqueue(excepted); |
| var exception = await Record.ExceptionAsync(() => task1).ConfigureAwait(false); |
| await task2.ConfigureAwait(false); |
| |
| //Assert |
| exception.Should().BeOfType<TaskCanceledException>(); |
| task2.Result.Should().Be(excepted); |
| |
| //Annihilate |
| source1.Dispose(); |
| source2.Dispose(); |
| queue.Dispose(); |
| } |
| } |
| } |