public TestContainer(TestContainerList containers, IVsProject project, string source)
     : base(containers.Discoverer, source)
 {
     Project = project;
     ProjectDirectory = project.GetProjectDir();
     BaseDirectory = Discoverer.BaseDirectory;
     Name = string.Join("/", new[] {
         Project.GetProjectName(),
         Path.GetDirectoryName(GetRelativePath(Source)).Replace('\\', '/')
     }.Where(s => !string.IsNullOrWhiteSpace(s)));
     Logger = new TestLogger(Discoverer.Logger, Name);
     ServerLogger = CreateServerLogger();
     Logger.Debug("Creating TestContainer for {0}", GetRelativePath(Source));
     Containers = containers;
     SourceSettings = Discoverer.TestSettings.AddSource(Name, Source);
     try
     {
         Init();
     }
     catch (Exception ex)
     {
         Validate(false, "Error: " + ex.Message);
         Logger.Error(ex, "Could not load tests");
     }
     FileWatchers = GetFileWatchers().Where(f => f != null).ToList();
     if (IsValid)
     {
         SourceSettingsPersister.Save(Discoverer.TestAdapterInfo.SettingsFileDirectory, SourceSettings);
         StartTestServer();
     }
     if (!IsValid)
     {
         Logger.Warn(InvalidReason);
     }
     else
     {
         Logger.Debug("TestContainer created");
     }
 }
        public IEnumerable <ITestContainer> GetTestContainers(IVsProject project)
        {
            if (!project.IsTestProject(Guids.NodejsBaseProjectFactory))
            {
                if (EqtTrace.IsVerboseEnabled)
                {
                    EqtTrace.Verbose("TestContainerDiscoverer: Ignoring project {0} as it is not a Node.js project.", project.GetProjectName());
                }

                yield break;
            }

            project.GetMkDocument(VSConstants.VSITEMID_ROOT, out var path);

            if (this.detectingChanges)
            {
                SaveModifiedFiles(project);
            }

            if (!this.knownProjects.TryGetValue(path, out var projectInfo))
            {
                // Don't return any containers for projects we don't know about.
                yield break;
            }
            projectInfo.HasRequestedContainers = true;

            var latestWrite = project.GetProjectItemPaths().Aggregate(
                this.lastWrite,
                (latest, filePath) =>
            {
                try
                {
                    var ft = File.GetLastWriteTimeUtc(filePath);
                    return((ft > latest) ? ft : latest);
                }
                catch (UnauthorizedAccessException)
                {
                }
                catch (ArgumentException)
                {
                }
                catch (IOException)
                {
                }
                return(latest);
            });

            var architecture = Architecture.X86;

            // TODO: Read the architecture from the project

            yield return(new TestContainer(this, path, latestWrite, architecture));
        }
        public IEnumerable<ITestContainer> GetTestContainers(IVsProject project) {
            if (!project.IsTestProject(GuidList.guidPythonProjectGuid)) {
                if (EqtTrace.IsVerboseEnabled) {
                    EqtTrace.Verbose("TestContainerDiscoverer: Ignoring project {0} as it is not a test project.", project.GetProjectName());
                }

                yield break;
            }

            string path;
            project.GetMkDocument(VSConstants.VSITEMID_ROOT, out path);

            if (_detectingChanges) {
                SaveModifiedFiles(project);
            }

            ProjectInfo projectInfo;
            if (!_knownProjects.TryGetValue(path, out projectInfo)) {
                // Don't return any containers for projects we don't know about.
                yield break;
            }
            projectInfo.HasRequestedContainers = true;
            
            var latestWrite = project.GetProjectItemPaths().Aggregate(
                _lastWrite,
                (latest, filePath) => {
                    try {
                        var ft = File.GetLastWriteTimeUtc(filePath);
                        return (ft > latest) ? ft : latest;
                    } catch (UnauthorizedAccessException) {
                    } catch (ArgumentException) {
                    } catch (IOException) {
                    }
                    return latest;
                });
            
            var architecture = Architecture.X86;
            // TODO: Read the architecture from the project

            yield return new TestContainer(this, path, latestWrite, architecture);
        }