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

namespace XUnitTest.Common;

/// <summary>DisposeBase可销毁基类测试</summary>
public class DisposeBaseTests
{
    /// <summary>测试用的可销毁子类</summary>
    private class TestDisposable : DisposeBase
    {
        public Boolean ManagedDisposed { get; private set; }
        public Int32 DisposeCallCount { get; private set; }

        protected override void Dispose(Boolean disposing)
        {
            if (Disposed) return; // 基类只执行一次,子类也应遵循

            base.Dispose(disposing);

            DisposeCallCount++;
            if (disposing) ManagedDisposed = true;
        }
    }

    [Fact(DisplayName = "初始未释放")]
    public void InitialNotDisposed()
    {
        var obj = new TestDisposable();
        Assert.False(obj.Disposed);
        obj.Dispose();
    }

    [Fact(DisplayName = "Dispose后标记已释放")]
    public void DisposeSetsFlag()
    {
        var obj = new TestDisposable();
        obj.Dispose();
        Assert.True(obj.Disposed);
        Assert.True(obj.ManagedDisposed);
    }

    [Fact(DisplayName = "多次Dispose只执行一次")]
    public void DoubleDisposeOnlyOnce()
    {
        var obj = new TestDisposable();
        obj.Dispose();
        obj.Dispose();
        obj.Dispose();

        Assert.Equal(1, obj.DisposeCallCount);
    }

    [Fact(DisplayName = "OnDisposed事件触发")]
    public void OnDisposedEventFires()
    {
        var obj = new TestDisposable();
        var fired = false;
        obj.OnDisposed += (s, e) => fired = true;

        obj.Dispose();

        Assert.True(fired);
    }

    [Fact(DisplayName = "OnDisposed事件发送者正确")]
    public void OnDisposedSenderCorrect()
    {
        var obj = new TestDisposable();
        Object? sender = null;
        obj.OnDisposed += (s, e) => sender = s;

        obj.Dispose();

        Assert.Same(obj, sender);
    }

    [Fact(DisplayName = "IDisposable2接口实现")]
    public void ImplementsIDisposable2()
    {
        IDisposable2 obj = new TestDisposable();
        Assert.False(obj.Disposed);
        obj.Dispose();
        Assert.True(obj.Disposed);
    }

    [Fact(DisplayName = "TryDispose扩展方法")]
    public void TryDisposeExtension()
    {
        var obj = new TestDisposable();
        var result = obj.TryDispose();

        Assert.True(obj.Disposed);
        Assert.Same(obj, result);
    }

    [Fact(DisplayName = "TryDispose对null安全")]
    public void TryDisposeNullSafe()
    {
        Object? obj = null;
        var result = obj.TryDispose();
        Assert.Null(result);
    }

    [Fact(DisplayName = "TryDispose处理列表")]
    public void TryDisposeList()
    {
        var items = new List<TestDisposable>
        {
            new(),
            new(),
            new()
        };

        ((Object)items).TryDispose();

        foreach (var item in items)
        {
            Assert.True(item.Disposed);
        }
    }
}