using Xunit;

namespace SabreTools.ObjectIdentifier.Test
{
    // These tests are known to be incomplete due to the sheer number
    // of possible OIDs that exist. The tests below are a minimal
    // representation of functionality to guarantee proper behavior
    // not necessarily absolute outputs
    public class ParserTests
    {
        #region ASN.1

        [Fact]
        public void ASN1Notation_AlwaysNull()
        {
            ulong[]? values = null;
            string? actual = Parser.ParseOIDToASN1Notation(values);
            Assert.Null(actual);
        }

        #endregion

        #region Dot Notation

        [Fact]
        public void DotNotation_NullValues_Null()
        {
            ulong[]? values = null;
            string? actual = Parser.ParseOIDToDotNotation(values);
            Assert.Null(actual);
        }

        [Fact]
        public void DotNotation_EmptyValues_Null()
        {
            ulong[]? values = [];
            string? actual = Parser.ParseOIDToDotNotation(values);
            Assert.Null(actual);
        }

        [Fact]
        public void DotNotation_Values_Formatted()
        {
            string expected = "0.1.2.3";
            ulong[]? values = [0, 1, 2, 3];
            string? actual = Parser.ParseOIDToDotNotation(values);
            Assert.Equal(expected, actual);
        }

        #endregion

        #region Modified OID-IRI

        [Fact]
        public void ModifiedOIDIRI_NullValues_Null()
        {
            ulong[]? values = null;
            string? actual = Parser.ParseOIDToModifiedOIDIRI(values);
            Assert.Null(actual);
        }

        [Fact]
        public void ModifiedOIDIRI_EmptyValues_Null()
        {
            ulong[]? values = [];
            string? actual = Parser.ParseOIDToModifiedOIDIRI(values);
            Assert.Null(actual);
        }

        [Fact]
        public void ModifiedOIDIRI_Values_Formatted()
        {
            string expected = "/ITU-T/[question]/2/3";
            ulong[]? values = [0, 1, 2, 3];
            string? actual = Parser.ParseOIDToModifiedOIDIRI(values);
            Assert.Equal(expected, actual);
        }

        #endregion

        #region OID-IRI

        [Fact]
        public void OIDIRI_NullValues_Null()
        {
            ulong[]? values = null;
            string? actual = Parser.ParseOIDToOIDIRINotation(values);
            Assert.Null(actual);
        }

        [Fact]
        public void OIDIRI_EmptyValues_Null()
        {
            ulong[]? values = [];
            string? actual = Parser.ParseOIDToOIDIRINotation(values);
            Assert.Null(actual);
        }

        [Fact]
        public void OIDIRI_Values_Formatted()
        {
            string expected = "/ITU-T/1/2/3";
            ulong[]? values = [0, 1, 2, 3];
            string? actual = Parser.ParseOIDToOIDIRINotation(values);
            Assert.Equal(expected, actual);
        }

        #endregion
    }
}
