/// <summary> /// Executes the interpreter. /// </summary> public void Execute() { bool quit = false; while (!quit) { _teletypeWithPosition.NewLine(); _teletypeWithPosition.Write(">"); var command = _teletypeWithPosition.Read(); if (command == null) { _runEnvironment.KeyboardBreak = false; continue; } try { var parsedLine = _tokeniser.Tokenise(command); if (parsedLine.LineNumber.HasValue) { _programRepository.SetProgramLine(parsedLine); } else { _runEnvironment.CurrentLine = parsedLine; quit = _executor.ExecuteLine(); } } catch (Exceptions.BreakException endError) { if (endError.ErrorMessage != string.Empty) { WriteErrorToTeletype( _runEnvironment.CurrentLine.LineNumber, endError.ErrorMessage); } } catch (Exceptions.BasicException basicError) { WriteErrorToTeletype( _runEnvironment.DataErrorLine ?? _runEnvironment.CurrentLine?.LineNumber, "?" + basicError.ErrorMessage + " ERROR"); } } }
public void TeletypeWithPositionForwardsWrites() { _mockTeletype = new Mock <ITeletype>(); _mockTeletype.Setup(mt => mt.Width).Returns(80); _sut = new TeletypeWithPosition(_mockTeletype.Object); _sut.Write("HELLO"); _mockTeletype.Verify(mt => mt.Write("HELLO"), Times.Once); Assert.AreEqual(6, _sut.Position()); }
/// <summary> /// Executes the PRINT command. /// </summary> public void Execute() { bool newLine = true; while (true) { var token = _runEnvironment.CurrentLine.NextToken(); if ((token.Seperator == TokenType.Colon) || (token.Statement == TokenType.Else) || (token.Seperator == TokenType.EndOfLine)) { if (newLine) { _teletype.NewLine(); } _runEnvironment.CurrentLine.PushToken(token); return; } if ((token.Statement == TokenType.Tab) || (token.Statement == TokenType.Space)) { short value = _expressionEvaluator.GetExpression().ValueAsShort(); if (_runEnvironment.CurrentLine.NextToken().Seperator != TokenType.CloseBracket) { throw new Exceptions.SyntaxErrorException(); } if (token.Statement == TokenType.Tab) { _teletype.Tab(value); } else { _teletype.Space(value); } } else if ((token.Seperator == TokenType.Semicolon) || (token.Seperator == TokenType.Comma)) { newLine = false; if (token.Seperator == TokenType.Comma) { _teletype.NextComma(); } } else { newLine = true; _runEnvironment.CurrentLine.PushToken(token); _teletype.Write(_expressionEvaluator.GetExpression().ToString()); } } }
public void TeletypeWithPositionForwardsReads() { _mockTeletype = new Mock <ITeletype>(); _mockTeletype.Setup(mt => mt.Width).Returns(80); _sut = new TeletypeWithPosition(_mockTeletype.Object); _mockTeletype.Setup(mt => mt.Read()).Returns("RUN"); _sut.Write(">"); Assert.AreNotEqual(1, _sut.Position()); var result = _sut.Read(); Assert.AreEqual("RUN", result); Assert.AreEqual(1, _sut.Position()); }
public void TeletypeWithPositionCommasInCorrectPlace( int beforeSpaceCount, string output, int expectedBefore, int expectedAfter) { _mockTeletype = new Mock <ITeletype>(); _mockTeletype.Setup(mt => mt.Width).Returns(80); _sut = new TeletypeWithPosition(_mockTeletype.Object); _sut.Space((short)beforeSpaceCount); var actualBefore = _sut.Position(); _sut.Write(output); _sut.NextComma(); var actualAfter = _sut.Position(); Assert.AreEqual(expectedBefore, actualBefore); Assert.AreEqual(expectedAfter, actualAfter); }