UnitTests/ShapeCacheTests.cs
#nullable enable
using HitShapes;
using Sandbox;
using Xunit;

namespace HitShapes.Tests;

public class ShapeCacheTests
{
    [Fact]
    public void Radial_same_params_returns_same_instance()
    {
        var a = HitShape.Radial(slots: 8, innerRatio: 0.4f);
        var b = HitShape.Radial(slots: 8, innerRatio: 0.4f);
        Assert.Same(a, b);
    }

    [Fact]
    public void Radial_default_outer_ratio_participates_in_cache_key()
    {
        var a = HitShape.Radial(slots: 8, innerRatio: 0.4f);
        var b = HitShape.Radial(slots: 8, innerRatio: 0.4f, outerRatio: 1f);
        Assert.Same(a, b);
    }

    [Fact]
    public void Radial_different_params_return_different_instances()
    {
        var a = HitShape.Radial(slots: 8);
        var b = HitShape.Radial(slots: 9);
        Assert.NotSame(a, b);
    }

    [Fact]
    public void RectGrid_same_params_returns_same_instance()
    {
        var a = HitShape.RectGrid(cols: 4, rows: 3);
        var b = HitShape.RectGrid(cols: 4, rows: 3);
        Assert.Same(a, b);
    }

    [Fact]
    public void CustomRaw_not_cached_each_call_returns_new_instance()
    {
        var a = HitShape.CustomRaw(slotCount: 1, (_, _) => null);
        var b = HitShape.CustomRaw(slotCount: 1, (_, _) => null);
        Assert.NotSame(a, b);
    }

    [Fact]
    public void Polygon_not_cached_each_call_returns_new_instance()
    {
        Vector2[] verts = { new(0f, 0f), new(1f, 0f), new(0.5f, 1f) };
        var a = HitShape.Polygon(verts);
        var b = HitShape.Polygon(verts);
        Assert.NotSame(a, b);
    }

    [Fact]
    public void Polygons_not_cached_each_call_returns_new_instance()
    {
        Vector2[][] polys = {
            new Vector2[] { new(0f, 0f), new(1f, 0f), new(0.5f, 1f) },
            new Vector2[] { new(0f, 0f), new(1f, 0f), new(0.5f, 1f) },
        };
        var a = HitShape.Polygons(polys);
        var b = HitShape.Polygons(polys);
        Assert.NotSame(a, b);
    }

    [Fact]
    public void Union_not_cached_each_call_returns_new_instance()
    {
        var a = HitShape.Radial(4);
        var b = HitShape.RectGrid(2, 2);
        Assert.NotSame(HitShape.Union(a, b), HitShape.Union(a, b));
    }

    [Fact]
    public void Intersect_not_cached_each_call_returns_new_instance()
    {
        var a = HitShape.Radial(4);
        var b = HitShape.RectGrid(2, 2);
        Assert.NotSame(HitShape.Intersect(a, b), HitShape.Intersect(a, b));
    }

    [Fact]
    public void Difference_not_cached_each_call_returns_new_instance()
    {
        var a = HitShape.Radial(4);
        var b = HitShape.RectGrid(2, 2);
        Assert.NotSame(HitShape.Difference(a, b), HitShape.Difference(a, b));
    }
}