Skip to content

Commit c8546bf

Browse files
authored
fix: auto fixtures on records fail to pick the correct constructor (#2063)
1 parent e94b7f2 commit c8546bf

6 files changed

Lines changed: 79 additions & 2 deletions

src/Testing.AutoFixtures/AutoFixtureGenerator+StaticGenerator.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,10 @@ IEnumerable<IParameterSymbol> parameterSymbols
237237
list.Add(Token(SyntaxKind.CommaToken));
238238
}
239239

240-
list.RemoveAt(list.Count - 1);
240+
if (list.Count > 0)
241+
{
242+
list.RemoveAt(list.Count - 1);
243+
}
241244
return GlobalStatement(
242245
LocalFunctionStatement(
243246
IdentifierName(className),

src/Testing.AutoFixtures/AutoFixtureGenerator.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Compilation compilation
3939
namedTypeSymbol
4040
.Constructors
4141
.SelectMany(methodSymbol => methodSymbol.Parameters)
42+
.Where(p => !SymbolEqualityComparer.Default.Equals(p.Type, namedTypeSymbol))
4243
.Distinct(ParameterReductionComparer.Default)
4344
.ToList();
4445

@@ -105,7 +106,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
105106
.SyntaxProvider
106107
.ForAttributeWithMetadataName(
107108
"Rocket.Surgery.Extensions.Testing.AutoFixtures.AutoFixtureAttribute",
108-
(node, _) => node.IsKind(SyntaxKind.ClassDeclaration),
109+
(node, _) => node.IsKind(SyntaxKind.ClassDeclaration) || node.IsKind(SyntaxKind.RecordDeclaration),
109110
(syntaxContext, _) => syntaxContext
110111
)
111112
.Combine(context.CompilationProvider);

test/Testing.AutoFixtures.Tests/AutoFixtureGeneratorTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public async Task GivenAutoFixture_WhenGenerate_ThenShouldGenerateAutoFixtureBas
5656
[MemberData(nameof(NestedClassFixtureData.Data), MemberType = typeof(NestedClassFixtureData))]
5757
[MemberData(nameof(DifferentNamedFixtureData.Data), MemberType = typeof(DifferentNamedFixtureData))]
5858
[MemberData(nameof(LazyConstructorFixtureData.Data), MemberType = typeof(LazyConstructorFixtureData))]
59+
[MemberData(nameof(RecordConstructorFixtureData.Data), MemberType = typeof(RecordConstructorFixtureData))]
5960
public async Task GivenAutoFixtureAttribute_WhenGenerate_ThenGeneratesAutoFixture(
6061
GeneratorTestContext context
6162
)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using Rocket.Surgery.Extensions.Testing.SourceGenerators;
2+
3+
namespace Rocket.Surgery.Extensions.Testing.AutoFixtures.Tests;
4+
5+
internal class RecordConstructorFixtureData : AutoFixtureSourceData
6+
{
7+
public static TheoryData<GeneratorTestContext> Data =>
8+
[
9+
DefaultBuilder()
10+
.AddSources(RecordSource, RecordFixture)
11+
.Build(),
12+
];
13+
14+
private const string RecordSource = @"
15+
namespace Goony.Goo.Goo
16+
17+
public record UserAccount(string UserId, string? LastLogin = null, string? ExpiringRefresh = null);
18+
";
19+
private const string RecordFixture = @"
20+
using Rocket.Surgery.Extensions.Testing.AutoFixtures;
21+
22+
namespace Goony.Goo.Goo.Tests
23+
24+
[AutoFixture(typeof(UserAccount))]
25+
public record UserAccountFixture;
26+
";
27+
}
28+
29+
public record UserAccount(string UserId, string? LastLogin = null, string? ExpiringRefresh = null);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//HintName: Rocket.Surgery.Extensions.Testing.AutoFixtures/Rocket.Surgery.Extensions.Testing.AutoFixtures.AutoFixtureGenerator/UserAccount.AutoFixture.g.cs
2+
using System;
3+
using System.Collections.ObjectModel;
4+
using Goony.Goo.Goo;
5+
using Rocket.Surgery.Extensions.Testing.AutoFixtures;
6+
7+
namespace Goony.Goo.Goo.Tests
8+
{
9+
internal sealed partial class UserAccountFixture : AutoFixtureBase<UserAccountFixture>
10+
{
11+
public static implicit operator UserAccount(UserAccountFixture fixture) => fixture.Build();
12+
public UserAccountFixture WithUserId(System.String UserId) => With(ref _UserId, UserId);
13+
public UserAccountFixture WithLastLogin(System.String LastLogin) => With(ref _LastLogin, LastLogin);
14+
public UserAccountFixture WithExpiringRefresh(System.String ExpiringRefresh) => With(ref _ExpiringRefresh, ExpiringRefresh);
15+
private UserAccount Build() => new UserAccount(_UserId, _LastLogin, _ExpiringRefresh);
16+
private System.String _UserId = default;
17+
private System.String _LastLogin = default;
18+
private System.String _ExpiringRefresh = default;
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
AnalyzerDiagnostics: {
3+
Rocket.Surgery.Extensions.Testing.AutoFixtures.Diagnostics.Rsaf0001: [],
4+
Rocket.Surgery.Extensions.Testing.AutoFixtures.Diagnostics.Rsaf0002: [],
5+
Rocket.Surgery.Extensions.Testing.AutoFixtures.Diagnostics.Rsaf0003: []
6+
},
7+
FinalDiagnostics: [],
8+
GeneratorDiagnostics: {
9+
Rocket.Surgery.Extensions.Testing.AutoFixtures.AutoFixtureGenerator: []
10+
},
11+
ParseOptions: {
12+
DocumentationMode: Parse
13+
},
14+
References: [
15+
Microsoft.Extensions.Logging.Abstractions.dll,
16+
mscorlib.dll,
17+
netstandard.dll,
18+
System.Core.dll,
19+
System.dll,
20+
System.Private.CoreLib.dll,
21+
System.Runtime.dll
22+
]
23+
}

0 commit comments

Comments
 (0)