解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
5.29 KiB
X
using System;
using System.Buffers;
using System.Buffers.Binary;
using System.ComponentModel;
using NewLife.Buffers;
using Xunit;

namespace XUnitTest.Compat;

/// <summary>无符号端序扩展(NewLife.Buffers.SequenceReaderHelper)测试,全 TFM 由 NewLife.Core 提供</summary>
public class SequenceReaderHelperTests
{
    [Fact]
    [DisplayName("TryReadBigEndian_UInt16跨段_与BinaryPrimitives一致")]
    public void UInt16_BigEndian_AcrossSegments()
    {
        var buffer = new Byte[2];
        BinaryPrimitives.WriteUInt16BigEndian(buffer, 0xABCD);
        var reader = new SequenceReader<Byte>(SequenceFactory.Build(new[] { buffer[0] }, new[] { buffer[1] }));

        Assert.True(reader.TryReadBigEndian(out UInt16 value));
        Assert.Equal((UInt16)0xABCD, value);
        Assert.Equal(2L, reader.Consumed);
    }

    [Fact]
    [DisplayName("TryReadLittleEndian_UInt16连续段_与BinaryPrimitives一致")]
    public void UInt16_LittleEndian_Contiguous()
    {
        var buffer = new Byte[2];
        BinaryPrimitives.WriteUInt16LittleEndian(buffer, 0x1234);
        var reader = new SequenceReader<Byte>(SequenceFactory.Build(buffer));

        Assert.True(reader.TryReadLittleEndian(out UInt16 value));
        Assert.Equal((UInt16)0x1234, value);
        Assert.Equal(2L, reader.Consumed);
    }

    [Fact]
    [DisplayName("TryReadBigEndian_UInt32跨段_与BinaryPrimitives一致")]
    public void UInt32_BigEndian_AcrossSegments()
    {
        var buffer = new Byte[4];
        BinaryPrimitives.WriteUInt32BigEndian(buffer, 0x89ABCDEF);
        var reader = new SequenceReader<Byte>(SequenceFactory.Build(new[] { buffer[0] }, new[] { buffer[1], buffer[2], buffer[3] }));

        Assert.True(reader.TryReadBigEndian(out UInt32 value));
        Assert.Equal(0x89ABCDEFu, value);
        Assert.Equal(4L, reader.Consumed);
    }

    [Fact]
    [DisplayName("TryReadLittleEndian_UInt32跨段_与BinaryPrimitives一致")]
    public void UInt32_LittleEndian_AcrossSegments()
    {
        var buffer = new Byte[4];
        BinaryPrimitives.WriteUInt32LittleEndian(buffer, 0x76543210);
        var reader = new SequenceReader<Byte>(SequenceFactory.Build(new[] { buffer[0], buffer[1] }, new[] { buffer[2], buffer[3] }));

        Assert.True(reader.TryReadLittleEndian(out UInt32 value));
        Assert.Equal(0x76543210u, value);
        Assert.Equal(4L, reader.Consumed);
    }

    [Fact]
    [DisplayName("TryReadBigEndian_UInt64跨段_与BinaryPrimitives一致")]
    public void UInt64_BigEndian_AcrossSegments()
    {
        var buffer = new Byte[8];
        BinaryPrimitives.WriteUInt64BigEndian(buffer, 0x0102030405060708UL);
        var reader = new SequenceReader<Byte>(SequenceFactory.Build(new[] { buffer[0], buffer[1], buffer[2] }, new[] { buffer[3], buffer[4], buffer[5], buffer[6], buffer[7] }));

        Assert.True(reader.TryReadBigEndian(out UInt64 value));
        Assert.Equal(0x0102030405060708UL, value);
        Assert.Equal(8L, reader.Consumed);
    }

    [Fact]
    [DisplayName("TryReadLittleEndian_UInt64跨段_与BinaryPrimitives一致")]
    public void UInt64_LittleEndian_AcrossSegments()
    {
        var buffer = new Byte[8];
        BinaryPrimitives.WriteUInt64LittleEndian(buffer, 0x8877665544332211UL);
        var reader = new SequenceReader<Byte>(SequenceFactory.Build(new[] { buffer[0] }, new[] { buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7] }));

        Assert.True(reader.TryReadLittleEndian(out UInt64 value));
        Assert.Equal(0x8877665544332211UL, value);
        Assert.Equal(8L, reader.Consumed);
    }

    [Fact]
    [DisplayName("TryPeekBigEndian_UInt32跨段_不推进位置")]
    public void Peek_UInt32_BigEndian()
    {
        var buffer = new Byte[4];
        BinaryPrimitives.WriteUInt32BigEndian(buffer, 0xDEADBEEF);
        var reader = new SequenceReader<Byte>(SequenceFactory.Build(new[] { buffer[0] }, new[] { buffer[1], buffer[2], buffer[3] }));

        Assert.True(reader.TryPeekBigEndian(out UInt32 value));
        Assert.Equal(0xDEADBEEFu, value);
        Assert.Equal(0L, reader.Consumed);
        Assert.True(reader.TryReadBigEndian(out value));
        Assert.Equal(0xDEADBEEFu, value);
    }

    [Fact]
    [DisplayName("TryPeekLittleEndian_UInt64连续段_不推进位置")]
    public void Peek_UInt64_LittleEndian()
    {
        var buffer = new Byte[8];
        BinaryPrimitives.WriteUInt64LittleEndian(buffer, 0x1122334455667788UL);
        var reader = new SequenceReader<Byte>(SequenceFactory.Build(buffer));

        Assert.True(reader.TryPeekLittleEndian(out UInt64 value));
        Assert.Equal(0x1122334455667788UL, value);
        Assert.Equal(0L, reader.Consumed);
    }

    [Fact]
    [DisplayName("TryReadLittleEndian_UInt64数据不足_返回false且不推进")]
    public void Read_Insufficient()
    {
        var reader = new SequenceReader<Byte>(SequenceFactory.Build(new Byte[] { 1, 2, 3 }));
        Assert.False(reader.TryReadLittleEndian(out UInt64 _));
        Assert.Equal(0L, reader.Consumed);
    }

    [Fact]
    [DisplayName("TryPeekBigEndian_UInt32数据不足_返回false且不推进")]
    public void Peek_Insufficient()
    {
        var reader = new SequenceReader<Byte>(SequenceFactory.Build(new Byte[] { 1, 2, 3 }));
        Assert.False(reader.TryPeekBigEndian(out UInt32 _));
        Assert.Equal(0L, reader.Consumed);
    }
}