// we should raise this event if we update the test containers (due to user file changes) so that VS can update tests // currently we have no file watchers implemented, so this isn't used yet protected virtual void OnTestContainersUpdated(EventArgs e) { Log($"OnTestContainersUpdated() called - file changes detected"); // execute delgate chain for all attached handlers TestContainersUpdated?.Invoke(this, e); }
/// <summary> /// Raises the test containers changed event, returns true if the event was delivered /// or would be delivered and there were no listeners. /// </summary> /// <param name="project">The project which the event is being raised for</param> private bool OnTestContainersChanged(IVsProject project) { // https://pytools.codeplex.com/workitem/1271 // When test explorer kicks off a run it kicks off a test discovery // phase, which kicks off a build, which results in us saving files. // If we raise the files changed event then test explorer immediately turns // around and queries us for the changed files. Then it continues // along with the test discovery phase it was already initiating, and // discovers that no changes have occured - because it already updated // to the latest changes when we informed it our containers had changed. // Therefore if we are both building and detecting changes then we // don't want to raise the event, instead it'll query us in a little // bit and get the most recent changes. if (project != null && project.TryGetProjectPath(out var projectPath) && this.knownProjects.TryGetValue(projectPath, out var projectInfo) && projectInfo != null && projectInfo.HasRequestedContainers) { if (!this.building || !this.detectingChanges) { TestContainersUpdated?.Invoke(this, EventArgs.Empty); return(true); } } return(false); }
internal TestContainerDiscoverer ( [Import(typeof(IOperationState))] IOperationState operationState, [Import(typeof(SVsServiceProvider))] IServiceProvider serviceProvider ) { TestContainersUpdated?.ToString(); Logger.Clear(); Logger.Initialize(serviceProvider, Vsix.Name); CoverageUtil.InstallOrUpdateCoverlet(exception => { if (exception != null) { Logger.Log(exception); return; } operationState.StateChanged += OperationState_StateChanged; Logger.Log("Initialized!"); }); }
internal TestContainerDiscoverer ( [Import(typeof(IOperationState))] IOperationState operationState, [Import(typeof(SVsServiceProvider))] IServiceProvider serviceProvider ) { _serviceProvider = serviceProvider; new Thread(() => { try { Logger.Initialize(_serviceProvider); FCCEngine.Initialize(); Initialize(_serviceProvider); TestContainersUpdated.ToString(); operationState.StateChanged += OperationState_StateChanged; Logger.Log($"Initialized"); } catch (Exception exception) { Logger.Log($"Failed Initialization", exception); } }).Start(); }
private void OnDeferredTestChanged(object state) { // guard against triggering multiple updates during initial load until setup is complete if (!_firstLoad) { TestContainersUpdated?.Invoke(this, EventArgs.Empty); } }
private void OnProjectLoaded(object sender, ProjectEventArgs e) { var pyProj = PythonProject.FromObject(e.Project); if (pyProj != null) { var analyzer = pyProj.Analyzer; _projectInfo[pyProj] = new ProjectInfo(this, pyProj); } TestContainersUpdated?.Invoke(this, EventArgs.Empty); }
private void UpdateTestContainersIfGaugeSpecFile(ProjectItem projectItem) { if (projectItem?.ContainingProject == null) { return; } if (projectItem.ContainingProject.IsGaugeProject() && projectItem.FileNames[0].IsGaugeSpecFile()) { TestContainersUpdated?.Invoke(this, EventArgs.Empty); } }
private void OnProjectUnloaded(object sender, ProjectEventArgs e) { if (e.Project != null) { var pyProj = PythonProject.FromObject(e.Project); ProjectInfo events; if (pyProj != null && _projectInfo.TryGetValue(pyProj, out events) && _projectInfo.Remove(pyProj)) { events.Dispose(); } } TestContainersUpdated?.Invoke(this, EventArgs.Empty); }
private async Task OnProjectLoadedAsync(IVsProject project) { var pyProj = PythonProject.FromObject(project); if (pyProj != null) { var analyzer = await pyProj.GetAnalyzerAsync(); if (analyzer != null) { _projectInfo[pyProj] = new ProjectInfo(this, pyProj); } } TestContainersUpdated?.Invoke(this, EventArgs.Empty); }
private void OnProjectUnloaded(object sender, ProjectEventArgs e) { if (e.Project != null) { var provider = e.Project as IPythonProjectProvider; ProjectInfo events; if (provider != null && _projectInfo.TryGetValue(provider.Project, out events)) { var analyzer = provider.Project.Analyzer; provider.Project.ProjectAnalyzerChanged -= events.ProjectAnalyzerChanged; analyzer.AnalysisComplete -= events.AnalysisComplete; _projectInfo.Remove(provider.Project); } } TestContainersUpdated?.Invoke(this, EventArgs.Empty); }
private void OnProjectLoaded(object sender, ProjectEventArgs e) { if (e.Project != null) { var provider = e.Project as IPythonProjectProvider; if (provider != null) { var analyzer = provider.Project.Analyzer; var projectInfo = new ProjectInfo(this, provider.Project); _projectInfo[provider.Project] = projectInfo; foreach (var file in analyzer.Files) { projectInfo.AnalysisComplete(this, new AnalysisCompleteEventArgs(file)); } } } TestContainersUpdated?.Invoke(this, EventArgs.Empty); }