added enum support for SPRNET-467

This commit is contained in:
eeichinger
2009-07-27 16:36:59 +00:00
parent 231e096fac
commit 0521f868bd
5 changed files with 50 additions and 5 deletions

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}

View File

@@ -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"));
}
/// <summary>
@@ -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));
}
/// <summary>
@@ -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"));
}
/// <summary>
@@ -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"));
}
/// <summary>