﻿/*
 * 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 System.Threading;
    using System.Threading.Tasks;
    using Xunit;

    public class StateManagerTests
    {
        [Theory]
        [InlineData(ProducerState.Connected, ProducerState.Connected, ProducerState.Connected)]
        [InlineData(ProducerState.Connected, ProducerState.Disconnected, ProducerState.Connected)]
        [InlineData(ProducerState.Connected, ProducerState.Closed, ProducerState.Connected)]
        [InlineData(ProducerState.Disconnected, ProducerState.Connected, ProducerState.Disconnected)]
        [InlineData(ProducerState.Disconnected, ProducerState.Disconnected, ProducerState.Disconnected)]
        [InlineData(ProducerState.Disconnected, ProducerState.Closed, ProducerState.Disconnected)]
        [InlineData(ProducerState.Closed, ProducerState.Connected, ProducerState.Closed)]
        [InlineData(ProducerState.Closed, ProducerState.Disconnected, ProducerState.Closed)]
        [InlineData(ProducerState.Closed, ProducerState.Closed, ProducerState.Closed)]
        public void SetState_GivenNewState_ShouldReturnFormerState(ProducerState initialState, ProducerState newState, ProducerState expected)
        {
            //Arrange
            var sut = new StateManager<ProducerState>(initialState, ProducerState.Closed);

            //Act
            var actual = sut.SetState(newState);

            //Assert
            Assert.Equal(expected, actual);
        }

        [Theory]
        [InlineData(ProducerState.Connected)]
        [InlineData(ProducerState.Disconnected)]
        [InlineData(ProducerState.Closed)]
        public void SetState_GivenStateIsFinal_ShouldNotChangeState(ProducerState newState)
        {
            //Arrange
            var sut = new StateManager<ProducerState>(ProducerState.Closed, ProducerState.Closed);

            //Act
            _ = sut.SetState(newState);

            //Assert
            Assert.Equal(ProducerState.Closed, sut.CurrentState);
        }

        [Theory]
        [InlineData(ProducerState.Connected, ProducerState.Disconnected)]
        [InlineData(ProducerState.Connected, ProducerState.Closed)]
        [InlineData(ProducerState.Disconnected, ProducerState.Connected)]
        [InlineData(ProducerState.Disconnected, ProducerState.Closed)]
        public void SetState_GivenStateIsChangedToWanted_ShouldCompleteTask(ProducerState initialState, ProducerState newState)
        {
            //Arrange
            var sut = new StateManager<ProducerState>(initialState, ProducerState.Closed);
            var task = sut.StateChangedTo(newState, default);

            //Act
            _ = sut.SetState(newState);

            //Assert
            Assert.True(task.IsCompleted);
        }

        [Theory]
        [InlineData(ProducerState.Connected, ProducerState.Disconnected)]
        [InlineData(ProducerState.Connected, ProducerState.Closed)]
        [InlineData(ProducerState.Disconnected, ProducerState.Connected)]
        [InlineData(ProducerState.Disconnected, ProducerState.Closed)]
        public void SetState_GivenStateIsChangedFromWanted_ShouldCompleteTask(ProducerState initialState, ProducerState newState)
        {
            //Arrange
            var sut = new StateManager<ProducerState>(initialState, ProducerState.Closed);
            var task = sut.StateChangedFrom(initialState, default);

            //Act
            _ = sut.SetState(newState);

            //Assert
            Assert.True(task.IsCompleted);
        }

        [Theory]
        [InlineData(ProducerState.Connected)]
        [InlineData(ProducerState.Disconnected)]
        [InlineData(ProducerState.Closed)]
        public void StateChangedTo_GivenStateIsAlreadyWanted_ShouldCompleteTask(ProducerState state)
        {
            //Arrange
            var sut = new StateManager<ProducerState>(state, ProducerState.Closed);

            //Act
            var task = sut.StateChangedTo(state, default);

            //Assert
            Assert.True(task.IsCompleted);
        }

        [Theory]
        [InlineData(ProducerState.Connected, ProducerState.Disconnected)]
        [InlineData(ProducerState.Connected, ProducerState.Closed)]
        [InlineData(ProducerState.Disconnected, ProducerState.Connected)]
        [InlineData(ProducerState.Disconnected, ProducerState.Closed)]
        public void StateChangedTo_GivenStateIsNotWanted_ShouldNotCompleteTask(ProducerState initialState, ProducerState wantedState)
        {
            //Arrange
            var sut = new StateManager<ProducerState>(initialState, ProducerState.Closed);

            //Act
            var task = sut.StateChangedTo(wantedState, default);

            //Assert
            Assert.False(task.IsCompleted);
        }

        [Theory]
        [InlineData(ProducerState.Connected)]
        [InlineData(ProducerState.Disconnected)]
        public void StateChangedTo_GivenStateIsFinal_ShouldCompleteTask(ProducerState state)
        {
            //Arrange
            var sut = new StateManager<ProducerState>(ProducerState.Closed, ProducerState.Closed);

            //Act
            var task = sut.StateChangedTo(state, default);

            //Assert
            Assert.True(task.IsCompleted);
        }

        [Theory]
        [InlineData(ProducerState.Connected)]
        [InlineData(ProducerState.Disconnected)]
        public void StateChangedFrom_GivenStateHasNotChanged_ShouldNotCompleteTask(ProducerState state)
        {
            //Arrange
            var sut = new StateManager<ProducerState>(state, ProducerState.Closed);

            //Act
            var task = sut.StateChangedFrom(state, default);

            //Assert
            Assert.False(task.IsCompleted);
        }

        [Theory]
        [InlineData(ProducerState.Connected, ProducerState.Disconnected)]
        [InlineData(ProducerState.Connected, ProducerState.Closed)]
        [InlineData(ProducerState.Disconnected, ProducerState.Connected)]
        [InlineData(ProducerState.Disconnected, ProducerState.Closed)]
        public void StateChangedFrom_GivenStateHasChanged_ShouldCompleteTask(ProducerState initialState, ProducerState fromState)
        {
            //Arrange
            var sut = new StateManager<ProducerState>(initialState, ProducerState.Closed);

            //Act
            var task = sut.StateChangedFrom(fromState, default);

            //Assert
            Assert.True(task.IsCompleted);
        }

        [Theory]
        [InlineData(ProducerState.Connected)]
        [InlineData(ProducerState.Disconnected)]
        [InlineData(ProducerState.Closed)]
        public void StateChangedFrom_GivenStateIsFinal_ShouldCompleteTask(ProducerState state)
        {
            //Arrange
            var sut = new StateManager<ProducerState>(ProducerState.Closed, ProducerState.Closed);

            //Act
            var task = sut.StateChangedFrom(state, default);

            //Assert
            Assert.True(task.IsCompleted);
        }

        [Theory]
        [InlineData(ProducerState.Connected, ProducerState.Disconnected)]
        [InlineData(ProducerState.Disconnected, ProducerState.Connected)]
        public void SetState_GivenStateIsChangeToFinalState_ShouldCompleteTask(ProducerState initialState, ProducerState wantedState)
        {
            //Arrange
            var sut = new StateManager<ProducerState>(initialState, ProducerState.Closed);

            //Act
            var task = sut.StateChangedTo(wantedState, default);
            _ = sut.SetState(ProducerState.Closed);

            //Assert
            Assert.True(task.IsCompleted);
        }

        [Theory]
        [InlineData(ProducerState.Connected, ProducerState.Disconnected, ProducerState.Closed)]
        [InlineData(ProducerState.Disconnected, ProducerState.Connected, ProducerState.Closed)]
        public void SetState_GivenStateIsChangedToNotWanted_ShouldNotCompleteTask(ProducerState initialState, ProducerState newState, ProducerState wantedState)
        {
            //Arrange
            var sut = new StateManager<ProducerState>(initialState, ProducerState.Closed);

            //Act
            var task = sut.StateChangedTo(wantedState, default);
            _ = sut.SetState(newState);

            //Assert
            Assert.False(task.IsCompleted);
        }

        [Fact]
        public async Task CancelToken_GivenTaskWasStillWaiting_ShouldCancelTask()
        {
            //Arrange
            var sut = new StateManager<ProducerState>(ProducerState.Connected, ProducerState.Closed);
            var cts = new CancellationTokenSource();
            var task = sut.StateChangedFrom(ProducerState.Connected, cts.Token);

            //Act
            cts.Cancel();
            var exception = await Record.ExceptionAsync(() => task.AsTask()).ConfigureAwait(false); // xUnit can't record ValueTask yet

            //Assert
            Assert.IsType<TaskCanceledException>(exception);

            //Annihilate
            cts.Dispose();
        }
    }
}
