private async Task FullStdLibTest(PythonVersion v, params string[] skipModules) { v.AssertInstalled(); var factory = new AstPythonInterpreterFactory(v.Configuration, new InterpreterFactoryCreationOptions { DatabasePath = TestData.GetTempPath(), UseExistingCache = false }); var modules = ModulePath.GetModulesInLib(v.PrefixPath).ToList(); var skip = new HashSet <string>(skipModules); skip.UnionWith(new[] { "matplotlib.backends._backend_gdk", "matplotlib.backends._backend_gtkagg", "matplotlib.backends._gtkagg", }); bool anySuccess = false; bool anyExtensionSuccess = false, anyExtensionSeen = false; bool anyParseError = false; using (var analyzer = new PythonAnalysis(factory)) { try { var tasks = new List <Task <Tuple <ModulePath, IPythonModule> > >(); var interp = (AstPythonInterpreter)analyzer.Analyzer.Interpreter; foreach (var m in skip) { interp.AddUnimportableModule(m); } foreach (var r in modules .Where(m => !skip.Contains(m.ModuleName)) .GroupBy(m => { int i = m.FullName.IndexOf('.'); return(i <= 0 ? m.FullName : m.FullName.Remove(i)); }) .AsParallel() .SelectMany(g => g.Select(m => Tuple.Create(m, interp.ImportModule(m.ModuleName)))) ) { var modName = r.Item1; var mod = r.Item2; anyExtensionSeen |= modName.IsNativeExtension; if (mod == null) { Trace.TraceWarning("failed to import {0} from {1}", modName.ModuleName, modName.SourceFile); } else if (mod is AstScrapedPythonModule smod) { if (smod.ParseErrors?.Any() ?? false) { anyParseError = true; Trace.TraceError("Parse errors in {0}", modName.SourceFile); foreach (var e in smod.ParseErrors) { Trace.TraceError(e); } } else { anySuccess = true; anyExtensionSuccess |= modName.IsNativeExtension; mod.GetMemberNames(analyzer.ModuleContext).ToList(); } } else if (mod is AstPythonModule) { // pass } else { Trace.TraceError("imported {0} as type {1}", modName.ModuleName, mod.GetType().FullName); } } } finally { _analysisLog = analyzer.GetLogContent(CultureInfo.InvariantCulture); } } Assert.IsTrue(anySuccess, "failed to import any modules at all"); Assert.IsTrue(anyExtensionSuccess || !anyExtensionSeen, "failed to import all extension modules"); Assert.IsFalse(anyParseError, "parse errors occurred"); }