﻿/*
 * 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();
        }
    }
}
