Exemple #1
0
        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);
            }
        }