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:	29-06-2015
 /// <summary>
 /// Defines the variable from token, it also checks if a variable is not a keyword in the given language.
 /// </summary>
 /// <returns>The variable from token.</returns>
 /// <param name="instructionLine">Instruction line.</param>
 /// <param name="currentLine">Current line.</param>
 protected virtual CmdDefineVariable DefineVariableFromToken(List<Token> instructionLine, int currentLine)
 {
     List<Token> tokensAtCurrentLine = instructionLine.Where (x => x.Position.Line == currentLine).ToList ();
     instructionLine.RemoveAll (x => x.Position.Line == currentLine);
     string variableName = tokensAtCurrentLine.First ().Value;
     if (languageKeywords.Contains (variableName)) {
         throw KeyWordAsVariable (currentLine, variableName, EGameLanguage.Python);
     } else {
         VariableSolver solver = ParseVariableDefinition (tokensAtCurrentLine, currentLine);
         DefineVariable myVar = new DefineVariable (solver);
         CmdDefineVariable myVariable = new CmdDefineVariable (tokensAtCurrentLine.First().Value,myVar);
         return myVariable;
     }
 }
        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);
        }
        protected override CmdDefineVariable DefineVariableFromToken(List<Token> instructionLine, int currentLine)
        {
            List<Token> tokensAtCurrentLine = instructionLine.Where (x => x.Position.Line == currentLine).ToList ();
            instructionLine.RemoveAll (x => x.Position.Line == currentLine);
            if (tokensAtCurrentLine.Count == 2 && tokensAtCurrentLine [0].Type == ETokenType.VARIABLE && tokensAtCurrentLine [1].Type == ETokenType.EOL) {
                Token t = tokensAtCurrentLine.First ();
                List<String> result = new List<string> ();
                GroupCollection groups = varDeclarationRegex.Match (t.Value).Groups;
                if (groups.Count == 3) {
                    foreach (var item in varDeclarationRegex.GetGroupNames()) {
                        result.Add (string.Format ("Group: {0}, Value: {1}", item, groups [item].Value));
                    }

                    string variableName = groups ["variableName"].Value;
                    string variableType = groups ["variableType"].Value;

                    if (languageKeywords.Contains (variableName)) {
                        throw KeyWordAsVariable (currentLine, variableName, EGameLanguage.Python);
                    }
                    if (!definedVariables.ContainsKey (variableName)) {
                        definedVariables.Add (variableName, variableType);
                    } else {
                        throw VariableNameHasAlreadyBeenDeclared (currentLine, variableName);
                    }
                    List<IAssignment> assignments = new List<IAssignment> ();
                    assignments.Add (new ConcreteVariable (new Variable (0, EVariableType.Int)));
                    VariableSolver solver = BuildDefineVariable (assignments, EMathOperator.None);
                    DefineVariable myVar = new DefineVariable (solver);
                    CmdDefineVariable myVariable = new CmdDefineVariable (variableName, myVar);
                    return myVariable;
                } else {
                    return base.DefineVariableFromToken (tokensAtCurrentLine, currentLine);
                }
            } else {
                return base.DefineVariableFromToken (tokensAtCurrentLine, currentLine);
            }
        }
 /// Author: Bert van Montfort
 /// <summary>
 /// Creates a new CmdDefineVariable
 /// </summary>
 /// <param name="variableName">Variable name.</param>
 /// <param name="varValue">Variable value.</param>
 public CmdDefineVariable(string variableName, DefineVariable varValue)
 {
     this.variableName = variableName;
     this.varValue = varValue;
 }