using NUnit.Framework;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Collections.Tests;

internal class UnsafeCounterTests
{
    [Test]
    public unsafe void UnsafeAtomicCounter32_AddSub()
    {
        int value = 0;
        var counter = new UnsafeAtomicCounter32(&value);

        Assert.AreEqual(0, counter.Add(123));
        Assert.AreEqual(123, counter.Add(0));
        Assert.AreEqual(123, counter.Sub(0));
        Assert.AreEqual(123, counter.AddSat(1, 123));
        Assert.AreEqual(123, counter.SubSat(1, 123));

        counter.AddSat(0xffff, 256);
        Assert.AreEqual(256, counter.Add(0));

        counter.SubSat(0xffff, -256);
        Assert.AreEqual(-256, counter.Add(0));
    }

    [Test]
    public unsafe void UnsafeAtomicCounter64_AddSub()
    {
        long value = 0;
        var counter = new UnsafeAtomicCounter64(&value);

        Assert.AreEqual(0, counter.Add(123));
        Assert.AreEqual(123, counter.Add(0));
        Assert.AreEqual(123, counter.Sub(0));
        Assert.AreEqual(123, counter.AddSat(1, 123));
        Assert.AreEqual(123, counter.SubSat(1, 123));

        counter.AddSat(0xffff, 256);
        Assert.AreEqual(256, counter.Add(0));

        counter.SubSat(0xffff, -256);
        Assert.AreEqual(-256, counter.Add(0));
    }
}