Skip to content
This repository has been archived by the owner on Nov 15, 2021. It is now read-only.

Commit

Permalink
Apply filter to reduce/improve reporting #20
Browse files Browse the repository at this point in the history
  • Loading branch information
sawilde committed Jul 13, 2011
1 parent 4309313 commit c957106
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 7 deletions.
1 change: 1 addition & 0 deletions main/OpenCover.Console/Program.cs
Expand Up @@ -130,6 +130,7 @@ static void Main(string[] args)
catch (Exception ex)
{
System.Console.WriteLine("An exception occured: {0}", ex.Message);
System.Console.WriteLine("stack: {0}", ex.StackTrace);
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions main/OpenCover.Framework/Filter.cs
Expand Up @@ -109,6 +109,9 @@ public bool UseAssembly(string assemblyName)

public bool InstrumentClass(string assemblyName, string className)
{
if (string.IsNullOrEmpty(assemblyName)) return false;
if (string.IsNullOrEmpty(className)) return false;

if (ExclusionFilter.Any(keyValuePair => Regex.Match(assemblyName, keyValuePair.Key.WrapWithAnchors()).Success && keyValuePair.Value == ".*"))
{
return false;
Expand Down
Expand Up @@ -13,18 +13,22 @@ namespace OpenCover.Framework.Model
internal class InstrumentationModelBuilder : IInstrumentationModelBuilder
{
private readonly ISymbolManager _symbolManager;
private readonly IFilter _filter;

/// <summary>
/// Standard constructor
/// </summary>
/// <param name="symbolManager">the symbol manager that will provide the data</param>
public InstrumentationModelBuilder(ISymbolManager symbolManager)
/// <param name="filter">A filter to decide whether to include or exclude an assembly or its classes</param>
public InstrumentationModelBuilder(ISymbolManager symbolManager, IFilter filter)
{
_symbolManager = symbolManager;
_filter = filter;
}

public Module BuildModuleModel()
{
if (!_filter.UseAssembly(_symbolManager.ModuleName)) return null;
var module = new Module {ModuleName = _symbolManager.ModuleName, FullName = _symbolManager.ModulePath, Files = _symbolManager.GetFiles()};
module.Classes = _symbolManager.GetInstrumentableTypes();
foreach (var @class in module.Classes)
Expand Down
Expand Up @@ -10,17 +10,19 @@ namespace OpenCover.Framework.Model
public class InstrumentationModelBuilderFactory : IInstrumentationModelBuilderFactory
{
private readonly ICommandLine _commandLine;
private readonly IFilter _filter;

public InstrumentationModelBuilderFactory(ICommandLine commandLine)
public InstrumentationModelBuilderFactory(ICommandLine commandLine, IFilter filter)
{
_commandLine = commandLine;
_filter = filter;
}

public IInstrumentationModelBuilder CreateModelBuilder(string modulePath, string moduleName)
{
var manager = new CecilSymbolManager(_commandLine);
var manager = new CecilSymbolManager(_commandLine, _filter);
manager.Initialise(modulePath, moduleName);
return new InstrumentationModelBuilder(manager);
return new InstrumentationModelBuilder(manager, _filter);
}
}
}
6 changes: 4 additions & 2 deletions main/OpenCover.Framework/Symbols/CecilSymbolManager.cs
Expand Up @@ -22,13 +22,15 @@ internal class CecilSymbolManager : ISymbolManager
{
private const int stepOverLineCode = 0xFEEFEE;
private readonly ICommandLine _commandLine;
private readonly IFilter _filter;
private string _modulePath;
private string _moduleName;
private AssemblyDefinition _sourceAssembly;

public CecilSymbolManager(ICommandLine commandLine)
public CecilSymbolManager(ICommandLine commandLine, IFilter filter)
{
_commandLine = commandLine;
_filter = filter;
}

public string ModulePath
Expand Down Expand Up @@ -99,7 +101,7 @@ public Class[] GetInstrumentableTypes()
var classes = new List<Class>();
IEnumerable<TypeDefinition> typeDefinitions = SourceAssembly.MainModule.Types;
GetInstrumentableTypes(typeDefinitions, classes);
return classes.ToArray();
return classes.Where(c => _filter.InstrumentClass(_moduleName, c.FullName)).ToArray();
}

private static void GetInstrumentableTypes(IEnumerable<TypeDefinition> typeDefinitions, List<Class> classes)
Expand Down
Expand Up @@ -2,6 +2,7 @@
using Mono.Cecil;
using Moq;
using NUnit.Framework;
using OpenCover.Framework;
using OpenCover.Framework.Model;
using OpenCover.Framework.Symbols;
using OpenCover.Test.MoqFramework;
Expand All @@ -20,6 +21,10 @@ public void BuildModuleModel_Gets_ModulePath_From_SymbolReader()
.SetupGet(x => x.ModulePath)
.Returns("ModulePath");

Container.GetMock<IFilter>()
.Setup(x => x.UseAssembly(It.IsAny<string>()))
.Returns(true);

// act
var module = Instance.BuildModuleModel();

Expand All @@ -37,6 +42,10 @@ public void BuildModuleModel_GetsClasses_From_SymbolReader()
.Setup(x => x.GetInstrumentableTypes())
.Returns(new[] {@class});

Container.GetMock<IFilter>()
.Setup(x => x.UseAssembly(It.IsAny<string>()))
.Returns(true);

// act
var module = Instance.BuildModuleModel();

Expand All @@ -63,6 +72,10 @@ public void BuildModuleModel_Gets_ConstructorMethods_From_SymbolReader()
.Setup(x => x.GetSequencePointsForToken(It.IsAny<int>()))
.Returns(new[] {new SequencePoint()});

Container.GetMock<IFilter>()
.Setup(x => x.UseAssembly(It.IsAny<string>()))
.Returns(true);

// act
var module = Instance.BuildModuleModel();

Expand All @@ -89,6 +102,10 @@ public void BuildModuleModel_Gets_DeclaredMethods_From_SymbolReader()
.Setup(x => x.GetSequencePointsForToken(It.IsAny<int>()))
.Returns(new[] { new SequencePoint() });

Container.GetMock<IFilter>()
.Setup(x => x.UseAssembly(It.IsAny<string>()))
.Returns(true);

// act
var module = Instance.BuildModuleModel();

Expand Down Expand Up @@ -116,6 +133,10 @@ public void BuildModuleModel_Gets_SequencePoints_From_SymbolReader()
.Setup(x => x.GetSequencePointsForToken(101))
.Returns(new[] { @seqPoint });

Container.GetMock<IFilter>()
.Setup(x => x.UseAssembly(It.IsAny<string>()))
.Returns(true);

// act
var module = Instance.BuildModuleModel();

Expand All @@ -142,6 +163,10 @@ public void BuildModule_IgnoresMethods_With_NoSequencePoints()
.Setup(x => x.GetSequencePointsForToken(101))
.Returns(default(SequencePoint[]));

Container.GetMock<IFilter>()
.Setup(x => x.UseAssembly(It.IsAny<string>()))
.Returns(true);

// act
var module = Instance.BuildModuleModel();

Expand Down
28 changes: 27 additions & 1 deletion main/OpenCover.Test/Framework/Symbols/CecilSymbolManagerTests.cs
Expand Up @@ -15,14 +15,16 @@ public class CecilSymbolManagerTests
private CecilSymbolManager _reader;
private string _location;
private Mock<ICommandLine> _mockCommandLine;
private Mock<IFilter> _mockFilter;

[SetUp]
public void Setup()
{
_mockCommandLine = new Mock<ICommandLine>();
_mockFilter = new Mock<IFilter>();
_location = Path.Combine(Environment.CurrentDirectory, "OpenCover.Test.dll");

_reader = new CecilSymbolManager(_mockCommandLine.Object);
_reader = new CecilSymbolManager(_mockCommandLine.Object, _mockFilter.Object);
_reader.Initialise(_location, "OpenCover.Test");
}

Expand All @@ -36,6 +38,9 @@ public void Teardown()
public void GetFiles_Returns_AllFiles_InModule()
{
//arrange
_mockFilter
.Setup(x => x.InstrumentClass(It.IsAny<string>(), It.IsAny<string>()))
.Returns(true);

// act
var files = _reader.GetFiles();
Expand All @@ -49,6 +54,9 @@ public void GetFiles_Returns_AllFiles_InModule()
public void GetInstrumentableTypes_Returns_AllTypes_InModule_ThatCanBeInstrumented()
{
// arrange
_mockFilter
.Setup(x => x.InstrumentClass(It.IsAny<string>(), It.IsAny<string>()))
.Returns(true);

// act
var types = _reader.GetInstrumentableTypes();
Expand All @@ -62,9 +70,14 @@ public void GetInstrumentableTypes_Returns_AllTypes_InModule_ThatCanBeInstrument
public void GetConstructorsForType_Returns_AllDeclared_ForType()
{
// arrange
_mockFilter
.Setup(x => x.InstrumentClass(It.IsAny<string>(), It.IsAny<string>()))
.Returns(true);

var types = _reader.GetInstrumentableTypes();
var type = types.Where(x => x.FullName == "OpenCover.Test.Samples.DeclaredConstructorClass").First();


// act
var ctors = _reader.GetConstructorsForType(type, new File[0]);

Expand All @@ -76,9 +89,14 @@ public void GetConstructorsForType_Returns_AllDeclared_ForType()
public void GetMethodsForType_Returns_AllDeclared_ForType()
{
// arrange
_mockFilter
.Setup(x => x.InstrumentClass(It.IsAny<string>(), It.IsAny<string>()))
.Returns(true);

var types = _reader.GetInstrumentableTypes();
var type = types.Where(x => x.FullName == "OpenCover.Test.Samples.DeclaredMethodClass").First();


// act
var methods = _reader.GetMethodsForType(type, new File[0]);

Expand All @@ -90,6 +108,10 @@ public void GetMethodsForType_Returns_AllDeclared_ForType()
public void GetSequencePointsForMethodToken()
{
// arrange
_mockFilter
.Setup(x => x.InstrumentClass(It.IsAny<string>(), It.IsAny<string>()))
.Returns(true);

var types = _reader.GetInstrumentableTypes();
var type = types.Where(x => x.FullName == "OpenCover.Test.Samples.DeclaredMethodClass").First();
var methods = _reader.GetMethodsForType(type, new File[0]);
Expand All @@ -105,6 +127,10 @@ public void GetSequencePointsForMethodToken()
public void GetSequencePointsForConstructorToken()
{
// arrange
_mockFilter
.Setup(x => x.InstrumentClass(It.IsAny<string>(), It.IsAny<string>()))
.Returns(true);

var types = _reader.GetInstrumentableTypes();
var type = types.Where(x => x.FullName == "OpenCover.Test.Samples.DeclaredConstructorClass").First();
var ctors = _reader.GetConstructorsForType(type, new File[0]);
Expand Down

0 comments on commit c957106

Please sign in to comment.