using k8s.Models;
using Xunit;
using FluentAssertions;
using k8s.Versioning;
using AutoMapper;

namespace k8s.Tests
{
    public class VersionConverterTests
    {
        [Fact]
        public void CanExplicitlyConvert()
        {
            var a = new V1APIService { Spec = new V1APIServiceSpec { Group = "blah" } };
            var b = (V1beta1APIService)a;
            b.Spec.Group.Should().Be("blah");
        }

        [Fact]
        public void ConfigurationsAreValid()
        {
            var config = new MapperConfiguration(VersionConverter.GetConfigurations);
            config.AssertConfigurationIsValid();
        }

        [Theory]
        [InlineData("v1", "v1beta1", 1)]
        [InlineData("v1beta1", "v1", -1)]
        [InlineData("v1beta1", "v1alpha1", 1)]
        [InlineData("v1alpha1", "v1beta1", -1)]
        [InlineData("v1", "v1alpha1", 1)]
        [InlineData("v2alpha1", "v1", 1)]
        [InlineData("v1", "v2alpha1", -1)]
        [InlineData("v1", "v1", 0)]
        [InlineData("v2", "v2", 0)]
        [InlineData("v1beta1", "v1beta1", 0)]
        [InlineData("v1beta2", "v1beta2", 0)]
        [InlineData("v2beta2", "v2beta2", 0)]
        public void KubernetesVersionCompare(string x, string y, int expected)
        {
            KubernetesVersionComparer.Instance.Compare(x, y).Should().Be(expected);
        }

        [Fact]
        public void ConvertToVersion()
        {
            var src = new V1beta1APIService().Initialize();
            src.ApiVersion.Should().Be("apiregistration.k8s.io/v1beta1");
            var sut = (V1APIService)VersionConverter.ConvertToVersion(src, "v1");
            sut.Should().NotBeNull();
            sut.ApiVersion.Should().Be("apiregistration.k8s.io/v1");
        }
    }
}
