From 0521f868bd3ff9a065e92e35f07032040adefcec Mon Sep 17 00:00:00 2001 From: eeichinger Date: Mon, 27 Jul 2009 16:36:59 +0000 Subject: [PATCH] added enum support for SPRNET-467 --- src/Spring/Spring.Core/Expressions/OpAND.cs | 14 ++++++++++++-- src/Spring/Spring.Core/Expressions/OpNOT.cs | 11 ++++++++++- src/Spring/Spring.Core/Expressions/OpOR.cs | 12 +++++++++++- src/Spring/Spring.Core/Expressions/OpXOR.cs | 11 ++++++++++- .../Expressions/ExpressionEvaluatorTests.cs | 7 +++++++ 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/Spring/Spring.Core/Expressions/OpAND.cs b/src/Spring/Spring.Core/Expressions/OpAND.cs index 8cf1ad38..e1a13d01 100644 --- a/src/Spring/Spring.Core/Expressions/OpAND.cs +++ b/src/Spring/Spring.Core/Expressions/OpAND.cs @@ -68,8 +68,18 @@ namespace Spring.Expressions if (NumberUtils.IsInteger(l) && NumberUtils.IsInteger(r)) { return NumberUtils.BitwiseAnd(l, r); - } - return Convert.ToBoolean(l) && Convert.ToBoolean(r); + } + else if (l is Enum && l.GetType() == r.GetType()) + { + Type enumType = l.GetType(); + Type integralType = Enum.GetUnderlyingType(enumType); + l = Convert.ChangeType(l, integralType); + r = Convert.ChangeType(r, integralType); + object result = NumberUtils.BitwiseAnd(l, r); + return Enum.ToObject(enumType, result); + } + else + return Convert.ToBoolean(l) && Convert.ToBoolean(r); } } } \ No newline at end of file diff --git a/src/Spring/Spring.Core/Expressions/OpNOT.cs b/src/Spring/Spring.Core/Expressions/OpNOT.cs index f7870fad..5203d73c 100644 --- a/src/Spring/Spring.Core/Expressions/OpNOT.cs +++ b/src/Spring/Spring.Core/Expressions/OpNOT.cs @@ -67,7 +67,16 @@ namespace Spring.Expressions { return NumberUtils.BitwiseNot(operand); } - return !Convert.ToBoolean(operand); + else if (operand is Enum) + { + Type enumType = operand.GetType(); + Type integralType = Enum.GetUnderlyingType(enumType); + operand = Convert.ChangeType(operand, integralType); + object result = NumberUtils.BitwiseNot(operand); + return Enum.ToObject(enumType, result); + } + else + return !Convert.ToBoolean(operand); } } } \ No newline at end of file diff --git a/src/Spring/Spring.Core/Expressions/OpOR.cs b/src/Spring/Spring.Core/Expressions/OpOR.cs index 95534f70..ca5b8929 100644 --- a/src/Spring/Spring.Core/Expressions/OpOR.cs +++ b/src/Spring/Spring.Core/Expressions/OpOR.cs @@ -69,7 +69,17 @@ namespace Spring.Expressions { return NumberUtils.BitwiseOr(l, r); } - return Convert.ToBoolean(l) || Convert.ToBoolean(r); + else if (l is Enum && l.GetType() == r.GetType()) + { + Type enumType = l.GetType(); + Type integralType = Enum.GetUnderlyingType(enumType); + l = Convert.ChangeType(l, integralType); + r = Convert.ChangeType(r, integralType); + object result = NumberUtils.BitwiseOr(l, r); + return Enum.ToObject(enumType, result); + } + else + return Convert.ToBoolean(l) || Convert.ToBoolean(r); } } } \ No newline at end of file diff --git a/src/Spring/Spring.Core/Expressions/OpXOR.cs b/src/Spring/Spring.Core/Expressions/OpXOR.cs index c025f474..82a2c403 100644 --- a/src/Spring/Spring.Core/Expressions/OpXOR.cs +++ b/src/Spring/Spring.Core/Expressions/OpXOR.cs @@ -66,7 +66,16 @@ namespace Spring.Expressions if (NumberUtils.IsInteger(l) && NumberUtils.IsInteger(r)) { return NumberUtils.BitwiseXor(l, r); - } + } + else if (l is Enum && l.GetType() == r.GetType()) + { + Type enumType = l.GetType(); + Type integralType = Enum.GetUnderlyingType(enumType); + l = Convert.ChangeType(l, integralType); + r = Convert.ChangeType(r, integralType); + object result = NumberUtils.BitwiseXor(l, r); + return Enum.ToObject(enumType, result); + } return Convert.ToBoolean(l) ^ Convert.ToBoolean(r); } } diff --git a/test/Spring/Spring.Core.Tests/Expressions/ExpressionEvaluatorTests.cs b/test/Spring/Spring.Core.Tests/Expressions/ExpressionEvaluatorTests.cs index c6a4cbe7..5b467593 100644 --- a/test/Spring/Spring.Core.Tests/Expressions/ExpressionEvaluatorTests.cs +++ b/test/Spring/Spring.Core.Tests/Expressions/ExpressionEvaluatorTests.cs @@ -31,6 +31,7 @@ using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap; using System.Text; +using System.Text.RegularExpressions; using System.Threading; using System.Web.Services; using antlr; @@ -957,6 +958,7 @@ namespace Spring.Expressions { Assert.AreEqual( 1 | 2, ExpressionEvaluator.GetValue(null, "1 or 2")); Assert.AreEqual( 1 | -2, ExpressionEvaluator.GetValue(null, "1 or -2")); + Assert.AreEqual(RegexOptions.IgnoreCase | RegexOptions.Compiled, ExpressionEvaluator.GetValue(null, "T(System.Text.RegularExpressions.RegexOptions).IgnoreCase or T(System.Text.RegularExpressions.RegexOptions).Compiled")); } /// @@ -981,6 +983,9 @@ namespace Spring.Expressions { Assert.AreEqual(1 & 3, ExpressionEvaluator.GetValue(null, "1 and 3")); Assert.AreEqual(1 & -1, ExpressionEvaluator.GetValue(null, "1 and -1")); + Hashtable vars = new Hashtable(); + vars["ALL"] = (RegexOptions) 0xFFFF; + Assert.AreEqual(RegexOptions.IgnoreCase, ExpressionEvaluator.GetValue(null, "T(System.Text.RegularExpressions.RegexOptions).IgnoreCase and #ALL", vars)); } /// @@ -993,6 +998,7 @@ namespace Spring.Expressions Assert.IsTrue((bool)ExpressionEvaluator.GetValue(null, "!false")); string expression = @"IsMember('Nikola Tesla') and !IsMember('Mihajlo Pupin')"; Assert.IsFalse((bool)ExpressionEvaluator.GetValue(ieee, expression)); + Assert.AreEqual( ~RegexOptions.Compiled, ExpressionEvaluator.GetValue(null, "!T(System.Text.RegularExpressions.RegexOptions).Compiled")); } /// @@ -1005,6 +1011,7 @@ namespace Spring.Expressions Assert.AreEqual(1 ^ -1, ExpressionEvaluator.GetValue(null, "1 xor -1")); Assert.AreEqual(true ^ false, ExpressionEvaluator.GetValue(null, "true xor false")); Assert.AreEqual(true ^ true, ExpressionEvaluator.GetValue(null, "true xor true")); + Assert.AreEqual(RegexOptions.IgnoreCase ^ RegexOptions.Compiled, ExpressionEvaluator.GetValue(null, "T(System.Text.RegularExpressions.RegexOptions).IgnoreCase xor T(System.Text.RegularExpressions.RegexOptions).Compiled")); } ///