From 13a2cb790f7da120ee504801b80ec4ac2306d822 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Tue, 2 Jun 2026 19:52:40 +0100 Subject: [PATCH] fix(source-gen): emit Array.Empty() for empty array args (#6150) Jagged-array test data such as `IEnumerable>` feeding a `byte[][]` parameter produced uncompilable generated code (CS1586 + CS0178). `CollectsTrailingArguments()` treats every array-typed parameter as a trailing/collecting array, so `TupleArgumentHelper` built the empty-array fallback as `new {elementType}[0]`. For a `byte[][]` parameter the element type is `byte[]`, yielding `new byte[][0]` - the `[0]` rank specifier cannot follow an array element type. The runtime arm compiled fine; the break was in the unreachable case 0 / default arms that still must compile. Emit `global::System.Array.Empty()` instead, which is valid for both scalar and array element types and is allocation-free. Adds a compile/runtime guard (TUnit.TestProject/Bugs/6150) passing in both source-gen and reflection modes, plus a source-gen snapshot test. Regenerates the affected snapshots (new X[0] -> Array.Empty()). --- .../ArgsAsArrayTests.Test.verified.txt | 36 ++--- .../Bugs/6150/Tests6150.cs | 15 ++ ...nflictingNamespace.DotNet10_0.verified.txt | 4 +- ...onflictingNamespace.DotNet8_0.verified.txt | 4 +- ...onflictingNamespace.DotNet9_0.verified.txt | 4 +- ...thConflictingNamespace.Net4_7.verified.txt | 4 +- ...nflictingNamespace.DotNet10_0.verified.txt | 4 +- ...onflictingNamespace.DotNet8_0.verified.txt | 4 +- ...onflictingNamespace.DotNet9_0.verified.txt | 4 +- ...thConflictingNamespace.Net4_7.verified.txt | 4 +- .../DataDrivenTests.Test.verified.txt | 4 +- ...hodDataSourceDrivenTests.Test.verified.txt | 4 +- .../Tests2112.Test.verified.txt | 8 +- .../Tests6150.Test.verified.txt | 147 ++++++++++++++++++ .../Helpers/TupleArgumentHelper.cs | 9 +- TUnit.TestProject/Bugs/6150/Tests.cs | 22 +++ 16 files changed, 232 insertions(+), 45 deletions(-) create mode 100644 TUnit.Core.SourceGenerator.Tests/Bugs/6150/Tests6150.cs create mode 100644 TUnit.Core.SourceGenerator.Tests/Tests6150.Test.verified.txt create mode 100644 TUnit.TestProject/Bugs/6150/Tests.cs diff --git a/TUnit.Core.SourceGenerator.Tests/ArgsAsArrayTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ArgsAsArrayTests.Test.verified.txt index a1483ca69e..769de70830 100644 --- a/TUnit.Core.SourceGenerator.Tests/ArgsAsArrayTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ArgsAsArrayTests.Test.verified.txt @@ -72,7 +72,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne { case 0: { - instance.Params(new string[0]); + instance.Params(global::System.Array.Empty()); return default(global::System.Threading.Tasks.ValueTask); } case 1: @@ -106,7 +106,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne return default(global::System.Threading.Tasks.ValueTask); } default: - instance.Params((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new string[0])); + instance.Params((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty())); return default(global::System.Threading.Tasks.ValueTask); } } @@ -123,7 +123,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne { case 0: { - instance.ParamsEnumerable(new string[0]); + instance.ParamsEnumerable(global::System.Array.Empty()); return default(global::System.Threading.Tasks.ValueTask); } case 1: @@ -157,7 +157,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne return default(global::System.Threading.Tasks.ValueTask); } default: - instance.ParamsEnumerable((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new string[0])); + instance.ParamsEnumerable((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty())); return default(global::System.Threading.Tasks.ValueTask); } } @@ -174,7 +174,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne { case 1: { - instance.Following_Non_Params(global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), new string[0]); + instance.Following_Non_Params(global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::System.Array.Empty()); return default(global::System.Threading.Tasks.ValueTask); } case 2: @@ -212,7 +212,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne { throw new global::System.ArgumentException($"Expected at least 1 argument, but got {args.Length}"); } - instance.Following_Non_Params(global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), (args.Length > 1 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(1, args.Length - 1), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new string[0])); + instance.Following_Non_Params(global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), (args.Length > 1 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(1, args.Length - 1), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty())); return default(global::System.Threading.Tasks.ValueTask); } } @@ -229,7 +229,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne { case 0: { - return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray(new string[0])); + return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray(global::System.Array.Empty())); } case 1: { @@ -256,7 +256,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray(new string[] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]), global::TUnit.Core.Helpers.CastHelper.Cast(args[4]), global::TUnit.Core.Helpers.CastHelper.Cast(args[5]) })); } default: - return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new string[0]))); + return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty()))); } } catch (global::System.Exception ex) @@ -272,7 +272,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne { case 0: { - return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_SingleValue(new string[0])); + return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_SingleValue(global::System.Array.Empty())); } case 1: { @@ -299,7 +299,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_SingleValue(new string[] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]), global::TUnit.Core.Helpers.CastHelper.Cast(args[4]), global::TUnit.Core.Helpers.CastHelper.Cast(args[5]) })); } default: - return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_SingleValue((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new string[0]))); + return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_SingleValue((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty()))); } } catch (global::System.Exception ex) @@ -315,7 +315,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne { case 0: { - return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_MultipleValues(new string[0])); + return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_MultipleValues(global::System.Array.Empty())); } case 1: { @@ -342,7 +342,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_MultipleValues(new string[] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]), global::TUnit.Core.Helpers.CastHelper.Cast(args[4]), global::TUnit.Core.Helpers.CastHelper.Cast(args[5]) })); } default: - return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_MultipleValues((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new string[0]))); + return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_MultipleValues((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty()))); } } catch (global::System.Exception ex) @@ -358,7 +358,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne { case 0: { - return new global::System.Threading.Tasks.ValueTask(instance.NonParamsIntArray(new int[0])); + return new global::System.Threading.Tasks.ValueTask(instance.NonParamsIntArray(global::System.Array.Empty())); } case 1: { @@ -385,7 +385,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne return new global::System.Threading.Tasks.ValueTask(instance.NonParamsIntArray(new int[] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]), global::TUnit.Core.Helpers.CastHelper.Cast(args[4]), global::TUnit.Core.Helpers.CastHelper.Cast(args[5]) })); } default: - return new global::System.Threading.Tasks.ValueTask(instance.NonParamsIntArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new int[0]))); + return new global::System.Threading.Tasks.ValueTask(instance.NonParamsIntArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty()))); } } catch (global::System.Exception ex) @@ -401,7 +401,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne { case 0: { - return new global::System.Threading.Tasks.ValueTask(instance.GenericStringArray(new string[0])); + return new global::System.Threading.Tasks.ValueTask(instance.GenericStringArray(global::System.Array.Empty())); } case 1: { @@ -428,7 +428,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne return new global::System.Threading.Tasks.ValueTask(instance.GenericStringArray(new string[] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]), global::TUnit.Core.Helpers.CastHelper.Cast(args[4]), global::TUnit.Core.Helpers.CastHelper.Cast(args[5]) })); } default: - return new global::System.Threading.Tasks.ValueTask(instance.GenericStringArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new string[0]))); + return new global::System.Threading.Tasks.ValueTask(instance.GenericStringArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty()))); } } catch (global::System.Exception ex) @@ -444,7 +444,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne { case 0: { - return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_BeyondStaticCaseCap(new string[0])); + return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_BeyondStaticCaseCap(global::System.Array.Empty())); } case 1: { @@ -471,7 +471,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "names", ne return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_BeyondStaticCaseCap(new string[] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]), global::TUnit.Core.Helpers.CastHelper.Cast(args[4]), global::TUnit.Core.Helpers.CastHelper.Cast(args[5]) })); } default: - return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_BeyondStaticCaseCap((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new string[0]))); + return new global::System.Threading.Tasks.ValueTask(instance.NonParamsStringArray_BeyondStaticCaseCap((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty()))); } } catch (global::System.Exception ex) diff --git a/TUnit.Core.SourceGenerator.Tests/Bugs/6150/Tests6150.cs b/TUnit.Core.SourceGenerator.Tests/Bugs/6150/Tests6150.cs new file mode 100644 index 0000000000..2a7fb82e1d --- /dev/null +++ b/TUnit.Core.SourceGenerator.Tests/Bugs/6150/Tests6150.cs @@ -0,0 +1,15 @@ + +namespace TUnit.Core.SourceGenerator.Tests.Bugs._6150; + +internal class Tests6150 : TestsBase +{ + [Test] + public Task Test() => RunTest(Path.Combine(Git.RootDirectory.FullName, + "TUnit.TestProject", + "Bugs", + "6150", + "Tests.cs"), + async generatedFiles => + { + }); +} diff --git a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.DotNet10_0.verified.txt b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.DotNet10_0.verified.txt index 8cab517356..a232eb963d 100644 --- a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.DotNet10_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.DotNet10_0.verified.txt @@ -236,7 +236,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "value", new glo { case 0: { - instance.IntegerArray(new int[0]); + instance.IntegerArray(global::System.Array.Empty()); return default(global::System.Threading.Tasks.ValueTask); } case 1: @@ -270,7 +270,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "value", new glo return default(global::System.Threading.Tasks.ValueTask); } default: - instance.IntegerArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new int[0])); + instance.IntegerArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty())); return default(global::System.Threading.Tasks.ValueTask); } } diff --git a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.DotNet8_0.verified.txt b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.DotNet8_0.verified.txt index 8cab517356..a232eb963d 100644 --- a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.DotNet8_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.DotNet8_0.verified.txt @@ -236,7 +236,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "value", new glo { case 0: { - instance.IntegerArray(new int[0]); + instance.IntegerArray(global::System.Array.Empty()); return default(global::System.Threading.Tasks.ValueTask); } case 1: @@ -270,7 +270,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "value", new glo return default(global::System.Threading.Tasks.ValueTask); } default: - instance.IntegerArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new int[0])); + instance.IntegerArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty())); return default(global::System.Threading.Tasks.ValueTask); } } diff --git a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.DotNet9_0.verified.txt b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.DotNet9_0.verified.txt index 8cab517356..a232eb963d 100644 --- a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.DotNet9_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.DotNet9_0.verified.txt @@ -236,7 +236,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "value", new glo { case 0: { - instance.IntegerArray(new int[0]); + instance.IntegerArray(global::System.Array.Empty()); return default(global::System.Threading.Tasks.ValueTask); } case 1: @@ -270,7 +270,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "value", new glo return default(global::System.Threading.Tasks.ValueTask); } default: - instance.IntegerArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new int[0])); + instance.IntegerArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty())); return default(global::System.Threading.Tasks.ValueTask); } } diff --git a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.Net4_7.verified.txt b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.Net4_7.verified.txt index a6f62b8b2d..17ff184f61 100644 --- a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.Net4_7.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.DataDrivenTest_WithConflictingNamespace.Net4_7.verified.txt @@ -236,7 +236,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "value", new glo { case 0: { - instance.IntegerArray(new int[0]); + instance.IntegerArray(global::System.Array.Empty()); return default(global::System.Threading.Tasks.ValueTask); } case 1: @@ -270,7 +270,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "value", new glo return default(global::System.Threading.Tasks.ValueTask); } default: - instance.IntegerArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new int[0])); + instance.IntegerArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty())); return default(global::System.Threading.Tasks.ValueTask); } } diff --git a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.DotNet10_0.verified.txt b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.DotNet10_0.verified.txt index 00c233071c..7a83761011 100644 --- a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.DotNet10_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.DotNet10_0.verified.txt @@ -183,7 +183,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "strings", { case 0: { - return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(new string[0])); + return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(global::System.Array.Empty())); } case 1: { @@ -210,7 +210,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "strings", return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(new string[] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]), global::TUnit.Core.Helpers.CastHelper.Cast(args[4]), global::TUnit.Core.Helpers.CastHelper.Cast(args[5]) })); } default: - return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new string[0]))); + return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty()))); } } catch (global::System.Exception ex) diff --git a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.DotNet8_0.verified.txt b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.DotNet8_0.verified.txt index 00c233071c..7a83761011 100644 --- a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.DotNet8_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.DotNet8_0.verified.txt @@ -183,7 +183,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "strings", { case 0: { - return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(new string[0])); + return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(global::System.Array.Empty())); } case 1: { @@ -210,7 +210,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "strings", return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(new string[] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]), global::TUnit.Core.Helpers.CastHelper.Cast(args[4]), global::TUnit.Core.Helpers.CastHelper.Cast(args[5]) })); } default: - return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new string[0]))); + return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty()))); } } catch (global::System.Exception ex) diff --git a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.DotNet9_0.verified.txt b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.DotNet9_0.verified.txt index 00c233071c..7a83761011 100644 --- a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.DotNet9_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.DotNet9_0.verified.txt @@ -183,7 +183,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "strings", { case 0: { - return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(new string[0])); + return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(global::System.Array.Empty())); } case 1: { @@ -210,7 +210,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "strings", return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(new string[] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]), global::TUnit.Core.Helpers.CastHelper.Cast(args[4]), global::TUnit.Core.Helpers.CastHelper.Cast(args[5]) })); } default: - return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new string[0]))); + return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty()))); } } catch (global::System.Exception ex) diff --git a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.Net4_7.verified.txt b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.Net4_7.verified.txt index b4e7d92b5d..c7a952615b 100644 --- a/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.Net4_7.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ConflictingNamespaceTests.MethodDataSource_WithConflictingNamespace.Net4_7.verified.txt @@ -183,7 +183,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "strings", { case 0: { - return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(new string[0])); + return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(global::System.Array.Empty())); } case 1: { @@ -210,7 +210,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "strings", return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(new string[] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]), global::TUnit.Core.Helpers.CastHelper.Cast(args[4]), global::TUnit.Core.Helpers.CastHelper.Cast(args[5]) })); } default: - return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new string[0]))); + return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty()))); } } catch (global::System.Exception ex) diff --git a/TUnit.Core.SourceGenerator.Tests/DataDrivenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/DataDrivenTests.Test.verified.txt index 8cab517356..a232eb963d 100644 --- a/TUnit.Core.SourceGenerator.Tests/DataDrivenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/DataDrivenTests.Test.verified.txt @@ -236,7 +236,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "value", new glo { case 0: { - instance.IntegerArray(new int[0]); + instance.IntegerArray(global::System.Array.Empty()); return default(global::System.Threading.Tasks.ValueTask); } case 1: @@ -270,7 +270,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "value", new glo return default(global::System.Threading.Tasks.ValueTask); } default: - instance.IntegerArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new int[0])); + instance.IntegerArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty())); return default(global::System.Threading.Tasks.ValueTask); } } diff --git a/TUnit.Core.SourceGenerator.Tests/MethodDataSourceDrivenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/MethodDataSourceDrivenTests.Test.verified.txt index 00c233071c..7a83761011 100644 --- a/TUnit.Core.SourceGenerator.Tests/MethodDataSourceDrivenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/MethodDataSourceDrivenTests.Test.verified.txt @@ -183,7 +183,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "strings", { case 0: { - return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(new string[0])); + return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(global::System.Array.Empty())); } case 1: { @@ -210,7 +210,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string[]), "strings", return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest(new string[] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]), global::TUnit.Core.Helpers.CastHelper.Cast(args[4]), global::TUnit.Core.Helpers.CastHelper.Cast(args[5]) })); } default: - return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new string[0]))); + return new global::System.Threading.Tasks.ValueTask(instance.EnumerableFuncArrayTest((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty()))); } } catch (global::System.Exception ex) diff --git a/TUnit.Core.SourceGenerator.Tests/Tests2112.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests2112.Test.verified.txt index 32ef232545..fc3649448c 100644 --- a/TUnit.Core.SourceGenerator.Tests/Tests2112.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/Tests2112.Test.verified.txt @@ -45,7 +45,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(long[]), "arr", new gl { case 1: { - instance.Test(global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[0]); + instance.Test(global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::System.Array.Empty()); return default(global::System.Threading.Tasks.ValueTask); } case 2: @@ -83,7 +83,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(long[]), "arr", new gl { throw new global::System.ArgumentException($"Expected at least 1 argument, but got {args.Length}"); } - instance.Test(global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), (args.Length > 1 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(1, args.Length - 1), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new long[0])); + instance.Test(global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), (args.Length > 1 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(1, args.Length - 1), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty())); return default(global::System.Threading.Tasks.ValueTask); } } @@ -100,7 +100,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(long[]), "arr", new gl { case 1: { - instance.Test2(global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), new long[0]); + instance.Test2(global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::System.Array.Empty()); return default(global::System.Threading.Tasks.ValueTask); } case 2: @@ -138,7 +138,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(long[]), "arr", new gl { throw new global::System.ArgumentException($"Expected at least 1 argument, but got {args.Length}"); } - instance.Test2(global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), (args.Length > 1 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(1, args.Length - 1), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : new long[0])); + instance.Test2(global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), (args.Length > 1 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(1, args.Length - 1), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty())); return default(global::System.Threading.Tasks.ValueTask); } } diff --git a/TUnit.Core.SourceGenerator.Tests/Tests6150.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/Tests6150.Test.verified.txt new file mode 100644 index 0000000000..4ce3cd1291 --- /dev/null +++ b/TUnit.Core.SourceGenerator.Tests/Tests6150.Test.verified.txt @@ -0,0 +1,147 @@ +// +#pragma warning disable + +#nullable enable +namespace TUnit.Generated; +[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute] +[global::System.CodeDom.Compiler.GeneratedCode("TUnit", "VERSION_SCRUBBED")] +internal static class TUnit_TestProject_Bugs__6150_Tests__TestSource +{ + private static readonly global::TUnit.Core.ClassMetadata __classMetadata = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.Bugs._6150.Tests", new global::TUnit.Core.ClassMetadata + { + Type = typeof(global::TUnit.TestProject.Bugs._6150.Tests), + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.Bugs._6150.Tests)), + Name = "Tests", + Namespace = "TUnit.TestProject.Bugs._6150", + Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", "TestsBase`1"), + Parameters = global::System.Array.Empty(), + Properties = global::System.Array.Empty(), + Parent = null + }); + private static readonly global::System.Type __classType = typeof(global::TUnit.TestProject.Bugs._6150.Tests); + private static readonly global::TUnit.Core.MethodMetadata __mm_0 = global::TUnit.Core.MethodMetadataFactory.Create("JaggedArray", __classType, typeof(global::System.Threading.Tasks.Task), __classMetadata, parameters: new global::TUnit.Core.ParameterMetadata[] +{ +global::TUnit.Core.ParameterMetadataFactory.Create(typeof(byte[][]), "data", new global::TUnit.Core.ConcreteType(typeof(byte[][])), false, reflectionInfoFactory: static () => typeof(global::TUnit.TestProject.Bugs._6150.Tests).GetMethod("JaggedArray", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, new global::System.Type[] { typeof(byte[][]) }, null)!.GetParameters()[0]) +}); + private static global::TUnit.TestProject.Bugs._6150.Tests __CreateInstance(global::System.Type[] typeArgs, object?[] args) + { + return new global::TUnit.TestProject.Bugs._6150.Tests(); + } + private static global::System.Threading.Tasks.ValueTask __Invoke(global::TUnit.TestProject.Bugs._6150.Tests instance, int methodIndex, object?[] args, global::System.Threading.CancellationToken cancellationToken) + { + switch (methodIndex) + { + case 0: + { + try + { + switch (args.Length) + { + case 0: + { + return new global::System.Threading.Tasks.ValueTask(instance.JaggedArray(global::System.Array.Empty())); + } + case 1: + { + return new global::System.Threading.Tasks.ValueTask(instance.JaggedArray((args[0] is null ? null : args[0] is byte[][] arr ? arr : new byte[][] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]) }))); + } + case 2: + { + return new global::System.Threading.Tasks.ValueTask(instance.JaggedArray(new byte[][] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]) })); + } + case 3: + { + return new global::System.Threading.Tasks.ValueTask(instance.JaggedArray(new byte[][] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]) })); + } + case 4: + { + return new global::System.Threading.Tasks.ValueTask(instance.JaggedArray(new byte[][] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]) })); + } + case 5: + { + return new global::System.Threading.Tasks.ValueTask(instance.JaggedArray(new byte[][] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]), global::TUnit.Core.Helpers.CastHelper.Cast(args[4]) })); + } + case 6: + { + return new global::System.Threading.Tasks.ValueTask(instance.JaggedArray(new byte[][] { global::TUnit.Core.Helpers.CastHelper.Cast(args[0]), global::TUnit.Core.Helpers.CastHelper.Cast(args[1]), global::TUnit.Core.Helpers.CastHelper.Cast(args[2]), global::TUnit.Core.Helpers.CastHelper.Cast(args[3]), global::TUnit.Core.Helpers.CastHelper.Cast(args[4]), global::TUnit.Core.Helpers.CastHelper.Cast(args[5]) })); + } + default: + return new global::System.Threading.Tasks.ValueTask(instance.JaggedArray((args.Length > 0 ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range(0, args.Length), i => global::TUnit.Core.Helpers.CastHelper.Cast(args[i]))) : global::System.Array.Empty()))); + } + } + catch (global::System.Exception ex) + { + return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex)); + } + } + default: + throw new global::System.ArgumentOutOfRangeException(nameof(methodIndex)); + } + } + private static global::System.Attribute[] __Attributes(int groupIndex) + { + switch (groupIndex) + { + case 0: + { + return + [ + new global::TUnit.Core.TestAttribute(), + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) + ]; + } + default: + throw new global::System.ArgumentOutOfRangeException(nameof(groupIndex)); + } + } + public static readonly global::TUnit.Core.TestEntry[] Entries = new global::TUnit.Core.TestEntry[] + { + new global::TUnit.Core.TestEntry + { + MethodName = "JaggedArray", + FullyQualifiedName = "TUnit.TestProject.Bugs._6150.Tests.JaggedArray", + FilePath = @"", + LineNumber = 8, + Categories = global::System.Array.Empty(), + Properties = global::System.Array.Empty(), + HasDataSource = true, + RepeatCount = 0, + DependsOn = global::System.Array.Empty(), + MethodMetadata = __mm_0, + CreateInstance = __CreateInstance, + InvokeBody = __Invoke, + MethodIndex = 0, + CreateAttributes = __Attributes, + AttributeGroupIndex = 0, + TestDataSources = new global::TUnit.Core.IDataSourceAttribute[] +{ + new global::TUnit.Core.MethodDataSourceAttribute("Data") + { + Factory = (dataGeneratorMetadata) => + { + async global::System.Collections.Generic.IAsyncEnumerable>> Factory() + { + var result = global::TUnit.TestProject.Bugs._6150.Tests.Data(); + if (result is global::System.Collections.IEnumerable enumerable && !(result is string)) + { + foreach (var item in enumerable) + { + yield return () => global::System.Threading.Tasks.Task.FromResult(global::TUnit.Core.Helpers.DataSourceHelpers.ToObjectArray(item)); + } + } + else + { + yield return () => global::System.Threading.Tasks.Task.FromResult(global::TUnit.Core.Helpers.DataSourceHelpers.ToObjectArray(result)); + } + } + return Factory(); + } + }, +}, + }, + }; +} +internal static partial class TUnit_TestRegistration +{ + static readonly int _r_TUnit_TestProject_Bugs__6150_Tests__TestSource = global::TUnit.Core.SourceRegistrar.RegisterEntries(static () => TUnit_TestProject_Bugs__6150_Tests__TestSource.Entries); +} diff --git a/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/TupleArgumentHelper.cs b/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/TupleArgumentHelper.cs index ef93c1ef6c..5f3fd46427 100644 --- a/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/TupleArgumentHelper.cs +++ b/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/TupleArgumentHelper.cs @@ -124,7 +124,7 @@ public static List GenerateArgumentAccessWithParams(IList {regularParamCount} ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range({regularParamCount}, {rangeCount}), i => global::TUnit.Core.Helpers.CastHelper.Cast<{elementType.GloballyQualified()}>({argumentsArrayName}[i]))) : new {elementType.GloballyQualified()}[0])"; + var arrayInit = $"({argumentsArrayName}.Length > {regularParamCount} ? global::System.Linq.Enumerable.ToArray(global::System.Linq.Enumerable.Select(global::System.Linq.Enumerable.Range({regularParamCount}, {rangeCount}), i => global::TUnit.Core.Helpers.CastHelper.Cast<{elementType.GloballyQualified()}>({argumentsArrayName}[i]))) : global::System.Array.Empty<{elementType.GloballyQualified()}>())"; argumentExpressions.Add(arrayInit); } else @@ -133,8 +133,11 @@ public static List GenerateArgumentAccessWithParams(IList() + // rather than `new T[0]`: when T is itself an array (jagged param like + // byte[][], element type byte[]) the rank-specifier form `new byte[][0]` + // is invalid C# (CS1586/CS0178). See issue #6150. + argumentExpressions.Add($"global::System.Array.Empty<{elementType.GloballyQualified()}>()"); } else if (remainingArgCount == 1) { diff --git a/TUnit.TestProject/Bugs/6150/Tests.cs b/TUnit.TestProject/Bugs/6150/Tests.cs new file mode 100644 index 0000000000..68ae44adce --- /dev/null +++ b/TUnit.TestProject/Bugs/6150/Tests.cs @@ -0,0 +1,22 @@ +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._6150; + +[EngineTest(ExpectedResult.Pass)] +public class Tests +{ + [Test] + [MethodDataSource(nameof(Data))] + public async Task JaggedArray(byte[][] data) + { + await Assert.That(data).IsNotNull(); + } + + public static IEnumerable> Data() + => + [ + static () => [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], + static () => [[0, 1, 2], [3, 4, 5, 6]], + static () => [[0, 1, 2], [3, 4, 5, 6], [7, 8, 9]] + ]; +}