/// <summary> /// If the value is an operand, returns it, otherwise creates the right kind of operand /// </summary> /// <param name="value"></param> /// <returns></returns> public static IOperand EnsureOperand(IConvertible value) { if (value is IOperand) { return((IOperand)value); } else if (value is string) { //TODO: parse quotes and return a string liteeral if need be return(Equations.CreateVariable((string)value)); } else { return(Equations.CreateLiteral(value)); } }
public void Variable_() { IVariable variable = Equations.CreateVariable("x"); try { var x = variable.Value; Assert.Fail("Can't get value from unbound variable"); } catch { } variable.OnGetValue += new EventHandler <VariableReadEventArgs>(GetVariableValue); xVal = 22; Assert.AreEqual(22, variable.Value, "Variable got correct value"); xVal = 123; //Assert.AreEqual(22, variable.Value, "Variable caches value"); //variable.Clear(); Assert.AreEqual(123, variable.Value, "Variable got correct value after clearing cache"); Assert.AreEqual("x", variable.ToString(), "ToString works"); }
public void Clone_() { //var variable = Equations.CreateVariable<int>("x"); var variable = Equations.CreateVariable("x"); var lit = Equations.CreateLiteral <int>("120"); //var clause = Equations.CreateClause<int>(lit, variable, "-"); var clause = new Difference(lit, variable); var exp = Equations.CreateEquation <int>(clause); exp.SetVariable("x", 5); Assert.AreEqual(115, exp.Value, "Built an equation by hand and it worked"); //clause.Operator = Equations.CreateOperator("*"); //Assert.AreEqual(600, exp.Value, "Built an equation by hand and it worked"); var litClone = lit.Clone(); Assert.AreEqual(120, litClone.Value, "Literal cloned ok"); var clauseClone = clause.Clone(); var cloneVars = clauseClone.Variables.FirstOrDefault(); Assert.IsTrue(cloneVars != null, "Clone has variables"); // 120 - x + 3 clauseClone.AddOperand(3); var newExp = Equations.CreateEquation <int>(clauseClone); newExp.SetVariable("x", 2); Assert.AreEqual(121, newExp.Value, "Cloned & chained worked"); Assert.AreEqual(115, exp.Value, "Original unaffected"); var exp3 = Equations.CreateEquation <double>("10/(2*x+3-y*1.5*(3+5))+22.5"); Assert.AreEqual(10 / (2 * 5 + 3 - 3 * 1.5 * (3 + 5)) + 22.5, exp3.GetValue(5, 3), "long equation"); }