internal DiscoverSinkTrampoline( string targetAssemblyPath, ITestDiscoverSink parentSink, Dictionary <string, SymbolInformation> symbolInformations) { Debug.Assert(!string.IsNullOrWhiteSpace(targetAssemblyPath)); Debug.Assert(parentSink != null); targetAssemblyPath_ = targetAssemblyPath; parentSink_ = parentSink; symbolInformations_ = symbolInformations; }
/// <summary> /// Test execute target assembly. /// </summary> /// <param name="targetAssemblyPath">Target assembly path</param> /// <param name="sink">Execution logger interface</param> public async Task DiscoverAsync( string targetAssemblyPath, ITestDiscoverSink sink) { Debug.Assert(!string.IsNullOrWhiteSpace(targetAssemblyPath)); Debug.Assert(sink != null); try { // FIXME: discoverer can not execute... Please update FSharp.Core.Service // Step1: Parse F# source code and discover AST tree, retreive symbol informations. //var symbols = await this.InternalExecuteAsync<IDiscoverer, SymbolInformation[]>( // testDiscovererPath_, // testDiscovererTypeName_, // testDiscovererPath_, // discoverer => discoverer.Discover(targetAssemblyPath)); // var symbols = new SymbolInformationDiscoverer(targetAssemblyPath) // .Discover(); // Take last item, most deepest information. // var grouped = symbols var grouped = new SymbolInformation[] { } .GroupBy(symbol => symbol.SymbolName) #if DEBUG .ToArray() #endif ; var symbolDictionary = grouped. ToDictionary(g => g.Key, g => g.Last()); #if DEBUG foreach (var g in grouped.Where(g => g.Count() >= 2)) { Debug.WriteLine(string.Format( "Discover: Duplicate symbol: SymbolName={0}, Entries=[{1}]", g.Key, string.Join(",", g.Select(si => string.Format("{0}({1},{2})", Path.GetFileName(si.FileName), si.MinLineNumber, si.MinColumnNumber))))); } var fileName = Path.GetFileName(targetAssemblyPath); foreach (var entry in symbolDictionary) { Debug.WriteLine(string.Format( "Discover: FileName={0}, SymbolName={1}, Position={2},{3}", fileName, entry.Key, entry.Value.MinLineNumber, entry.Value.MinColumnNumber)); } #endif // Step2: Traverse target test assembly, retreive test cases and push to Visual Studio. await this.InternalExecuteAsync <RemotableTestExecutor, bool>( testRunnerAssemblyPath_, typeof(RemotableTestExecutor).FullName, targetAssemblyPath, executor => { executor.Discover( targetAssemblyPath, new DiscoverSinkTrampoline(targetAssemblyPath, sink, symbolDictionary)); return(true); }); } catch (Exception ex) { Trace.WriteLine(ex.ToString()); sink.Message(true, ex.Message); } }