Skip to content

Commit

Permalink
exclude nested types when declared type is excluded OpenCover#328
Browse files Browse the repository at this point in the history
  • Loading branch information
sawilde committed Aug 8, 2015
1 parent 95495b7 commit 66b0344
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 12 deletions.
1 change: 1 addition & 0 deletions ReleaseNotes.tmp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
Version [[version]]
#329 address ArgumentOutOfRangeException (potentially related to #274) (fix for VS2015)
#335 error on unrecognized arguments/prefixes (fix)
#328 exclude types when declaredtype is excluded (fix-feature)

Version 4.6.166
#323 push releases and candidates to github via appveyor (prj-mgmt)
Expand Down
7 changes: 5 additions & 2 deletions main/OpenCover.Framework/Filter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -153,10 +153,13 @@ public bool ExcludeByAttribute(IMemberDefinition entity)

while (true)
{
if (entity == null || !entity.HasCustomAttributes)
if (entity == null)
return false;

if (ExcludeByAttribute((ICustomAttributeProvider) entity))
if (ExcludeByAttribute((ICustomAttributeProvider)entity))
return true;

if (ExcludeByAttribute(entity.DeclaringType))
return true;

if (entity.DeclaringType == null || !entity.Name.StartsWith("<"))
Expand Down
48 changes: 41 additions & 7 deletions main/OpenCover.Test/Framework/FilterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -600,24 +600,58 @@ public void Can_Identify_Excluded_Assemblies()
Assert.True(filter.ExcludeByAttribute(sourceAssembly));
}

static IEnumerable<TypeDefinition> AllNestedTypes(TypeDefinition typeDefinition)
{
if (typeDefinition.NestedTypes == null) yield break;
foreach (var nestedTypeDefinition in typeDefinition.NestedTypes)
{
yield return nestedTypeDefinition;
foreach (var allNestedType in AllNestedTypes(nestedTypeDefinition))
{
yield return allNestedType;
}
}
}

static IEnumerable<TypeDefinition> AllTypes(ModuleDefinition module)
{
foreach (var typeDefinition in module.Types)
{
yield return typeDefinition;
foreach (var allNestedType in AllNestedTypes(typeDefinition))
{
yield return allNestedType;
}
}
}

[Test]
public void Can_Identify_Excluded_Types()
[TestCase("Concrete")]
[TestCase("InnerConcrete")]
[TestCase("InnerInnerConcrete")]
public void Can_Identify_Excluded_Types(string typeName)
{
// arrange
var sourceAssembly = AssemblyDefinition.ReadAssembly(typeof(Samples.Concrete).Assembly.Location);

// act
var filter = new Filter();
foreach (var typeDefinition in sourceAssembly.MainModule.Types.Where(x => x.Name == "Concrete"))
{
Assert.False(filter.ExcludeByAttribute(typeDefinition));
}
var allTypes = AllTypes(sourceAssembly.MainModule);
var typeDefinition = allTypes.First(x => x.Name == typeName);

Assert.False(filter.ExcludeByAttribute(typeDefinition));

// assert
filter.AddAttributeExclusionFilters(new[] { "*ExcludeClassAttribute" });
foreach (var typeDefinition in sourceAssembly.MainModule.Types.Where(x => x.Name == "Concrete"))
foreach (var methodDefinition in typeDefinition.Methods)
{
if (methodDefinition.IsSetter || methodDefinition.IsGetter) continue;
Assert.True(filter.ExcludeByAttribute(methodDefinition));
}
Assert.True(filter.ExcludeByAttribute(typeDefinition));
foreach (var nestedType in AllNestedTypes(typeDefinition))
{
Assert.True(filter.ExcludeByAttribute(typeDefinition));
Assert.True(filter.ExcludeByAttribute(nestedType));
}
}

Expand Down
31 changes: 28 additions & 3 deletions main/OpenCover.Test/Samples/Samples.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

namespace OpenCover.Test.Samples
{
class ConstructorNotDeclaredClass
{

{
}

class DeclaredConstructorClass
Expand Down Expand Up @@ -193,7 +193,32 @@ public override string Name
[ExcludeMethodAttribute]
public override void Method()
{
throw new NotImplementedException();
throw new NotImplementedException();
}

protected class InnerConcrete
{
public InnerConcrete()
{

}

public void Method()
{
var t = new Task(() =>
{
Method();
Method();
});
}

protected class InnerInnerConcrete
{
public InnerInnerConcrete()
{

}
}
}
}

Expand Down

0 comments on commit 66b0344

Please sign in to comment.