public void TestFanucInterpreter_RelationalOperators_HandleNullCorrectly()
        {
            var testProgram = LoadProgram(@"%
O9874(TestProg)
#1=#0
#2=1.
#3=2.
#4=0

(All these should evaluate to true)
IF[#1EQ#0]THEN[#4=[#4+1]]
IF[#2EQ1]THEN[#4=[#4+1]]
IF[#0NE#2]THEN[#4=[#4+1]]
IF[#2NE3.2]THEN[#4=[#4+1]]
IF[#3GT#2]THEN[#4=[#4+1]]
IF[#3GE#2]THEN[#4=[#4+1]]
IF[#1GE#0]THEN[#4=[#4+1]]
IF[#2LT#3]THEN[#4=[#4+1]]
IF[#2LE#3]THEN[#4=[#4+1]]
IF[#1LE#0]THEN[#4=[#4+1]]

(These should evaluate to false)
IF[#1GT#0]THEN[#4=[#4+1]]
IF[#0LT#2]THEN[#4=[#4+1]]
%");

            IMachineToolRuntime runtime     = new FanucMachineToolRuntime();
            IGCodeInterpreter   interpreter = new FanucGCodeInterpreter(runtime);

            interpreter.RunProgram(testProgram);

            Assert.That(interpreter[4], Is.EqualTo(10));
        }
        public void TestFanucInterpreter_BasicVariableAssignmentWorks()
        {
            var testProgram = LoadProgram(@"%
O9874(TestProg)
#1=#0
#2=4.9
#3=12
#4=#2
#5=#3
#6=-23.2
#7=+25.7
#8=+3.
#9=-2
%");

            IMachineToolRuntime runtime     = new FanucMachineToolRuntime();
            IGCodeInterpreter   interpreter = new FanucGCodeInterpreter(runtime);

            interpreter.RunProgram(testProgram);

            Assert.That(interpreter[1], Is.Null);
            Assert.That(interpreter[2], Is.EqualTo(4.9));
            Assert.That(interpreter[3], Is.EqualTo(12));
            Assert.That(interpreter[4], Is.EqualTo(4.9));
            Assert.That(interpreter[5], Is.EqualTo(12));
            Assert.That(interpreter[6], Is.EqualTo(-23.2));
            Assert.That(interpreter[7], Is.EqualTo(25.7));
            Assert.That(interpreter[8], Is.EqualTo(3));
            Assert.That(interpreter[9], Is.EqualTo(-2));
        }
        public void TestFanucInterpreter_ArithmeticOperatorPrecedence()
        {
            var testProgram = LoadProgram(@"%
O9874(TestProg)
#1=1+2*3-4/4 (This should evaluate to 6)
#2=1+[2*3]-[4/4]
%");

            IMachineToolRuntime runtime     = new FanucMachineToolRuntime();
            IGCodeInterpreter   interpreter = new FanucGCodeInterpreter(runtime);

            interpreter.RunProgram(testProgram);

            Assert.That(interpreter[1], Is.EqualTo(6));
            Assert.That(interpreter[2], Is.EqualTo(6));
        }
        public void TestFanucInterpreter_NegationExpression()
        {
            var testProgram = LoadProgram(@"%
O9874(TestProg)
#1=4
#2=-[#1-2]
#3=+[3*#1]
%");

            IMachineToolRuntime runtime     = new FanucMachineToolRuntime();
            IGCodeInterpreter   interpreter = new FanucGCodeInterpreter(runtime);

            interpreter.RunProgram(testProgram);

            Assert.That(interpreter[2], Is.EqualTo(-2));
            Assert.That(interpreter[3], Is.EqualTo(12));
        }
        public void TestFanucInterpreter_EmptyBlocks()
        {
            var testProgram = LoadProgram(@"%
O9874(TestProg)
N10

(Just a comment)
N20 (This is label 20)
N30
N40 (This is label 40)
%");

            IMachineToolRuntime runtime     = new FanucMachineToolRuntime();
            IGCodeInterpreter   interpreter = new FanucGCodeInterpreter(runtime);

            Assert.DoesNotThrow(() => interpreter.RunProgram(testProgram));
        }
        public void TestFanucInterpreter_AssignmentOperator_HandlesNullCorrectly()
        {
            var testProgram = LoadProgram(@"%
O9874(TestProg)
#1=#0
#2=#1
#3=[#0-2]+4
#4=#1*4
%");

            IMachineToolRuntime runtime     = new FanucMachineToolRuntime();
            IGCodeInterpreter   interpreter = new FanucGCodeInterpreter(runtime);

            interpreter.RunProgram(testProgram);

            Assert.That(interpreter[2], Is.Null);
            Assert.That(interpreter[3], Is.EqualTo(0));
            Assert.That(interpreter[4], Is.EqualTo(0));
        }
        public void TestFanucInterpreter_UsingInvalidVars_ResultsInError()
        {
            IMachineToolRuntime runtime     = new FanucMachineToolRuntime();
            IGCodeInterpreter   interpreter = new FanucGCodeInterpreter(runtime);

            var assignmentToNullTestProgram   = LoadProgram(@"%
O9874(TestProg)
#0=42.899
%");
            var invalidAssignmentTestProgram  = LoadProgram(@"%
O9874(TestProg)
#237=-99.876
%");
            var invalidAccessTestProgram1     = LoadProgram(@"%
O9874(TestProg)
#2=#460
%");
            var invalidAccessTestProgram2     = LoadProgram(@"%
O9874(TestProg)
#2=#470-5
%");
            var invalidIndirectionTestProgram = LoadProgram(@"%
O9874(TestProg)
#1=-5
#[#1]=56.4
%");
            var ex1 = Assert.Throws <GCodeException>(() => interpreter.RunProgram(assignmentToNullTestProgram));

            Assert.That(ex1.Line, Is.EqualTo(3));
            var ex2 = Assert.Throws <GCodeException>(() => interpreter.RunProgram(invalidAssignmentTestProgram));

            Assert.That(ex2.Line, Is.EqualTo(3));
            var ex3 = Assert.Throws <GCodeException>(() => interpreter.RunProgram(invalidAccessTestProgram1));

            Assert.That(ex3.Line, Is.EqualTo(3));
            var ex4 = Assert.Throws <GCodeException>(() => interpreter.RunProgram(invalidAccessTestProgram2));

            Assert.That(ex4.Line, Is.EqualTo(3));
            var ex5 = Assert.Throws <GCodeException>(() => interpreter.RunProgram(invalidIndirectionTestProgram));

            Assert.That(ex5.Line, Is.EqualTo(4));
        }
        public void TestFanucInterpreter_ArithmeticOperators_HandleNullCorrectly()
        {
            var testProgram = LoadProgram(@"%
O9874(TestProg)
#1=#0
#4=0

(All these should evaluate to true)
IF[[1+#0]EQ#0]THEN[#4=[#4+1]]
IF[[#0-7]EQ#0]THEN[#4=[#4+1]]
IF[[2*#1]EQ#0]THEN[#4=[#4+1]]
IF[[#1/6]EQ#0]THEN[#4=[#4+1]]
IF[[#1MOD#0]EQ#0]THEN[#4=[#4+1]]
%");

            IMachineToolRuntime runtime     = new FanucMachineToolRuntime();
            IGCodeInterpreter   interpreter = new FanucGCodeInterpreter(runtime);

            interpreter.RunProgram(testProgram);

            Assert.That(interpreter[4], Is.EqualTo(5));
        }
        public void TestFanucInterpreter_ControlFlow_And_WorkingVariableRange()
        {
            var testProgram = LoadProgram(@"%
O9874(TestProg)
#33=#0
(This line is just a simple test of IF-THEN)
IF[#33EQ#0]THEN[#33=1]

(Fill vars 1-33 with their index numbers)
N10
IF[#33GT33]GOTO20
#[#33]=#33
#33=#33+1
GOTO10
N20
#33=33

(Fill vars 100-199 with their index numbers)
#199=100
N30
IF[#199GT199]GOTO40
#[#199]=#199
#199=#199+1
GOTO30
N40
#199=199

(Fill vars 500-999 with their index numbers)
#999=500
N50
IF[#999GT999]GOTO60
#[#999]=#999
#999=#999+1
GOTO50
N60
#999=999
%");

            IMachineToolRuntime runtime     = new FanucMachineToolRuntime();
            IGCodeInterpreter   interpreter = new FanucGCodeInterpreter(runtime);

            interpreter.RunProgram(testProgram);

            uint i = 1;

            do
            {
                Assert.That(interpreter[i], Is.EqualTo(i));
                if (i == 33)
                {
                    i = 100;
                }
                else if (i == 199)
                {
                    i = 500;
                }
                else
                {
                    i++;
                }
            } while (i < 1000);
        }