diff --git a/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/FullyQualifiedWithGlobalPrefixRewriter.cs b/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/FullyQualifiedWithGlobalPrefixRewriter.cs index 5937229fc4..4dce582257 100644 --- a/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/FullyQualifiedWithGlobalPrefixRewriter.cs +++ b/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/FullyQualifiedWithGlobalPrefixRewriter.cs @@ -224,6 +224,26 @@ public override SyntaxNode VisitTypeOfExpression(TypeOfExpressionSyntax node) { elementType = arrayTypeSymbol2.ElementType.GloballyQualified(); } + // Check parent cast expression for array type context + // Handles cases like: (MyEnum[])[MyEnum.One, MyEnum.Two] + else if (node.Parent is CastExpressionSyntax castExpr) + { + var castTypeInfo = semanticModel.GetTypeInfo(castExpr.Type); + if (castTypeInfo.Type is IArrayTypeSymbol castArrayType) + { + elementType = castArrayType.ElementType.GloballyQualified(); + } + } + // Infer element type from first element if still unknown + // Handles cases where semantic model doesn't provide array type info + else if (node.Elements.Count > 0 && node.Elements[0] is ExpressionElementSyntax firstElement) + { + var elementTypeInfo = semanticModel.GetTypeInfo(firstElement.Expression); + if (elementTypeInfo.Type is ITypeSymbol inferredType) + { + elementType = inferredType.GloballyQualified(); + } + } // Visit and rewrite each element var rewrittenElements = new List(); diff --git a/TUnit.TestProject/Bugs/4065/BugRepro4065.cs b/TUnit.TestProject/Bugs/4065/BugRepro4065.cs new file mode 100644 index 0000000000..8d64cf14bc --- /dev/null +++ b/TUnit.TestProject/Bugs/4065/BugRepro4065.cs @@ -0,0 +1,38 @@ +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._4065; + +public enum MyEnum +{ + One, + Two, + Three +} + +[EngineTest(ExpectedResult.Pass)] +public class BugRepro4065 +{ + [Test] + [Arguments((MyEnum[])[MyEnum.One, MyEnum.Two])] + public async Task EnumArrayWithCollectionExpression(MyEnum[] values) + { + await Assert.That(values.Length).IsEqualTo(2); + await Assert.That(values[0]).IsEqualTo(MyEnum.One); + await Assert.That(values[1]).IsEqualTo(MyEnum.Two); + } + + [Test] + [Arguments((MyEnum[])[MyEnum.Three])] + public async Task EnumArraySingleElement(MyEnum[] values) + { + await Assert.That(values.Length).IsEqualTo(1); + await Assert.That(values[0]).IsEqualTo(MyEnum.Three); + } + + [Test] + [Arguments(new MyEnum[] { MyEnum.One, MyEnum.Two })] // Old syntax (should still work) + public async Task EnumArrayWithNewSyntax(MyEnum[] values) + { + await Assert.That(values.Length).IsEqualTo(2); + } +}