using Unity.Burst;
using Unity.Jobs;
using NUnit.Framework;
using Unity.Collections;

#pragma warning disable 0649

internal class NativeContainerTests_ValidateTypes : NativeContainerTests_ValidateTypesFixture
{
    enum MyTestEnum
    {
        HellWorld
    }

    struct Vector3
    {
        public float x, y, z;
    }

    struct Matrix4x4
    {
        public float m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15;
    }

    [BurstCompile(CompileSynchronously = true)]
    struct StructWithVariousStructsAndValueTypesJob : IJob
    {
        [ReadOnly]
        public NativeArray<float> nativeArrayRO;
        public NativeArray<float> nativeArrayRW;

#pragma warning disable 0169 // field is never used
        Vector3 vec3;
        float       floatVal;
        Matrix4x4   matrix;
        int         intValue;
        byte        byteValue;
        short       shortValue;
        MyTestEnum  myEnum;
#pragma warning restore 0169 // field is never used

        public void Execute() {}
    }

    [BurstCompile(CompileSynchronously = true)]
    struct StructEmptyJob : IJob
    {
        public void Execute() {}
    }

    [Test]
    public void Scheduling_With_Supported_Types()
    {
        var temp1 = CollectionHelper.CreateNativeArray<float>(1, CommonRwdAllocator.Handle);
        var temp2 = CollectionHelper.CreateNativeArray<float>(1, CommonRwdAllocator.Handle);

        var types = new StructWithVariousStructsAndValueTypesJob();
        types.nativeArrayRO = temp1;
        types.nativeArrayRW = temp2;
        types.Schedule().Complete();
        new StructEmptyJob().Schedule().Complete();

        temp1.Dispose();
        temp2.Dispose();
    }
}