Example #1
0
        public async Task Run_Should_Output_Code_Results_When_Valid()
        {
            // arrange
            var input  = "test code";
            var output = "test output";
            var result = new CodeResult
            {
                Output    = output,
                State     = OutputState.Valid,
                Variables = Enumerable.Range(1, 2).Select(i => $"test-var-{i}").ToList(),
            };

            var console = new Mock <IConsole>();

            var expectedColPosition = 3;

            console
            .Setup(c => c.CursorLeft)
            .Returns(expectedColPosition);

            var expectedRowPosition = 6;

            console
            .Setup(c => c.CursorTop)
            .Returns(expectedRowPosition);

            var keyHandler    = new Mock <IConsoleKeyHandler>();
            var consoleWriter = new Mock <IConsoleWriter>();
            var replEngine    = new Mock <IReplEngine>();
            var loop          = new Mock <ILoop>();
            var consoleState  = new Mock <IConsoleState>();

            keyHandler
            .Setup(c => c.Process(consoleState.Object))
            .Returns(input);

            replEngine
            .Setup(r => r.Execute(input))
            .ReturnsAsync(result);

            loop
            .SetupSequence(l => l.Continue())
            .Returns(true)
            .Returns(false);

            var interactiveLoop = new InteractiveLoop(console.Object,
                                                      keyHandler.Object, consoleWriter.Object, replEngine.Object, loop.Object, consoleState.Object);

            // act
            await interactiveLoop.Run();

            // assert
            consoleState.VerifySet(c => c.ColPosition = expectedColPosition);
            consoleState.VerifySet(c => c.RowPosition = expectedRowPosition);

            consoleWriter.Verify(c => c.WriteOutput(output), Times.Once);
            consoleWriter.Verify(c => c.WriteError(output), Times.Never);

            consoleState.Verify(c => c.CompleteInput(result.Variables));
        }
Example #2
0
        public async Task Run_Should_Output_Error_Message_From_Result_When_Error_State()
        {
            // arrange
            var input  = "test invalid code";
            var output = "error output";
            var result = new CodeResult
            {
                Output    = output,
                State     = OutputState.Error,
                Variables = Enumerable.Range(1, 3).Select(i => $"test-var-{i}").ToList(),
            };

            var console       = new Mock <IConsole>();
            var keyHandler    = new Mock <IConsoleKeyHandler>();
            var consoleWriter = new Mock <IConsoleWriter>();
            var replEngine    = new Mock <IReplEngine>();
            var loop          = new Mock <ILoop>();
            var consoleState  = new Mock <IConsoleState>();

            keyHandler
            .Setup(c => c.Process(consoleState.Object))
            .Returns(input);

            replEngine
            .Setup(r => r.Execute(input))
            .ReturnsAsync(result);

            loop
            .SetupSequence(l => l.Continue())
            .Returns(true)
            .Returns(false);

            consoleState
            .Setup(c => c.Text)
            .Returns(new StringBuilder());

            var interactiveLoop = new InteractiveLoop(console.Object,
                                                      keyHandler.Object, consoleWriter.Object, replEngine.Object, loop.Object, consoleState.Object);

            // act
            await interactiveLoop.Run();

            // assert
            consoleState.VerifySet(c => c.TextRowPosition = 1, Times.Never, "should not increment");

            consoleWriter.Verify(c => c.WriteOutput(output), Times.Never);
            consoleWriter.Verify(c => c.WriteError(output), Times.Once);

            consoleState.Verify(c => c.CompleteInput(result.Variables));
        }
Example #3
0
        public async Task Run_Should_Output_Error_When_Throws_Exception()
        {
            // arrange
            var input       = "test code";
            var errorOutput = "test error output";

            var console       = new Mock <IConsole>();
            var keyHandler    = new Mock <IConsoleKeyHandler>();
            var consoleWriter = new Mock <IConsoleWriter>();
            var replEngine    = new Mock <IReplEngine>();
            var loop          = new Mock <ILoop>();
            var consoleState  = new Mock <IConsoleState>();

            keyHandler
            .Setup(c => c.Process(consoleState.Object))
            .Returns(input);

            var expectedException = new Exception(errorOutput);

            replEngine
            .Setup(r => r.Execute(input))
            .Throws(expectedException);

            loop
            .SetupSequence(l => l.Continue())
            .Returns(true)
            .Returns(false);

            var interactiveLoop = new InteractiveLoop(console.Object,
                                                      keyHandler.Object, consoleWriter.Object, replEngine.Object, loop.Object, consoleState.Object);

            // act && assert
            await interactiveLoop.Run();

            // assert
            consoleWriter.Verify(c => c.WriteOutput(errorOutput), Times.Never);
            consoleWriter.Verify(c => c.WriteError(expectedException), Times.Once);
        }
Example #4
0
        public async Task Run_Should_Output_Code_Results_When_Multiline_Continue()
        {
            // arrange
            var console       = new Mock <IConsole>();
            var consoleReader = new Mock <IConsoleKeyHandler>();
            var consoleWriter = new Mock <IConsoleWriter>();
            var replEngine    = new Mock <IReplEngine>();
            var loop          = new Mock <ILoop>();
            var consoleState  = new Mock <IConsoleState>();

            consoleReader
            .SetupSequence(c => c.Process(consoleState.Object))
            .Returns("var ")
            .Returns("testVariable = \"test value\";");

            var firstResult = new CodeResult
            {
                State     = OutputState.Continue,
                Output    = "no output after 1st input",
                Variables = Enumerable.Range(1, 1).Select(i => $"test-var-{i}").ToList(),
            };

            var secondResult = new CodeResult
            {
                State     = OutputState.Valid,
                Output    = "final output after 2nd input",
                Variables = Enumerable.Range(1, firstResult.Variables.Count + 1).Select(i => $"test-var-{i}").ToList(),
            };

            replEngine
            .SetupSequence(r => r.Execute(It.IsAny <string>()))
            .Returns(Task.FromResult(firstResult))
            .Returns(Task.FromResult(secondResult));

            loop
            .SetupSequence(l => l.Continue())
            .Returns(true)
            .Returns(true)
            .Returns(false);

            consoleState
            .SetupSequence(c => c.Prompt)
            .Returns(Prompt.Standard)
            .Returns(Prompt.Continue);

            var interactiveLoop = new InteractiveLoop(console.Object,
                                                      consoleReader.Object, consoleWriter.Object, replEngine.Object, loop.Object, consoleState.Object);

            // act
            await interactiveLoop.Run();

            // assert
            console.Verify(c => c.Write($"{Prompt.Standard} "), Times.Once);
            consoleWriter.Verify(c => c.WriteOutput(firstResult.Output), Times.Never);

            console.Verify(c => c.Write($"{Prompt.Continue} "), Times.Once);
            consoleWriter.Verify(c => c.WriteOutput(secondResult.Output), Times.Once);

            consoleState.VerifySet(c => c.TextRowPosition = 1, Times.Once, "should increment");

            consoleState.Verify(c => c.CompleteInput(secondResult.Variables), Times.Once);
        }