v9.10.2019.0101  全面巩固批量Insert/Update/Upsert,支持数据备份、恢复和同步,支持实体列表保存到文件以及加载
大石头 authored at 2019-01-01 13:38:33
3.04 KiB
X
using System.Text.Json;
using NewLife.Serialization;
using Xunit;

namespace XUnitTest.Serialization;

/// <summary>本地时间转换器测试</summary>
public class LocalTimeConverterTests
{
    private static readonly JsonSerializerOptions _options = new()
    {
        Converters = { new LocalTimeConverter() }
    };

    [Fact(DisplayName = "标准格式往返")]
    public void StandardFormatRoundTrip()
    {
        var dt = new DateTime(2025, 7, 1, 12, 30, 45, DateTimeKind.Local);
        var json = JsonSerializer.Serialize(dt, _options);
        Assert.NotNull(json);

        var restored = JsonSerializer.Deserialize<DateTime>(json, _options);
        Assert.Equal(dt.Year, restored.Year);
        Assert.Equal(dt.Month, restored.Month);
        Assert.Equal(dt.Day, restored.Day);
        Assert.Equal(dt.Hour, restored.Hour);
        Assert.Equal(dt.Minute, restored.Minute);
        Assert.Equal(dt.Second, restored.Second);
    }

    [Fact(DisplayName = "从Unix时间戳读取")]
    public void ReadFromUnixTimestamp()
    {
        // Unix timestamp for a date
        var json = "1719835200"; // 2024-07-01 12:00:00 UTC approximately
        var dt = JsonSerializer.Deserialize<DateTime>(json, _options);
        Assert.True(dt > DateTime.MinValue);
    }

    [Fact(DisplayName = "从ISO字符串读取")]
    public void ReadFromISOString()
    {
        var json = "\"2025-07-01T12:30:45\"";
        var dt = JsonSerializer.Deserialize<DateTime>(json, _options);
        Assert.Equal(2025, dt.Year);
        Assert.Equal(7, dt.Month);
        Assert.Equal(1, dt.Day);
    }

    [Fact(DisplayName = "带时区字符串转本地时间")]
    public void ReadWithTimezoneConvertsToLocal()
    {
        var json = "\"2025-07-01T12:30:45+00:00\"";
        var dt = JsonSerializer.Deserialize<DateTime>(json, _options);
        // 应转换为本地时间
        Assert.True(dt > DateTime.MinValue);
    }

    [Fact(DisplayName = "带UTC后缀字符串")]
    public void ReadWithUTCSuffix()
    {
        var json = "\"2025-07-01 12:30:45 UTC\"";
        var dt = JsonSerializer.Deserialize<DateTime>(json, _options);
        Assert.True(dt > DateTime.MinValue);
        Assert.Equal(2025, dt.Year);
    }

    [Fact(DisplayName = "无效字符串返回MinValue")]
    public void InvalidStringReturnsMinValue()
    {
        var json = "\"not-a-date\"";
        var dt = JsonSerializer.Deserialize<DateTime>(json, _options);
        Assert.Equal(DateTime.MinValue, dt);
    }

    [Fact(DisplayName = "自定义DateTimeFormat")]
    public void CustomDateTimeFormat()
    {
        var options = new JsonSerializerOptions
        {
            Converters = { new LocalTimeConverter { DateTimeFormat = "yyyy-MM-dd" } }
        };

        var dt = new DateTime(2025, 7, 1);
        var json = JsonSerializer.Serialize(dt, options);
        Assert.Contains("2025-07-01", json);
    }

    [Fact(DisplayName = "MinValue序列化")]
    public void MinValueSerialization()
    {
        var json = JsonSerializer.Serialize(DateTime.MinValue, _options);
        Assert.NotNull(json);
    }
}