public void NavigateTo() { using (var app = new VisualStudioApp()) { app.OpenProject(@"TestData\Navigation.sln"); using (var dialog = app.OpenNavigateTo()) { dialog.SearchTerm = "Class"; Assert.AreEqual(4, dialog.WaitForNumberOfResults(4)); } using (var dialog = app.OpenNavigateTo()) { dialog.SearchTerm = "cls"; Assert.AreEqual(4, dialog.WaitForNumberOfResults(4)); } using (var dialog = app.OpenNavigateTo()) { dialog.SearchTerm = "func"; Assert.AreEqual(8, dialog.WaitForNumberOfResults(8)); } using (var dialog = app.OpenNavigateTo()) { dialog.SearchTerm = "fn"; Assert.AreEqual(8, dialog.WaitForNumberOfResults(8)); } } }
private void TestPublishToWebRole( string languageName, string templateName, string projectName, string expectedProjectItem, string textInResponse, int publishTimeout ) { using (var app = new VisualStudioApp()) { AzureWebSiteTests.CreateProject( app, languageName, templateName, TestData.GetTempPath(), projectName, expectedProjectItem ); app.Dte.ExecuteCommand("Project.ConverttoWindowsAzureCloudServiceProject"); _cloudServiceToDelete = Guid.NewGuid().ToString("N"); var siteUri = app.PublishToAzureCloudService(_cloudServiceToDelete, publishSettingsFilePath); app.WaitForBuildComplete(publishTimeout); app.AzureActivityLog.WaitForPublishComplete(_cloudServiceToDelete, publishTimeout); string text = WebDownloadUtility.GetString(siteUri); Console.WriteLine("Response from {0}", siteUri); Console.WriteLine(text); Assert.IsTrue(text.Contains(textInResponse), text); } }
public void AddCloudProject() { using (var app = new VisualStudioApp()) { var project = app.CreateProject( PythonVisualStudioApp.TemplateLanguageName, PythonVisualStudioApp.DjangoWebProjectTemplate, TestData.GetTempPath(), "AddCloudProject" ); app.SolutionExplorerTreeView.SelectProject(project); try { app.ExecuteCommand("Project.ConverttoMicrosoftAzureCloudServiceProject"); } catch (Exception ex1) { try { app.ExecuteCommand("Project.ConverttoWindowsAzureCloudServiceProject"); } catch (Exception ex2) { Console.WriteLine("Unable to execute Project.ConverttoWindowsAzureCloudServiceProject.\r\n{0}", ex2); try { app.ExecuteCommand("Project.AddWindowsAzureCloudServiceProject"); } catch (Exception ex3) { Console.WriteLine("Unable to execute Project.AddWindowsAzureCloudServiceProject.\r\n{0}", ex3); throw ex1; } } } var res = app.SolutionExplorerTreeView.WaitForItem( "Solution '" + app.Dte.Solution.Projects.Item(1).Name + "' (2 projects)", app.Dte.Solution.Projects.Item(1).Name + ".Azure" ); Assert.IsNotNull(res); } }
private void TestPublishToWebSite( string templateName, string projectName, string moduleName, string textInResponse, string pythonVersion, int publishTimeout, string packageName = null ) { using (var app = new VisualStudioApp()) { var pyProj = app.CreateProject( PythonVisualStudioApp.TemplateLanguageName, templateName, TestData.GetTempPath(), projectName ).GetPythonProject(); var factory = WebProjectTests.CreateVirtualEnvironment(pythonVersion, app, pyProj); WebProjectTests.InstallWebFramework(app, moduleName, packageName ?? moduleName, factory); _webSiteToDelete = Guid.NewGuid().ToString("N"); var siteUri = app.PublishToAzureWebSite(_webSiteToDelete, publishSettingsFilePath); app.WaitForBuildComplete(publishTimeout); string text = WebDownloadUtility.GetString(siteUri); Console.WriteLine("Response from {0}", siteUri); Console.WriteLine(text); Assert.IsTrue(text.Contains(textInResponse), text); } }
public void ObjectBrowserBasicTest() { using (var app = new VisualStudioApp()) { var project = app.OpenProject(@"TestData\Outlining.sln"); System.Threading.Thread.Sleep(1000); app.OpenObjectBrowser(); var objectBrowser = app.ObjectBrowser; System.Threading.Thread.Sleep(1000); int nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(1, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[0].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(4, nodeCount, "Node count: " + nodeCount.ToString()); AssertNodes(objectBrowser, new NodeInfo("Outlining", "Outlining"), new NodeInfo("BadForStatement.py", "BadForStatement.py"), new NodeInfo("NestedFuncDef.py", "NestedFuncDef.py", new[] { "f()" }), new NodeInfo("Program.py", "Program.py", new[] { "f()" })); app.Dte.Solution.Close(false); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(1, nodeCount, "Node count: " + nodeCount.ToString()); } }
public static NewAppDialog FromDte(VisualStudioApp app) { return new NewAppDialog( app, AutomationElement.FromHandle( app.OpenDialogWithDteExecuteCommand("ProjectandSolutionContextMenus.Project.Add.Djangoapp") ) ); }
public void DebugPythonProject() { using (var app = new VisualStudioApp()) { StartHelloWorldAndBreak(app); app.Dte.Debugger.Go(WaitForBreakOrEnd: true); Assert.AreEqual(dbgDebugMode.dbgDesignMode, app.Dte.Debugger.CurrentMode); } }
public VisualStudioInstance(SolutionFile solution) { _solution = solution; _app = new VisualStudioApp(); Project = _app.OpenProject(solution.Filename); ThreadHelper.Generic.Invoke(Keyboard.Reset); _solutionExplorer = _app.OpenSolutionExplorer(); SelectSolutionNode(); }
public void VerifyTemplateDirectories() { var languageName = RConstants.TemplateLanguageName; using (var app = new VisualStudioApp()) { var sln = (Solution2)app.Dte.Solution; var paths = (new[] { RConstants.ProjectTemplate_EmptyProject }) .Select(n => sln.GetProjectTemplate(n, languageName)); var existingPaths = paths.Where(templatePath => File.Exists(templatePath) || Directory.Exists(templatePath)); existingPaths.Should().BeEquivalentTo(paths); } }
public void DebugDjangoProject() { using (var app = new VisualStudioApp()) { DebuggerUITests.DebugProject.OpenProjectAndBreak( app, TestData.GetPath(@"TestData\DjangoDebugProject.sln"), @"TestApp\views.py", 5, false); } }
public override ToolWindowPane ActivateInteractiveWindow(VisualStudioApp app, string executionMode) { string description = null; if (Version.IsCPython) { description = string.Format("{0} {1}", Version.Isx64 ? CPythonInterpreterFactoryConstants.Description64 : CPythonInterpreterFactoryConstants.Description32, Version.Version.ToVersion() ); } else if (Version.IsIronPython) { description = string.Format("{0} {1}", Version.Isx64 ? "IronPython 64-bit" : "IronPython", Version.Version.ToVersion() ); } Assert.IsNotNull(description, "Unknown interpreter"); var automation = (IVsPython)app.Dte.GetObject("VsPython"); var options = (IPythonOptions)automation; var replOptions = options.GetInteractiveOptions(description); Assert.IsNotNull(replOptions, "Could not find options for " + description); replOptions.InlinePrompts = InlinePrompts; replOptions.UseInterpreterPrompts = UseInterpreterPrompts; replOptions.PrimaryPrompt = PrimaryPrompt; replOptions.SecondaryPrompt = SecondaryPrompt; replOptions.EnableAttach = EnableAttach; var oldExecutionMode = replOptions.ExecutionMode; app.OnDispose(() => replOptions.ExecutionMode = oldExecutionMode); replOptions.ExecutionMode = executionMode; var oldAddNewLineAtEndOfFullyTypedWord = options.Intellisense.AddNewLineAtEndOfFullyTypedWord; app.OnDispose(() => options.Intellisense.AddNewLineAtEndOfFullyTypedWord = oldAddNewLineAtEndOfFullyTypedWord); options.Intellisense.AddNewLineAtEndOfFullyTypedWord = AddNewLineAtEndOfFullyTypedWord; bool success = false; for (int retries = 1; retries < 20; ++retries) { try { app.ExecuteCommand("Python.Interactive", "/e:\"" + description + "\""); success = true; break; } catch (AggregateException) { } app.DismissAllDialogs(); app.SetFocus(); Thread.Sleep(retries * 100); } Assert.IsTrue(success, "Unable to open " + description + " through DTE"); var interpreters = app.ComponentModel.GetService<IInterpreterOptionsService>(); var replId = PythonReplEvaluatorProvider.GetReplId( interpreters.FindInterpreter(Version.Id, Version.Version.ToVersion()) ); var provider = app.ComponentModel.GetService<InteractiveWindowProvider>(); return (ToolWindowPane)provider.FindReplWindow(replId); }
public void AddDifferentFileType() { using (var app = new VisualStudioApp()) { var project = app.OpenProject(@"TestData\HelloWorld.sln"); string fullPath = TestData.GetPath(@"TestData\HelloWorld.sln"); // "Python Environments", "References", "Search Paths", "Program.py" Assert.AreEqual(4, project.ProjectItems.Count); var item = project.ProjectItems.AddFromFileCopy(TestData.GetPath(@"TestData\Xaml\EmptyXName.xaml")); Assert.AreEqual("EmptyXName.xaml", item.Properties.Item("FileName").Value); } }
// Currently Fails: https://pytools.codeplex.com/workitem/2609 public void MoveFolderWithItem() { using (var app = new VisualStudioApp()) { // close any projects before switching source control... app.Dte.Solution.Close(); app.SelectSourceControlProvider("Test Source Provider"); ExpectSourceControl(); foreach (var projectType in ProjectTypes) { var testDef = new ProjectDefinition("SourceControl", projectType, PropertyGroup( Property("SccProjectName", "HelloWorld"), Property("SccLocalPath", "LocalPath"), Property("SccAuxPath", "AuxPath"), Property("SccProvider", "TestProvider") ), ItemGroup( Folder("Fob"), Folder("Fob\\Oar"), Compile("Program"), Compile("Fob\\Oar\\Quox") ) ); using (var solution = testDef.Generate()) { TestSccProvider.DocumentEvents.Clear(); var project = app.OpenProject(solution.Filename); var window = app.OpenSolutionExplorer(); var folder = window.WaitForItem("Solution 'SourceControl' (1 project)", "SourceControl", "Fob", "Oar"); var point = folder.GetClickablePoint(); Mouse.MoveTo(point); Mouse.Down(MouseButton.Left); var destFolder = window.WaitForItem("Solution 'SourceControl' (1 project)", "SourceControl"); Mouse.MoveTo(destFolder.GetClickablePoint()); Mouse.Up(MouseButton.Left); window.AssertFileExists(Path.GetDirectoryName(solution.Filename), "Solution 'SourceControl' (1 project)", "SourceControl", "Oar", "Quox" + projectType.CodeExtension); var projectDir = Path.GetDirectoryName(project.FullName); AssertDocumentEvents(projectDir, OnQueryRenameFiles(projectType.Code("Fob\\Oar\\Quox"), projectType.Code("Oar\\Quox"), VSQUERYRENAMEFILEFLAGS_NoFlags), OnQueryRenameFiles("Fob\\Oar\\", "Oar", VSQUERYRENAMEFILEFLAGS_Directory), OnAfterRenameFiles(projectType.Code("Fob\\Oar\\Quox"), projectType.Code("Oar\\Quox"), VSRENAMEFILEFLAGS_NoFlags), OnAfterRenameFiles("Fob\\Oar\\", "Oar", VSRENAMEFILEFLAGS_Directory) ); } } } }
public void LoadNodejsProject() { using (var app = new VisualStudioApp()) { app.OpenProject(@"TestData\HelloWorld.sln"); Assert.IsTrue(app.Dte.Solution.IsOpen, "The solution is not open"); Assert.IsTrue(app.Dte.Solution.Projects.Count == 1, String.Format("Loading project resulted in wrong number of loaded projects, expected 1, received {0}", app.Dte.Solution.Projects.Count)); var iter = app.Dte.Solution.Projects.GetEnumerator(); iter.MoveNext(); Project project = (Project)iter.Current; Assert.AreEqual("HelloWorld.njsproj", Path.GetFileName(project.FileName), "Wrong project file name"); } }
public static void CloseAll(VisualStudioApp app = null) { IComponentModel compModel; if (app != null) { compModel = app.GetService<IComponentModel>(typeof(SComponentModel)); } else { compModel = (IComponentModel)VSTestContext.ServiceProvider.GetService(typeof(SComponentModel)); } var replWindowProvider = compModel.GetService<IReplWindowProvider>(); foreach (var frame in replWindowProvider.GetReplWindows() .OfType<ReplWindow>() .Select(r => r.Frame) .OfType<IVsWindowFrame>()) { frame.Hide(); } }
public void DebugPythonProjectSubFolderStartupFileSysPath() { using (var app = new VisualStudioApp()) { app.OpenProject(TestData.GetPath(@"TestData\SysPath.sln")); ClearOutputWindowDebugPaneText(); app.Dte.ExecuteCommand("Debug.Start"); WaitForMode(app, dbgDebugMode.dbgDesignMode); // sys.path should point to the startup file directory, not the project directory. // this matches the behavior of start without debugging. // Note: backslashes are escaped in the output string testDataPath = TestData.GetPath("TestData\\SysPath\\Sub'").Replace("\\", "\\\\"); WaitForDebugOutput(text => text.Contains(testDataPath)); } }
public void LoadRelativeProjects() { using (var app = new VisualStudioApp()) { string fullPath = TestData.GetPath(@"TestData\ProjectHomeProjects.sln"); app.OpenProject(@"TestData\ProjectHomeProjects.sln", expectedProjects: 9); foreach (var project in app.Dte.Solution.Projects.OfType<Project>()) { var name = Path.GetFileName(project.FileName); if (name.StartsWith("ProjectA")) { // Should have ProgramA.py, Subfolder\ProgramB.py and Subfolder\Subsubfolder\ProgramC.py var programA = project.ProjectItems.Item("ProgramA.py"); Assert.IsNotNull(programA); var subfolder = project.ProjectItems.Item("Subfolder"); var programB = subfolder.ProjectItems.Item("ProgramB.py"); Assert.IsNotNull(programB); var subsubfolder = subfolder.ProjectItems.Item("Subsubfolder"); var programC = subsubfolder.ProjectItems.Item("ProgramC.py"); Assert.IsNotNull(programC); } else if (name.StartsWith("ProjectB")) { // Should have ProgramB.py and Subsubfolder\ProgramC.py var programB = project.ProjectItems.Item("ProgramB.py"); Assert.IsNotNull(programB); var subsubfolder = project.ProjectItems.Item("Subsubfolder"); var programC = subsubfolder.ProjectItems.Item("ProgramC.py"); Assert.IsNotNull(programC); } else if (name.StartsWith("ProjectSln")) { // Should have ProjectHomeProjects\ProgramA.py, // ProjectHomeProjects\Subfolder\ProgramB.py and // ProjectHomeProjects\Subfolder\Subsubfolder\ProgramC.py var projectHome = project.ProjectItems.Item("ProjectHomeProjects"); var programA = projectHome.ProjectItems.Item("ProgramA.py"); Assert.IsNotNull(programA); var subfolder = projectHome.ProjectItems.Item("Subfolder"); var programB = subfolder.ProjectItems.Item("ProgramB.py"); Assert.IsNotNull(programB); var subsubfolder = subfolder.ProjectItems.Item("Subsubfolder"); var programC = subsubfolder.ProjectItems.Item("ProgramC.py"); Assert.IsNotNull(programC); } else { Assert.Fail("Wrong project file name", name); } } } }
public void GlobalIntellisense() { using (var app = new VisualStudioApp()) { Window window; var openFile = OpenProjectItem(app, "server.js", out window); openFile.MoveCaret(6, 1); Keyboard.Type("process."); using (var session = openFile.WaitForSession<ICompletionSession>()) { var completions = session.Session.CompletionSets.First().Completions.Select(x => x.InsertionText); Assert.IsTrue(completions.Contains("abort")); Assert.IsTrue(completions.Contains("chdir")); } } }
public InteractiveWindow(string title, AutomationElement element, VisualStudioApp app) : base(null, element) { _app = app; _title = title; var compModel = _app.GetService<IComponentModel>(typeof(SComponentModel)); var replWindowProvider = compModel.GetService<IReplWindowProvider>(); _replWindow = replWindowProvider.GetReplWindows() .OfType<ReplWindow>() .FirstOrDefault(p => p.Title.Equals(title, StringComparison.CurrentCulture)); _replWindowInfo = _replWindows.GetValue(_replWindow, window => { var info = new ReplWindowInfo(); window.ReadyForInput += new Action(info.OnReadyForInput); return info; }); }
public void CreateNewScript() { using (var app = new VisualStudioApp()) { var project = app.CreateProject( RConstants.TemplateLanguageName, RConstants.ProjectTemplate_EmptyProject, System.IO.Path.GetTempPath(), "RTestProject"); app.OpenSolutionExplorer().SelectProject(project); using (var newItem = NewItemDialog.FromDte(app)) { AutomationWrapper.Select(newItem.ProjectTypes.FindItem("R Script")); newItem.FileName = "my-script.r"; newItem.OK(); } var document = app.GetDocument("my-script.r"); document.SetFocus(); document.Type("2 -> a"); document.Text.Should().Be("2 -> a# R Script"); } }
public void EnterCompletion() { Window window; using (var app = new VisualStudioApp()) { var openFile = OpenProjectItem(app, "server.js", out window); openFile.MoveCaret(7, 1); Keyboard.Type("http."); System.Threading.Thread.Sleep(5000); Keyboard.Type("Cli\r"); openFile.WaitForText(@"var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello World\n'); }).listen(1337); http.ClientRequest"); } }
private static string SavePerfFile(string saveDirectory, VisualStudioApp app, IntPtr? dialog = null) { string destName; using (var saveDialog = new SaveDialog(app, AutomationElement.FromHandle(dialog ?? app.WaitForDialog()))) { var originalDestName = Path.Combine(saveDirectory, Path.GetFileName(saveDialog.FileName)); destName = originalDestName; while (File.Exists(destName)) { destName = string.Format("{0} {1}{2}", Path.GetFileNameWithoutExtension(originalDestName), Guid.NewGuid(), Path.GetExtension(originalDestName) ); } saveDialog.FileName = destName; saveDialog.Save(); } return destName; }
public void TestAttachBasic() { string debugSolution = TestData.GetPath(@"TestData\DebugAttach\DebugAttach.sln"); string startFile = "Simple.py"; using (var app = new VisualStudioApp()) { var dbg2 = (Debugger2)app.Dte.Debugger; SD.Process processToAttach = OpenSolutionAndLaunchFile(app, debugSolution, startFile, "", ""); try { AttachAndWaitForMode(app, processToAttach, AD7Engine.DebugEngineName, dbgDebugMode.dbgRunMode); } finally { dbg2.DetachAll(); DebugProject.WaitForMode(app, dbgDebugMode.dbgDesignMode); if (!processToAttach.HasExited) processToAttach.Kill(); } } }
public void FileNamesResolve() { using (var app = new VisualStudioApp()) { var project = app.OpenProject(@"TestData\HelloWorld.sln"); var ps = System.Management.Automation.PowerShell.Create(); ps.AddScript(@" param($project) $folderProjectItem = $project.ProjectItems.Item(""Program.py"") $result = $folderProjectItem.FileNames(1) "); ps.AddParameter("project", project); ps.Invoke(); var result = ps.Runspace.SessionStateProxy.GetVariable("result"); var folder = project.ProjectItems.Item("Program.py"); string path = folder.get_FileNames(1); Assert.AreEqual(path, result); } }
public void ProjectBuild() { using (var app = new VisualStudioApp()) { var project = app.OpenProject(@"TestData\HelloWorld.sln"); app.Dte.Solution.SolutionBuild.Build(true); string[] expectedOutputFiles = { "AppxManifest.xml", "HelloWorld.build.appxrecipe", "resources.pri", "startupinfo.xml" }; string currentDir = Directory.GetCurrentDirectory(); foreach (string s in expectedOutputFiles) { Assert.AreEqual(true, File.Exists(string.Format("{0}\\TestData\\HelloWorld\\bin\\{1}", currentDir, s)), string.Format("{0} is missing from bin output folder", s)); } // TODO: // Add test for rebuild // Add test to build all configs and platforms } }
internal static void CreateProject(VisualStudioApp app, string languageName, string templateName, string location, string projectName, string expectedProjectItem) { using (var newProjDialog = app.FileNewProject()) { newProjDialog.FocusLanguageNode(languageName); newProjDialog.Location = location; newProjDialog.ProjectName = projectName; var djangoApp = newProjDialog.ProjectTypes.FindItem(templateName); djangoApp.Select(); newProjDialog.OK(); } // wait for new solution to load... for (int i = 0; i < 40 && app.Dte.Solution.Projects.Count == 0; i++) { System.Threading.Thread.Sleep(250); } app.OpenSolutionExplorer().WaitForItem( "Solution '" + app.Dte.Solution.Projects.Item(1).Name + "' (1 project)", app.Dte.Solution.Projects.Item(1).Name, expectedProjectItem ); }
public void DeferredSaveWithDot() { // http://pytools.codeplex.com/workitem/623 // enable deferred saving on projects using (var app = new VisualStudioApp()) { var props = app.Dte.get_Properties("Environment", "ProjectsAndSolution"); var prevValue = props.Item("SaveNewProjects").Value; props.Item("SaveNewProjects").Value = false; app.OnDispose(() => props.Item("SaveNewProjects").Value = prevValue); // now run the test var newProjDialog = app.FileNewProject(); newProjDialog.FocusLanguageNode("JavaScript"); var consoleApp = newProjDialog.ProjectTypes.FindItem("Blank Node.js Application"); consoleApp.Select(); newProjDialog.ProjectName = "Fob.Baz"; newProjDialog.ClickOK(); // wait for new solution to load... for (int i = 0; i < 100 && app.Dte.Solution.Projects.Count == 0; i++) { System.Threading.Thread.Sleep(1000); } TestUtils.DteExecuteCommandOnThreadPool("File.SaveAll"); var saveProjDialog = new SaveProjectDialog(app.WaitForDialog()); saveProjDialog.Save(); app.WaitForDialogDismissed(); var fullname = app.Dte.Solution.FullName; app.Dte.Solution.Close(false); Directory.Delete(Path.GetDirectoryName(fullname), true); } }
private static INodeProfileSession LaunchSession( VisualStudioApp app, Func<INodeProfileSession> creator, string saveDirectory ) { INodeProfileSession session = null; var task = Task.Factory.StartNew(() => { session = creator(); // Must fault the task to abort the wait throw new Exception(); }); var dialog = app.WaitForDialog(task); if (dialog != IntPtr.Zero) { SavePerfFile(saveDirectory, app, dialog); try { task.Wait(TimeSpan.FromSeconds(5.0)); Assert.Fail("Task did not fault"); } catch (AggregateException) { } } Assert.IsNotNull(session, "Session was not correctly initialized"); return session; }
public static OverwriteFileDialog Wait(VisualStudioApp app) { var hwnd = app.WaitForDialog(); Assert.AreNotEqual(IntPtr.Zero, hwnd, "Did not find OverwriteFileDialog"); var element = AutomationElement.FromHandle(hwnd); try { Assert.IsNotNull(element.FindFirst( TreeScope.Descendants, new PropertyCondition(AutomationElement.AutomationIdProperty, "_allItems") ), "Not correct dialog - missing '_allItems'"); Assert.IsNotNull(element.FindFirst( TreeScope.Descendants, new PropertyCondition(AutomationElement.AutomationIdProperty, "_yes") ), "Not correct dialog - missing '_yes'"); var res = new OverwriteFileDialog(app, element); element = null; return res; } finally { if (element != null) { AutomationWrapper.DumpElement(element); } } }
private void RunTestCase(VisualStudioApp app, IFrameworkHandle frameworkHandle, IRunContext runContext, TestCase test, Dictionary <string, NodejsProjectSettings> sourceToSettings) { var testResult = new TestResult(test); frameworkHandle.RecordStart(test); testResult.StartTime = DateTimeOffset.Now; NodejsProjectSettings settings; if (!sourceToSettings.TryGetValue(test.Source, out settings)) { sourceToSettings[test.Source] = settings = LoadProjectSettings(test.Source); } if (settings == null) { frameworkHandle.SendMessage( TestMessageLevel.Error, "Unable to determine interpreter to use for " + test.Source); RecordEnd( frameworkHandle, test, testResult, null, "Unable to determine interpreter to use for " + test.Source, TestOutcome.Failed); return; } NodejsTestInfo testInfo = new NodejsTestInfo(test.FullyQualifiedName); List <string> args = new List <string>(); int port = 0; if (runContext.IsBeingDebugged && app != null) { app.DTE.Debugger.DetachAll(); args.AddRange(GetDebugArgs(settings, out port)); } var workingDir = Path.GetDirectoryName(CommonUtils.GetAbsoluteFilePath(settings.WorkingDir, testInfo.ModulePath)); args.AddRange(GetInterpreterArgs(test, workingDir, settings.ProjectRootDir)); //Debug.Fail("attach debugger"); if (!File.Exists(settings.NodeExePath)) { frameworkHandle.SendMessage(TestMessageLevel.Error, "Interpreter path does not exist: " + settings.NodeExePath); return; } lock (_syncObject) { _nodeProcess = ProcessOutput.Run( settings.NodeExePath, args, workingDir, null, false, null, false); #if DEBUG frameworkHandle.SendMessage(TestMessageLevel.Informational, "cd " + workingDir); frameworkHandle.SendMessage(TestMessageLevel.Informational, _nodeProcess.Arguments); #endif _nodeProcess.Wait(TimeSpan.FromMilliseconds(500)); if (runContext.IsBeingDebugged && app != null) { try { //the '#ping=0' is a special flag to tell VS node debugger not to connect to the port, //because a connection carries the consequence of setting off --debug-brk, and breakpoints will be missed. string qualifierUri = string.Format("tcp://localhost:{0}#ping=0", port); while (!app.AttachToProcess(_nodeProcess, NodejsRemoteDebugPortSupplierUnsecuredId, qualifierUri)) { if (_nodeProcess.Wait(TimeSpan.FromMilliseconds(500))) { break; } } #if DEBUG } catch (COMException ex) { frameworkHandle.SendMessage(TestMessageLevel.Error, "Error occurred connecting to debuggee."); frameworkHandle.SendMessage(TestMessageLevel.Error, ex.ToString()); KillNodeProcess(); } #else } catch (COMException) {
public void RenameItemsTest() { using (var app = new VisualStudioApp()) { var project = app.OpenProject(@"TestData\NodejsProjectData\RenameItemsTestUI.sln"); using (new NodejsOptionHolder(NodejsPackage.Instance.GeneralOptionsPage, "ShowBrowserAndNodeLabels", false)) { var window = app.OpenSolutionExplorer(); // find server.js, send copy & paste, verify copy of file is there var projectNode = window.WaitForItem("Solution 'RenameItemsTestUI' (1 project)", "HelloWorld", "server.js"); // rename once, cancel renaming to existing file.... AutomationWrapper.Select(projectNode); Keyboard.PressAndRelease(Key.F2); System.Threading.Thread.Sleep(100); Keyboard.Type("NewName.txt"); Keyboard.Type(Key.Delete); // delete extension left at end Keyboard.Type(Key.Delete); Keyboard.Type(Key.Delete); System.Threading.Thread.Sleep(100); Keyboard.PressAndRelease(Key.Enter); IntPtr dialog = app.WaitForDialog(); VisualStudioApp.CheckMessageBox(MessageBoxButton.Cancel, "file name extension"); // rename again, don't cancel... AutomationWrapper.Select(projectNode); Keyboard.PressAndRelease(Key.F2); System.Threading.Thread.Sleep(100); Keyboard.Type("NewName.txt"); Keyboard.Type(Key.Delete); // delete extension left at end Keyboard.Type(Key.Delete); Keyboard.Type(Key.Delete); System.Threading.Thread.Sleep(100); Keyboard.PressAndRelease(Key.Enter); dialog = app.WaitForDialog(); VisualStudioApp.CheckMessageBox(MessageBoxButton.Yes, "file name extension"); Assert.AreNotEqual(null, window.WaitForItem("Solution 'RenameItemsTestUI' (1 project)", "HelloWorld", "NewName.txt")); var subJs = window.WaitForItem("Solution 'RenameItemsTestUI' (1 project)", "HelloWorld", "Sub1", "Sub2", "Foo.js"); Assert.IsNotNull(subJs); var sub1 = window.FindItem("Solution 'RenameItemsTestUI' (1 project)", "HelloWorld", "Sub1"); AutomationWrapper.Select(sub1); Keyboard.PressAndRelease(Key.F2); System.Threading.Thread.Sleep(100); Keyboard.Type("FolderName"); Keyboard.PressAndRelease(Key.Enter); for (int i = 0; i < 20; i++) { try { if (project.GetIsFolderExpanded("FolderName")) { break; } } catch (ArgumentException) { } System.Threading.Thread.Sleep(100); } Assert.IsTrue(project.GetIsFolderExpanded("FolderName")); Assert.AreNotEqual(null, window.WaitForItem("Solution 'RenameItemsTestUI' (1 project)", "HelloWorld", "FolderName", "Sub2", "Foo.js")); } } }
private static void StartHelloWorldAndBreak(VisualStudioApp app) { OpenProjectAndBreak(app, @"TestData\HelloWorld.sln", "Program.py", 1); }
public CredentialsDialog(VisualStudioApp app, AutomationElement element) : base(app, element) { }
private static Project OpenDebuggerProjectAndBreak(VisualStudioApp app, string startItem, int lineNo, bool setStartupItem = true) { return(OpenProjectAndBreak(app, @"TestData\DebuggerProject.sln", startItem, lineNo)); }
////[TestMethod, Priority(UITestPriority.P0)] //[HostType("VSTestHost"), TestCategory("Installed")] public void ObjectBrowserContextMenuBasicTest(VisualStudioApp app) { var project = app.OpenProject(@"TestData\MultiModule.sln"); System.Threading.Thread.Sleep(1000); app.OpenObjectBrowser(); var objectBrowser = app.ObjectBrowser; System.Threading.Thread.Sleep(1000); int nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(1, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[0].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(3, nodeCount, "Node count: " + nodeCount.ToString()); string str = objectBrowser.TypeBrowserPane.Nodes[1].Value; Assert.AreEqual("MyModule.py", str, ""); str = objectBrowser.TypeBrowserPane.Nodes[2].Value; Assert.AreEqual("Program.py", str, ""); objectBrowser.TypeBrowserPane.Nodes[2].ExpandCollapse(); System.Threading.Thread.Sleep(1000); objectBrowser.TypeBrowserPane.Nodes[1].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(6, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[1].ShowContextMenu(); System.Threading.Thread.Sleep(1000); Condition con = new PropertyCondition( AutomationElement.ClassNameProperty, "ContextMenu" ); AutomationElement el = AutomationElement.RootElement.FindFirst(TreeScope.Descendants, con); Assert.IsNotNull(el); Menu menu = new Menu(el); int itemCount = menu.Items.Count; Assert.AreEqual(7, itemCount, "Item count: " + itemCount.ToString()); Assert.AreEqual("Copy", menu.Items[0].Value.Trim(), ""); Assert.AreEqual("View Namespaces", menu.Items[1].Value.Trim(), ""); Assert.AreEqual("View Containers", menu.Items[2].Value.Trim(), ""); Assert.AreEqual("Sort Alphabetically", menu.Items[3].Value.Trim(), ""); Assert.AreEqual("Sort By Object Type", menu.Items[4].Value.Trim(), ""); Assert.AreEqual("Sort By Object Access", menu.Items[5].Value.Trim(), ""); Assert.AreEqual("Group By Object Type", menu.Items[6].Value.Trim(), ""); Keyboard.PressAndRelease(System.Windows.Input.Key.Escape); objectBrowser.TypeBrowserPane.Nodes[2].ShowContextMenu(); System.Threading.Thread.Sleep(1000); el = AutomationElement.RootElement.FindFirst(TreeScope.Descendants, con); Assert.IsNotNull(el); menu = new Menu(el); itemCount = menu.Items.Count; Assert.AreEqual(13, itemCount, "Item count: " + itemCount.ToString()); Assert.AreEqual("Go To Definition", menu.Items[0].Value.Trim(), ""); Assert.AreEqual("Go To Declaration", menu.Items[1].Value.Trim(), ""); Assert.AreEqual("Go To Reference", menu.Items[2].Value.Trim(), ""); Assert.AreEqual("Browse Definition", menu.Items[3].Value.Trim(), ""); Assert.AreEqual("Find All References", menu.Items[4].Value.Trim(), ""); Assert.AreEqual("Filter To Type", menu.Items[5].Value.Trim(), ""); Assert.AreEqual("Copy", menu.Items[6].Value.Trim(), ""); Assert.AreEqual("View Namespaces", menu.Items[7].Value.Trim(), ""); Assert.AreEqual("View Containers", menu.Items[8].Value.Trim(), ""); Assert.AreEqual("Sort Alphabetically", menu.Items[9].Value.Trim(), ""); Assert.AreEqual("Sort By Object Type", menu.Items[10].Value.Trim(), ""); Assert.AreEqual("Sort By Object Access", menu.Items[11].Value.Trim(), ""); Assert.AreEqual("Group By Object Type", menu.Items[12].Value.Trim(), ""); Keyboard.PressAndRelease(System.Windows.Input.Key.Escape); }
public TestExecutor() { _app = VisualStudioApp.FromEnvironmentVariable(PythonConstants.PythonToolsProcessIdEnvironmentVariable); _interpreterService = InterpreterOptionsServiceProvider.GetService(_app); }
////[TestMethod, Priority(UITestPriority.P0)] //[HostType("VSTestHost"), TestCategory("Installed")] public void ObjectBrowserTypeBrowserSortTest(VisualStudioApp app) { var project = app.OpenProject(@"TestData\MultiModule.sln"); System.Threading.Thread.Sleep(1000); app.OpenObjectBrowser(); var objectBrowser = app.ObjectBrowser; System.Threading.Thread.Sleep(1000); int nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(1, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[0].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(3, nodeCount, "Node count: " + nodeCount.ToString()); string str = objectBrowser.TypeBrowserPane.Nodes[1].Value; Assert.AreEqual("MyModule.py", str, ""); str = objectBrowser.TypeBrowserPane.Nodes[2].Value; Assert.AreEqual("Program.py", str, ""); objectBrowser.TypeBrowserPane.Nodes[1].ShowContextMenu(); System.Threading.Thread.Sleep(1000); Condition con = new PropertyCondition( AutomationElement.ClassNameProperty, "ContextMenu" ); AutomationElement el = AutomationElement.RootElement.FindFirst(TreeScope.Descendants, con); Assert.IsNotNull(el); Menu menu = new Menu(el); int itemCount = menu.Items.Count; Assert.AreEqual(7, itemCount, "Item count: " + itemCount.ToString()); menu.Items[6].Check(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(4, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[2].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(5, nodeCount, "Node count: " + nodeCount.ToString()); Assert.AreEqual("Namespaces", objectBrowser.TypeBrowserPane.Nodes[3].Value, ""); Assert.AreEqual("Namespaces", objectBrowser.TypeBrowserPane.Nodes[1].Value, ""); objectBrowser.TypeBrowserPane.Nodes[3].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(6, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[3].ExpandCollapse(); System.Threading.Thread.Sleep(1000); objectBrowser.TypeBrowserPane.Nodes[0].ShowContextMenu(); System.Threading.Thread.Sleep(1000); el = AutomationElement.RootElement.FindFirst(TreeScope.Descendants, con); Assert.IsNotNull(el); menu = new Menu(el); itemCount = menu.Items.Count; Assert.AreEqual(7, itemCount, "Item count: " + itemCount.ToString()); Assert.IsTrue(menu.Items[6].ToggleStatus); menu.Items[3].Check(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(4, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[3].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(6, nodeCount, "Node count: " + nodeCount.ToString()); str = objectBrowser.TypeBrowserPane.Nodes[1].Value; Assert.AreEqual("MyModule.py", str, ""); str = objectBrowser.TypeBrowserPane.Nodes[2].Value; Assert.AreEqual("class SchoolMember\n", str, ""); str = objectBrowser.TypeBrowserPane.Nodes[3].Value; Assert.AreEqual("Program.py", str, ""); str = objectBrowser.TypeBrowserPane.Nodes[4].Value; Assert.AreEqual("class Student(MyModule.SchoolMember)\n", str, ""); str = objectBrowser.TypeBrowserPane.Nodes[5].Value; Assert.AreEqual("class Teacher(MyModule.SchoolMember)\n", str, ""); }
private static string[] PublishAndWaitForFiles(VisualStudioApp app, string command, string dir) { app.Dte.ExecuteCommand(command); return(WaitForFiles(dir)); }
public NewAppDialog(VisualStudioApp app, AutomationElement element) : base(app, element) { }
private void DetachDebugger(int vsProcessId) { VisualStudioApp.DetachDebugger(vsProcessId); }
/// <summary> /// Make sure deleting a project clears the error list when there are errors in multiple files /// /// Take 2 of https://pytools.codeplex.com/workitem/1523 /// </summary> public void ErrorListAndTaskListAreClearedWhenProjectWithMultipleFilesIsUnloaded(VisualStudioApp app) { var project = app.OpenProject(@"TestData\ErrorProjectMultipleFiles.sln"); app.WaitForTaskListItems(typeof(SVsErrorList), 14); app.WaitForTaskListItems(typeof(SVsTaskList), 4); var solutionService = app.GetService <IVsSolution>(typeof(SVsSolution)); Assert.IsNotNull(solutionService); IVsHierarchy selectedHierarchy; ErrorHandler.ThrowOnFailure(solutionService.GetProjectOfUniqueName(project.UniqueName, out selectedHierarchy)); Assert.IsNotNull(selectedHierarchy); Console.WriteLine("Unloading project"); ErrorHandler.ThrowOnFailure(solutionService.CloseSolutionElement((uint)__VSSLNCLOSEOPTIONS.SLNCLOSEOPT_UnloadProject, selectedHierarchy, 0)); app.WaitForTaskListItems(typeof(SVsErrorList), 0); app.WaitForTaskListItems(typeof(SVsTaskList), 0); }
public void ImportStar(VisualStudioApp app) { string expectedText = @"from sys import *"; RemoveLightBulbTest(app, "ImportStar.py", 1, 1, true, expectedText); }
private static void LaunchAndVerifyNoDebug( VisualStudioApp app, int port, string textInResponse ) { bool prevNormal = true, prevAbnormal = true; string text; int retries; try { using (var processes = new ProcessScope("python")) { EndToEndLog("Transitioning to UI thread to build"); app.ServiceProvider.GetUIThread().Invoke(() => { EndToEndLog("Building"); app.Dte.Solution.SolutionBuild.Build(true); EndToEndLog("Updating settings"); prevNormal = app.GetService <PythonToolsService>().DebuggerOptions.WaitOnNormalExit; prevAbnormal = app.GetService <PythonToolsService>().DebuggerOptions.WaitOnAbnormalExit; app.GetService <PythonToolsService>().DebuggerOptions.WaitOnNormalExit = false; app.GetService <PythonToolsService>().DebuggerOptions.WaitOnAbnormalExit = false; EndToEndLog("Starting running"); app.Dte.Solution.SolutionBuild.Run(); EndToEndLog("Running"); }); var newProcesses = processes.WaitForNewProcess(TimeSpan.FromSeconds(30)).ToList(); Assert.IsTrue(newProcesses.Any(), "Did not find new Python process"); EndToEndLog("Found new processes with IDs {0}", string.Join(", ", newProcesses.Select(p => p.Id.ToString()))); for (retries = 100; retries > 0 && !IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners().Any(p => p.Port == port); --retries) { Thread.Sleep(300); } EndToEndLog("Active at http://localhost:{0}/", port); text = WebDownloadUtility.GetString(new Uri(string.Format("http://localhost:{0}/", port))); } } finally { app.ServiceProvider.GetUIThread().Invoke(() => { app.GetService <PythonToolsService>().DebuggerOptions.WaitOnNormalExit = prevNormal; app.GetService <PythonToolsService>().DebuggerOptions.WaitOnAbnormalExit = prevAbnormal; }); } EndToEndLog("Response from http://localhost:{0}/", port); EndToEndLog(text); Assert.IsTrue(text.Contains(textInResponse), text); for (retries = 20; retries > 0 && !IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners().All(p => p.Port != port); --retries) { Thread.Sleep(500); } if (retries > 0) { EndToEndLog("Process ended"); } else { EndToEndLog("Timed out waiting for process to exit"); } }
public void FutureImport(VisualStudioApp app) { string expectedText = @"from __future__ import with_statement"; RemoveLightBulbTest(app, "FutureImport.py", 1, 1, true, expectedText); }
public void ImportTrailingWhitespace(VisualStudioApp app) { string expectedText = @"fob"; RemoveLightBulbTest(app, "ImportTrailingWhitespace.py", 1, 1, true, expectedText); }
public void FromImport(VisualStudioApp app) { string expectedText = @""; RemoveLightBulbTest(app, "FromImport.py", 1, 1, true, expectedText); }
private static ToolWindowPane ActivateInteractiveWindow(ReplWindowProxySettings settings, VisualStudioApp app, string projectName, string backend) { string description = null; if (settings.Version.IsCPython) { description = string.Format("{0} {1}", settings.Version.Isx64 ? "Python 64-bit" : "Python 32-bit", settings.Version.Version.ToVersion() ); } else if (settings.Version.IsIronPython) { description = string.Format("{0} {1}", settings.Version.Isx64 ? "IronPython 64-bit" : "IronPython", settings.Version.Version.ToVersion() ); } Assert.IsNotNull(description, "Unknown interpreter"); var automation = (IVsPython)app.Dte.GetObject("VsPython"); var options = (IPythonOptions)automation; var replOptions = options.Interactive; Assert.IsNotNull(replOptions, "Could not find options for " + description); var oldAddNewLineAtEndOfFullyTypedWord = options.Intellisense.AddNewLineAtEndOfFullyTypedWord; app.OnDispose(() => options.Intellisense.AddNewLineAtEndOfFullyTypedWord = oldAddNewLineAtEndOfFullyTypedWord); options.Intellisense.AddNewLineAtEndOfFullyTypedWord = settings.AddNewLineAtEndOfFullyTypedWord; var interpreters = app.ComponentModel.GetService <IInterpreterRegistryService>(); var replId = PythonReplEvaluatorProvider.GetEvaluatorId( interpreters.FindConfiguration(settings.Version.Id) ); if (!string.IsNullOrEmpty(projectName)) { var dteProj = app.GetProject(projectName); var proj = (PythonProjectNode)dteProj.GetCommonProject(); replId = PythonReplEvaluatorProvider.GetEvaluatorId(proj); } return(app.ServiceProvider.GetUIThread().Invoke(() => { app.ServiceProvider.GetPythonToolsService().InteractiveBackendOverride = backend; var provider = app.ComponentModel.GetService <InteractiveWindowProvider>(); return (ToolWindowPane)provider.OpenOrCreate(replId); })); }
public void Breakpoint() { using (var app = new VisualStudioApp()) { var project = app.OpenProject(@"TestData\HelloWorld.sln"); TargetInfo ti = TargetInfo.GetTargetInfo(); // Wait for solution to load... for (int i = 0; i < 40 && app.Dte.Solution.Projects.Count == 0; i++) { System.Threading.Thread.Sleep(250); } Assert.IsFalse(0 == app.Dte.Solution.Projects.Count); // Set platform foreach (SolutionConfiguration2 solConfiguration2 in app.Dte.Solution.SolutionBuild.SolutionConfigurations) { if (String.Equals(solConfiguration2.PlatformName, ti.Plat, StringComparison.Ordinal)) { solConfiguration2.Activate(); break; } } // Open project properties var item = app.SolutionExplorerTreeView.WaitForItem( "Solution '" + app.Dte.Solution.Projects.Item(1).Name + "' (1 project)", app.Dte.Solution.Projects.Item(1).Name ); AutomationWrapper.Select(item); app.Dte.ExecuteCommand("ClassViewContextMenus.ClassViewMultiselectProjectReferencesItems.Properties"); AutomationElement doc = null; for (int i = 0; i < 10; i++) { doc = app.GetDocumentTab("HelloWorld"); if (doc != null) { break; } doc = app.GetDocumentTab("HelloWorld.njsproj"); if (doc != null) { break; } System.Threading.Thread.Sleep(1000); } Assert.IsNotNull(doc, "Failed to find project properties tab"); // Enter IP address of target machine var debuggerMachineName = new TextBox( new AutomationWrapper(doc).FindByAutomationId("_debuggerMachineName") ); debuggerMachineName.SetFocus(); Keyboard.ControlA(); Keyboard.Backspace(); Keyboard.Type(ti.IP); app.Dte.ExecuteCommand("File.SaveAll"); // Build project app.Dte.Solution.SolutionBuild.Build(true); // Add breakpoint app.Dte.Debugger.Breakpoints.Add(String.Empty, "server.js", 3, 1, String.Empty, dbgBreakpointConditionType.dbgBreakpointConditionTypeWhenTrue, String.Empty, String.Empty, 1, String.Empty, 1, dbgHitCountType.dbgHitCountTypeNone); // F5 app.Dte.ExecuteCommand("Debug.Start"); // Check that breakpoint is hit app.WaitForMode(dbgDebugMode.dbgBreakMode, 120); Assert.IsTrue(app.Dte.ActiveDocument.Name.Contains("server.js")); Assert.IsTrue((app.Dte.ActiveDocument.Object("TextDocument") as TextDocument).Selection.ActivePoint.Line == 3); } }
////[TestMethod, Priority(UITestPriority.P0)] //[HostType("VSTestHost"), TestCategory("Installed")] public void ObjectBrowserNavigationTest(VisualStudioApp app) { var project = app.OpenProject(@"TestData\MultiModule.sln"); System.Threading.Thread.Sleep(1000); app.OpenObjectBrowser(); var objectBrowser = app.ObjectBrowser; objectBrowser.EnsureLoaded(); int nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(1, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[0].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(3, nodeCount, "Node count: " + nodeCount.ToString()); string str = objectBrowser.TypeBrowserPane.Nodes[1].Value; Assert.AreEqual("MyModule.py", str, ""); str = objectBrowser.TypeBrowserPane.Nodes[2].Value; Assert.AreEqual("Program.py", str, ""); objectBrowser.TypeBrowserPane.Nodes[2].ExpandCollapse(); System.Threading.Thread.Sleep(1000); objectBrowser.TypeBrowserPane.Nodes[1].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(6, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[4].Select(); System.Threading.Thread.Sleep(1000); app.ExecuteCommand("Edit.GoToDefinition"); System.Threading.Thread.Sleep(1000); str = app.Dte.ActiveDocument.Name; Assert.AreEqual("Program.py", str, ""); int lineNo = ((TextSelection)app.Dte.ActiveDocument.Selection).ActivePoint.Line; Assert.AreEqual(14, lineNo, "Line number: " + lineNo.ToString()); app.OpenObjectBrowser(); objectBrowser.TypeBrowserPane.Nodes[2].Select(); System.Threading.Thread.Sleep(1000); app.ExecuteCommand("Edit.GoToDefinition"); System.Threading.Thread.Sleep(1000); str = app.Dte.ActiveDocument.Name; Assert.AreEqual("MyModule.py", str, ""); lineNo = ((TextSelection)app.Dte.ActiveDocument.Selection).ActivePoint.Line; Assert.AreEqual(1, lineNo, "Line number: " + lineNo.ToString()); objectBrowser.TypeBrowserPane.Nodes[3].ExpandCollapse(); System.Threading.Thread.Sleep(1000); objectBrowser.TypeBrowserPane.Nodes[1].ExpandCollapse(); System.Threading.Thread.Sleep(1000); }
internal static IPythonInterpreterFactory CreateVirtualEnvironment(string pythonVersion, VisualStudioApp app, PythonProjectNode pyProj) { var uiThread = app.ServiceProvider.GetUIThread(); var task = uiThread.InvokeTask(() => { var model = app.GetService <IComponentModel>(typeof(SComponentModel)); var service = model.GetService <IInterpreterOptionsService>(); return(pyProj.CreateOrAddVirtualEnvironment( service, true, Path.Combine(pyProj.ProjectHome, "env"), service.FindInterpreter(PythonPaths.CPythonGuid, pythonVersion), Version.Parse(pythonVersion) >= new Version(3, 3) )); }); try { Assert.IsTrue(task.Wait(TimeSpan.FromMinutes(2.0)), "Timed out waiting for venv"); } catch (AggregateException ex) { throw ex.InnerException; } var factory = task.Result; Assert.IsTrue(uiThread.Invoke(() => factory.Id == pyProj.GetInterpreterFactory().Id)); return(factory); }
////[TestMethod, Priority(UITestPriority.P0)] //[HostType("VSTestHost"), TestCategory("Installed")] public void ObjectBrowserCommentsTest(VisualStudioApp app) { var project = app.OpenProject(@"TestData\Inheritance.sln"); System.Threading.Thread.Sleep(1000); app.OpenObjectBrowser(); var objectBrowser = app.ObjectBrowser; System.Threading.Thread.Sleep(1000); int nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(1, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[0].ExpandCollapse(); System.Threading.Thread.Sleep(1000); string str = objectBrowser.TypeBrowserPane.Nodes[1].Value; Assert.AreEqual("Program.py", str, ""); objectBrowser.TypeBrowserPane.Nodes[1].Select(); nodeCount = objectBrowser.TypeNavigatorPane.Nodes.Count; Assert.AreEqual(4, nodeCount, "Node Count: " + nodeCount.ToString()); str = objectBrowser.TypeNavigatorPane.Nodes[0].Value; Assert.AreEqual("member", str.Trim(), ""); str = objectBrowser.TypeNavigatorPane.Nodes[1].Value; Assert.AreEqual("members", str.Trim(), ""); str = objectBrowser.TypeNavigatorPane.Nodes[2].Value; Assert.AreEqual("s", str.Trim(), ""); str = objectBrowser.TypeNavigatorPane.Nodes[3].Value; Assert.AreEqual("t", str.Trim(), ""); objectBrowser.TypeBrowserPane.Nodes[1].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(5, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[2].Select(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeNavigatorPane.Nodes.Count; Assert.AreEqual(2, nodeCount, "Node Count: " + nodeCount.ToString()); str = objectBrowser.TypeNavigatorPane.Nodes[0].Value; Assert.IsTrue(str.Trim().StartsWith("def __init__(self"), str); str = objectBrowser.TypeNavigatorPane.Nodes[1].Value; Assert.AreEqual("def tell(self)", str.Trim(), ""); str = objectBrowser.DetailPane.Value; Assert.IsTrue(str.Trim().Contains("SchoolMember"), str); Assert.IsTrue(str.Trim().Contains("Represents any school member."), str); objectBrowser.TypeNavigatorPane.Nodes[1].Select(); System.Threading.Thread.Sleep(1000); str = objectBrowser.DetailPane.Value; Assert.IsTrue(str.Trim().Contains("def tell(self)"), str); Assert.IsTrue(str.Trim().Contains("Tell my detail."), str); objectBrowser.TypeBrowserPane.Nodes[0].ExpandCollapse(); System.Threading.Thread.Sleep(1000); }
private void DetachDebugger(int vsProcessId) { #if !NETSTANDARD2_0 VisualStudioApp.DetachDebugger(vsProcessId); #endif }
public ToolsOptionsDialog(VisualStudioApp app, AutomationElement element) : base(app, element) { }
public void TestClientServerIntelliSenseModes() { string solutionLabel = "Solution 'ClientServerCode' (1 project)", projectLabel = "ClientServerCode", nodeDirectoryLabel = NodejsFolderNode.AppendLabel("NodeDirectory", FolderContentType.Node), nodeSubDirectoryLabel = NodejsFolderNode.AppendLabel("NodeSubDirectory", FolderContentType.Node), browserDirectoryLabel = NodejsFolderNode.AppendLabel("BrowserDirectory", FolderContentType.Browser), emptyBrowserSubDirectoryLabel = "BrowserSubDirectory", browserSubDirectoryLabel = NodejsFolderNode.AppendLabel("BrowserSubDirectory", FolderContentType.Browser), mixedDirectoryLabel = NodejsFolderNode.AppendLabel("MixedDirectory", FolderContentType.Mixed), mixedDirectoryBrowserDirectoryLabel = NodejsFolderNode.AppendLabel("BrowserDirectory", FolderContentType.Browser), mixedDirectoryNodeDirectoryLabel = NodejsFolderNode.AppendLabel("NodeDirectory", FolderContentType.Node), browserCodeLabel = "browserCode.js", mixedDirectoryRenamedLabel = NodejsFolderNode.AppendLabel("MixedDirectoryRenamed", FolderContentType.Mixed); using (var app = new VisualStudioApp()) { var project = app.OpenProject(@"TestData\ClientServerCode\ClientServerCode.sln"); using (new NodejsOptionHolder(NodejsPackage.Instance.GeneralOptionsPage, "ShowBrowserAndNodeLabels", true)) { // Wait until project is loaded var solutionExplorer = app.OpenSolutionExplorer(); solutionExplorer.WaitForItem( solutionLabel, projectLabel, "app.js"); var nodejsProject = app.GetProject("ClientServerCode").GetNodejsProject(); var projectNode = solutionExplorer.WaitForItem( solutionLabel, projectLabel); var browserDirectory = solutionExplorer.WaitForItem( solutionLabel, projectLabel, browserDirectoryLabel ); Assert.IsNotNull( browserDirectory, "Browser directories should be labeled as such. Could not find " + browserDirectoryLabel); var browserSubDirectory = solutionExplorer.WaitForItem( solutionLabel, projectLabel, browserDirectoryLabel, emptyBrowserSubDirectoryLabel ); Assert.IsNotNull( browserSubDirectory, "Project initialization: could not find " + emptyBrowserSubDirectoryLabel); var nodeDirectory = solutionExplorer.WaitForItem( solutionLabel, projectLabel, nodeDirectoryLabel ); Assert.IsNotNull( nodeDirectory, "Node directories should be labeled as such. Could not find " + nodeDirectoryLabel); var nodeSubDirectory = solutionExplorer.WaitForItem( solutionLabel, projectLabel, nodeDirectoryLabel, nodeSubDirectoryLabel ); Assert.IsNotNull( nodeSubDirectory, "Project initialization: could not find " + nodeSubDirectoryLabel); projectNode.Select(); using (var newItem = NewItemDialog.FromDte(app)) { newItem.FileName = "newItem.js"; newItem.OK(); } Assert.AreEqual( "Compile", nodejsProject.GetItemType("newItem.js"), "Top level files should be set to item type 'Compile'"); Keyboard.Type("process."); Keyboard.Type(Keyboard.CtrlSpace.ToString()); using (var session = app.GetDocument(Path.Combine(nodejsProject.ProjectHome, @"newItem.js")).WaitForSession <ICompletionSession>()) { var completions = session.Session.CompletionSets.First().Completions.Select(x => x.InsertionText); Assert.IsTrue( completions.Contains("env"), "New documents of the node type should open with default VS editor" ); } browserSubDirectory.Select(); using (var newBrowserItem = NewItemDialog.FromDte(app)) { newBrowserItem.FileName = "newBrowserItem.js"; newBrowserItem.OK(); } Keyboard.Type("document."); System.Threading.Thread.Sleep(2000); Keyboard.Type(Keyboard.CtrlSpace.ToString()); using (var session = app.GetDocument(Path.Combine(nodejsProject.ProjectHome, @"BrowserDirectory\browserSubDirectory\newBrowserItem.js")).WaitForSession <ICompletionSession>()) { var completions = session.Session.CompletionSets.First().Completions.Select(x => x.InsertionText); Assert.IsTrue( completions.Contains("body"), "New documents of the browser type should open with default VS editor" ); } browserSubDirectory = solutionExplorer.WaitForItem( solutionLabel, projectLabel, browserDirectoryLabel, browserSubDirectoryLabel ); Assert.IsNotNull( browserSubDirectory, "Folder label was not updated to " + browserSubDirectoryLabel); var newBrowserItemFile = solutionExplorer.WaitForItem( solutionLabel, projectLabel, browserDirectoryLabel, browserSubDirectoryLabel, "newBrowserItem.js" ); Assert.AreEqual( "Content", nodejsProject.GetItemType(@"BrowserDirectory\BrowserSubDirectory\newBrowserItem.js"), "Adding a javascript file to a 'browser' directory should set the item type as Content."); var mixedDirectory = solutionExplorer.WaitForItem( solutionLabel, projectLabel, mixedDirectoryLabel ); Assert.IsNotNull( mixedDirectory, "Folder with mixed browser/node content should be specified as such. Could not find: " + mixedDirectoryLabel); nodeDirectory.Select(); using (var newTypeScriptItem = NewItemDialog.FromDte(app)) { newTypeScriptItem.FileName = "newTypeScriptItem.ts"; newTypeScriptItem.OK(); } Assert.AreEqual( "TypeScriptCompile", nodejsProject.GetItemType(@"NodeDirectory\newTypeScriptItem.ts"), "Non-javascript files should retain their content type."); var newBrowserItemNode = nodejsProject.FindNodeByFullPath( Path.Combine(nodejsProject.ProjectHome, @"BrowserDirectory\BrowserSubDirectory\newBrowserItem.js") ); newBrowserItemNode.ExcludeFromProject(); var excludedBrowserItem = solutionExplorer.WaitForItem( solutionLabel, projectLabel, browserDirectoryLabel, emptyBrowserSubDirectoryLabel ); Assert.IsNotNull( emptyBrowserSubDirectoryLabel, "Label should be removed when there are no included javascript files the directory. Could not find " + emptyBrowserSubDirectoryLabel); (newBrowserItemNode as NodejsFileNode).IncludeInProject(false); var includedBrowserItem = solutionExplorer.WaitForItem( solutionLabel, projectLabel, browserDirectoryLabel, browserSubDirectoryLabel ); Assert.IsNotNull( includedBrowserItem, "Label should be added when a javascript file is included in the directory. Could not find " + browserSubDirectoryLabel); var mixedDirectoryNode = app.GetProject("ClientServerCode").GetNodejsProject().FindNodeByFullPath( Path.Combine(nodejsProject.ProjectHome, @"MixedDirectory\")); System.Threading.Thread.Sleep(2000); mixedDirectory.Select(); Keyboard.PressAndRelease(Key.F2); Keyboard.Type("MixedDirectoryRenamed"); Keyboard.PressAndRelease(Key.Enter); mixedDirectoryNode.ExpandItem(EXPANDFLAGS.EXPF_ExpandFolderRecursively); var renamedMixedDirectory = solutionExplorer.WaitForItem( solutionLabel, projectLabel, mixedDirectoryRenamedLabel, mixedDirectoryBrowserDirectoryLabel, browserCodeLabel ); Assert.IsNotNull( renamedMixedDirectory, "Renaming mixed directory failed: could not find " + browserCodeLabel); newBrowserItemNode.ItemNode.ItemTypeName = "Compile"; var nodeBrowserSubDirectory = solutionExplorer.WaitForItem( solutionLabel, projectLabel, NodejsFolderNode.AppendLabel("BrowserDirectory", FolderContentType.Mixed), NodejsFolderNode.AppendLabel("BrowserSubDirectory", FolderContentType.Node) ); Assert.IsNotNull( nodeBrowserSubDirectory, "Changing the item type should change the directory label. Could not find " + NodejsFolderNode.AppendLabel("BrowserSubDirectory", FolderContentType.Node) ); var nodeDirectoryNode = app.GetProject("ClientServerCode").GetNodejsProject().FindNodeByFullPath( Path.Combine(app.GetProject("ClientServerCode").GetNodejsProject().ProjectHome, @"NodeDirectory\")); (nodeDirectoryNode as NodejsFolderNode).SetItemTypeRecursively(VSLangProj.prjBuildAction.prjBuildActionContent); Assert.AreEqual( "Content", nodejsProject.GetItemType(@"NodeDirectory\NodeSubDirectory\nodeCode.js"), "nodeCode.js file should be marked as content after recursively setting directory contents as Content." ); Assert.AreEqual( "TypeScriptCompile", nodejsProject.GetItemType(@"NodeDirectory\newTypeScriptItem.ts"), "Only javascript file item types should change when marking item types recursively." ); var fromPoint = solutionExplorer.WaitForItem( solutionLabel, projectLabel, mixedDirectoryRenamedLabel, mixedDirectoryNodeDirectoryLabel ).GetClickablePoint(); var toPoint = solutionExplorer.WaitForItem( solutionLabel, projectLabel, mixedDirectoryRenamedLabel, mixedDirectoryBrowserDirectoryLabel ).GetClickablePoint(); Mouse.MoveTo(fromPoint); Mouse.Down(MouseButton.Left); Mouse.MoveTo(toPoint); Mouse.Up(MouseButton.Left); var draggedDirectory = solutionExplorer.WaitForItem( solutionLabel, projectLabel, mixedDirectoryRenamedLabel, NodejsFolderNode.AppendLabel("BrowserDirectory", FolderContentType.Mixed), NodejsFolderNode.AppendLabel("NodeDirectory", FolderContentType.Node) ); Assert.IsNotNull( draggedDirectory, "Labels not properly updated after dragging and dropping directory." ); } } }
/// <summary> /// Runs a single formatting test /// </summary> /// <param name="filename">The filename of the document to perform formatting in (lives in FormattingTests.sln)</param> /// <param name="selection">The selection to format, or null if formatting the entire document</param> /// <param name="expectedText">The expected source code after the formatting</param> /// <param name="changedSpans">The spans which should be marked as changed in the buffer after formatting</param> private static void FormattingTest(string filename, Span?selection, string expectedText, Span[] changedSpans) { using (var app = new VisualStudioApp()) { var project = app.OpenProject(@"TestData\FormattingTests\FormattingTests.sln"); var item = project.ProjectItems.Item(filename); var window = item.Open(); window.Activate(); var doc = app.GetDocument(item.Document.FullName); var aggFact = app.ComponentModel.GetService <IViewTagAggregatorFactoryService>(); var changeTags = aggFact.CreateTagAggregator <ChangeTag>(doc.TextView); // format the selection or document if (selection == null) { DoFormatDocument(); } else { doc.Invoke(() => doc.TextView.Selection.Select(new SnapshotSpan(doc.TextView.TextBuffer.CurrentSnapshot, selection.Value), false)); DoFormatSelection(); } // verify the contents are correct string actual = null; for (int i = 0; i < 100; i++) { actual = doc.TextView.TextBuffer.CurrentSnapshot.GetText(); if (expectedText == actual) { break; } System.Threading.Thread.Sleep(100); } Assert.AreEqual(expectedText, actual); // verify the change tags are correct var snapshot = doc.TextView.TextBuffer.CurrentSnapshot; var tags = changeTags.GetTags( new SnapshotSpan( doc.TextView.TextBuffer.CurrentSnapshot, new Span(0, doc.TextView.TextBuffer.CurrentSnapshot.Length) ) ); List <Span> result = new List <Span>(); foreach (var tag in tags) { result.Add( new Span( tag.Span.Start.GetPoint(doc.TextView.TextBuffer.CurrentSnapshot, PositionAffinity.Successor).Value.Position, tag.Span.End.GetPoint(doc.TextView.TextBuffer.CurrentSnapshot, PositionAffinity.Successor).Value.Position ) ); } // dump the spans for creating tests easier foreach (var span in result) { Console.WriteLine(span); } Assert.AreEqual(result.Count, changedSpans.Length); for (int i = 0; i < result.Count; i++) { Assert.AreEqual(result[i], changedSpans[i]); } } }
////[TestMethod, Priority(UITestPriority.P0)] //[HostType("VSTestHost"), TestCategory("Installed")] public void ObjectBrowserFindAllReferencesTest(VisualStudioApp app) { var project = app.OpenProject(@"TestData\MultiModule.sln"); System.Threading.Thread.Sleep(1000); app.OpenObjectBrowser(); var objectBrowser = app.ObjectBrowser; System.Threading.Thread.Sleep(1000); int nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(1, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[0].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(3, nodeCount, "Node count: " + nodeCount.ToString()); string str = objectBrowser.TypeBrowserPane.Nodes[1].Value; Assert.AreEqual("MyModule.py", str, ""); str = objectBrowser.TypeBrowserPane.Nodes[2].Value; Assert.AreEqual("Program.py", str, ""); objectBrowser.TypeBrowserPane.Nodes[2].ExpandCollapse(); System.Threading.Thread.Sleep(1000); objectBrowser.TypeBrowserPane.Nodes[1].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(6, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[4].ShowContextMenu(); System.Threading.Thread.Sleep(1000); Condition con = new PropertyCondition( AutomationElement.ClassNameProperty, "ContextMenu" ); AutomationElement el = AutomationElement.RootElement.FindFirst(TreeScope.Descendants, con); Assert.IsNotNull(el); Menu menu = new Menu(el); int itemCount = menu.Items.Count; Assert.AreEqual(13, itemCount, "Item count: " + itemCount.ToString()); menu.Items[4].Check(); System.Threading.Thread.Sleep(1000); //this needs to be updated for bug #4840 str = app.Dte.ActiveWindow.Caption; Assert.IsTrue(str.Contains("2 matches found"), str); objectBrowser.TypeBrowserPane.Nodes[2].ShowContextMenu(); System.Threading.Thread.Sleep(1000); el = AutomationElement.RootElement.FindFirst(TreeScope.Descendants, con); Assert.IsNotNull(el); menu = new Menu(el); menu.Items[4].Check(); System.Threading.Thread.Sleep(1000); str = app.Dte.ActiveWindow.Caption; Assert.IsTrue(str.Contains("2 matches found"), str); }
public SaveProjectDialog(VisualStudioApp app, AutomationElement element) : base(app, element) { }
////[TestMethod, Priority(UITestPriority.P0)] //[HostType("VSTestHost"), TestCategory("Installed")] public void ObjectBrowserNavigateVarContextMenuTest(VisualStudioApp app) { var project = app.OpenProject(@"TestData\MultiModule.sln"); System.Threading.Thread.Sleep(1000); app.OpenObjectBrowser(); var objectBrowser = app.ObjectBrowser; objectBrowser.EnsureLoaded(); int nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(1, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[0].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(3, nodeCount, "Node count: " + nodeCount.ToString()); string str = objectBrowser.TypeBrowserPane.Nodes[1].Value; Assert.AreEqual("MyModule.py", str, ""); str = objectBrowser.TypeBrowserPane.Nodes[2].Value; Assert.AreEqual("Program.py", str, ""); objectBrowser.TypeBrowserPane.Nodes[2].ExpandCollapse(); System.Threading.Thread.Sleep(1000); objectBrowser.TypeBrowserPane.Nodes[1].ExpandCollapse(); System.Threading.Thread.Sleep(1000); nodeCount = objectBrowser.TypeBrowserPane.Nodes.Count; Assert.AreEqual(6, nodeCount, "Node count: " + nodeCount.ToString()); objectBrowser.TypeBrowserPane.Nodes[4].ShowContextMenu(); System.Threading.Thread.Sleep(1000); Condition con = new PropertyCondition( AutomationElement.ClassNameProperty, "ContextMenu" ); AutomationElement el = AutomationElement.RootElement.FindFirst(TreeScope.Descendants, con); Assert.IsNotNull(el); Menu menu = new Menu(el); int itemCount = menu.Items.Count; Assert.AreEqual(13, itemCount, "Item count: " + itemCount.ToString()); menu.Items[0].Check(); System.Threading.Thread.Sleep(1000); str = app.Dte.ActiveDocument.Name; Assert.AreEqual("Program.py", str, ""); int lineNo = ((TextSelection)app.Dte.ActiveDocument.Selection).ActivePoint.Line; Assert.AreEqual(14, lineNo, "Line number: " + lineNo.ToString()); app.OpenObjectBrowser(); objectBrowser.TypeBrowserPane.Nodes[5].ShowContextMenu(); System.Threading.Thread.Sleep(1000); el = AutomationElement.RootElement.FindFirst(TreeScope.Descendants, con); Assert.IsNotNull(el); menu = new Menu(el); menu.Items[0].Check(); System.Threading.Thread.Sleep(1000); lineNo = ((TextSelection)app.Dte.ActiveDocument.Selection).ActivePoint.Line; Assert.AreEqual(3, lineNo, "Line number: " + lineNo.ToString()); }
internal static Project OpenDebuggerProject(VisualStudioApp app, string startItem = null) { return(app.OpenProject(@"TestData\DebuggerProject.sln", startItem)); }
public InteractiveWindow(string title, AutomationElement element, VisualStudioApp app) : base(null, element) { _app = app; _title = title; var compModel = _app.GetService<IComponentModel>(typeof(SComponentModel)); var replWindowProvider = compModel.GetService<InteractiveWindowProvider>(); _replWindow = replWindowProvider #if DEV14_OR_LATER .GetReplToolWindows() #else .GetReplWindows() #endif .OfType<ToolWindowPane>() .FirstOrDefault(p => p.Caption.Equals(title, StringComparison.CurrentCulture)); #if DEV14_OR_LATER _interactive = ((IVsInteractiveWindow)_replWindow).InteractiveWindow; #else _interactive = (IReplWindow)_replWindow; #endif _replWindowInfo = _replWindows.GetValue(_replWindow, window => { var info = new InteractiveWindowInfo(); _interactive.ReadyForInput += new Action(info.OnReadyForInput); return info; }); }