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

namespace XUnitTest.Buffers;

public class PooledByteBufferWriterTests
{
    [Fact]
    [DisplayName("构造_初始容量_创建成功")]
    public void Ctor_InitialCapacity_CreatesInstance()
    {
        using var writer = new PooledByteBufferWriter(256);
        Assert.NotNull(writer);
        Assert.Equal(0, writer.WrittenCount);
        Assert.True(writer.Capacity >= 256);
        Assert.Equal(writer.Capacity, writer.FreeCapacity);
    }

    [Fact]
    [DisplayName("构造_初始容量为0_抛出异常")]
    public void Ctor_ZeroCapacity_ThrowsException()
    {
        Assert.Throws<ArgumentOutOfRangeException>(() => new PooledByteBufferWriter(0));
    }

    [Fact]
    [DisplayName("构造_初始容量为负_抛出异常")]
    public void Ctor_NegativeCapacity_ThrowsException()
    {
        Assert.Throws<ArgumentOutOfRangeException>(() => new PooledByteBufferWriter(-1));
    }

    [Fact]
    [DisplayName("GetSpan_写入数据_通过Advance推进")]
    public void GetSpan_WriteData_AdvanceUpdatesPosition()
    {
        using var writer = new PooledByteBufferWriter(64);
        var span = writer.GetSpan(10);
        span[0] = 0x01;
        span[1] = 0x02;
        span[2] = 0x03;
        writer.Advance(3);

        Assert.Equal(3, writer.WrittenCount);
        Assert.Equal(writer.Capacity - 3, writer.FreeCapacity);

        // 验证已写入数据
        var written = writer.WrittenSpan;
        Assert.Equal(3, written.Length);
        Assert.Equal(0x01, written[0]);
        Assert.Equal(0x02, written[1]);
        Assert.Equal(0x03, written[2]);
    }

    [Fact]
    [DisplayName("GetMemory_写入数据_通过Advance推进")]
    public void GetMemory_WriteData_AdvanceUpdatesPosition()
    {
        using var writer = new PooledByteBufferWriter(64);
        var mem = writer.GetMemory(10);
        mem.Span[0] = 0x0A;
        mem.Span[1] = 0x0B;
        writer.Advance(2);

        Assert.Equal(2, writer.WrittenCount);
        var written = writer.WrittenMemory;
        Assert.Equal(2, written.Length);
        Assert.Equal(0x0A, written.Span[0]);
        Assert.Equal(0x0B, written.Span[1]);
    }

    [Fact]
    [DisplayName("Advance_超出容量_抛出异常")]
    public void Advance_ExceedCapacity_ThrowsException()
    {
        using var writer = new PooledByteBufferWriter(64);
        Assert.Throws<ArgumentOutOfRangeException>(() => writer.Advance(65));
    }

    [Fact]
    [DisplayName("写入数据_触发自动扩容")]
    public void WriteData_TriggersAutoResize()
    {
        using var writer = new PooledByteBufferWriter(16);
        // 写入超过初始容量的数据,触发扩容
        var data = new Byte[128];
        for (var i = 0; i < data.Length; i++) data[i] = (Byte)(i & 0xFF);

        var span = writer.GetSpan(data.Length);
        data.CopyTo(span);
        writer.Advance(data.Length);

        Assert.Equal(data.Length, writer.WrittenCount);
        Assert.True(writer.Capacity >= data.Length);

        // 验证写入内容
        var written = writer.WrittenSpan;
        for (var i = 0; i < data.Length; i++)
            Assert.Equal(data[i], written[i]);
    }

    [Fact]
    [DisplayName("Clear_清空后重新写入")]
    public void Clear_ThenWriteAgain()
    {
        using var writer = new PooledByteBufferWriter(64);
        // 先写入
        var span = writer.GetSpan(10);
        span[0] = 0xFF;
        writer.Advance(1);
        Assert.Equal(1, writer.WrittenCount);

        // 清空
        writer.Clear();
        Assert.Equal(0, writer.WrittenCount);

        // 重新写入
        span = writer.GetSpan(5);
        span[0] = 0xAA;
        writer.Advance(1);
        Assert.Equal(1, writer.WrittenCount);
        Assert.Equal(0xAA, writer.WrittenSpan[0]);
    }

    [Fact]
    [DisplayName("WriteToStream_写入到流")]
    public void WriteToStream_WritesToStream()
    {
        using var writer = new PooledByteBufferWriter(64);
        var data = "Hello, World!"u8.ToArray();
        var span = writer.GetSpan(data.Length);
        data.CopyTo(span);
        writer.Advance(data.Length);

        using var ms = new MemoryStream();
        writer.WriteToStream(ms);

        Assert.Equal(data.Length, ms.Length);
        var result = ms.ToArray();
        Assert.Equal(data, result);
    }

    [Fact]
    [DisplayName("WriteToStreamAsync_异步写入到流")]
    public async Task WriteToStreamAsync_WritesToStream()
    {
        using var writer = new PooledByteBufferWriter(64);
        var data = "Async Test!"u8.ToArray();
        var span = writer.GetSpan(data.Length);
        data.CopyTo(span);
        writer.Advance(data.Length);

        using var ms = new MemoryStream();
        await writer.WriteToStreamAsync(ms, CancellationToken.None);

        Assert.Equal(data.Length, ms.Length);
        var result = ms.ToArray();
        Assert.Equal(data, result);
    }

    [Fact]
    [DisplayName("Dispose_释放后实例标记失效")]
    public void Dispose_MarksInstanceInvalid()
    {
        var writer = new PooledByteBufferWriter(64);
        writer.Dispose();

        // 再次释放不应抛异常
        writer.Dispose();
    }

    [Fact]
    [DisplayName("ClearAndReturnBuffers_归还数组后重置")]
    public void ClearAndReturnBuffers_ReturnsBuffers()
    {
        var writer = new PooledByteBufferWriter(64);
        // 写入一些数据
        var span = writer.GetSpan(10);
        span[0] = 0x42;
        writer.Advance(1);

        writer.ClearAndReturnBuffers();
        // 调用后 WrittenCount 应为0(实际内部已标记失效)
        // Dispose 再次调用不应抛异常
        writer.Dispose();
    }

    [Fact]
    [DisplayName("InitializeEmptyInstance_重新初始化")]
    public void InitializeEmptyInstance_Reinitializes()
    {
        using var writer = new PooledByteBufferWriter(64);
        // 先写入数据
        var span = writer.GetSpan(10);
        span[0] = 0x42;
        writer.Advance(1);

        // 重新初始化
        writer.InitializeEmptyInstance(128);
        Assert.Equal(0, writer.WrittenCount);
        Assert.True(writer.Capacity >= 128);
    }
}