From 55f16ba2c1e8adf09f107bcfa1d1fac2e5b5bf45 Mon Sep 17 00:00:00 2001
From: Piotr Zajac
Date: Sun, 19 Apr 2026 17:15:50 +0200
Subject: [PATCH 1/4] fix: resolve CodeQL warnings across Core and test
projects
- Combine nested if statements in IgnoreVirtualMembersSpecimenBuilder
- Add ToString() override to AbstractTestClass in AutoDataAdapterAttributeTests
- Use object instead of var to fix incomparable-types Equals in ValuesRequestTests
- Remove redundant GetHashCode() call on int in ValuesRequestTests
- Refactor CustomizeFixture foreach to use Select projection in AutoDataAdapterAttribute
- Replace as+Assert.NotNull with Assert.IsType in Assert section in CustomizeWithAttributeTests and AutoDataAttributeProviderTests
Co-Authored-By: Claude Sonnet 4.6
---
.../tasks/task-16 - Fix-CodeQL-warnings.md | 24 +
.../AutoDataAdapterAttributeTests.cs | 344 ++++++------
.../Attributes/CustomizeWithAttributeTests.cs | 504 +++++++++---------
.../AutoDataAttributeProviderTests.cs | 4 +-
.../Requests/ValuesRequestTests.cs | 498 ++++++++---------
.../Attributes/AutoDataAdapterAttribute.cs | 127 +++--
.../IgnoreVirtualMembersSpecimenBuilder.cs | 73 ++-
7 files changed, 795 insertions(+), 779 deletions(-)
create mode 100644 .backlog/tasks/task-16 - Fix-CodeQL-warnings.md
diff --git a/.backlog/tasks/task-16 - Fix-CodeQL-warnings.md b/.backlog/tasks/task-16 - Fix-CodeQL-warnings.md
new file mode 100644
index 00000000..93589a0c
--- /dev/null
+++ b/.backlog/tasks/task-16 - Fix-CodeQL-warnings.md
@@ -0,0 +1,24 @@
+---
+id: TASK-16
+title: Fix CodeQL warnings
+status: Done
+assignee:
+ - piotrzajac
+ - claude
+created_date: '2026-04-19 14:23'
+updated_date: '2026-04-19 15:13'
+labels: []
+dependencies: []
+priority: medium
+---
+
+## Acceptance Criteria
+
+- [x] #1 Collapsible if statements combined (IgnoreVirtualMembersSpecimenBuilder)
+- [x] #2 Default ToString() override added (AbstractTestClass in AutoDataAdapterAttributeTests)
+- [x] #3 Change var to object to resolve incomparable-types Equals warning (ValuesRequestTests)
+- [x] #4 Useless call to GetHashCode() as value is its own hash (ValuesRequestTests)
+- [x] #5 AutoDataAdapterAttribute CustomizeFixture: foreach refactored to use Select projection.
+- [x] #6 CustomizeWithAttributeTests: as+Assert.NotNull replaced with Assert.IsType in Assert section (lines 136, 157)
+- [x] #7 AutoDataAttributeProviderTests: same pattern applied (line 22)
+
diff --git a/src/Objectivity.AutoFixture.XUnit2.Core.Tests/Attributes/AutoDataAdapterAttributeTests.cs b/src/Objectivity.AutoFixture.XUnit2.Core.Tests/Attributes/AutoDataAdapterAttributeTests.cs
index 0fd8b588..8983f90e 100644
--- a/src/Objectivity.AutoFixture.XUnit2.Core.Tests/Attributes/AutoDataAdapterAttributeTests.cs
+++ b/src/Objectivity.AutoFixture.XUnit2.Core.Tests/Attributes/AutoDataAdapterAttributeTests.cs
@@ -1,172 +1,172 @@
-namespace Objectivity.AutoFixture.XUnit2.Core.Tests.Attributes
-{
- using System;
- using System.Diagnostics.CodeAnalysis;
- using System.Linq;
- using System.Reflection;
-
- using global::AutoFixture;
- using global::AutoFixture.Kernel;
- using global::AutoFixture.Xunit2;
- using Objectivity.AutoFixture.XUnit2.Core.Attributes;
-
- using Xunit;
-
- [Collection("AutoDataAdapterAttribute")]
- [Trait("Category", "DataAttribute")]
- [SuppressMessage("Design", "CA1034:Nested types should not be visible", Justification = "Test objects")]
- public class AutoDataAdapterAttributeTests
- {
- [AutoData]
- [Theory(DisplayName = "GIVEN fixture WHEN constructor is invoked THEN passed fixture is being adapted and inline values collection is empty")]
- public void GivenFixture_WhenConstructorIsInvoked_ThenPassedFixtureIsBeingAdaptedAndInlineValuesCollectionIsEmpty(Fixture fixture)
- {
- // Arrange
- // Act
- var attribute = new AutoDataAdapterAttribute(fixture, null);
-
- // Assert
- Assert.Equal(fixture, attribute.AdaptedFixture);
- Assert.Empty(attribute.InlineValues);
- }
-
- [Fact(DisplayName = "GIVEN uninitialized fixture WHEN constructor is invoked THEN exception is thrown")]
- public void GivenUninitializedFixture_WhenConstructorIsInvoked_ThenExceptionIsThrown()
- {
- // Arrange
- // Act
- static object Act() => new AutoDataAdapterAttribute(null);
-
- // Assert
- var exception = Assert.Throws(Act);
- Assert.Equal("fixture", exception.ParamName);
- }
-
- [AutoData]
- [Theory(DisplayName = "GIVEN uninitialized method info WHEN GetData is invoked THEN exception is thrown")]
- public void GivenUninitializedMethodInfo_WhenConstructorIsInvoked_ThenExceptionIsThrown(Fixture fixture)
- {
- // Arrange
- var attribute = new AutoDataAdapterAttribute(fixture);
-
- // Act
- object Act() => attribute.GetData(null);
-
- // Assert
- var exception = Assert.Throws(Act);
- Assert.Equal("testMethod", exception.ParamName);
- }
-
- [Fact(DisplayName = "GIVEN test data with instance WHEN GetData called THEN auto data generation skipped")]
- public void GivenTestDataWithInstance_WhenGetDataCalled_ThenAutoDataGenerationSkipped()
- {
- // Arrange
- IFixture fixture = new Fixture();
- var attribute = new AutoDataAdapterAttribute(fixture, SpecificTestClass.Create());
- var methodInfo = typeof(AutoDataAdapterAttributeTests).GetMethod(nameof(this.TestMethodWithAbstractTestClass), BindingFlags.Instance | BindingFlags.NonPublic);
- var expectedNumberOfParameters = methodInfo.GetParameters().Length;
-
- // Act
- var data = attribute.GetData(methodInfo).ToArray();
-
- // Assert
- Assert.Single(data);
- Assert.Equal(expectedNumberOfParameters, data.First().Length);
- Assert.All(data.First(), Assert.NotNull);
- Assert.All(data.First().Skip(1), item => Assert.Equal(data.First().Last(), item));
- }
-
- [Fact(DisplayName = "GIVEN empty test data WHEN GetData called THEN auto data generation throws exception")]
- public void GivenEmptyTestData_WhenGetDataCalled_ThenAutoDataGenerationSkipped()
- {
- // Arrange
- IFixture fixture = new Fixture();
- var attribute = new AutoDataAdapterAttribute(fixture);
- var methodInfo = typeof(AutoDataAdapterAttributeTests).GetMethod(nameof(this.TestMethodWithAbstractTestClass), BindingFlags.Instance | BindingFlags.NonPublic);
-
- // Act
- void Act() => attribute.GetData(methodInfo);
-
- // Assert
- Assert.ThrowsAny(Act);
- }
-
- [Fact(DisplayName = "GIVEN test method with Frozen customization after others WHEN GetData called THEN ensure parameter is frozen on the end")]
- public void GivenTestMethodWithFrozenCustomizationAfterOthers_WhenGetDataCalled_ThenEnsureParameterIsFrozenOnTheEnd()
- {
- // Arrange
- IFixture fixture = new Fixture();
- var attribute = new AutoDataAdapterAttribute(fixture, null);
- var methodInfo = typeof(AutoDataAdapterAttributeTests).GetMethod(nameof(this.TestMethodWithFrozenCustomizationBeforeOthers), BindingFlags.Instance | BindingFlags.NonPublic);
- var expectedNumberOfParameters = methodInfo.GetParameters().Length;
-
- // Act
- var data = attribute.GetData(methodInfo).ToArray();
-
- // Assert
- Assert.Single(data);
- Assert.Equal(expectedNumberOfParameters, data.First().Length);
- Assert.All(data.First(), Assert.NotNull);
- Assert.All(
- data.First().Skip(1),
- x =>
- {
- var parameters = data.First();
- Assert.Equal(parameters.Last(), x);
- Assert.NotEqual(parameters.First(), x);
- Assert.Contains(StopStringCustomization.Value, x as string);
- });
- }
-
- protected string TestMethodWithAbstractTestClass(
- SpecificTestClass instance,
- [Frozen] string text,
- string message)
- {
- return $"{instance}: {text}, {message}";
- }
-
- protected string TestMethodWithFrozenCustomizationBeforeOthers(
- string first,
- [Frozen][StopString] string second,
- string third)
- {
- return $"{first}: {second}, {third}";
- }
-
- [SuppressMessage("Minor Code Smell", "S2094:Classes should not be empty", Justification = "Test class")]
- protected abstract class AbstractTestClass
- {
- }
-
- protected sealed class SpecificTestClass : AbstractTestClass
- {
- private SpecificTestClass()
- {
- }
-
- public static AbstractTestClass Create()
- {
- return new SpecificTestClass();
- }
- }
-
- protected sealed class StopStringAttribute : CustomizeWithAttribute
- {
- }
-
- [SuppressMessage("ReSharper", "ClassNeverInstantiated.Global", Justification = "This class is instantiated indirectly.")]
- protected class StopStringCustomization : ICustomization
- {
- public const string Value = "STOP";
-
- public void Customize(IFixture fixture)
- {
- fixture.Customizations.Add(
- new FilteringSpecimenBuilder(
- new FixedBuilder(Value),
- new ExactTypeSpecification(Value.GetType())));
- }
- }
- }
-}
+namespace Objectivity.AutoFixture.XUnit2.Core.Tests.Attributes
+{
+ using System;
+ using System.Diagnostics.CodeAnalysis;
+ using System.Linq;
+ using System.Reflection;
+
+ using global::AutoFixture;
+ using global::AutoFixture.Kernel;
+ using global::AutoFixture.Xunit2;
+ using Objectivity.AutoFixture.XUnit2.Core.Attributes;
+
+ using Xunit;
+
+ [Collection("AutoDataAdapterAttribute")]
+ [Trait("Category", "DataAttribute")]
+ [SuppressMessage("Design", "CA1034:Nested types should not be visible", Justification = "Test objects")]
+ public class AutoDataAdapterAttributeTests
+ {
+ [AutoData]
+ [Theory(DisplayName = "GIVEN fixture WHEN constructor is invoked THEN passed fixture is being adapted and inline values collection is empty")]
+ public void GivenFixture_WhenConstructorIsInvoked_ThenPassedFixtureIsBeingAdaptedAndInlineValuesCollectionIsEmpty(Fixture fixture)
+ {
+ // Arrange
+ // Act
+ var attribute = new AutoDataAdapterAttribute(fixture, null);
+
+ // Assert
+ Assert.Equal(fixture, attribute.AdaptedFixture);
+ Assert.Empty(attribute.InlineValues);
+ }
+
+ [Fact(DisplayName = "GIVEN uninitialized fixture WHEN constructor is invoked THEN exception is thrown")]
+ public void GivenUninitializedFixture_WhenConstructorIsInvoked_ThenExceptionIsThrown()
+ {
+ // Arrange
+ // Act
+ static object Act() => new AutoDataAdapterAttribute(null);
+
+ // Assert
+ var exception = Assert.Throws(Act);
+ Assert.Equal("fixture", exception.ParamName);
+ }
+
+ [AutoData]
+ [Theory(DisplayName = "GIVEN uninitialized method info WHEN GetData is invoked THEN exception is thrown")]
+ public void GivenUninitializedMethodInfo_WhenConstructorIsInvoked_ThenExceptionIsThrown(Fixture fixture)
+ {
+ // Arrange
+ var attribute = new AutoDataAdapterAttribute(fixture);
+
+ // Act
+ object Act() => attribute.GetData(null);
+
+ // Assert
+ var exception = Assert.Throws(Act);
+ Assert.Equal("testMethod", exception.ParamName);
+ }
+
+ [Fact(DisplayName = "GIVEN test data with instance WHEN GetData called THEN auto data generation skipped")]
+ public void GivenTestDataWithInstance_WhenGetDataCalled_ThenAutoDataGenerationSkipped()
+ {
+ // Arrange
+ IFixture fixture = new Fixture();
+ var attribute = new AutoDataAdapterAttribute(fixture, SpecificTestClass.Create());
+ var methodInfo = typeof(AutoDataAdapterAttributeTests).GetMethod(nameof(this.TestMethodWithAbstractTestClass), BindingFlags.Instance | BindingFlags.NonPublic);
+ var expectedNumberOfParameters = methodInfo.GetParameters().Length;
+
+ // Act
+ var data = attribute.GetData(methodInfo).ToArray();
+
+ // Assert
+ Assert.Single(data);
+ Assert.Equal(expectedNumberOfParameters, data.First().Length);
+ Assert.All(data.First(), Assert.NotNull);
+ Assert.All(data.First().Skip(1), item => Assert.Equal(data.First().Last(), item));
+ }
+
+ [Fact(DisplayName = "GIVEN empty test data WHEN GetData called THEN auto data generation throws exception")]
+ public void GivenEmptyTestData_WhenGetDataCalled_ThenAutoDataGenerationSkipped()
+ {
+ // Arrange
+ IFixture fixture = new Fixture();
+ var attribute = new AutoDataAdapterAttribute(fixture);
+ var methodInfo = typeof(AutoDataAdapterAttributeTests).GetMethod(nameof(this.TestMethodWithAbstractTestClass), BindingFlags.Instance | BindingFlags.NonPublic);
+
+ // Act
+ void Act() => attribute.GetData(methodInfo);
+
+ // Assert
+ Assert.ThrowsAny(Act);
+ }
+
+ [Fact(DisplayName = "GIVEN test method with Frozen customization after others WHEN GetData called THEN ensure parameter is frozen on the end")]
+ public void GivenTestMethodWithFrozenCustomizationAfterOthers_WhenGetDataCalled_ThenEnsureParameterIsFrozenOnTheEnd()
+ {
+ // Arrange
+ IFixture fixture = new Fixture();
+ var attribute = new AutoDataAdapterAttribute(fixture, null);
+ var methodInfo = typeof(AutoDataAdapterAttributeTests).GetMethod(nameof(this.TestMethodWithFrozenCustomizationBeforeOthers), BindingFlags.Instance | BindingFlags.NonPublic);
+ var expectedNumberOfParameters = methodInfo.GetParameters().Length;
+
+ // Act
+ var data = attribute.GetData(methodInfo).ToArray();
+
+ // Assert
+ Assert.Single(data);
+ Assert.Equal(expectedNumberOfParameters, data.First().Length);
+ Assert.All(data.First(), Assert.NotNull);
+ Assert.All(
+ data.First().Skip(1),
+ x =>
+ {
+ var parameters = data.First();
+ Assert.Equal(parameters.Last(), x);
+ Assert.NotEqual(parameters.First(), x);
+ Assert.Contains(StopStringCustomization.Value, x as string);
+ });
+ }
+
+ protected string TestMethodWithAbstractTestClass(
+ SpecificTestClass instance,
+ [Frozen] string text,
+ string message)
+ {
+ return $"{instance}: {text}, {message}";
+ }
+
+ protected string TestMethodWithFrozenCustomizationBeforeOthers(
+ string first,
+ [Frozen][StopString] string second,
+ string third)
+ {
+ return $"{first}: {second}, {third}";
+ }
+
+ protected abstract class AbstractTestClass
+ {
+ public override string ToString() => this.GetType().Name;
+ }
+
+ protected sealed class SpecificTestClass : AbstractTestClass
+ {
+ private SpecificTestClass()
+ {
+ }
+
+ public static AbstractTestClass Create()
+ {
+ return new SpecificTestClass();
+ }
+ }
+
+ protected sealed class StopStringAttribute : CustomizeWithAttribute
+ {
+ }
+
+ [SuppressMessage("ReSharper", "ClassNeverInstantiated.Global", Justification = "This class is instantiated indirectly.")]
+ protected class StopStringCustomization : ICustomization
+ {
+ public const string Value = "STOP";
+
+ public void Customize(IFixture fixture)
+ {
+ fixture.Customizations.Add(
+ new FilteringSpecimenBuilder(
+ new FixedBuilder(Value),
+ new ExactTypeSpecification(Value.GetType())));
+ }
+ }
+ }
+}
diff --git a/src/Objectivity.AutoFixture.XUnit2.Core.Tests/Attributes/CustomizeWithAttributeTests.cs b/src/Objectivity.AutoFixture.XUnit2.Core.Tests/Attributes/CustomizeWithAttributeTests.cs
index 8994768b..a3eab524 100644
--- a/src/Objectivity.AutoFixture.XUnit2.Core.Tests/Attributes/CustomizeWithAttributeTests.cs
+++ b/src/Objectivity.AutoFixture.XUnit2.Core.Tests/Attributes/CustomizeWithAttributeTests.cs
@@ -1,253 +1,251 @@
-namespace Objectivity.AutoFixture.XUnit2.Core.Tests.Attributes
-{
- using System;
- using System.Collections.Generic;
- using System.Diagnostics.CodeAnalysis;
- using System.Linq;
- using System.Reflection;
-
- using global::AutoFixture;
- using global::AutoFixture.Kernel;
- using global::AutoFixture.Xunit2;
-
- using Objectivity.AutoFixture.XUnit2.Core.Attributes;
- using Objectivity.AutoFixture.XUnit2.Core.Customizations;
-
- using Xunit;
-
- [Collection("CustomizeWithAttribute")]
- [Trait("Category", "CustomizeAttribute")]
- public class CustomizeWithAttributeTests
- {
- public static TheoryData ArgumentsDiscoveryCustomizationTestData { get; } = new()
- {
- { false, null, 0 },
- { false, Array.Empty