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

namespace XUnitTest.Caching;

/// <summary>IProducerConsumer 接口契约测试,以 MemoryQueue 为实现验证生产者消费者语义</summary>
public class IProducerConsumerTests : IDisposable
{
    private readonly MemoryQueue<String> _queue;

    public IProducerConsumerTests() => _queue = new MemoryQueue<String>();

    public void Dispose() => _queue.Dispose();

    [Fact(DisplayName = "初始状态 Count=0 IsEmpty=true")]
    public void InitialState()
    {
        Assert.Equal(0, _queue.Count);
        Assert.True(_queue.IsEmpty);
    }

    [Fact(DisplayName = "Add/TakeOne 单条生产消费")]
    public void Add_TakeOne()
    {
        _queue.Add("hello");

        Assert.Equal(1, _queue.Count);
        Assert.False(_queue.IsEmpty);

        var val = _queue.TakeOne(1);
        Assert.Equal("hello", val);

        // 消费后应为空
        Assert.True(_queue.IsEmpty);
    }

    [Fact(DisplayName = "Add 批量生产")]
    public void Add_Batch()
    {
        var n = _queue.Add("a", "b", "c");

        Assert.Equal(3, n);
        Assert.Equal(3, _queue.Count);
    }

    [Fact(DisplayName = "Take 批量消费")]
    public void Take_Batch()
    {
        _queue.Add("x", "y", "z");

        var items = _queue.Take(2).ToList();
        Assert.Equal(2, items.Count);
        Assert.Contains("x", items);
        Assert.Contains("y", items);

        // 队列剩余 1 个
        Assert.Equal(1, _queue.Count);
    }

    [Fact(DisplayName = "TakeOneAsync 异步消费")]
    public async Task TakeOneAsync()
    {
        _queue.Add("async_test");

        var val = await _queue.TakeOneAsync(1);
        Assert.Equal("async_test", val);
    }

    [Fact(DisplayName = "TakeOne 空队列不等待返回默认值")]
    public void TakeOne_Timeout()
    {
        // 空队列 timeout < 0 不等待直接返回默认值
        var val = _queue.TakeOne(-1);
        Assert.Null(val);
    }

    [Fact(DisplayName = "Acknowledge 确认消费")]
    public void Acknowledge()
    {
        _queue.Add("ack_msg");

        var val = _queue.TakeOne(1);
        Assert.Equal("ack_msg", val);

        // 确认消费(MemoryQueue 的 Acknowledge 始终返回 0)
        var n = _queue.Acknowledge("ack_msg");
        Assert.Equal(0, n);
    }
}