#if UNITY_EDITOR

using NUnit.Framework;
using System;
using Unity.Mathematics;
using UnityEngine.PathTracing.Lightmapping;

namespace UnityEngine.PathTracing.Tests
{
    internal class ChartIdenticationTests
    {
        [Test]
        public void TestUnionFind()
        {
            uint vertexCount = 8;
            var vertexChartIds = new UInt32[vertexCount];
            var triangleIndices = new UInt32[]
            {
                0, 1, 7,
                4, 5, 6,
                2, 6, 4,
                0, 3, 7
            };
            ChartIdentification.InitializeRepresentatives(vertexChartIds);
            ChartIdentification.UnionTriangleEdges(triangleIndices, vertexChartIds);
            ChartIdentification.FindRepresentatives(vertexChartIds);

            Assert.AreEqual(0, vertexChartIds[0]);
            Assert.AreEqual(0, vertexChartIds[1]);
            Assert.AreEqual(2, vertexChartIds[2]);
            Assert.AreEqual(0, vertexChartIds[3]);
            Assert.AreEqual(2, vertexChartIds[4]);
            Assert.AreEqual(2, vertexChartIds[5]);
            Assert.AreEqual(2, vertexChartIds[6]);
            Assert.AreEqual(0, vertexChartIds[7]);
        }

        [Test]
        public void TestCompaction()
        {
            var vertexChartIds = new UInt32[]
            {
                3, 3, 3,
                3, 2, 2,
                9, 9, 0,
                0, 3, 3
            };
            ChartIdentification.Compact(vertexChartIds, out uint chartCount);

            Assert.AreEqual(4, chartCount);

            Assert.AreEqual(0, vertexChartIds[0]);
            Assert.AreEqual(0, vertexChartIds[1]);
            Assert.AreEqual(0, vertexChartIds[2]);
            Assert.AreEqual(0, vertexChartIds[3]);
            Assert.AreEqual(1, vertexChartIds[4]);
            Assert.AreEqual(1, vertexChartIds[5]);
            Assert.AreEqual(2, vertexChartIds[6]);
            Assert.AreEqual(2, vertexChartIds[7]);
            Assert.AreEqual(3, vertexChartIds[8]);
            Assert.AreEqual(3, vertexChartIds[9]);
            Assert.AreEqual(0, vertexChartIds[10]);
            Assert.AreEqual(0, vertexChartIds[11]);
        }

        [Test]
        public void TestDeduplication()
        {
            uint vertexCount = 6;
            var vertexChartIds = new UInt32[vertexCount];
            var inputVertexUvs = new float2[]
            {
                new(-1.0f, 0.0f),
                new(0.0f, 1.0f),
                new(0.0f, -1.0f),
                new(0.0f, 1.0f),
                new(1.0f, 0.0f),
                new(0.0f, -1.0f)
            };
            var inputVertexNormals = new float3[]
            {
                new(-1.0f, 0.0f, 0.0f),
                new(0.0f, 1.0f, 0.0f),
                new(0.0f, -1.0f, 0.0f),
                new(0.0f, 1.0f, 0.0f),
                new(1.0f, 0.0f, 0.0f),
                new(0.0f, -1.0f, 0.0f)
            };
            var inputVertexPositions = new float3[]
            {
                new(-1.0f, 0.0f, 0.0f),
                new(0.0f, 1.0f, 0.0f),
                new(0.0f, -1.0f, 0.0f),
                new(0.0f, 1.0f, 0.0f),
                new(1.0f, 0.0f, 0.0f),
                new(0.0f, -2.0f, 0.0f)
            };

            ChartIdentification.InitializeRepresentatives(vertexChartIds);
            ChartIdentification.UnionDuplicateVertices(inputVertexUvs, inputVertexPositions, inputVertexNormals, vertexChartIds, true);
            ChartIdentification.FindRepresentatives(vertexChartIds);

            Assert.AreEqual(0, vertexChartIds[0]);
            Assert.AreEqual(3, vertexChartIds[1]);
            Assert.AreEqual(2, vertexChartIds[2]);
            Assert.AreEqual(3, vertexChartIds[3]);
            Assert.AreEqual(4, vertexChartIds[4]);
            Assert.AreEqual(5, vertexChartIds[5]);
        }
    }
}
#endif