152 lines
3.7 KiB
C#
152 lines
3.7 KiB
C#
|
using System;
|
||
|
using NUnit.Framework;
|
||
|
using UnityBenchShared;
|
||
|
|
||
|
namespace Burst.Compiler.IL.Tests
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Test with enums.
|
||
|
/// </summary>
|
||
|
internal partial class TestEnums
|
||
|
{
|
||
|
[System.Flags]
|
||
|
public enum MyEnum
|
||
|
{
|
||
|
Hello = 5,
|
||
|
Something = 10
|
||
|
}
|
||
|
|
||
|
[TestCompiler]
|
||
|
public static int test_enum_cast_to_int()
|
||
|
{
|
||
|
MyEnum value = MyEnum.Hello;
|
||
|
return (int)value;
|
||
|
}
|
||
|
|
||
|
[TestCompiler(MyEnum.Hello)]
|
||
|
[TestCompiler(MyEnum.Something)]
|
||
|
public static int test_enum_compare(MyEnum value)
|
||
|
{
|
||
|
if (value == MyEnum.Hello)
|
||
|
return 0;
|
||
|
else
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
//[TestCompiler(typeof(StructContainingEnumProvider))]
|
||
|
//public static int test_enum_in_struct(ref StructContainingEnum myStruct)
|
||
|
//{
|
||
|
// return myStruct.intValue + (int)myStruct.value;
|
||
|
//}
|
||
|
|
||
|
[TestCompiler(MyEnum.Hello)]
|
||
|
[TestCompiler(MyEnum.Something)]
|
||
|
[Ignore("Failure")]
|
||
|
public static int test_enum_has_flag(MyEnum value)
|
||
|
{
|
||
|
return value.HasFlag(MyEnum.Hello) ? 3 : 4;
|
||
|
}
|
||
|
|
||
|
[TestCompiler(MyEnum.Hello)]
|
||
|
[TestCompiler(MyEnum.Something)]
|
||
|
public static int test_enum_and_mask(MyEnum value)
|
||
|
{
|
||
|
return (value & MyEnum.Hello) != 0 ? 3 : 4;
|
||
|
}
|
||
|
|
||
|
[TestCompiler(1)]
|
||
|
[TestCompiler(2)]
|
||
|
public static int TestEnumSwitchCase(IntPtr value)
|
||
|
{
|
||
|
var enumValue = (SmallEnum) value.ToInt32();
|
||
|
// Need at least 3 cases to generate a proper switch
|
||
|
// otherwise Roslyn will generate an if/else
|
||
|
switch (enumValue)
|
||
|
{
|
||
|
case SmallEnum.One:
|
||
|
return 7;
|
||
|
case SmallEnum.Two:
|
||
|
return 8;
|
||
|
case SmallEnum.Three:
|
||
|
return 9;
|
||
|
default:
|
||
|
return 10;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static int GetToInt32(int value)
|
||
|
{
|
||
|
return value;
|
||
|
}
|
||
|
|
||
|
[TestCompiler]
|
||
|
public static int test_enum_sizeof_small_enum()
|
||
|
{
|
||
|
return sizeof(SmallEnum);
|
||
|
}
|
||
|
|
||
|
|
||
|
[TestCompiler(SmallEnum.Three)]
|
||
|
public static int test_enum_sizeof_small_enum_in_struct_access(SmallEnum value)
|
||
|
{
|
||
|
var s = new MySmallEnumStruct
|
||
|
{
|
||
|
a = value,
|
||
|
b = value,
|
||
|
c = value
|
||
|
};
|
||
|
return (int)s.a + (int)s.b + (int)s.c;
|
||
|
}
|
||
|
|
||
|
public struct StructContainingEnum
|
||
|
{
|
||
|
public MyEnum value;
|
||
|
public int intValue;
|
||
|
}
|
||
|
|
||
|
|
||
|
public enum SmallEnum : byte
|
||
|
{
|
||
|
One,
|
||
|
Two,
|
||
|
Three
|
||
|
}
|
||
|
|
||
|
|
||
|
public struct MySmallEnumStruct
|
||
|
{
|
||
|
public SmallEnum a;
|
||
|
public SmallEnum b;
|
||
|
public SmallEnum c;
|
||
|
public SmallEnum d;
|
||
|
}
|
||
|
|
||
|
public enum SomeByteEnum : byte
|
||
|
{
|
||
|
First = 0,
|
||
|
Last = 255
|
||
|
}
|
||
|
|
||
|
public unsafe struct FixedByte4Struct
|
||
|
{
|
||
|
fixed byte bytes[4];
|
||
|
|
||
|
public SomeByteEnum this[SomeByteEnum index]
|
||
|
{
|
||
|
get { return (SomeByteEnum)bytes[(int)index]; }
|
||
|
}
|
||
|
|
||
|
public struct Provider : IArgumentProvider
|
||
|
{
|
||
|
public object Value => new FixedByte4Struct { };
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[TestCompiler(typeof(FixedByte4Struct.Provider))]
|
||
|
public static SomeByteEnum test_enum_indexer(ref FixedByte4Struct bytes)
|
||
|
{
|
||
|
return bytes[0];
|
||
|
}
|
||
|
}
|
||
|
}
|