Esempio n. 1
0
        public void TheMultiplyCommandPopsTheTwoValuesAtTheBottomOfTheStackMultipliesThemAndPushesTheResult()
        {
            _stack.PushValue(12);
            _stack.PushValue(34);

            _stack.Multiply();

            _stack.PopValue().Should().Be(408);
            _stack.IsEmpty.Should().BeTrue();
        }
        bool RunScriptCommand(IProgramCounter programCounter, IVariableManager localVariables)
        {
            if (programCounter.Eof)
            {
                throw new Exception($"Unexpected end of script found in '{programCounter.GetScriptName()}'");
            }

            var command = programCounter.GetCommand();

            switch ((ScriptToken)command)
            {
            case ScriptToken.PushIntValue:
                _stack.PushValue(programCounter.GetInteger());
                break;

            case ScriptToken.PushStringValue:
                _stack.PushValue(programCounter.GetNullTerminatedString());
                break;

            case ScriptToken.PushGlobalVariable:     //  4
                PushGlobalVariableOnToTheStack(programCounter);
                break;

            case ScriptToken.PopGlobalVariable:     //  5
                SetGlobalVariableToBottomValueOfStack(programCounter);
                break;

            case ScriptToken.Jfalse:     //  6
                MoveScriptPointerIfStackValueIsZero(programCounter);
                break;

            case ScriptToken.Jtrue:     //  7
                MoveScriptPointerIfStackValueIsNotZero(programCounter);
                break;

            case ScriptToken.Jall:     //  8
                MoveScriptPointerAlways(programCounter);
                break;

            case ScriptToken.Add:     //  9
                _stack.Add();
                break;

            case ScriptToken.Subtract:     //  10
                _stack.Subtract();
                break;

            case ScriptToken.Multiply:     //  11
                _stack.Multiply();
                break;

            case ScriptToken.Divide:     //  12
                _stack.Divide();
                break;

            case ScriptToken.Negate:     //  13
                _stack.Negate();
                break;

            case ScriptToken.LogicalNot:     //  14
                _stack.LogicalNot();
                break;

            case ScriptToken.Lt:     //  15
                _stack.Lt();
                break;

            case ScriptToken.Gt:     //  16
                _stack.Gt();
                break;

            case ScriptToken.Lte:     //  17
                _stack.Lte();
                break;

            case ScriptToken.Gte:     //  18
                _stack.Gte();
                break;

            case ScriptToken.VariableEquals:     //  19
                _stack.VariableEquals();
                break;

            case ScriptToken.LogicalAnd:     //  20
                _stack.LogicalAnd();
                break;

            case ScriptToken.LogicalOr:     //  21
                _stack.LogicalOr();
                break;

            case ScriptToken.CallFnRoutine:     //  22
                ProcessFnRoutine(programCounter, localVariables);
                break;

            case ScriptToken.DropStackValue:     //  23
                return(_stack.PopValue() == 0);

            case ScriptToken.EndScript:     //  24
                return(false);

            case ScriptToken.DropSkipPauseNotZero:     //  25
                return(ProcessDropSkipPauseNotZero(programCounter));

            case ScriptToken.PauseScript:     // 26
                return(false);

            case ScriptToken.PushLocalVariable:     //  27
                PushLocalVariableOnToTheStack(programCounter, localVariables);
                break;

            case ScriptToken.PopLocalVariable:     //  28
                SetLocalVariableToBottomValueOfStack(programCounter, localVariables);
                break;

            default:
                throw new InvalidOperationException($"Invalid Script Command {command}");
            }

            return(true);
        }