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

namespace XUnitTest.Data;

public class DefaultMatchQueueTests
{
    [Fact]
    [DisplayName("Add_Match_正常请求响应配对")]
    public void Add_Match_RequestResponseMatch()
    {
        var queue = new DefaultMatchQueue(16);
        var tcs = new TaskCompletionSource<Object>();
        var request = "req1";
        var response = "resp1";

        queue.Add("owner", request, 5000, tcs);

        var matched = queue.Match("owner", response, tcs, (req, resp) =>
        {
            return req?.ToString() == "req1" && resp?.ToString() == "resp1";
        });

        Assert.True(matched);
    }

    [Fact]
    [DisplayName("Add_Match_不匹配回调_返回False")]
    public void Add_Match_NoMatch_ReturnsFalse()
    {
        var queue = new DefaultMatchQueue(16);
        var tcs = new TaskCompletionSource<Object>();
        var request = "req1";
        var response = "resp2";

        queue.Add("owner", request, 5000, tcs);

        var matched = queue.Match("owner", response, tcs, (req, resp) =>
        {
            return req?.ToString() == "req1" && resp?.ToString() == "resp1";
        });

        Assert.False(matched);
    }

    [Fact]
    [DisplayName("Add_多个请求_按顺序匹配")]
    public void Add_MultipleRequests_MatchInOrder()
    {
        var queue = new DefaultMatchQueue(16);
        var tcs1 = new TaskCompletionSource<Object>();
        var tcs2 = new TaskCompletionSource<Object>();

        queue.Add("owner", "req1", 5000, tcs1);
        queue.Add("owner", "req2", 5000, tcs2);

        // 匹配第二个先
        var matched2 = queue.Match("owner", "resp2", tcs2, (req, resp) =>
        {
            return req?.ToString() == "req2" && resp?.ToString() == "resp2";
        });
        Assert.True(matched2);

        // 再匹配第一个
        var matched1 = queue.Match("owner", "resp1", tcs1, (req, resp) =>
        {
            return req?.ToString() == "req1" && resp?.ToString() == "resp1";
        });
        Assert.True(matched1);
    }

    [Fact]
    [DisplayName("Clear_清空后不再匹配")]
    public void Clear_ThenNoMatch()
    {
        var queue = new DefaultMatchQueue(16);
        var tcs = new TaskCompletionSource<Object>();

        queue.Add("owner", "req1", 5000, tcs);
        queue.Clear();

        var matched = queue.Match("owner", "resp1", tcs, (req, resp) => true);
        Assert.False(matched);
    }

    [Fact]
    [DisplayName("队列满时_抛出异常")]
    public void QueueFull_ThrowsException()
    {
        // 使用小队列(3个槽位)
        var queue = new DefaultMatchQueue(3);
        var tasks = new TaskCompletionSource<Object>[4];

        for (var i = 0; i < 3; i++)
        {
            tasks[i] = new TaskCompletionSource<Object>();
            queue.Add("owner", $"req{i}", 5000, tasks[i]);
        }

        // 第四个插入应抛出异常
        tasks[3] = new TaskCompletionSource<Object>();
        Assert.Throws<XException>(() => queue.Add("owner", "req3", 5000, tasks[3]));
    }

    [Fact]
    [DisplayName("Clear_清除所有项")]
    public void Clear_RemovesAllItems()
    {
        var queue = new DefaultMatchQueue(16);
        var tcs = new TaskCompletionSource<Object>();

        queue.Add("owner", "req1", 5000, tcs);
        queue.Clear();

        // Clear 后再 Match 应返回 false
        var matched = queue.Match("owner", "resp1", tcs, (req, resp) => true);
        Assert.False(matched);
    }

    [Fact]
    [DisplayName("不同Owner_分别匹配")]
    public void DifferentOwners_MatchSeparately()
    {
        var queue = new DefaultMatchQueue(16);
        var tcs1 = new TaskCompletionSource<Object>();
        var tcs2 = new TaskCompletionSource<Object>();

        queue.Add("owner1", "req1", 5000, tcs1);
        queue.Add("owner2", "req2", 5000, tcs2);

        // owner1 只匹配自己的请求
        var matched1 = queue.Match("owner1", "resp1", tcs1, (req, resp) =>
            req?.ToString() == "req1");
        Assert.True(matched1);

        // owner2 只匹配自己的请求
        var matched2 = queue.Match("owner2", "resp2", tcs2, (req, resp) =>
            req?.ToString() == "req2");
        Assert.True(matched2);
    }
}