public void forLoop2() { EOrientation orientation = EOrientation.East; Robot robot = Robot.Create (orientation, new Map(EDifficulty.Easy)); MainCode mainCode = new MainCode (); // Create (int i = 1; i < 5; i*i) //Create i ConcreteVariable iVar = new ConcreteVariable (new Variable (1, EVariableType.Int)); DefineVariable iDefine = new DefineVariable (iVar); CmdDefineVariable iDefineCommand = new CmdDefineVariable ("i", iDefine); //create a variable thats always 2 Variable staticTwoVar = new Variable (2, EVariableType.Int); VariableSolver staticTwoVarS = new ConcreteVariable (staticTwoVar); // Create i*i ConcreteVariable iGather = new ConcreteVariable ("i"); // Gathers i, this creates a reference to iVar VariableSolver ixiSolver = new VariableCombo (iGather, staticTwoVarS, EMathOperator.Multiply); DefineVariable ixiDefine = new DefineVariable (ixiSolver); CmdDefineVariable ixiSolverCommand = new CmdDefineVariable ("i", ixiDefine); //create a variable thats always 5 Variable max = new Variable (5, EVariableType.Int); VariableSolver maxS = new ConcreteVariable (max); //Create i < 4 ValueSolver solver = new ValueSolver (iGather, maxS, EComparisonOperator.ValueLessThan); ForLoop forLoop = new ForLoop (solver, iDefineCommand, ixiSolverCommand); //forLoop.variables["i"] = new Variable(1, EVariableType.Int); mainCode.addChild (forLoop); forLoop.addChild (new TurnRight ()); mainCode.execute (); EOrientation actual = robot.orientationEnum; EOrientation expected = EOrientation.North; Assert.AreEqual (expected, actual); }
public void forLoop1() { EOrientation orientation = EOrientation.East; Robot robot = Robot.Create (orientation, new Map(EDifficulty.Easy)); MainCode mainCode = new MainCode (); // Create (int i = 0; i < 5; i++) //Create i ConcreteVariable iVar = new ConcreteVariable (new Variable (0, EVariableType.Int)); DefineVariable iDefine = new DefineVariable (iVar); CmdDefineVariable iDefineCommand = new CmdDefineVariable ("i", iDefine); //create a variable thats always 5 Variable max = new Variable (5, EVariableType.Int); VariableSolver maxS = new ConcreteVariable (max); //Create i < 5 ValueSolver solver = new ValueSolver (iVar, maxS, EComparisonOperator.ValueLessThan); // Create i++ ConcreteVariable staticOneVar = new ConcreteVariable (new Variable (1, EVariableType.Int)); ConcreteVariable iGather = new ConcreteVariable ("i"); // Gathers i, this creates a reference to iVar VariableSolver iPlusOneSolver = new VariableCombo (iGather, staticOneVar, EMathOperator.Add); DefineVariable iPlusOneDefine = new DefineVariable (iPlusOneSolver); CmdDefineVariable iPlusOneSolverCommand = new CmdDefineVariable ("i", iPlusOneDefine); Composite forLoop = new ForLoop (solver, iDefineCommand, iPlusOneSolverCommand); mainCode.addChild (forLoop); forLoop.addChild (new TurnRight ()); mainCode.execute (); EOrientation actual = robot.orientationEnum; EOrientation expected = EOrientation.South; Assert.AreEqual (expected, actual); }
/// Author: Max Hamulyak /// Date: 30-06-2015 /// <summary> /// Builds the solver needed for an define variable statement, using a list of conditions. /// based on a set of rules it can be checked how the list should be parsed, recursivly. /// </summary> /// <returns>The define variable.</returns> /// <param name="conditions">Conditions.</param> /// <param name="priorityOperator">Priority operator.</param> protected virtual VariableSolver BuildDefineVariable(List<IAssignment> conditions, EMathOperator priorityOperator) { int index = 0; bool stopLoop = false; while (index < conditions.Count && !stopLoop) { if (conditions.Count > 3) { int loopIndex = 0; while (loopIndex < conditions.Count) { IAssignment assignment = conditions.ElementAt (loopIndex); if (assignment is MathOperator) { if ((assignment as MathOperator).MathOperator2 == priorityOperator) { int itemIndex = conditions.IndexOf (assignment); IAssignment left = conditions.ElementAt (itemIndex - 1); IAssignment right = conditions.ElementAt (itemIndex + 1); conditions.Remove (left); conditions.Remove (right); conditions.Remove (assignment); if ((left is VariableSolver) && (right is VariableSolver)) { VariableCombo combo = new VariableCombo ((left as VariableSolver), (right as VariableSolver), priorityOperator); conditions.Insert (itemIndex - 1, combo); } else { throw InvalidAssignment (left.LineNumber); } } } loopIndex++; } BuildDefineVariable (conditions, priorityOperator + 1); } else { stopLoop = true; } } IAssignment returnAssignment = null; if (conditions.Count == 1) { //Should be concrete returnAssignment = conditions.ElementAt(0); } else if (conditions.Count == 2) { throw InvalidAssignmentTwoAssignmentValues (conditions); } else if (conditions.Count == 3) { if (conditions.ElementAt (1) is MathOperator) { if (conditions.ElementAt (0) is VariableSolver && conditions.ElementAt (2) is VariableSolver) { returnAssignment = new VariableCombo ((conditions.ElementAt (0) as VariableSolver), (conditions.ElementAt (2) as VariableSolver), (conditions.ElementAt (1) as MathOperator).MathOperator2); } else { throw InvalidAssignment (conditions.ElementAt (1).LineNumber); } } else { throw InvalidAssignmentMathOperator(conditions.ElementAt(1).LineNumber); } } else { throw InvalidAssignment (conditions.ElementAt (0).LineNumber); } return returnAssignment as VariableSolver; }
public void variableStringSubstract() { MainCode mainCode = new MainCode (); // create i = 10 ConcreteVariable iVar = new ConcreteVariable (new Variable ("10", EVariableType.String)); DefineVariable iDefine = new DefineVariable (iVar); CmdDefineVariable iDefineCommand = new CmdDefineVariable ("i", iDefine); // create x = 5; ConcreteVariable xVar = new ConcreteVariable (new Variable (5, EVariableType.Int)); DefineVariable xDefine = new DefineVariable (xVar); CmdDefineVariable xDefineCommand = new CmdDefineVariable ("x", xDefine); // Gather the variables ConcreteVariable iGather = new ConcreteVariable ("i"); ConcreteVariable xGather = new ConcreteVariable ("x"); // calculate and put the values in ii VariableSolver calculation = new VariableCombo (iGather, xGather, EMathOperator.Subtract); DefineVariable calcCommand = new DefineVariable (calculation); CmdDefineVariable executeCalculation = new CmdDefineVariable ("ii", calcCommand); mainCode.addChild (xDefineCommand); mainCode.addChild (iDefineCommand); mainCode.addChild (executeCalculation); mainCode.execute (); //ConcreteVariable iiGather = new ConcreteVariable ("ii"); }
public void variableStringAdd() { MainCode mainCode = new MainCode (); // create i = 10 ConcreteVariable iVar = new ConcreteVariable (new Variable ("10", EVariableType.String)); DefineVariable iDefine = new DefineVariable (iVar); CmdDefineVariable iDefineCommand = new CmdDefineVariable ("i", iDefine); // create x = 5; ConcreteVariable xVar = new ConcreteVariable (new Variable (5, EVariableType.Int)); DefineVariable xDefine = new DefineVariable (xVar); CmdDefineVariable xDefineCommand = new CmdDefineVariable ("x", xDefine); // Gather the variables ConcreteVariable iGather = new ConcreteVariable ("i"); ConcreteVariable xGather = new ConcreteVariable ("x"); // calculate and put the values in ii VariableSolver calculation = new VariableCombo (iGather, xGather, EMathOperator.Add); DefineVariable calcCommand = new DefineVariable (calculation); CmdDefineVariable executeCalculation = new CmdDefineVariable ("ii", calcCommand); mainCode.addChild (xDefineCommand); mainCode.addChild (iDefineCommand); mainCode.addChild (executeCalculation); mainCode.execute (); //ConcreteVariable iiGather = new ConcreteVariable ("ii"); string expected = "105"; string actual = mainCode.variables["ii"].Value; Assert.AreEqual (expected, actual); }