diff --git a/_CodeAnalysis.docx b/_CodeAnalysis.docx index e6c1cc4..296fdd0 100644 Binary files a/_CodeAnalysis.docx and b/_CodeAnalysis.docx differ diff --git a/src/NatsnudaLibrary/IRandom.cs b/src/NatsnudaLibrary/IRandom.cs index 0e741cf..bd0a335 100644 --- a/src/NatsnudaLibrary/IRandom.cs +++ b/src/NatsnudaLibrary/IRandom.cs @@ -26,6 +26,10 @@ public interface IRandom /// /// A 32-bit signed integer that is greater than or equal to 0 and less than /// . + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Microsoft.Naming", + "CA1716:IdentifiersShouldNotMatchKeywords", + Justification = "Matching existing interface with reserved language keyword.")] int Next(); /// @@ -35,6 +39,10 @@ public interface IRandom /// /// A 32-bit signed integer that is greater than or equal to 0, and less than /// . + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Microsoft.Naming", + "CA1716:IdentifiersShouldNotMatchKeywords", + Justification = "Matching existing interface with reserved language keyword.")] int Next(int maxValue); /// @@ -46,6 +54,10 @@ public interface IRandom /// /// A 32-bit signed integer that is greater than or equal to /// , and less than . + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Microsoft.Naming", + "CA1716:IdentifiersShouldNotMatchKeywords", + Justification = "Matching existing interface with reserved language keyword.")] int Next(int minValue, int maxValue); /// diff --git a/src/NatsnudaLibrary/NatsnudaLibrary.ruleset b/src/NatsnudaLibrary/NatsnudaLibrary.ruleset index 2488a2f..a505f22 100644 --- a/src/NatsnudaLibrary/NatsnudaLibrary.ruleset +++ b/src/NatsnudaLibrary/NatsnudaLibrary.ruleset @@ -18,5 +18,6 @@ + \ No newline at end of file diff --git a/src/NatsnudaLibrary/SystemDateTimeProvider.cs b/src/NatsnudaLibrary/SystemDateTimeProvider.cs index c30bf9a..cbc3e81 100644 --- a/src/NatsnudaLibrary/SystemDateTimeProvider.cs +++ b/src/NatsnudaLibrary/SystemDateTimeProvider.cs @@ -27,9 +27,17 @@ namespace Natsnudasoft.NatsnudaLibrary public class SystemDateTimeProvider : IDateTimeProvider { /// + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Menees.Analyzers", + "MEN013:UseUTCTime", + Justification = "Matching existing implementation.")] public DateTime Now => DateTime.Now; /// + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Menees.Analyzers", + "MEN013:UseUTCTime", + Justification = "Matching existing implementation.")] public DateTime Today => DateTime.Today; /// diff --git a/src/TestExtensions/EqualsOverrideTheoriesSuccessiveAssertion.cs b/src/TestExtensions/EqualsOverrideTheoriesSuccessiveAssertion.cs index a4b7d75..3a8d38f 100644 --- a/src/TestExtensions/EqualsOverrideTheoriesSuccessiveAssertion.cs +++ b/src/TestExtensions/EqualsOverrideTheoriesSuccessiveAssertion.cs @@ -97,8 +97,7 @@ protected override void VerifyEqualsMethod(MethodInfo methodInfo) methodInfo.ReflectedType.Name, i)); } - else if (methodInfo.GetParameters().Single().ParameterType - .IsAssignableFrom(right.GetType())) + else if (methodInfo.GetParameters().Single().ParameterType.IsInstanceOfType(right)) { var expectedResult = equalsOverrideTheory.ExpectedResult; var resultsMatchExpected = Enumerable.Range(0, this.SuccessiveCount) diff --git a/src/TestExtensions/ExceptionBehaviorExpectation.cs b/src/TestExtensions/ExceptionBehaviorExpectation.cs index 6084495..06c0801 100644 --- a/src/TestExtensions/ExceptionBehaviorExpectation.cs +++ b/src/TestExtensions/ExceptionBehaviorExpectation.cs @@ -113,6 +113,10 @@ public class ExceptionBehaviorExpectation : IBehaviorExpectation /// The command whose behaviour must be examined. /// is /// . + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Microsoft.Design", + "CA1031:DoNotCatchGeneralExceptionTypes", + Justification = "Exception is propagated by guard clause.")] public void Verify(IGuardClauseCommand command) { ParameterValidation.IsNotNull(command, nameof(command)); diff --git a/src/TestExtensions/ParameterNullReferenceBehaviorExpectation.cs b/src/TestExtensions/ParameterNullReferenceBehaviorExpectation.cs index 520ff38..ea7c104 100644 --- a/src/TestExtensions/ParameterNullReferenceBehaviorExpectation.cs +++ b/src/TestExtensions/ParameterNullReferenceBehaviorExpectation.cs @@ -71,6 +71,10 @@ public ParameterNullReferenceBehaviorExpectation(ISpecimenBuilder specimenBuilde /// The command whose behaviour must be examined. /// is /// . + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Microsoft.Design", + "CA1031:DoNotCatchGeneralExceptionTypes", + Justification = "Exception is propagated by guard clause.")] public void Verify(IGuardClauseCommand command) { ParameterValidation.IsNotNull(command, nameof(command)); diff --git a/src/TestExtensions/ParameterSpecimenBuilder.cs b/src/TestExtensions/ParameterSpecimenBuilder.cs index 9ea706c..c41d74b 100644 --- a/src/TestExtensions/ParameterSpecimenBuilder.cs +++ b/src/TestExtensions/ParameterSpecimenBuilder.cs @@ -108,7 +108,7 @@ public object Create(object request, ISpecimenContext context) var parameterInfo = request as ParameterInfo; if (parameterInfo != null && parameterInfo.Member.DeclaringType == this.DeclaringType && - parameterInfo.ParameterType.IsAssignableFrom(this.SpecimenValue.GetType()) && + parameterInfo.ParameterType.IsInstanceOfType(this.SpecimenValue) && parameterInfo.Name == this.ParameterName) { specimen = this.SpecimenValue; diff --git a/src/TestExtensions/PropertyChangedRaisedException.cs b/src/TestExtensions/PropertyChangedRaisedException.cs index 43846d4..b169d77 100644 --- a/src/TestExtensions/PropertyChangedRaisedException.cs +++ b/src/TestExtensions/PropertyChangedRaisedException.cs @@ -30,8 +30,13 @@ namespace Natsnudasoft.NatsnudaLibrary.TestExtensions [Serializable] public sealed class PropertyChangedRaisedException : Exception { + private const string PropertyInfoTypeName = nameof(PropertyInfo) + "TypeName"; + private const string PropertyInfoMemberName = nameof(PropertyInfo) + "MemberName"; private const string DefaultMessage = "A property did not raise the PropertyChanged event."; + [NonSerialized] + private readonly PropertyInfo propertyInfo; + /// /// Initializes a new instance of the class. /// @@ -75,7 +80,7 @@ public PropertyChangedRaisedException(string message, Exception innerException) public PropertyChangedRaisedException(PropertyInfo propertyInfo) : base(CreateMessage(propertyInfo)) { - this.PropertyInfo = propertyInfo; + this.propertyInfo = propertyInfo; } /// @@ -90,29 +95,35 @@ public PropertyChangedRaisedException(PropertyInfo propertyInfo) Exception innerException) : base(CreateMessage(propertyInfo), innerException) { - this.PropertyInfo = propertyInfo; + this.propertyInfo = propertyInfo; } [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] private PropertyChangedRaisedException(SerializationInfo info, StreamingContext context) : base(info, context) { - this.PropertyInfo = (PropertyInfo)info - .GetValue(nameof(this.PropertyInfo), typeof(PropertyInfo)); + var typeName = info.GetString(PropertyInfoTypeName); + var memberName = info.GetString(PropertyInfoMemberName); + const BindingFlags bindingFlags = BindingFlags.Static | + BindingFlags.Instance | + BindingFlags.Public | + BindingFlags.NonPublic; + this.propertyInfo = Type.GetType(typeName).GetProperty(memberName, bindingFlags); } /// /// Gets the property information for the property that did correctly raise the /// PropertyChanged event. /// - public PropertyInfo PropertyInfo { get; } + public PropertyInfo PropertyInfo => this.propertyInfo; /// [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { base.GetObjectData(info, context); - info.AddValue(nameof(this.PropertyInfo), this.PropertyInfo); + info.AddValue(PropertyInfoTypeName, this.PropertyInfo.DeclaringType.FullName); + info.AddValue(PropertyInfoMemberName, this.PropertyInfo.Name); } private static string CreateMessage(PropertyInfo propertyInfo) diff --git a/src/TestExtensions/TestExtensions.ruleset b/src/TestExtensions/TestExtensions.ruleset index 8572c08..9168ea3 100644 --- a/src/TestExtensions/TestExtensions.ruleset +++ b/src/TestExtensions/TestExtensions.ruleset @@ -18,5 +18,6 @@ + \ No newline at end of file diff --git a/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideAssertionTests.cs b/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideAssertionTests.cs index 19fbd0e..d09feb5 100644 --- a/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideAssertionTests.cs +++ b/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideAssertionTests.cs @@ -89,7 +89,7 @@ public void VerifyWithMethodThatIsNotEqualsMethodIsNotInvoked() { var sutMock = new Mock(new Mock().Object) { - CallBase = true + CallBase = true, }; var sut = sutMock.Object; @@ -105,7 +105,7 @@ public void VerifyWithMethodThatIsEqualsMethodIsInvoked() { var sutMock = new Mock(new Mock().Object) { - CallBase = true + CallBase = true, }; var sut = sutMock.Object; diff --git a/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideNewObjectAssertionTests.cs b/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideNewObjectAssertionTests.cs index 47a3641..99c2a27 100644 --- a/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideNewObjectAssertionTests.cs +++ b/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideNewObjectAssertionTests.cs @@ -64,7 +64,7 @@ public void VerifyEqualsMethodWithNonObjectParameterTypeDoesNotInvokeEquals() var verifyHelperMock = new Mock(false, true, false) { - CallBase = true + CallBase = true, }; fixture.Inject(verifyHelperMock.Object); var sut = fixture.Create(); @@ -97,7 +97,7 @@ public void VerifyEqualsMethodCorrectBehaviourInvokesEquals() var verifyHelperMock = new Mock(false, true, false) { - CallBase = true + CallBase = true, }; fixture.Inject(verifyHelperMock.Object); var sut = fixture.Create(); diff --git a/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideNullAssertionTests.cs b/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideNullAssertionTests.cs index d4dd4cb..0aa848a 100644 --- a/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideNullAssertionTests.cs +++ b/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideNullAssertionTests.cs @@ -64,7 +64,7 @@ public void VerifyEqualsMethodWithNonNullableParameterTypeDoesNotInvokeEquals() var fixture = new Fixture(); var verifyHelperMock = new Mock(false, true, false) { - CallBase = true + CallBase = true, }; fixture.Inject(verifyHelperMock.Object); var sut = fixture.Create(); @@ -96,7 +96,7 @@ public void VerifyEqualsMethodCorrectBehaviourInvokesEquals() var fixture = new Fixture(); var verifyHelperMock = new Mock(false, true, false) { - CallBase = true + CallBase = true, }; fixture.Inject(verifyHelperMock.Object); var sut = fixture.Create(); diff --git a/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideOtherSuccessiveAssertionTests.cs b/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideOtherSuccessiveAssertionTests.cs index 33aeb5f..ee64a38 100644 --- a/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideOtherSuccessiveAssertionTests.cs +++ b/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideOtherSuccessiveAssertionTests.cs @@ -65,7 +65,7 @@ public void VerifyEqualsMethodWithObjectParameterTypeDoesNotInvokeEquals() var fixture = new Fixture(); var verifyHelperMock = new Mock(false, true, false) { - CallBase = true + CallBase = true, }; fixture.Inject(verifyHelperMock.Object); var sut = fixture.Create(); @@ -88,7 +88,7 @@ public void VerifyEqualsMethodViolatesEqualsSuccessiveContractThrows() new EqualsOverrideAssertionVerifyHelper( false, false, - () => equalsResultQueue.Dequeue()) + () => equalsResultQueue.Dequeue()), }); fixture.Register(() => verifyHelperQueue.Dequeue()); var sut = fixture.Create(); @@ -106,12 +106,12 @@ public void VerifyEqualsMethodCorrectBehaviourInvokesEquals() var fixture = new Fixture(); var verifyHelperMock = new Mock(false, false, true) { - CallBase = true + CallBase = true, }; var verifyHelperQueue = new Queue(new[] { verifyHelperMock.Object, - new EqualsOverrideAssertionVerifyHelper(false, false, true) + new EqualsOverrideAssertionVerifyHelper(false, false, true), }); fixture.Register(() => verifyHelperQueue.Dequeue()); var sut = fixture.Create(); diff --git a/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideSelfAssertionTests.cs b/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideSelfAssertionTests.cs index 662acb8..d9b11c5 100644 --- a/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideSelfAssertionTests.cs +++ b/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideSelfAssertionTests.cs @@ -64,7 +64,7 @@ public void VerifyEqualsMethodViolatesEqualsSelfContractThrows() var fixture = new Fixture(); var verifyHelperMock = new Mock(false, false, true) { - CallBase = true + CallBase = true, }; fixture.Inject(verifyHelperMock.Object); var sut = fixture.Create(); @@ -82,7 +82,7 @@ public void VerifyEqualsMethodCorrectBehaviourInvokesEquals() var fixture = new Fixture(); var verifyHelperMock = new Mock(false, true, true) { - CallBase = true + CallBase = true, }; fixture.Inject(verifyHelperMock.Object); var sut = fixture.Create(); diff --git a/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideTheoriesSuccessiveAssertionTests.cs b/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideTheoriesSuccessiveAssertionTests.cs index 7ae0fa3..60308f6 100644 --- a/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideTheoriesSuccessiveAssertionTests.cs +++ b/test/unit/NatsnudasoftTests/TestExtension/EqualsOverrideTheoriesSuccessiveAssertionTests.cs @@ -85,7 +85,7 @@ public void VerifyEqualsMethodWithTheoryWithRightThatCannotBeAssignedDoesNotInvo var fixture = new Fixture(); var verifyHelperMock = new Mock(false, true, false) { - CallBase = true + CallBase = true, }; var equalsOverrideTheory = new EqualsOverrideTheory( verifyHelperMock.Object, @@ -131,12 +131,12 @@ public void VerifyEqualsMethodCorrectBehaviourInvokesEquals() var fixture = new Fixture(); var verifyHelperMock = new Mock(false, false, true) { - CallBase = true + CallBase = true, }; var verifyHelperQueue = new Queue(new[] { verifyHelperMock.Object, - new EqualsOverrideAssertionVerifyHelper(false, false, true) + new EqualsOverrideAssertionVerifyHelper(false, false, true), }); fixture.Register(() => verifyHelperQueue.Dequeue()); var equalsOverrideTheory = new EqualsOverrideTheory( diff --git a/test/unit/NatsnudasoftTests/TestExtension/ExceptionBehaviorExpectationTests.cs b/test/unit/NatsnudasoftTests/TestExtension/ExceptionBehaviorExpectationTests.cs index 2198b86..a7209ae 100644 --- a/test/unit/NatsnudasoftTests/TestExtension/ExceptionBehaviorExpectationTests.cs +++ b/test/unit/NatsnudasoftTests/TestExtension/ExceptionBehaviorExpectationTests.cs @@ -85,7 +85,7 @@ public void ConstructorEmptyValuesThrows() var ex = Record.Exception(() => new ExceptionBehaviorExpectation( new Mock().Object, fixture.Create(), - new object[] { })); + Array.Empty())); Assert.IsType(ex); } @@ -100,7 +100,7 @@ public void Constructor2EmptyValuesThrows() new Mock().Object, new Mock().Object, fixture.Create(), - new object[] { })); + Array.Empty())); Assert.IsType(ex); } diff --git a/test/unit/NatsnudasoftTests/TestExtension/ParameterTypeFavoringConstructorQueryTests.cs b/test/unit/NatsnudasoftTests/TestExtension/ParameterTypeFavoringConstructorQueryTests.cs index e2b8566..e0381b2 100644 --- a/test/unit/NatsnudasoftTests/TestExtension/ParameterTypeFavoringConstructorQueryTests.cs +++ b/test/unit/NatsnudasoftTests/TestExtension/ParameterTypeFavoringConstructorQueryTests.cs @@ -78,11 +78,15 @@ public void SelectMethodsConstructorFoundReturnsSingleConstructor() var actual = sut.SelectMethods(typeof(SelectConstructorTestClass)); - Assert.Equal(1, actual.Count()); + Assert.Single(actual); Assert.IsType(actual.First()); Assert.Equal(expected, ((ConstructorMethod)actual.First()).Constructor); } + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Microsoft.Performance", + "CA1812:AvoidUninstantiatedInternalClasses", + Justification = "Class is used via reflection.")] private sealed class SelectConstructorTestClass { public SelectConstructorTestClass(int intParameter)