예제 #1
0
        public void WatchWorkspaceVirtualEnvCreated()
        {
            var python = PythonPaths.Python37_x64 ?? PythonPaths.Python37;

            var workspaceFolder = TestData.GetTempPath();

            Directory.CreateDirectory(workspaceFolder);
            File.WriteAllText(Path.Combine(workspaceFolder, "app.py"), string.Empty);

            string envFolder = Path.Combine(workspaceFolder, "env");

            var workspace        = new WorkspaceTestHelper.MockWorkspace(workspaceFolder);
            var workspaceContext = new WorkspaceTestHelper.MockWorkspaceContext(workspace);

            // Create virtual env inside the workspace folder (one level from root)
            var configs = TestTriggerDiscovery(
                workspaceContext,
                () => python.CreateVirtualEnv(Path.Combine(workspaceFolder, "env"))
                ).ToArray();

            Assert.AreEqual(1, configs.Length);
            Assert.IsTrue(PathUtils.IsSamePath(
                              Path.Combine(envFolder, "scripts", "python.exe"),
                              configs[0].InterpreterPath
                              ));
            Assert.AreEqual("Workspace|Workspace|env", configs[0].Id);
        }
예제 #2
0
        public void WatchWorkspaceFolderChanged()
        {
            var workspaceFolder1 = TestData.GetTempPath();

            Directory.CreateDirectory(workspaceFolder1);
            File.WriteAllText(Path.Combine(workspaceFolder1, "app1.py"), string.Empty);

            var workspaceFolder2 = TestData.GetTempPath();

            Directory.CreateDirectory(workspaceFolder2);
            File.WriteAllText(Path.Combine(workspaceFolder2, "app2.py"), string.Empty);

            var workspace1 = new WorkspaceTestHelper.MockWorkspace(workspaceFolder1);
            var workspace2 = new WorkspaceTestHelper.MockWorkspace(workspaceFolder2);

            var workspaceContext1 = new WorkspaceTestHelper.MockWorkspaceContext(workspace1);
            var workspaceContext2 = new WorkspaceTestHelper.MockWorkspaceContext(workspace2);

            var workspaceContextProvider = new WorkspaceTestHelper.MockWorkspaceContextProvider(workspaceContext1);

            using (var factoryProvider = new WorkspaceInterpreterFactoryProvider(workspaceContextProvider)) {
                // Load a different workspace
                Action triggerDiscovery = () => {
                    workspaceContextProvider.SimulateChangeWorkspace(workspaceContext2);
                };

                TestTriggerDiscovery(workspaceContext1, triggerDiscovery, workspaceContextProvider, true);
            }
        }
예제 #3
0
        private (TestSetupData, IList <string>) GenerateWorkspace()
        {
            var virtualEnvName = "virtualEnv";

            WorkspaceTestHelper.MockWorkspace      mockWorkspace  = WorkspaceTestHelper.CreateMockWorkspace(WorkspaceTestHelper.CreateWorkspaceFolder(), WorkspaceTestHelper.Python37Id);
            WorkspaceTestHelper.MockOptionsService optionsService = new WorkspaceTestHelper.MockOptionsService(WorkspaceTestHelper.DefaultFactory);
            var includedWorkspaceFilePaths = GenerateWorkspaceFiles(mockWorkspace.Location, virtualEnvName, out string virtualEnvPath);

            includedWorkspaceFilePaths.Add(Path.Combine(mockWorkspace.Location, "app.py"));             //Created by WorkspaceTestHelper.CreateWorkspaceFolder()

            var workspaceInterpreterFactories = new List <IPythonInterpreterFactory>()
            {
                new MockPythonInterpreterFactory(
                    new VisualStudioInterpreterConfiguration("Python|3.7", "Fake interpreter 3.7", Path.Combine(mockWorkspace.Location, virtualEnvName), virtualEnvPath)
                    )
            };

            WorkspaceTestHelper.MockRegistryService registryService = new WorkspaceTestHelper.MockRegistryService(workspaceInterpreterFactories);

            TestSetupData testDataSetup = new TestSetupData
            {
                OptionsService  = optionsService,
                RegistryService = registryService,
                Workspace       = mockWorkspace,
            };

            return(testDataSetup, includedWorkspaceFilePaths);
        }
예제 #4
0
        public void WatchWorkspaceSettingsChanged()
        {
            var workspaceFolder = TestData.GetTempPath();

            Directory.CreateDirectory(workspaceFolder);
            File.WriteAllText(Path.Combine(workspaceFolder, "app.py"), string.Empty);

            var workspace        = new WorkspaceTestHelper.MockWorkspace(workspaceFolder);
            var workspaceContext = new WorkspaceTestHelper.MockWorkspaceContext(workspace);

            // Modify settings
            Action triggerDiscovery = () => {
                workspaceContext.SimulateChangeInterpreterSetting("Global|PythonCore|3.7");
            };

            TestTriggerDiscovery(workspaceContext, triggerDiscovery, null, true);
        }
예제 #5
0
        public void AlreadyOpenedWorkspace()
        {
            var workspaceFolder = WorkspaceTestHelper.CreateWorkspaceFolder();

            WorkspaceTestHelper.MockWorkspace        workspace        = WorkspaceTestHelper.CreateMockWorkspace(workspaceFolder, WorkspaceTestHelper.PythonNoId);
            WorkspaceTestHelper.MockWorkspaceService workspaceService = new WorkspaceTestHelper.MockWorkspaceService(workspace);
            WorkspaceTestHelper.MockOptionsService   optionsService   = new WorkspaceTestHelper.MockOptionsService(WorkspaceTestHelper.DefaultFactory);
            WorkspaceTestHelper.MockRegistryService  registryService  = new WorkspaceTestHelper.MockRegistryService(WorkspaceTestHelper.AllFactories);
            var provider = new PythonWorkspaceContextProvider(
                workspaceService,
                new Lazy <IInterpreterOptionsService>(() => optionsService),
                new Lazy <IInterpreterRegistryService>(() => registryService),
                new JoinableTaskContext()
                );

            Assert.AreEqual(workspaceFolder, provider.Workspace.Location);
            Assert.AreEqual(WorkspaceTestHelper.DefaultFactory, provider.Workspace.CurrentFactory);
        }
예제 #6
0
        public void SwitchWorkspace()
        {
            var workspaceFolder1 = WorkspaceTestHelper.CreateWorkspaceFolder();
            var workspaceFolder2 = WorkspaceTestHelper.CreateWorkspaceFolder();

            WorkspaceTestHelper.MockWorkspace        workspace1       = WorkspaceTestHelper.CreateMockWorkspace(workspaceFolder1, WorkspaceTestHelper.Python27Id);
            WorkspaceTestHelper.MockWorkspace        workspace2       = WorkspaceTestHelper.CreateMockWorkspace(workspaceFolder2, WorkspaceTestHelper.Python37Id);
            WorkspaceTestHelper.MockWorkspaceService workspaceService = new WorkspaceTestHelper.MockWorkspaceService(workspace1);
            WorkspaceTestHelper.MockOptionsService   optionsService   = new WorkspaceTestHelper.MockOptionsService(WorkspaceTestHelper.DefaultFactory);
            WorkspaceTestHelper.MockRegistryService  registryService  = new WorkspaceTestHelper.MockRegistryService(WorkspaceTestHelper.AllFactories);
            var provider = new PythonWorkspaceContextProvider(
                workspaceService,
                new Lazy <IInterpreterOptionsService>(() => optionsService),
                new Lazy <IInterpreterRegistryService>(() => registryService),
                new JoinableTaskContext()
                );

            Assert.AreEqual(workspaceFolder1, provider.Workspace.Location);
            Assert.AreEqual(WorkspaceTestHelper.Python27Factory, provider.Workspace.CurrentFactory);

            using (var openEvent = new AutoResetEvent(false))
                using (var initEvent = new AutoResetEvent(false))
                    using (var closingEvent = new AutoResetEvent(false))
                        using (var closedEvent = new AutoResetEvent(false))
                        {
                            provider.WorkspaceOpening     += (sender, e) => { openEvent.Set(); };
                            provider.WorkspaceInitialized += (sender, e) => { initEvent.Set(); };
                            provider.WorkspaceClosed      += (sender, e) => { closedEvent.Set(); };
                            provider.WorkspaceClosing     += (sender, e) => { closingEvent.Set(); };

                            workspaceService.SimulateChangeWorkspace(workspace2);

                            Assert.IsTrue(openEvent.WaitOne(1000), $"Expected {nameof(provider.WorkspaceOpening)}.");
                            Assert.IsTrue(initEvent.WaitOne(1000), $"Expected {nameof(provider.WorkspaceInitialized)}.");
                            Assert.IsTrue(closingEvent.WaitOne(1000), $"Expected {nameof(provider.WorkspaceClosing)}.");
                            Assert.IsTrue(closedEvent.WaitOne(1000), $"Expected {nameof(provider.WorkspaceClosed)}.");

                            Assert.AreEqual(workspaceFolder2, provider.Workspace.Location);
                            Assert.AreEqual(WorkspaceTestHelper.Python37Factory, provider.Workspace.CurrentFactory);
                        }
        }
        public void DetectLocalEnvOutsideWorkspace()
        {
            var python = PythonPaths.Python37_x64 ?? PythonPaths.Python37;

            var tempFolder      = TestData.GetTempPath();
            var workspaceFolder = Path.Combine(tempFolder, "workspace");
            var envFolder       = Path.Combine(tempFolder, "outside");

            Directory.CreateDirectory(workspaceFolder);
            File.WriteAllText(Path.Combine(workspaceFolder, "app.py"), string.Empty);

            // Create virtual env outside the workspace folder
            using (var p = ProcessOutput.RunHiddenAndCapture(python.InterpreterPath, "-m", "venv", envFolder))
            {
                Console.WriteLine(p.Arguments);
                p.Wait();
                Console.WriteLine(string.Join(Environment.NewLine, p.StandardOutputLines.Concat(p.StandardErrorLines)));
                Assert.AreEqual(0, p.ExitCode);
            }

            // Normally a local virtual environment outside the workspace
            // wouldn't be detected, but it is when it's referenced from
            // the workspace python settings.
            WorkspaceTestHelper.MockWorkspace                workspace                = new WorkspaceTestHelper.MockWorkspace(workspaceFolder);
            WorkspaceTestHelper.MockWorkspaceContext         workspaceContext         = new WorkspaceTestHelper.MockWorkspaceContext(workspace, @"..\outside\scripts\python.exe");
            WorkspaceTestHelper.MockWorkspaceContextProvider workspaceContextProvider = new WorkspaceTestHelper.MockWorkspaceContextProvider(workspaceContext);

            using (var factoryProvider = new WorkspaceInterpreterFactoryProvider(workspaceContextProvider))
            {
                workspaceContextProvider.SimulateChangeWorkspace(workspaceContext);
                var configs = factoryProvider.GetInterpreterConfigurations().ToArray();

                Assert.AreEqual(1, configs.Length);
                Assert.IsTrue(PathUtils.IsSamePath(
                                  Path.Combine(envFolder, "scripts", "python.exe"),
                                  configs[0].InterpreterPath
                                  ));
                Assert.AreEqual("Workspace|Workspace|outside", configs[0].Id);
            }
        }
예제 #8
0
 public MockWorkspaceContext(WorkspaceTestHelper.MockWorkspace workspace, string interpreterSetting = null)
 {
     _workspace          = workspace;
     _interpreterSetting = interpreterSetting;
 }