<#/*THIS IS A T4 FILE - see t4_text_templating.md for what it is and how to run codegen*/#>
<#@ template debug="True" #>
<#@ output extension=".gen.cs" encoding="utf-8" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Globalization" #>

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//     TextTransform Samples/Packages/com.unity.collections/Unity.Collections.Tests.Playmode/FixedListPlayModeTests.tt
//
//     These tests require UNITY_DOTS_DEBUG to be enabled.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Collections;
using NUnit.Framework;
using UnityEngine.TestTools;
using System;
using Unity.Collections;

[TestFixture]
internal class FixedListPlaymodeTests
{
    [UnityTest]
#if UNITY_EDITOR // standalone only
        [Ignore("Test is for standalone builds only")]
#endif
    public IEnumerator FixedListPlaymode_AreCollectionsChecksEnabled()
    {
#if ENABLE_UNITY_COLLECTIONS_CHECKS
        Assert.IsTrue(false, "Collections checks should not be enabled in standalone playmode tests");
#endif
#if !UNITY_DOTS_DEBUG
        Assert.IsTrue(false, "UNITY_DOTS_DEBUG should be defined in standalone playmode tests");
#endif
        yield break;
    }
<#
    {
        var TYPES = new string[] {"byte", "int", "float"};
        var TYPESIZES = new int[] {1, 4, 4};
        var SIZES = new int[] {32, 64, 128};
        for (var type = 0; type < 3; ++type)
        {
            for (var size = 0; size < 3; ++size)
            {
                var BYTES = SIZES[size];
                var TYPE = TYPES[type];
                var TYPESIZE = TYPESIZES[type];
                var MAXLENGTH = BYTES - 2;
                var TYPENAME = String.Format("FixedList{0}Bytes", BYTES);
                var TYPENAME_IDENTIFIER = String.Format("FixedList{0}{1}Playmode_", BYTES, new CultureInfo("en-US").TextInfo.ToTitleCase(TYPE));
                var EXPECTEDCAPACITY = (BYTES - 2) / TYPESIZE;
                var BUFFERTYPE = String.Format("FixedBytes{0}", MAXLENGTH);
#>

    [UnityTest]
    public IEnumerator <#=TYPENAME_IDENTIFIER #>GenericHasExpectedCapacity()
    {
        var list = new <#=TYPENAME #><<#=TYPE#>>();
        var expectedCapacity = list.Capacity;
        for(int i = 0; i < expectedCapacity; ++i)
            list.Add((<#=TYPE #>)i);
        Assert.Throws<IndexOutOfRangeException> (() => { list.Add((<#=TYPE #>)expectedCapacity); });

        yield break;
    }
<#
            }
            for (var size = 0; size < 3; ++size)
            {
                var BYTES = SIZES[size];
                var TYPE = TYPES[type];
                var TYPESIZE = TYPESIZES[type];
                var MAXLENGTH = BYTES - 2;
                var TYPENAME = String.Format("FixedList{0}Bytes<{1}>", BYTES, TYPE);
                var TYPENAME_IDENTIFIER = String.Format("FixedList{0}{1}Playmode_", BYTES, new CultureInfo("en-US").TextInfo.ToTitleCase(TYPE));
                var EXPECTEDCAPACITY = (BYTES - 2) / TYPESIZE;
#>

    [UnityTest]
    public IEnumerator <#=TYPENAME_IDENTIFIER #>HasExpectedCapacity()
    {
        var list = new <#=TYPENAME #>();
        var expectedCapacity = list.Capacity;
        for(int i = 0; i < expectedCapacity; ++i)
            list.Add((<#=TYPE #>)i);
        Assert.Throws<IndexOutOfRangeException> (() => { list.Add((<#=TYPE #>)expectedCapacity); });

        yield break;
    }
<#
                foreach (var OTHERBYTES in SIZES)
                {
                    if (OTHERBYTES != BYTES)
                    {
                        var OTHERCAPACITY = (OTHERBYTES - 2) / TYPESIZE;
                        var OTHERTYPENAME = String.Format("FixedList{0}Bytes<{1}>", OTHERBYTES, TYPE);
                        var OTHERTYPENAME_IDENTIFIER = String.Format("_FixedList{0}{1}", OTHERBYTES, new CultureInfo("en-US").TextInfo.ToTitleCase(TYPE));

                        if (EXPECTEDCAPACITY > OTHERCAPACITY)
                        {
#>

    [UnityTest]
    public IEnumerator <#=TYPENAME_IDENTIFIER #>To<#=OTHERTYPENAME_IDENTIFIER #>()
    {
        var a = new <#=TYPENAME #>();
        for(var i = 0; i < <#=EXPECTEDCAPACITY #>; ++i)
            a.Add((<#=TYPE #>)i);
<#                    
                            WriteLine(
                                "        Assert.Throws<IndexOutOfRangeException> (() => {{ var b = new {0}(a); }} );",
                                OTHERTYPENAME);
                        
#>
        yield break;
    }
<#
                        }
                    }
                }
            }
        }
    }
#>

}