Skip to content

Commit

Permalink
[GH-66] - detecting substituting for internal members for Returns lik…
Browse files Browse the repository at this point in the history
…e calls - vb
  • Loading branch information
tpodolak committed Feb 10, 2019
1 parent c67c0d4 commit c3fd691
Show file tree
Hide file tree
Showing 14 changed files with 1,156 additions and 112 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ public abstract class NonVirtualSetupDiagnosticVerifier : VisualBasicDiagnosticV
{
internal AnalyzersSettings Settings { get; set; }

protected DiagnosticDescriptor Descriptor { get; } = DiagnosticDescriptors<DiagnosticDescriptorsProvider>.NonVirtualSetupSpecification;
protected DiagnosticDescriptor NonVirtualSetupSpecificationDescriptor { get; } = DiagnosticDescriptors<DiagnosticDescriptorsProvider>.NonVirtualSetupSpecification;

protected DiagnosticDescriptor InternalSetupSpecificationDescriptor { get; } = DiagnosticDescriptors<DiagnosticDescriptorsProvider>.InternalSetupSpecification;

[CombinatoryTheory]
[InlineData]
Expand Down Expand Up @@ -139,11 +141,29 @@ public abstract class NonVirtualSetupDiagnosticVerifier : VisualBasicDiagnosticV
public abstract Task ReportsNoDiagnosticsForSuppressedMember_WhenSuppressingExtensionMethod(string method);

[CombinatoryTheory]
[InlineData]
[InlineData(".Bar", "Internal member Bar can not be intercepted.")]
[InlineData(".FooBar()", "Internal member FooBar can not be intercepted.")]
[InlineData("(0)", "Internal member Item can not be intercepted.")]
public abstract Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToNotApplied(string method, string call, string message);

[CombinatoryTheory]
[InlineData(".Bar")]
[InlineData(".FooBar()")]
[InlineData("(0)")]
public abstract Task ReportsNoDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToApplied(string method, string call);

[CombinatoryTheory]
[InlineData(".Bar", "Internal member Bar can not be intercepted.")]
[InlineData(".FooBar()", "Internal member FooBar can not be intercepted.")]
[InlineData("(0)", "Internal member Item can not be intercepted.")]
public abstract Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToAppliedToWrongAssembly(string method, string call, string message);

[CombinatoryTheory]
[InlineData(".Bar")]
[InlineData(".FooBar()")]
[InlineData("(0)")]
public abstract Task ReportsNoDiagnostics_WhenSettingValueForProtectedInternalVirtualMember(string method, string call);

protected override DiagnosticAnalyzer GetDiagnosticAnalyzer()
{
return new NonVirtualSetupAnalyzer();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ End Sub
End Class
End Namespace
";
await VerifyDiagnostic(source, Descriptor, "Member Bar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
await VerifyDiagnostic(source, NonVirtualSetupSpecificationDescriptor, "Member Bar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
}

[CombinatoryData("Returns", "ReturnsForAnyArgs")]
Expand All @@ -50,7 +50,7 @@ End Sub
End Class
End Namespace
";
await VerifyDiagnostic(source, Descriptor, $"Member {literal} can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
await VerifyDiagnostic(source, NonVirtualSetupSpecificationDescriptor, $"Member {literal} can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
}

public override async Task ReportsDiagnostics_WhenSettingValueForStaticMethod(string method)
Expand All @@ -74,7 +74,7 @@ End Sub
End Class
End Namespace
";
await VerifyDiagnostic(source, Descriptor, "Member Bar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
await VerifyDiagnostic(source, NonVirtualSetupSpecificationDescriptor, "Member Bar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
}

public override async Task ReportsNoDiagnostics_WhenSettingValueForVirtualMethod(string method)
Expand Down Expand Up @@ -210,7 +210,7 @@ End Sub
End Class
End Namespace
";
await VerifyDiagnostic(source, Descriptor, "Member Bar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
await VerifyDiagnostic(source, NonVirtualSetupSpecificationDescriptor, "Member Bar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
}

public override async Task ReportsNoDiagnostics_WhenSettingValueForAbstractMethod(string method)
Expand Down Expand Up @@ -402,7 +402,7 @@ End Sub
End Class
End Namespace";

await VerifyDiagnostic(source, Descriptor, "Member Bar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
await VerifyDiagnostic(source, NonVirtualSetupSpecificationDescriptor, "Member Bar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
}

public override async Task ReportsNoDiagnostics_WhenSettingValueForVirtualIndexer(string method)
Expand Down Expand Up @@ -462,7 +462,7 @@ End Sub
End Class
End Namespace";

await VerifyDiagnostic(source, Descriptor, "Member Item can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
await VerifyDiagnostic(source, NonVirtualSetupSpecificationDescriptor, "Member Item can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
}

public override async Task ReportsNoDiagnostics_WhenUsingUnfortunatelyNamedMethod(string method)
Expand Down Expand Up @@ -521,7 +521,7 @@ End Class
End Namespace
";

await VerifyDiagnostic(source, Descriptor, "Member FooBar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
await VerifyDiagnostic(source, NonVirtualSetupSpecificationDescriptor, "Member FooBar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
}

public override async Task ReportsNoDiagnosticsForSuppressedMember_WhenSuppressingNonVirtualGenericProperty(string method)
Expand All @@ -546,7 +546,7 @@ End Class
End Namespace
";

await VerifyDiagnostic(source, Descriptor, "Member FooBar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
await VerifyDiagnostic(source, NonVirtualSetupSpecificationDescriptor, "Member FooBar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
}

public override async Task ReportsNoDiagnosticsForSuppressedMember_WhenSuppressingNonVirtualMethod(string method)
Expand Down Expand Up @@ -576,7 +576,7 @@ End Class
End Namespace
";

await VerifyDiagnostic(source, Descriptor, "Member Bar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
await VerifyDiagnostic(source, NonVirtualSetupSpecificationDescriptor, "Member Bar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
}

public override async Task ReportsNoDiagnosticsForSuppressedMember_WhenSuppressingNonVirtualGenericMethod(string method)
Expand Down Expand Up @@ -606,7 +606,7 @@ End Class
End Namespace
";

await VerifyDiagnostic(source, Descriptor, "Member Bar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
await VerifyDiagnostic(source, NonVirtualSetupSpecificationDescriptor, "Member Bar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
}

public override async Task ReportsNoDiagnosticsForSuppressedMember_WhenSuppressingNonVirtualIndexer(string method)
Expand Down Expand Up @@ -640,7 +640,7 @@ End Class
End Namespace
";

await VerifyDiagnostic(source, Descriptor, "Member Item can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
await VerifyDiagnostic(source, NonVirtualSetupSpecificationDescriptor, "Member Item can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
}

public override async Task ReportsNoDiagnosticsForSuppressedMember_WhenSuppressingNonVirtualGenericIndexer(string method)
Expand Down Expand Up @@ -674,7 +674,7 @@ End Class
End Namespace
";

await VerifyDiagnostic(source, Descriptor, "Member Item can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
await VerifyDiagnostic(source, NonVirtualSetupSpecificationDescriptor, "Member Item can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
}

public override async Task ReportsNoDiagnosticsForSuppressedMember_WhenSuppressingMembersFromEntireType(string method)
Expand Down Expand Up @@ -736,7 +736,7 @@ End Namespace
"Member FooBar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted."
};

var diagnostics = textParserResult.Spans.Select((span, idx) => CreateDiagnostic(Descriptor.OverrideMessage(diagnosticMessages[idx]), span.Span, span.LineSpan)).ToArray();
var diagnostics = textParserResult.Spans.Select((span, idx) => CreateDiagnostic(NonVirtualSetupSpecificationDescriptor.OverrideMessage(diagnosticMessages[idx]), span.Span, span.LineSpan)).ToArray();

await VerifyDiagnostic(textParserResult.Text, diagnostics);
}
Expand Down Expand Up @@ -800,7 +800,7 @@ End Namespace
"Member FooBar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted."
};

var diagnostics = textParserResult.Spans.Select((span, idx) => CreateDiagnostic(Descriptor.OverrideMessage(diagnosticMessages[idx]), span.Span, span.LineSpan)).ToArray();
var diagnostics = textParserResult.Spans.Select((span, idx) => CreateDiagnostic(NonVirtualSetupSpecificationDescriptor.OverrideMessage(diagnosticMessages[idx]), span.Span, span.LineSpan)).ToArray();

await VerifyDiagnostic(textParserResult.Text, diagnostics);
}
Expand Down Expand Up @@ -867,7 +867,7 @@ End Namespace
"Member FooBar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted."
};

var diagnostics = textParserResult.Spans.Select((span, idx) => CreateDiagnostic(Descriptor.OverrideMessage(diagnosticMessages[idx]), span.Span, span.LineSpan)).ToArray();
var diagnostics = textParserResult.Spans.Select((span, idx) => CreateDiagnostic(NonVirtualSetupSpecificationDescriptor.OverrideMessage(diagnosticMessages[idx]), span.Span, span.LineSpan)).ToArray();

await VerifyDiagnostic(textParserResult.Text, diagnostics);
}
Expand Down Expand Up @@ -913,7 +913,133 @@ Function Bar() As Integer
End Interface
End Namespace";

await VerifyDiagnostic(source, Descriptor, "Member GetFooBar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
await VerifyDiagnostic(source, NonVirtualSetupSpecificationDescriptor, "Member GetFooBar can not be intercepted. Only interface members and overrideable, overriding, and must override members can be intercepted.");
}

public override async Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToNotApplied(string method, string call, string message)
{
var source = $@"Imports NSubstitute
Namespace MyNamespace
Public Class Foo
Friend Overridable ReadOnly Property Bar As Integer
Friend Overridable Function FooBar() As Integer
Return 1
End Function
Default Friend Overridable ReadOnly Property Item(ByVal x As Integer) As Integer
Get
Return 1
End Get
End Property
End Class
Public Class FooTests
Public Sub Test()
Dim substitute = NSubstitute.Substitute.[For](Of Foo)()
Dim x = [|substitute{call}|].{method}(1)
End Sub
End Class
End Namespace";

await VerifyDiagnostic(source, InternalSetupSpecificationDescriptor, message);
}

public override async Task ReportsNoDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToApplied(string method, string call)
{
var source = $@"Imports NSubstitute
<Assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""OtherFirstAssembly"")>
<Assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""DynamicProxyGenAssembly2"")>
<Assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""OtherSecondAssembly"")>
Namespace MyNamespace
Public Class Foo
Friend Overridable ReadOnly Property Bar As Integer
Friend Overridable Function FooBar() As Integer
Return 1
End Function
Default Friend Overridable ReadOnly Property Item(ByVal x As Integer) As Integer
Get
Return 1
End Get
End Property
End Class
Public Class FooTests
Public Sub Test()
Dim substitute = NSubstitute.Substitute.[For](Of Foo)()
Dim x = substitute{call}.{method}(1)
End Sub
End Class
End Namespace";

await VerifyNoDiagnostic(source);
}

public override async Task ReportsDiagnostics_WhenSettingValueForInternalVirtualMember_AndInternalsVisibleToAppliedToWrongAssembly(string method, string call, string message)
{
var source = $@"Imports NSubstitute
<Assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""FirstAssembly"")>
Namespace MyNamespace
Public Class Foo
Friend Overridable ReadOnly Property Bar As Integer
Friend Overridable Function FooBar() As Integer
Return 1
End Function
Default Friend Overridable ReadOnly Property Item(ByVal x As Integer) As Integer
Get
Return 1
End Get
End Property
End Class
Public Class FooTests
Public Sub Test()
Dim substitute = NSubstitute.Substitute.[For](Of Foo)()
Dim x = [|substitute{call}|].{method}(1)
End Sub
End Class
End Namespace";

await VerifyDiagnostic(source, InternalSetupSpecificationDescriptor, message);
}

public override async Task ReportsNoDiagnostics_WhenSettingValueForProtectedInternalVirtualMember(string method, string call)
{
var source = $@"Imports NSubstitute
Namespace MyNamespace
Public Class Foo
Protected Friend Overridable ReadOnly Property Bar As Integer
Protected Friend Overridable Function FooBar() As Integer
Return 1
End Function
Default Protected Friend Overridable ReadOnly Property Item(ByVal x As Integer) As Integer
Get
Return 1
End Get
End Property
End Class
Public Class FooTests
Public Sub Test()
Dim substitute = NSubstitute.Substitute.[For](Of Foo)()
Dim x = substitute{call}.{method}(1)
End Sub
End Class
End Namespace";

await VerifyNoDiagnostic(source);
}
}
}
Loading

0 comments on commit c3fd691

Please sign in to comment.