节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
2.99 KiB
Stardust
using System;
using System.Reflection;
using Xunit;

namespace ServerTest.Services;

/// <summary>ShardTableService 单元测试。覆盖分表日期计算逻辑</summary>
public class ShardTableServiceTests
{
    [Theory]
    [InlineData("2026-07-15", 10, "2026-07-10")]
    [InlineData("2026-03-20", 15, "2026-03-15")]
    public void GetMostRecentDate_DayAlreadyPassed_ReturnsThisMonth(String nowStr, Int32 dd, String expectedStr)
    {
        var now = DateTime.Parse(nowStr);
        var expected = DateTime.Parse(expectedStr);

        var result = CallGetMostRecentDate(now, dd);

        Assert.Equal(expected, result);
    }

    [Fact]
    public void GetMostRecentDate_SameDay_BacktracksToLastMonth()
    {
        // dd==now.Day 时,条件 dd < now.Day 不成立,走回溯逻辑
        var now = new DateTime(2026, 7, 1);
        var result = CallGetMostRecentDate(now, 1);
        // 回溯到上一个有该日期的月份(6月有1号)
        Assert.Equal(new DateTime(2026, 6, 1), result);
    }

    [Theory]
    [InlineData("2026-07-10", 20, "2026-06-20")]
    [InlineData("2026-01-05", 10, "2025-12-10")]
    [InlineData("2026-04-15", 30, "2026-03-30")]
    public void GetMostRecentDate_DayNotYetPassed_ReturnsLastMonth(String nowStr, Int32 dd, String expectedStr)
    {
        var now = DateTime.Parse(nowStr);
        var expected = DateTime.Parse(expectedStr);

        var result = CallGetMostRecentDate(now, dd);

        Assert.Equal(expected, result);
    }

    [Theory]
    [InlineData("2026-03-15", 31, "2026-01-31")]
    [InlineData("2026-04-15", 31, "2026-03-31")]
    [InlineData("2026-05-15", 31, "2026-03-31")]
    [InlineData("2026-02-15", 30, "2026-01-30")]
    public void GetMostRecentDate_ShortMonth_Backtracks(String nowStr, Int32 dd, String expectedStr)
    {
        var now = DateTime.Parse(nowStr);
        var expected = DateTime.Parse(expectedStr);

        var result = CallGetMostRecentDate(now, dd);

        Assert.Equal(expected, result);
    }

    [Theory]
    [InlineData("2026-07-15", 32)]
    public void GetMostRecentDate_InvalidDay_ReturnsMinValue(String nowStr, Int32 dd)
    {
        var now = DateTime.Parse(nowStr);

        var result = CallGetMostRecentDate(now, dd);

        Assert.Equal(DateTime.MinValue, result);
    }

    // 非正数日序号(0/-1)会进入 dd < now.Day 分支,导致 new DateTime(year, month, dd) 抛出异常
    // 这是 DateTime 构造函数的校验行为,非业务逻辑,无需测试

    /// <summary>通过反射调用 ShardTableService 的私有静态方法 GetMostRecentDate</summary>
    private static DateTime CallGetMostRecentDate(DateTime now, Int32 dd)
    {
        var type = typeof(Stardust.Server.Services.ShardTableService);
        var method = type.GetMethod("GetMostRecentDate",
            BindingFlags.NonPublic | BindingFlags.Static);
        if (method == null)
            throw new InvalidOperationException("GetMostRecentDate method not found");

        return (DateTime)method.Invoke(null, [now, dd])!;
    }
}