refactor: rename NovaDbXxx to NovaXxx across entire project
copilot-swe-agent[bot] authored at 2026-02-18 20:12:17
4.79 KiB
NewLife.NovaDb
using System;
using NewLife.NovaDb.Core;
using Xunit;

namespace XUnitTest.Core;

/// <summary>GeoPoint 高级功能单元测试(距离、范围、解析、编解码)</summary>
public class GeoPointAdvancedTests
{
    [Fact(DisplayName = "GeoPoint 相等性 - 相同坐标")]
    public void TestEqualsSameCoords()
    {
        var a = new GeoPoint(39.9042, 116.4074);
        var b = new GeoPoint(39.9042, 116.4074);

        Assert.True(a.Equals(b));
        Assert.True(a == b);
        Assert.False(a != b);
        Assert.Equal(a.GetHashCode(), b.GetHashCode());
    }

    [Fact(DisplayName = "GeoPoint 相等性 - 不同坐标")]
    public void TestEqualsDifferentCoords()
    {
        var a = new GeoPoint(39.9042, 116.4074);
        var b = new GeoPoint(31.2304, 121.4737);

        Assert.False(a.Equals(b));
        Assert.False(a == b);
        Assert.True(a != b);
    }

    [Fact(DisplayName = "GeoPoint Equals(Object) 覆盖")]
    public void TestEqualsObject()
    {
        var point = new GeoPoint(39.9042, 116.4074);
        Object boxed = new GeoPoint(39.9042, 116.4074);

        Assert.True(point.Equals(boxed));
        Assert.False(point.Equals(null));
        Assert.False(point.Equals("not a geopoint"));
    }

    [Fact(DisplayName = "GeoPoint Distance - 北京到上海")]
    public void TestDistanceBeijingToShanghai()
    {
        var beijing = new GeoPoint(39.9042, 116.4074);
        var shanghai = new GeoPoint(31.2304, 121.4737);

        var distance = beijing.Distance(shanghai);

        // 北京到上海约 1068 km
        Assert.InRange(distance, 1_050_000, 1_090_000);
    }

    [Fact(DisplayName = "GeoPoint Distance - 同一点距离为零")]
    public void TestDistanceSamePoint()
    {
        var point = new GeoPoint(39.9042, 116.4074);

        Assert.Equal(0.0, point.Distance(point));
    }

    [Fact(DisplayName = "GeoPoint Distance - 对称性")]
    public void TestDistanceSymmetry()
    {
        var a = new GeoPoint(39.9042, 116.4074);
        var b = new GeoPoint(31.2304, 121.4737);

        Assert.Equal(a.Distance(b), b.Distance(a), 6);
    }

    [Fact(DisplayName = "GeoPoint WithinRadius - 在范围内")]
    public void TestWithinRadiusTrue()
    {
        var point = new GeoPoint(39.9042, 116.4074);
        var center = new GeoPoint(39.9142, 116.4174);

        Assert.True(point.WithinRadius(center, 50_000)); // 50km 范围内
    }

    [Fact(DisplayName = "GeoPoint WithinRadius - 超出范围")]
    public void TestWithinRadiusFalse()
    {
        var beijing = new GeoPoint(39.9042, 116.4074);
        var shanghai = new GeoPoint(31.2304, 121.4737);

        Assert.False(beijing.WithinRadius(shanghai, 100_000)); // 100km 范围外
    }

    [Fact(DisplayName = "GeoPoint Parse - 标准格式")]
    public void TestParse()
    {
        var point = GeoPoint.Parse("(39.9042, 116.4074)");

        Assert.Equal(39.9042, point.Latitude);
        Assert.Equal(116.4074, point.Longitude);
    }

    [Fact(DisplayName = "GeoPoint Parse - 无括号")]
    public void TestParseNoBrackets()
    {
        var point = GeoPoint.Parse("39.9042, 116.4074");

        Assert.Equal(39.9042, point.Latitude);
        Assert.Equal(116.4074, point.Longitude);
    }

    [Fact(DisplayName = "GeoPoint Parse - 错误格式抛出异常")]
    public void TestParseInvalidFormat()
    {
        Assert.Throws<FormatException>(() => GeoPoint.Parse("invalid"));
    }

    [Fact(DisplayName = "GeoPoint Parse - null 抛出 ArgumentNullException")]
    public void TestParseNull()
    {
        Assert.Throws<ArgumentNullException>(() => GeoPoint.Parse(null!));
    }

    [Fact(DisplayName = "GeoPoint 编解码往返")]
    public void TestCodecRoundTrip()
    {
        var codec = new DefaultDataCodec();
        var point = new GeoPoint(39.9042, 116.4074);

        var encoded = codec.Encode(point, DataType.GeoPoint);
        var decoded = (GeoPoint)codec.Decode(encoded, 0, DataType.GeoPoint)!;

        Assert.Equal(point, decoded);
    }

    [Fact(DisplayName = "GeoPoint 编解码 NULL")]
    public void TestCodecNull()
    {
        var codec = new DefaultDataCodec();

        var encoded = codec.Encode(null, DataType.GeoPoint);
        var decoded = codec.Decode(encoded, 0, DataType.GeoPoint);

        Assert.Null(decoded);
    }

    [Fact(DisplayName = "GeoPoint 编码长度")]
    public void TestCodecEncodedLength()
    {
        var codec = new DefaultDataCodec();
        var point = new GeoPoint(39.9042, 116.4074);

        Assert.Equal(16, codec.GetEncodedLength(point, DataType.GeoPoint));
        Assert.Equal(1, codec.GetEncodedLength(null, DataType.GeoPoint));
    }

    [Fact(DisplayName = "GeoPoint 默认值")]
    public void TestDefaultValue()
    {
        var point = new GeoPoint();

        Assert.Equal(0.0, point.Latitude);
        Assert.Equal(0.0, point.Longitude);
    }
}