Exemple #1
0
        private string GetSourceLocation(IBindingMethod bindingMethod, WarningCollector warningCollector)
        {
            if (bindingMethod is RuntimeBindingMethod runtimeBindingMethod && runtimeBindingMethod.MethodInfo.DeclaringType != null)
            {
                try
                {
                    var symbolReader       = GetOrCreateSymbolReader(runtimeBindingMethod.MethodInfo.DeclaringType.Assembly, warningCollector);
                    var methodSymbol       = symbolReader.ReadMethodSymbol(runtimeBindingMethod.MethodInfo.MetadataToken);
                    var startSequencePoint = methodSymbol?.SequencePoints?.FirstOrDefault(sp => !sp.IsHidden);
                    if (startSequencePoint == null)
                    {
                        return(null);
                    }
                    var sourceKey        = GetKey(_sourceFiles, startSequencePoint.SourcePath);
                    var sourceLocation   = $"#{sourceKey}|{startSequencePoint.StartLine}|{startSequencePoint.StartColumn}";
                    var endSequencePoint = methodSymbol.SequencePoints.LastOrDefault(sp => !sp.IsHidden);
                    if (endSequencePoint != null)
                    {
                        sourceLocation = sourceLocation + $"|{endSequencePoint.EndLine}|{endSequencePoint.EndColumn}";
                    }

                    return(sourceLocation);
                }
                catch (Exception ex)
                {
                    warningCollector.AddWarning("GetSourceLocation", ex);
                    return(null);
                }
            }
            return(null);
        }
Exemple #2
0
        internal DiscoveryResult DiscoverInternal(Assembly testAssembly, string testAssemblyPath, string configFilePath)
        {
            var bindingRegistry = GetBindingRegistry(testAssembly, configFilePath);

            var result           = new DiscoveryResult();
            var warningCollector = new WarningCollector();

            _sourceFiles.Clear();
            GetOrCreateSymbolReader(testAssembly, warningCollector, testAssemblyPath);

            result.StepDefinitions =
                GetStepDefinitions(bindingRegistry).Select(sdb =>
                                                           new StepDefinition
            {
                Type           = sdb.StepDefinitionType.ToString(),
                Regex          = sdb.Regex.ToString(),
                Method         = sdb.Method.ToString(),
                ParamTypes     = GetParamTypes(sdb.Method),
                Scope          = GetScope(sdb),
                SourceLocation = GetSourceLocation(sdb.Method, warningCollector)
            })
                .Distinct()     //TODO: SpecFlow discoverers bindings from external assemblies twice -- needs fix
                .ToArray();
            result.SourceFiles     = _sourceFiles.ToDictionary(sf => sf.Value.ToString(), sf => sf.Key);
            result.TypeNames       = _typeNames.ToDictionary(sf => sf.Value.ToString(), sf => sf.Key);
            result.Warnings        = warningCollector.Warnings;
            result.SpecFlowVersion = typeof(IStepDefinitionBinding).Assembly.Location;
            return(result);
        }
 private IDeveroomSymbolReader GetOrCreateSymbolReader(Assembly assembly, WarningCollector warningCollector, string assemblyFilePath = null)
 {
     if (!_symbolReaders.TryGetValue(assembly, out var symbolReader))
     {
         assemblyFilePath = assemblyFilePath ?? new Uri(assembly.CodeBase).LocalPath;
         symbolReader     = CreateSymbolReader(assemblyFilePath, warningCollector);
         _symbolReaders.Add(assembly, symbolReader);
     }
     return(symbolReader);
 }
        private StepDefinition CreateStepDefinition(IStepDefinitionBinding sdb, WarningCollector warningCollector)
        {
            var stepDefinition = new StepDefinition
            {
                Type           = sdb.StepDefinitionType.ToString(),
                Regex          = sdb.Regex?.ToString(),
                Method         = sdb.Method.ToString(),
                ParamTypes     = GetParamTypes(sdb.Method),
                Scope          = GetScope(sdb),
                SourceLocation = GetSourceLocation(sdb.Method, warningCollector),
                Expression     = GetSourceExpression(sdb),
                Error          = GetError(sdb)
            };

            return(stepDefinition);
        }
        internal DiscoveryResult DiscoverInternal(Assembly testAssembly, string testAssemblyPath, string configFilePath)
        {
            try
            {
                var bindingRegistry = GetBindingRegistry(testAssembly, configFilePath);

                var result           = new DiscoveryResult();
                var warningCollector = new WarningCollector();

                _sourceFiles.Clear();
                GetOrCreateSymbolReader(testAssembly, warningCollector, testAssemblyPath);

                result.StepDefinitions =
                    GetStepDefinitions(bindingRegistry)
                    .Select(sdb => CreateStepDefinition(sdb, warningCollector))
                    .Distinct()     //TODO: SpecFlow discoverers bindings from external assemblies twice -- needs fix
                    .ToArray();
                result.SourceFiles     = _sourceFiles.ToDictionary(sf => sf.Value.ToString(), sf => sf.Key);
                result.TypeNames       = _typeNames.ToDictionary(sf => sf.Value.ToString(), sf => sf.Key);
                result.Warnings        = warningCollector.Warnings;
                result.SpecFlowVersion = typeof(IStepDefinitionBinding).Assembly.Location;
                return(result);
            }
            catch (Exception ex) when(GetRegexError(ex) != null)
            {
                var regexError = GetRegexError(ex);

                return(new DiscoveryResult()
                {
                    SpecFlowVersion = typeof(IStepDefinitionBinding).Assembly.Location,
                    StepDefinitions = new[] {
                        new StepDefinition
                        {
                            Method = "Unknown method",
                            Error = $"Step definition regular expression error: {regexError.Message}"
                        }
                    }
                });
            }
        }
 protected virtual IDeveroomSymbolReader CreateSymbolReader(string assemblyFilePath, WarningCollector warningCollector)
 {
     try
     {
         return(new DnLibDeveroomSymbolReader(assemblyFilePath));
     }
     catch (Exception ex)
     {
         warningCollector.AddWarning($"Unable to create symbol reader for '{assemblyFilePath}'.", ex);
         return(new NullDeveroomSymbolReader());
     }
 }
        protected override IDeveroomSymbolReader CreateSymbolReader(string assemblyFilePath, WarningCollector warningCollector)
        {
            var symbolReaderFactories = new Func <string, IDeveroomSymbolReader>[]
            {
                path => new DnLibDeveroomSymbolReader(path),
                path => new ComDeveroomSymbolReader(path),
            };

            foreach (var symbolReaderFactory in symbolReaderFactories)
            {
                try
                {
                    return(symbolReaderFactory(assemblyFilePath));
                }
                catch (Exception ex)
                {
                    warningCollector.AddWarning($"CreateSymbolReader({assemblyFilePath})", ex);
                }
            }
            return(new NullDeveroomSymbolReader());
        }
 protected override IDeveroomSymbolReader CreateSymbolReader(string assemblyFilePath, WarningCollector warningCollector)
 {
     return(new StubSymbolReader());
 }