Beispiel #1
0
        public void CustomCommandsRequiredPackages()
        {
            using (var app = new PythonVisualStudioApp())
                using (var dis = app.SelectDefaultInterpreter(PythonVersion, "virtualenv")) {
                    PythonProjectNode node;
                    EnvDTE.Project    proj;
                    OpenProject(app, "CommandRequirePackages.sln", out node, out proj);

                    string envName;
                    var    env = app.CreateVirtualEnvironment(proj, out envName);

                    env.Select();
                    app.Dte.ExecuteCommand("Python.ActivateEnvironment");
                    // Ensure that no error dialog appears
                    app.WaitForNoDialog(TimeSpan.FromSeconds(5.0));

                    // First, execute the command and cancel it.
                    var task = ExecuteAsync(node, "Require Packages");
                    try {
                        var dialogHandle = app.WaitForDialog(task);
                        if (dialogHandle == IntPtr.Zero)
                        {
                            if (task.IsFaulted && task.Exception != null)
                            {
                                Assert.Fail("Unexpected exception in package install confirmation dialog:\n{0}", task.Exception);
                            }
                            else
                            {
                                Assert.AreNotEqual(IntPtr.Zero, dialogHandle);
                            }
                        }

                        using (var dialog = new AutomationDialog(app, AutomationElement.FromHandle(dialogHandle))) {
                            var label = dialog.FindByAutomationId("CommandLink_1000");
                            Assert.IsNotNull(label);

                            string expectedLabel =
                                "The following packages will be installed using pip:\r\n" +
                                "\r\n" +
                                "ptvsd\r\n" +
                                "azure==0.1";;
                            Assert.AreEqual(expectedLabel, label.Current.HelpText);

                            dialog.Cancel();
                            try {
                                task.Wait(1000);
                                Assert.Fail("Command was not canceled after dismissing the package install confirmation dialog");
                            } catch (AggregateException ex) {
                                if (!(ex.InnerException is TaskCanceledException))
                                {
                                    throw;
                                }
                            }
                        }
                    } finally {
                        if (!task.IsCanceled && !task.IsCompleted && !task.IsFaulted)
                        {
                            if (task.Wait(10000))
                            {
                                task.Dispose();
                            }
                        }
                        else
                        {
                            task.Dispose();
                        }
                    }

                    // Then, execute command and allow it to proceed.
                    task = ExecuteAsync(node, "Require Packages");
                    try {
                        var dialogHandle = app.WaitForDialog(task);
                        if (dialogHandle == IntPtr.Zero)
                        {
                            if (task.IsFaulted && task.Exception != null)
                            {
                                Assert.Fail("Unexpected exception in package install confirmation dialog:\n{0}", task.Exception);
                            }
                            else
                            {
                                Assert.AreNotEqual(IntPtr.Zero, dialogHandle);
                            }
                        }

                        using (var dialog = new AutomationDialog(app, AutomationElement.FromHandle(dialogHandle))) {
                            dialog.ClickButtonAndClose("CommandLink_1000", nameIsAutomationId: true);
                        }
                        task.Wait();

                        var ver = PythonVersion.Version.ToVersion();
                        ExpectOutputWindowText(app, string.Format("pass {0}.{1}", ver.Major, ver.Minor));
                    } finally {
                        if (!task.IsCanceled && !task.IsCompleted && !task.IsFaulted)
                        {
                            if (task.Wait(10000))
                            {
                                task.Dispose();
                            }
                        }
                        else
                        {
                            task.Dispose();
                        }
                    }
                }
        }