diff --git a/src/DelegateDecompiler.Tests/ByteEnumTests.cs b/src/DelegateDecompiler.Tests/ByteEnumTests.cs new file mode 100644 index 0000000..d5f835f --- /dev/null +++ b/src/DelegateDecompiler.Tests/ByteEnumTests.cs @@ -0,0 +1,354 @@ +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; + +namespace DelegateDecompiler.Tests +{ + [TestFixture] + public class ByteEnumTests : DecompilerTestsBase + { + public enum TestEnum : byte + { + Foo, + Bar + } + + [Flags] + public enum TestFlagEnum : byte + { + None = 0, + Foo = 1, + Bar = 2, + } + + [Test] + public void TestEnumParameterEqualsEnumConstant() + { + Expression> expected1 = x => x == TestEnum.Bar; + Expression> expected2 = x => (int) x == (int) TestEnum.Bar; + Func compiled = x => x == TestEnum.Bar; + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumConstantEqualsEnumParameter() + { + Expression> expected1 = x => TestEnum.Bar == x; + Expression> expected2 = x => (int) TestEnum.Bar == (int) x; + Func compiled = x => TestEnum.Bar == x; + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumPropertyNotEqualsFooOrElseEnumPropertyEqualsBar() + { + Expression> expected1 = x => (x != TestEnum.Bar) || (x == TestEnum.Foo); + Expression> expected2 = x => ((int)x != (int)TestEnum.Bar) || ((int)x == (int)TestEnum.Foo); + Func compiled = x => (x != TestEnum.Bar) || (x == TestEnum.Foo); + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumPropertyEqualsFooOrElseEnumPropertyEqualsBar() + { + Expression> expected1 = x => (x == TestEnum.Bar) || (x == TestEnum.Foo); + Expression> expected2 = x => ((int)x == (int)TestEnum.Bar) || ((int)x == (int)TestEnum.Foo); + Func compiled = x => (x == TestEnum.Bar) || (x == TestEnum.Foo); + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumParametersEqual() + { + Expression> expected = (x, y) => x == y; + Func compiled = (x, y) => x == y; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterNotEqualsEnumConstant() + { + Expression> expected1 = x => x != TestEnum.Bar; + Expression> expected2 = x => (int) x != (int) TestEnum.Bar; + Func compiled = x => x != TestEnum.Bar; + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumConstantNotEqualsEnumParameter() + { + Expression> expected1 = x => TestEnum.Bar != x; + Expression> expected2 = x => (int) TestEnum.Bar != (int) x; + Func compiled = x => TestEnum.Bar != x; + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumParametersNotEqual() + { + Expression> expected = (x, y) => x != y; + Func compiled = (x, y) => x != y; + Test(compiled, expected); + } + + [Test] + public void TestEnumConstantHasFlagEnumParameter() + { + Expression> expected = x => TestFlagEnum.Bar.HasFlag(x); + Func compiled = x => TestFlagEnum.Bar.HasFlag(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterHasFlagEnumConstant() + { + Expression> expected = x => x.HasFlag(TestFlagEnum.Bar); + Func compiled = x => x.HasFlag(TestFlagEnum.Bar); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterHasFlagEnumParameter() + { + Expression> expected = x => x.HasFlag(x); + Func compiled = x => x.HasFlag(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumConstantAndEnumParameter() + { + Expression> expected = x => TestFlagEnum.Bar & x; + Func compiled = x => TestFlagEnum.Bar & x; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAndEnumConstant() + { + Expression> expected = x => x & TestFlagEnum.Bar ; + Func compiled = x => x & TestFlagEnum.Bar ; + Test(compiled, expected); + } + + [Test] + public void TestNotEnumParameter() + { + Expression> expected = x => ~ x; + Func compiled = x => ~ x; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAndEnumParameter() + { + Expression> expected = x => x & x; + Func compiled = x => x & x ; + Test(compiled, expected); + } + + [Test] + public void TestEnumConstantOrEnumParameter() + { + Expression> expected = x => TestFlagEnum.Bar | x; + Func compiled = x => TestFlagEnum.Bar | x; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterOrEnumConstant() + { + Expression> expected = x => x | TestFlagEnum.Bar ; + Func compiled = x => x | TestFlagEnum.Bar ; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterOrEnumParameter() + { + Expression> expected = x => x | x; + Func compiled = x => x | x ; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodParameter() + { + Expression> expected = x => TestEnumMethod(x); + Func compiled = x => TestEnumMethod(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithEnumParameter() + { + Expression> expected = x => EnumMethod(x); + Func compiled = x => EnumMethod(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithObjectParameter() + { + Expression> expected = x => ObjectMethod(x); + Func compiled = x => ObjectMethod(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithInt8Parameter() + { + Expression> expected = x => Int8Method((byte) x); + Func compiled = x => Int8Method((byte) x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithInt16Parameter() + { + Expression> expected = x => Int16Method((short) x); + Func compiled = x => Int16Method((short) x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithInt32Parameter() + { + Expression> expected = x => Int32Method((int) x); + Func compiled = x => Int32Method((int) x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithInt64Parameter() + { + Expression> expected = x => Int64Method((long) x); + Func compiled = x => Int64Method((long) x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsGenericMethodParameter() + { + Expression> expected = x => GenericMethod(x); + Func compiled = x => GenericMethod(x); + Test(compiled, expected); + } + + // The following tests check for the insertion of Expression.Convert in the expression tree for compatible types + + [Test] + public void TestEnumCastSubtraction() + { + Expression> expected = x => (int)x - 10; + Func compiled = x => (int)x - 10; + Test(compiled, expected); + } + + [Test] + public void TestEnumCastMod() + { + Expression> expected = x => (int)x % 10; + Func compiled = x => (int)x % 10; + Test(compiled, expected); + } + + [Test] + public void TestEnumCastEquals() + { + Expression> expected = x => (int)x == 10; + Func compiled = x => (int)x == 10; + Test(compiled, expected); + } + + [Test] + public void TestEnumCastGreaterThan() + { + Expression> expected = x => (int)x > 10; + Func compiled = x => (int)x > 10; + Test(compiled, expected); + } + + [Test] + public void Issue61() + { + Expression> expected = x => Decimal.Round(x, 3, MidpointRounding.AwayFromZero); + Func compiled = x => Decimal.Round(x, 3, MidpointRounding.AwayFromZero); + Test(compiled, expected); + } + + [Test] + public void Issue98A() + { + Expression> expected = (x, y) => x == y; + Func compiled = (x, y) => x == y; + Test(compiled, expected); + } + + [Test] + public void Issue98B() + { + Expression> expected = x => x == TestEnum.Foo; + Func compiled = x => x == TestEnum.Foo; + Test(compiled, expected); + } + + [Test] + public void Issue160() + { + Expression> expected1 = x => (TestEnum?) x == TestEnum.Bar; + Expression> expected2 = x => (x.HasValue ? (TestEnum?) (x ?? 0) : null) == TestEnum.Bar; + Func compiled = x => (TestEnum?) x == TestEnum.Bar; + Test(compiled, expected1, expected2); + } + + [Test] + public void Issue176Array() + { + Expression> expected = x => new [] {TestEnum.Foo, TestEnum.Bar}.Contains(x); + Func compiled = x => new[] {TestEnum.Foo, TestEnum.Bar}.Contains(x); + Test(compiled, expected); + } + + private static bool TestEnumMethod(TestEnum p0) + { + throw new NotImplementedException(); + } + + private static bool EnumMethod(Enum p0) + { + throw new NotImplementedException(); + } + + private static bool ObjectMethod(object p0) + { + throw new NotImplementedException(); + } + + private static bool Int8Method(byte p0) + { + throw new NotImplementedException(); + } + + private static bool Int16Method(short p0) + { + throw new NotImplementedException(); + } + + private static bool Int32Method(int p0) + { + throw new NotImplementedException(); + } + + private static bool Int64Method(long p0) + { + throw new NotImplementedException(); + } + + private static bool GenericMethod(T x) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/DelegateDecompiler.Tests/EnumTests.cs b/src/DelegateDecompiler.Tests/EnumTests.cs index e45d510..867ba08 100644 --- a/src/DelegateDecompiler.Tests/EnumTests.cs +++ b/src/DelegateDecompiler.Tests/EnumTests.cs @@ -221,6 +221,14 @@ public void TestEnumParameterAsMethodWithObjectParameter() Test(compiled, expected); } + [Test] + public void TestEnumParameterAsMethodWithInt8Parameter() + { + Expression> expected = x => Int8Method((byte) x); + Func compiled = x => Int8Method((byte) x); + Test(compiled, expected); + } + [Test] public void TestEnumParameterAsMethodWithInt16Parameter() { @@ -343,6 +351,11 @@ private static bool ObjectMethod(object p0) throw new NotImplementedException(); } + private static bool Int8Method(byte p0) + { + throw new NotImplementedException(); + } + private static bool Int16Method(short p0) { throw new NotImplementedException(); diff --git a/src/DelegateDecompiler.Tests/LongEnumTests.cs b/src/DelegateDecompiler.Tests/LongEnumTests.cs new file mode 100644 index 0000000..875af87 --- /dev/null +++ b/src/DelegateDecompiler.Tests/LongEnumTests.cs @@ -0,0 +1,354 @@ +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; + +namespace DelegateDecompiler.Tests +{ + [TestFixture] + public class LongEnumTests : DecompilerTestsBase + { + public enum TestEnum : long + { + Foo, + Bar + } + + [Flags] + public enum TestFlagEnum : long + { + None = 0, + Foo = 1, + Bar = 2, + } + + [Test] + public void TestEnumParameterEqualsEnumConstant() + { + Expression> expected1 = x => x == TestEnum.Bar; + Expression> expected2 = x => (int) x == (int) TestEnum.Bar; + Func compiled = x => x == TestEnum.Bar; + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumConstantEqualsEnumParameter() + { + Expression> expected1 = x => TestEnum.Bar == x; + Expression> expected2 = x => (int) TestEnum.Bar == (int) x; + Func compiled = x => TestEnum.Bar == x; + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumPropertyNotEqualsFooOrElseEnumPropertyEqualsBar() + { + Expression> expected1 = x => (x != TestEnum.Bar) || (x == TestEnum.Foo); + Expression> expected2 = x => ((int)x != (int)TestEnum.Bar) || ((int)x == (int)TestEnum.Foo); + Func compiled = x => (x != TestEnum.Bar) || (x == TestEnum.Foo); + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumPropertyEqualsFooOrElseEnumPropertyEqualsBar() + { + Expression> expected1 = x => (x == TestEnum.Bar) || (x == TestEnum.Foo); + Expression> expected2 = x => ((int)x == (int)TestEnum.Bar) || ((int)x == (int)TestEnum.Foo); + Func compiled = x => (x == TestEnum.Bar) || (x == TestEnum.Foo); + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumParametersEqual() + { + Expression> expected = (x, y) => x == y; + Func compiled = (x, y) => x == y; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterNotEqualsEnumConstant() + { + Expression> expected1 = x => x != TestEnum.Bar; + Expression> expected2 = x => (int) x != (int) TestEnum.Bar; + Func compiled = x => x != TestEnum.Bar; + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumConstantNotEqualsEnumParameter() + { + Expression> expected1 = x => TestEnum.Bar != x; + Expression> expected2 = x => (int) TestEnum.Bar != (int) x; + Func compiled = x => TestEnum.Bar != x; + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumParametersNotEqual() + { + Expression> expected = (x, y) => x != y; + Func compiled = (x, y) => x != y; + Test(compiled, expected); + } + + [Test] + public void TestEnumConstantHasFlagEnumParameter() + { + Expression> expected = x => TestFlagEnum.Bar.HasFlag(x); + Func compiled = x => TestFlagEnum.Bar.HasFlag(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterHasFlagEnumConstant() + { + Expression> expected = x => x.HasFlag(TestFlagEnum.Bar); + Func compiled = x => x.HasFlag(TestFlagEnum.Bar); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterHasFlagEnumParameter() + { + Expression> expected = x => x.HasFlag(x); + Func compiled = x => x.HasFlag(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumConstantAndEnumParameter() + { + Expression> expected = x => TestFlagEnum.Bar & x; + Func compiled = x => TestFlagEnum.Bar & x; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAndEnumConstant() + { + Expression> expected = x => x & TestFlagEnum.Bar ; + Func compiled = x => x & TestFlagEnum.Bar ; + Test(compiled, expected); + } + + [Test] + public void TestNotEnumParameter() + { + Expression> expected = x => ~ x; + Func compiled = x => ~ x; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAndEnumParameter() + { + Expression> expected = x => x & x; + Func compiled = x => x & x ; + Test(compiled, expected); + } + + [Test] + public void TestEnumConstantOrEnumParameter() + { + Expression> expected = x => TestFlagEnum.Bar | x; + Func compiled = x => TestFlagEnum.Bar | x; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterOrEnumConstant() + { + Expression> expected = x => x | TestFlagEnum.Bar ; + Func compiled = x => x | TestFlagEnum.Bar ; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterOrEnumParameter() + { + Expression> expected = x => x | x; + Func compiled = x => x | x ; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodParameter() + { + Expression> expected = x => TestEnumMethod(x); + Func compiled = x => TestEnumMethod(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithEnumParameter() + { + Expression> expected = x => EnumMethod(x); + Func compiled = x => EnumMethod(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithObjectParameter() + { + Expression> expected = x => ObjectMethod(x); + Func compiled = x => ObjectMethod(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithInt8Parameter() + { + Expression> expected = x => Int8Method((byte) x); + Func compiled = x => Int8Method((byte) x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithInt16Parameter() + { + Expression> expected = x => Int16Method((short) x); + Func compiled = x => Int16Method((short) x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithInt32Parameter() + { + Expression> expected = x => Int32Method((int) x); + Func compiled = x => Int32Method((int) x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithInt64Parameter() + { + Expression> expected = x => Int64Method((long) x); + Func compiled = x => Int64Method((long) x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsGenericMethodParameter() + { + Expression> expected = x => GenericMethod(x); + Func compiled = x => GenericMethod(x); + Test(compiled, expected); + } + + // The following tests check for the insertion of Expression.Convert in the expression tree for compatible types + + [Test] + public void TestEnumCastSubtraction() + { + Expression> expected = x => (int)x - 10; + Func compiled = x => (int)x - 10; + Test(compiled, expected); + } + + [Test] + public void TestEnumCastMod() + { + Expression> expected = x => (int)x % 10; + Func compiled = x => (int)x % 10; + Test(compiled, expected); + } + + [Test] + public void TestEnumCastEquals() + { + Expression> expected = x => (int)x == 10; + Func compiled = x => (int)x == 10; + Test(compiled, expected); + } + + [Test] + public void TestEnumCastGreaterThan() + { + Expression> expected = x => (int)x > 10; + Func compiled = x => (int)x > 10; + Test(compiled, expected); + } + + [Test] + public void Issue61() + { + Expression> expected = x => Decimal.Round(x, 3, MidpointRounding.AwayFromZero); + Func compiled = x => Decimal.Round(x, 3, MidpointRounding.AwayFromZero); + Test(compiled, expected); + } + + [Test] + public void Issue98A() + { + Expression> expected = (x, y) => x == y; + Func compiled = (x, y) => x == y; + Test(compiled, expected); + } + + [Test] + public void Issue98B() + { + Expression> expected = x => x == TestEnum.Foo; + Func compiled = x => x == TestEnum.Foo; + Test(compiled, expected); + } + + [Test] + public void Issue160() + { + Expression> expected1 = x => (TestEnum?) x == TestEnum.Bar; + Expression> expected2 = x => (x.HasValue ? (TestEnum?) (x ?? 0) : null) == TestEnum.Bar; + Func compiled = x => (TestEnum?) x == TestEnum.Bar; + Test(compiled, expected1, expected2); + } + + [Test] + public void Issue176Array() + { + Expression> expected = x => new [] {TestEnum.Foo, TestEnum.Bar}.Contains(x); + Func compiled = x => new[] {TestEnum.Foo, TestEnum.Bar}.Contains(x); + Test(compiled, expected); + } + + private static bool TestEnumMethod(TestEnum p0) + { + throw new NotImplementedException(); + } + + private static bool EnumMethod(Enum p0) + { + throw new NotImplementedException(); + } + + private static bool ObjectMethod(object p0) + { + throw new NotImplementedException(); + } + + private static bool Int8Method(byte p0) + { + throw new NotImplementedException(); + } + + private static bool Int16Method(short p0) + { + throw new NotImplementedException(); + } + + private static bool Int32Method(int p0) + { + throw new NotImplementedException(); + } + + private static bool Int64Method(long p0) + { + throw new NotImplementedException(); + } + + private static bool GenericMethod(T x) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/DelegateDecompiler.Tests/Uint32EnumTests.cs b/src/DelegateDecompiler.Tests/Uint32EnumTests.cs new file mode 100644 index 0000000..a85a779 --- /dev/null +++ b/src/DelegateDecompiler.Tests/Uint32EnumTests.cs @@ -0,0 +1,354 @@ +using System; +using System.Linq; +using System.Linq.Expressions; +using NUnit.Framework; + +namespace DelegateDecompiler.Tests +{ + [TestFixture] + public class Uint32EnumTests : DecompilerTestsBase + { + public enum TestEnum : uint + { + Foo, + Bar + } + + [Flags] + public enum TestFlagEnum : uint + { + None = 0, + Foo = 1, + Bar = 2, + } + + [Test] + public void TestEnumParameterEqualsEnumConstant() + { + Expression> expected1 = x => x == TestEnum.Bar; + Expression> expected2 = x => (uint) x == (uint) TestEnum.Bar; + Func compiled = x => x == TestEnum.Bar; + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumConstantEqualsEnumParameter() + { + Expression> expected1 = x => TestEnum.Bar == x; + Expression> expected2 = x => (uint) TestEnum.Bar == (uint) x; + Func compiled = x => TestEnum.Bar == x; + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumPropertyNotEqualsFooOrElseEnumPropertyEqualsBar() + { + Expression> expected1 = x => (x != TestEnum.Bar) || (x == TestEnum.Foo); + Expression> expected2 = x => ((uint)x != (uint)TestEnum.Bar) || ((uint)x == (uint)TestEnum.Foo); + Func compiled = x => (x != TestEnum.Bar) || (x == TestEnum.Foo); + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumPropertyEqualsFooOrElseEnumPropertyEqualsBar() + { + Expression> expected1 = x => (x == TestEnum.Bar) || (x == TestEnum.Foo); + Expression> expected2 = x => ((uint)x == (uint)TestEnum.Bar) || ((uint)x == (uint)TestEnum.Foo); + Func compiled = x => (x == TestEnum.Bar) || (x == TestEnum.Foo); + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumParametersEqual() + { + Expression> expected = (x, y) => x == y; + Func compiled = (x, y) => x == y; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterNotEqualsEnumConstant() + { + Expression> expected1 = x => x != TestEnum.Bar; + Expression> expected2 = x => (uint) x != (uint) TestEnum.Bar; + Func compiled = x => x != TestEnum.Bar; + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumConstantNotEqualsEnumParameter() + { + Expression> expected1 = x => TestEnum.Bar != x; + Expression> expected2 = x => (uint) TestEnum.Bar != (uint) x; + Func compiled = x => TestEnum.Bar != x; + Test(compiled, expected1, expected2); + } + + [Test] + public void TestEnumParametersNotEqual() + { + Expression> expected = (x, y) => x != y; + Func compiled = (x, y) => x != y; + Test(compiled, expected); + } + + [Test] + public void TestEnumConstantHasFlagEnumParameter() + { + Expression> expected = x => TestFlagEnum.Bar.HasFlag(x); + Func compiled = x => TestFlagEnum.Bar.HasFlag(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterHasFlagEnumConstant() + { + Expression> expected = x => x.HasFlag(TestFlagEnum.Bar); + Func compiled = x => x.HasFlag(TestFlagEnum.Bar); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterHasFlagEnumParameter() + { + Expression> expected = x => x.HasFlag(x); + Func compiled = x => x.HasFlag(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumConstantAndEnumParameter() + { + Expression> expected = x => TestFlagEnum.Bar & x; + Func compiled = x => TestFlagEnum.Bar & x; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAndEnumConstant() + { + Expression> expected = x => x & TestFlagEnum.Bar ; + Func compiled = x => x & TestFlagEnum.Bar ; + Test(compiled, expected); + } + + [Test] + public void TestNotEnumParameter() + { + Expression> expected = x => ~ x; + Func compiled = x => ~ x; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAndEnumParameter() + { + Expression> expected = x => x & x; + Func compiled = x => x & x ; + Test(compiled, expected); + } + + [Test] + public void TestEnumConstantOrEnumParameter() + { + Expression> expected = x => TestFlagEnum.Bar | x; + Func compiled = x => TestFlagEnum.Bar | x; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterOrEnumConstant() + { + Expression> expected = x => x | TestFlagEnum.Bar ; + Func compiled = x => x | TestFlagEnum.Bar ; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterOrEnumParameter() + { + Expression> expected = x => x | x; + Func compiled = x => x | x ; + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodParameter() + { + Expression> expected = x => TestEnumMethod(x); + Func compiled = x => TestEnumMethod(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithEnumParameter() + { + Expression> expected = x => EnumMethod(x); + Func compiled = x => EnumMethod(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithObjectParameter() + { + Expression> expected = x => ObjectMethod(x); + Func compiled = x => ObjectMethod(x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithInt8Parameter() + { + Expression> expected = x => Int8Method((uint) x); + Func compiled = x => Int8Method((uint) x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithInt16Parameter() + { + Expression> expected = x => Int16Method((short) x); + Func compiled = x => Int16Method((short) x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithInt32Parameter() + { + Expression> expected = x => Int32Method((int) x); + Func compiled = x => Int32Method((int) x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsMethodWithInt64Parameter() + { + Expression> expected = x => Int64Method((long) x); + Func compiled = x => Int64Method((long) x); + Test(compiled, expected); + } + + [Test] + public void TestEnumParameterAsGenericMethodParameter() + { + Expression> expected = x => GenericMethod(x); + Func compiled = x => GenericMethod(x); + Test(compiled, expected); + } + + // The following tests check for the insertion of Expression.Convert in the expression tree for compatible types + + [Test] + public void TestEnumCastSubtraction() + { + Expression> expected = x => (uint)x - 10; + Func compiled = x => (uint)x - 10; + Test(compiled, expected); + } + + [Test] + public void TestEnumCastMod() + { + Expression> expected = x => (uint)x % 10; + Func compiled = x => (uint)x % 10; + Test(compiled, expected); + } + + [Test] + public void TestEnumCastEquals() + { + Expression> expected = x => (uint)x == 10; + Func compiled = x => (uint)x == 10; + Test(compiled, expected); + } + + [Test] + public void TestEnumCastGreaterThan() + { + Expression> expected = x => (uint)x > 10; + Func compiled = x => (uint)x > 10; + Test(compiled, expected); + } + + [Test] + public void Issue61() + { + Expression> expected = x => Decimal.Round(x, 3, MidpointRounding.AwayFromZero); + Func compiled = x => Decimal.Round(x, 3, MidpointRounding.AwayFromZero); + Test(compiled, expected); + } + + [Test] + public void Issue98A() + { + Expression> expected = (x, y) => x == y; + Func compiled = (x, y) => x == y; + Test(compiled, expected); + } + + [Test] + public void Issue98B() + { + Expression> expected = x => x == TestEnum.Foo; + Func compiled = x => x == TestEnum.Foo; + Test(compiled, expected); + } + + [Test] + public void Issue160() + { + Expression> expected1 = x => (TestEnum?) x == TestEnum.Bar; + Expression> expected2 = x => (x.HasValue ? (TestEnum?) (x ?? 0) : null) == TestEnum.Bar; + Func compiled = x => (TestEnum?) x == TestEnum.Bar; + Test(compiled, expected1, expected2); + } + + [Test] + public void Issue176Array() + { + Expression> expected = x => new [] {TestEnum.Foo, TestEnum.Bar}.Contains(x); + Func compiled = x => new[] {TestEnum.Foo, TestEnum.Bar}.Contains(x); + Test(compiled, expected); + } + + private static bool TestEnumMethod(TestEnum p0) + { + throw new NotImplementedException(); + } + + private static bool EnumMethod(Enum p0) + { + throw new NotImplementedException(); + } + + private static bool ObjectMethod(object p0) + { + throw new NotImplementedException(); + } + + private static bool Int8Method(uint p0) + { + throw new NotImplementedException(); + } + + private static bool Int16Method(short p0) + { + throw new NotImplementedException(); + } + + private static bool Int32Method(int p0) + { + throw new NotImplementedException(); + } + + private static bool Int64Method(long p0) + { + throw new NotImplementedException(); + } + + private static bool GenericMethod(T x) + { + throw new NotImplementedException(); + } + } +}