📄 tests/DltPayloadTests.cs
using Shouldly;

namespace SharpDlt.Tests;

public class DltPayloadTests
{
    [Fact]
    public void NonVerbosePayload_ParsesMessageIdAndData()
    {
        var data = TestDlt.LittleEndian(0x12345678).Concat<byte>([1, 2, 3]).ToArray();

        var payload = NonVerbosePayload.Parse(data, msbFirst: false);

        payload.MessageId.ShouldBe(0x12345678u);
        payload.NonStaticData.ToArray().ShouldBe(new byte[] { 1, 2, 3 });
        payload.ToString().ShouldBe("[305419896] 010203");
    }

    [Fact]
    public void NonVerbosePayload_ParsesBigEndianMessageId()
    {
        var data = TestDlt.BigEndian(0x12345678u);

        var payload = NonVerbosePayload.Parse(data, msbFirst: true);

        payload.MessageId.ShouldBe(0x12345678u);
        payload.NonStaticData.Length.ShouldBe(0);
    }

    [Fact]
    public void NonVerbosePayload_TooShort_Throws()
    {
        Should.Throw<DltParseException>(() => NonVerbosePayload.Parse(new byte[3], false));
    }

    [Fact]
    public void NonVerbosePayload_EqualityComparesContent()
    {
        new NonVerbosePayload(1, new byte[] { 1, 2 }).ShouldBe(new NonVerbosePayload(1, new byte[] { 1, 2 }));
        new NonVerbosePayload(1, new byte[] { 1, 2 }).ShouldNotBe(new NonVerbosePayload(2, new byte[] { 1, 2 }));
    }

    [Fact]
    public void VerbosePayload_ParsesEveryArgumentInOrder()
    {
        var data = TestDlt
            .StringArgument("value")
            .Concat(TestDlt.Argument(TestDlt.TypeInfoUInt16, [0x2A, 0x00]))
            .Concat(TestDlt.Argument(TestDlt.TypeInfoBool, [1]))
            .ToArray();

        var payload = VerbosePayload.Parse(data, msbFirst: false, numberOfArguments: 3);

        payload.Arguments.ShouldBe([
            new DltStringArgument("value", DltStringCoding.Ascii),
            new DltUnsignedArgument(42, DltIntegerWidth.Bits16),
            new DltBoolArgument(true),
        ]);
        payload.ToString().ShouldBe("value 42 True");
    }

    [Fact]
    public void VerbosePayload_WithoutArguments_IsEmpty()
    {
        var payload = VerbosePayload.Parse([], msbFirst: false, numberOfArguments: 0);

        payload.Arguments.ShouldBeEmpty();
        payload.ToString().ShouldBeEmpty();
    }

    [Fact]
    public void VerbosePayload_MoreArgumentsThanData_Throws()
    {
        var data = TestDlt.StringArgument("value");

        Should.Throw<DltParseException>(() => VerbosePayload.Parse(data, false, 2));
    }

    [Fact]
    public void VerbosePayload_EqualityComparesArguments()
    {
        var payload = new VerbosePayload([new DltBoolArgument(true)]);

        payload.ShouldBe(new VerbosePayload([new DltBoolArgument(true)]));
        payload.ShouldNotBe(new VerbosePayload([new DltBoolArgument(false)]));
    }
}