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

namespace XUnitTest.Caching;

public class CacheTests
{
    private readonly MemoryCache _cache;

    public CacheTests()
    {
        _cache = new MemoryCache();
    }

    [Fact]
    public void SetGet_Basic()
    {
        _cache.Set("key1", "value1");
        var result = _cache.Get<String>("key1");

        Assert.Equal("value1", result);
    }

    [Fact]
    public void Indexer_SetGet()
    {
        _cache["key2"] = 42;
        var result = _cache.Get<Int32>("key2");

        Assert.Equal(42, result);
    }

    [Fact]
    public void Count()
    {
        Assert.Equal(0, _cache.Count);

        _cache.Set("a", 1);
        _cache.Set("b", 2);
        _cache.Set("c", 3);

        Assert.Equal(3, _cache.Count);
    }

    [Fact]
    public void ContainsKey()
    {
        _cache.Set("exist", "yes");

        Assert.True(_cache.ContainsKey("exist"));
        Assert.False(_cache.ContainsKey("notexist"));
    }

    [Fact]
    public void Remove()
    {
        _cache.Set("todelete", "bye");
        Assert.Equal(1, _cache.Count);

        _cache.Remove("todelete");
        Assert.Equal(0, _cache.Count);
        Assert.False(_cache.ContainsKey("todelete"));
    }

    [Fact]
    public void Get_MissingKey()
    {
        var result = _cache.Get<String>("noexist");
        Assert.Null(result);

        var intResult = _cache.Get<Int32>("noexist");
        Assert.Equal(0, intResult);
    }

    [Fact]
    public void Expire_Default()
    {
        Assert.Equal(0, _cache.Expire);
    }

    [Fact]
    public void Name_Property()
    {
        Assert.NotNull(_cache.Name);
    }

    [Fact]
    public void Keys_ReturnsAllKeys()
    {
        _cache.Set("x", 1);
        _cache.Set("y", 2);
        _cache.Set("z", 3);

        var keys = _cache.Keys;
        Assert.NotNull(keys);
        Assert.Equal(3, keys.Count);
        Assert.Contains("x", keys);
        Assert.Contains("y", keys);
        Assert.Contains("z", keys);
    }

    [Fact]
    public void Clear_All()
    {
        _cache.Set("a", 1);
        _cache.Set("b", 2);
        Assert.Equal(2, _cache.Count);

        _cache.Clear();
        Assert.Equal(0, _cache.Count);
    }

    [Fact]
    public void Default_NotNull()
    {
        Assert.NotNull(Cache.Default);
    }

    [Fact(DisplayName = "零等待超时空闲锁可一次抢到")]
    public void AcquireLock_ZeroTimeout()
    {
        // msTimeout=0 时至少尝试一次,空闲锁应能直接抢到
        using var rlock = _cache.AcquireLock("zero_lock", 0);
        Assert.NotNull(rlock);
        Assert.True(_cache.ContainsKey("zero_lock"));
    }

    [Fact(DisplayName = "锁占用时零等待超时抢锁失败返回null")]
    public void AcquireLock_ZeroTimeoutConflict()
    {
        // 锁1持有正常过期时间(简单重载的过期时间=等待时间,不能为0)
        using var rlock1 = _cache.AcquireLock("conflict_lock", 5_000);
        Assert.NotNull(rlock1);

        // 锁被占用且不等待,应返回 null 而不是抛出
        using var rlock2 = _cache.AcquireLock("conflict_lock", 0, 5_000, false);
        Assert.Null(rlock2);
    }
}