diff --git a/src/Spring/Spring.Core/Expressions/OpAND.cs b/src/Spring/Spring.Core/Expressions/OpAND.cs index 2062a8e5..dcd5f42c 100644 --- a/src/Spring/Spring.Core/Expressions/OpAND.cs +++ b/src/Spring/Spring.Core/Expressions/OpAND.cs @@ -1,85 +1,93 @@ -#region License - -/* - * Copyright © 2002-2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#endregion - -using System; +#region License + +/* + * Copyright © 2002-2005 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#endregion + +using System; using System.Runtime.Serialization; -using Spring.Util; - -namespace Spring.Expressions -{ +using Spring.Util; + +namespace Spring.Expressions +{ /// /// Represents AND operator (both, bitwise and logical). - /// - /// Aleksandar Seovic - [Serializable] - public class OpAND : BinaryOperator - { - /// - /// Create a new instance - /// - public OpAND() - { - } - - /// - /// Create a new instance - /// - public OpAND(BaseNode left, BaseNode right) - :base(left, right) - { - } - - /// - /// Create a new instance from SerializationInfo - /// - protected OpAND(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } - - /// - /// Returns a value for the logical AND operator node. - /// - /// Context to evaluate expressions against. - /// Current expression evaluation context. + /// + /// Aleksandar Seovic + [Serializable] + public class OpAND : BinaryOperator + { + /// + /// Create a new instance + /// + public OpAND() + { + } + + /// + /// Create a new instance + /// + public OpAND(BaseNode left, BaseNode right) + :base(left, right) + { + } + + /// + /// Create a new instance from SerializationInfo + /// + protected OpAND(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + + /// + /// Returns a value for the logical AND operator node. + /// + /// Context to evaluate expressions against. + /// Current expression evaluation context. /// Node's value. - protected override object Get(object context, EvaluationContext evalContext) - { - object l = GetLeftValue(context, evalContext); - object r = GetRightValue(context, evalContext); - - if (NumberUtils.IsInteger(l) && NumberUtils.IsInteger(r)) + protected override object Get(object context, EvaluationContext evalContext) + { + object l = GetLeftValue(context, evalContext); + + if (NumberUtils.IsInteger(l)) { - return NumberUtils.BitwiseAnd(l, r); + object r = GetRightValue(context, evalContext); + if (NumberUtils.IsInteger(r)) + { + return NumberUtils.BitwiseAnd(l, r); + } } - else if (l is Enum && l.GetType() == r.GetType()) + else if (l is Enum) { - 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); + object r = GetRightValue(context, evalContext); + if (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); - } - } + + return Convert.ToBoolean(l) && + Convert.ToBoolean(GetRightValue(context, evalContext)); + } + } } \ No newline at end of file diff --git a/test/Spring/Spring.Core.Tests/Expressions/ExpressionEvaluatorTests.cs b/test/Spring/Spring.Core.Tests/Expressions/ExpressionEvaluatorTests.cs index 811eadba..73e7b23b 100644 --- a/test/Spring/Spring.Core.Tests/Expressions/ExpressionEvaluatorTests.cs +++ b/test/Spring/Spring.Core.Tests/Expressions/ExpressionEvaluatorTests.cs @@ -272,6 +272,13 @@ namespace Spring.Expressions #endregion Serialization Tests + [Test(Description = "SPRNET-1381")] + public void TestShortcircuitAndOperator() + { + object boolean = ExpressionEvaluator.GetValue(new Inventor(), "Name != null and Name.Length == 0"); + Assert.AreEqual(false, boolean); + } + [Test] public void TestBitwiseXOR() {