diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractEditorTest.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractEditorTest.cs index 37939b00e0e8e..f7b38f880363f 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractEditorTest.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractEditorTest.cs @@ -9,7 +9,6 @@ using Microsoft.CodeAnalysis.Shared.TestHooks; using Microsoft.VisualStudio.IntegrationTest.Utilities; using Microsoft.VisualStudio.IntegrationTest.Utilities.Common; -using Microsoft.VisualStudio.IntegrationTest.Utilities.InProcess; using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; using Microsoft.VisualStudio.IntegrationTest.Utilities.OutOfProcess; using Roslyn.Test.Utilities; @@ -138,15 +137,6 @@ protected int GetErrorListErrorCount() protected void SendKeys(params object[] keys) => Editor.SendKeys(keys); - protected KeyPress KeyPress(VirtualKey virtualKey, ShiftState shiftState) - => new KeyPress(virtualKey, shiftState); - - protected KeyPress Ctrl(VirtualKey virtualKey) - => new KeyPress(virtualKey, ShiftState.Ctrl); - - protected KeyPress Shift(VirtualKey virtualKey) - => new KeyPress(virtualKey, ShiftState.Shift); - protected void DisableSuggestionMode() => VisualStudioWorkspaceOutOfProc.SetUseSuggestionMode(false); @@ -175,9 +165,6 @@ protected void InvokeCodeActionList() WaitForAsyncOperations(FeatureAttribute.LightBulb); } - protected void ExecuteCommand(string commandName, string argument = "") - => VisualStudio.Instance.ExecuteCommand(commandName, argument); - private void VerifyCurrentLineTextAndAssertCaretPosition(string expectedText, bool trimWhitespace) { var caretStartIndex = expectedText.IndexOf("$$"); diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractIntegrationTest.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractIntegrationTest.cs index 63506b0669c17..c4796efab4c86 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractIntegrationTest.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractIntegrationTest.cs @@ -3,6 +3,7 @@ using System; using System.Threading; using Microsoft.VisualStudio.IntegrationTest.Utilities; +using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; namespace Roslyn.VisualStudio.IntegrationTests { @@ -24,5 +25,20 @@ protected void Wait(double seconds) var timeout = TimeSpan.FromMilliseconds(seconds * 1000); Thread.Sleep(timeout); } + + protected KeyPress KeyPress(VirtualKey virtualKey, ShiftState shiftState) + => new KeyPress(virtualKey, shiftState); + + protected KeyPress Ctrl(VirtualKey virtualKey) + => new KeyPress(virtualKey, ShiftState.Ctrl); + + protected KeyPress Shift(VirtualKey virtualKey) + => new KeyPress(virtualKey, ShiftState.Shift); + + protected KeyPress Alt(VirtualKey virtualKey) + => new KeyPress(virtualKey, ShiftState.Alt); + + protected void ExecuteCommand(string commandName, string argument = "") + => VisualStudio.Instance.ExecuteCommand(commandName, argument); } } diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractInteractiveWindowTest.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractInteractiveWindowTest.cs index 434947ef322f7..49869b6a28e61 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractInteractiveWindowTest.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractInteractiveWindowTest.cs @@ -25,6 +25,7 @@ protected AbstractInteractiveWindowTest(VisualStudioInstanceFactory instanceFact protected void ClearInteractiveWindow() { InteractiveWindow.Initialize(); + InteractiveWindow.ClearScreen(); InteractiveWindow.ShowWindow(); InteractiveWindow.Reset(); } @@ -44,12 +45,32 @@ protected void Reset(bool waitForPrompt = true) protected void SubmitText(string text, bool waitForPrompt = true) => InteractiveWindow.SubmitText(text, waitForPrompt); + protected void SendKeys(params object[] input) + { + VisualStudio.Instance.SendKeys.Send(input); + } + + protected void InsertCode(string text) + => InteractiveWindow.InsertCode(text); + protected void VerifyLastReplOutput(string expectedReplOutput) { var lastReplOutput = InteractiveWindow.GetLastReplOutput(); Assert.Equal(expectedReplOutput, lastReplOutput); } + protected void VerifyLastReplInput(string expectedReplInput) + { + var lastReplInput = InteractiveWindow.GetLastReplInput(); + Assert.Equal(expectedReplInput, lastReplInput); + } + + protected void VerifyCaretPosition(int expectedCaretPosition) + { + var position = InteractiveWindow.GetCaretPosition(); + Assert.Equal(expectedCaretPosition, position); + } + protected void VerifyLastReplOutputContains(string expectedReplOutput) { var lastReplOutput = InteractiveWindow.GetLastReplOutput(); diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractiveCommands.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractiveCommands.cs new file mode 100644 index 0000000000000..9edc70f156741 --- /dev/null +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractiveCommands.cs @@ -0,0 +1,135 @@ +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.VisualStudio.IntegrationTest.Utilities; +using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; +using Xunit; + +namespace Roslyn.VisualStudio.IntegrationTests.CSharp +{ + [Collection(nameof(SharedIntegrationHostFixture))] + public class CSharpInteractiveCommands : AbstractInteractiveWindowTest + { + public CSharpInteractiveCommands(VisualStudioInstanceFactory instanceFactory) + : base(instanceFactory) + { + } + + [Fact] + public void VerifyPreviousAndNextHistory() + { + SubmitText("1 + 2"); + SubmitText("1.ToString()"); + SendKeys(Alt(VirtualKey.Up)); + VerifyLastReplInput("1.ToString()"); + SendKeys(VirtualKey.Enter); + WaitForReplOutput("\"1\""); + SendKeys(Alt(VirtualKey.Up)); + VerifyLastReplInput("1.ToString()"); + SendKeys(Alt(VirtualKey.Up)); + VerifyLastReplInput("1 + 2"); + SendKeys(VirtualKey.Enter); + WaitForReplOutput("3"); + SendKeys(Alt(VirtualKey.Down)); + VerifyLastReplInput("1.ToString()"); + SendKeys(VirtualKey.Enter); + WaitForReplOutput("\"1\""); + } + + [Fact] + public void VerifyMaybeExecuteInput() + { + InsertCode("2 + 3"); + SendKeys(VirtualKey.Enter); + WaitForReplOutput("5"); + } + + [Fact] + public void VerifyNewLineAndIndent() + { + InsertCode("3 + "); + SendKeys(VirtualKey.Enter); + InsertCode("4"); + SendKeys(VirtualKey.Enter); + WaitForReplOutput("7"); + } + + [Fact] + public void VerifyExecuteInput() + { + SubmitText("1 + "); + VerifyLastReplOutputContains("CS1733"); + } + + [Fact] + public void VerifyForceNewLineAndIndent() + { + InsertCode("1 + 2"); + SendKeys(VirtualKey.Enter); + SubmitText("+ 3"); + VerifyReplPromptConsistency("", "6"); + } + + [Fact] + public void VerifyCancelInput() + { + InsertCode("1 + 4"); + SendKeys(Shift(VirtualKey.Enter)); + SendKeys(VirtualKey.Escape); + VerifyLastReplInput(string.Empty); + } + + [Fact] + public void VerifyUndoAndRedo() + { + ClearReplText(); + InsertCode(" 2 + 4 "); + SendKeys(Ctrl(VirtualKey.Z)); + VerifyReplPromptConsistency("< ![CDATA[]] >", string.Empty); + SendKeys(Ctrl(VirtualKey.Y)); + VerifyLastReplInput(" 2 + 4 "); + SendKeys(VirtualKey.Enter); + WaitForReplOutput("6"); + } + + [Fact] + public void CutDeletePasteSelectAll() + { + SendKeys("Text"); + ExecuteCommand("Edit.LineStart"); + ExecuteCommand("Edit.LineEnd"); + ExecuteCommand("Edit.LineStartExtend"); + ExecuteCommand("Edit.SelectionCancel"); + ExecuteCommand("Edit.LineEndExtend"); + ExecuteCommand("Edit.SelectAll"); + ExecuteCommand("Edit.SelectAll"); + ExecuteCommand("Edit.Copy"); + ExecuteCommand("Edit.Cut"); + ExecuteCommand("Edit.Paste"); + ExecuteCommand("Edit.Delete"); + ExecuteCommand("Edit.LineUp"); + ExecuteCommand("Edit.LineDown"); + ExecuteCommand("Edit.Paste"); + ExecuteCommand("Edit.Paste"); + SendKeys(VirtualKey.Escape); + } + + // + //