/// <summary> /// Returns a value for the logical OR operator node. /// </summary> /// <param name="context">Context to evaluate expressions against.</param> /// <param name="evalContext">Current expression evaluation context.</param> /// <returns>Node's value.</returns> protected override object Get(object context, EvaluationContext evalContext) { object l = GetLeftValue(context, evalContext); if (NumberUtils.IsInteger(l)) { object r = GetRightValue(context, evalContext); if (NumberUtils.IsInteger(r)) { return(NumberUtils.BitwiseOr(l, r)); } } else if (l is Enum) { 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.BitwiseOr(l, r); return(Enum.ToObject(enumType, result)); } } return(Convert.ToBoolean(l) || Convert.ToBoolean(GetRightValue(context, evalContext))); }
public void BitwiseOr() { Assert.AreEqual( ((Byte)2) | ((Byte)3), NumberUtils.BitwiseOr((Byte)2, (Byte)3)); Assert.AreEqual(((SByte)2) | ((SByte)3), NumberUtils.BitwiseOr((SByte)2, (SByte)3)); Assert.AreEqual(((Int16)2) | ((Int16)3), NumberUtils.BitwiseOr((Int16)2, (Int16)3)); Assert.AreEqual(((UInt16)2) | ((UInt16)3), NumberUtils.BitwiseOr((UInt16)2, (UInt16)3)); Assert.AreEqual(((Int32)2) | ((Int32)3), NumberUtils.BitwiseOr((Int32)2, (Int32)3)); Assert.AreEqual(((UInt32)2) | ((UInt32)3), NumberUtils.BitwiseOr((UInt32)2, (UInt32)3)); Assert.AreEqual(((Int64)2) | ((Int64)3), NumberUtils.BitwiseOr((Int64)2, (Int64)3)); Assert.AreEqual(((UInt64)2) | ((UInt64)3), NumberUtils.BitwiseOr((UInt64)2, (UInt64)3)); Assert.AreEqual(((UInt64)2) | ((Byte)3), NumberUtils.BitwiseOr((UInt64)2, (Byte)3)); Assert.AreEqual(false, NumberUtils.BitwiseOr(false, false)); Assert.AreEqual(true, NumberUtils.BitwiseOr(false, true)); try { NumberUtils.BitwiseAnd((double)2.0, 3); Assert.Fail(); } catch(ArgumentException) {} }