diff --git a/Directory.Packages.props b/Directory.Packages.props
index cf96f81..375dc3e 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -30,10 +30,12 @@
+
+
all
analyzers
@@ -55,4 +57,4 @@
-
\ No newline at end of file
+
diff --git a/tests/Visus.AddressValidation.Integration.FedEx.Tests/ModuleInitializer.cs b/tests/Visus.AddressValidation.Integration.FedEx.Tests/ModuleInitializer.cs
new file mode 100644
index 0000000..3f36c37
--- /dev/null
+++ b/tests/Visus.AddressValidation.Integration.FedEx.Tests/ModuleInitializer.cs
@@ -0,0 +1,15 @@
+namespace Visus.AddressValidation.Integration.FedEx.Tests;
+
+using System.Runtime.CompilerServices;
+using JetBrains.Annotations;
+using VerifyTests.DiffPlex;
+
+[UsedImplicitly]
+internal static class ModuleInitializer
+{
+ [ModuleInitializer]
+ public static void Initialize()
+ {
+ VerifyDiffPlex.Initialize(OutputType.Compact);
+ }
+}
diff --git a/tests/Visus.AddressValidation.Integration.Google.Tests/ModuleInitializer.cs b/tests/Visus.AddressValidation.Integration.Google.Tests/ModuleInitializer.cs
new file mode 100644
index 0000000..62834f8
--- /dev/null
+++ b/tests/Visus.AddressValidation.Integration.Google.Tests/ModuleInitializer.cs
@@ -0,0 +1,15 @@
+namespace Visus.AddressValidation.Integration.Google.Tests;
+
+using System.Runtime.CompilerServices;
+using JetBrains.Annotations;
+using VerifyTests.DiffPlex;
+
+[UsedImplicitly]
+internal static class ModuleInitializer
+{
+ [ModuleInitializer]
+ public static void Initialize()
+ {
+ VerifyDiffPlex.Initialize(OutputType.Compact);
+ }
+}
diff --git a/tests/Visus.AddressValidation.Integration.PitneyBowes.Tests/ModuleInitializer.cs b/tests/Visus.AddressValidation.Integration.PitneyBowes.Tests/ModuleInitializer.cs
new file mode 100644
index 0000000..5c653a8
--- /dev/null
+++ b/tests/Visus.AddressValidation.Integration.PitneyBowes.Tests/ModuleInitializer.cs
@@ -0,0 +1,15 @@
+namespace Visus.AddressValidation.Integration.PitneyBowes.Tests;
+
+using System.Runtime.CompilerServices;
+using JetBrains.Annotations;
+using VerifyTests.DiffPlex;
+
+[UsedImplicitly]
+internal static class ModuleInitializer
+{
+ [ModuleInitializer]
+ public static void Initialize()
+ {
+ VerifyDiffPlex.Initialize(OutputType.Compact);
+ }
+}
diff --git a/tests/Visus.AddressValidation.Integration.Ups.Tests/ModuleInitializer.cs b/tests/Visus.AddressValidation.Integration.Ups.Tests/ModuleInitializer.cs
new file mode 100644
index 0000000..6712fdb
--- /dev/null
+++ b/tests/Visus.AddressValidation.Integration.Ups.Tests/ModuleInitializer.cs
@@ -0,0 +1,15 @@
+namespace Visus.AddressValidation.Integration.Ups.Tests;
+
+using System.Runtime.CompilerServices;
+using JetBrains.Annotations;
+using VerifyTests.DiffPlex;
+
+[UsedImplicitly]
+internal static class ModuleInitializer
+{
+ [ModuleInitializer]
+ public static void Initialize()
+ {
+ VerifyDiffPlex.Initialize(OutputType.Compact);
+ }
+}
diff --git a/tests/Visus.AddressValidation.SourceGeneration.Tests/CustomResponseDataGeneratorTests.Should_Generate_GetCustomResponseData_For_Nested_Class#Visus_AddressValidation_SourceGeneration_Tests_Response_ApiData_GetCustomResponseData.g.verified.cs b/tests/Visus.AddressValidation.SourceGeneration.Tests/CustomResponseDataGeneratorTests.Should_Generate_GetCustomResponseData_For_Nested_Class#Visus_AddressValidation_SourceGeneration_Tests_Response_ApiData_GetCustomResponseData.g.verified.cs
new file mode 100644
index 0000000..ea10667
--- /dev/null
+++ b/tests/Visus.AddressValidation.SourceGeneration.Tests/CustomResponseDataGeneratorTests.Should_Generate_GetCustomResponseData_For_Nested_Class#Visus_AddressValidation_SourceGeneration_Tests_Response_ApiData_GetCustomResponseData.g.verified.cs
@@ -0,0 +1,25 @@
+//HintName: Visus_AddressValidation_SourceGeneration_Tests_Response_ApiData_GetCustomResponseData.g.cs
+//
+
+#nullable enable annotations
+#nullable disable warnings
+
+using System.Collections.Generic;
+
+namespace Visus.AddressValidation.SourceGeneration.Tests
+{
+ internal partial class Response
+ {
+ private partial class ApiData
+ {
+ public IReadOnlyDictionary GetCustomResponseData()
+ {
+ return new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ ["responseId"] = ResponseId,
+ ["response"] = ResponseText
+ };
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/Visus.AddressValidation.SourceGeneration.Tests/CustomResponseDataGeneratorTests.Should_Generate_GetCustomResponseData_For_Root_Class#Visus_AddressValidation_SourceGeneration_Tests_ApiResponse_GetCustomResponseData.g.verified.cs b/tests/Visus.AddressValidation.SourceGeneration.Tests/CustomResponseDataGeneratorTests.Should_Generate_GetCustomResponseData_For_Root_Class#Visus_AddressValidation_SourceGeneration_Tests_ApiResponse_GetCustomResponseData.g.verified.cs
new file mode 100644
index 0000000..3a5cb5e
--- /dev/null
+++ b/tests/Visus.AddressValidation.SourceGeneration.Tests/CustomResponseDataGeneratorTests.Should_Generate_GetCustomResponseData_For_Root_Class#Visus_AddressValidation_SourceGeneration_Tests_ApiResponse_GetCustomResponseData.g.verified.cs
@@ -0,0 +1,22 @@
+//HintName: Visus_AddressValidation_SourceGeneration_Tests_ApiResponse_GetCustomResponseData.g.cs
+//
+
+#nullable enable annotations
+#nullable disable warnings
+
+using System.Collections.Generic;
+
+namespace Visus.AddressValidation.SourceGeneration.Tests
+{
+ internal partial class ApiResponse
+ {
+ public IReadOnlyDictionary GetCustomResponseData()
+ {
+ return new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ ["responseId"] = ResponseId,
+ ["response"] = ResponseText
+ };
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/Visus.AddressValidation.SourceGeneration.Tests/CustomResponseDataGeneratorTests.cs b/tests/Visus.AddressValidation.SourceGeneration.Tests/CustomResponseDataGeneratorTests.cs
new file mode 100644
index 0000000..5a2e250
--- /dev/null
+++ b/tests/Visus.AddressValidation.SourceGeneration.Tests/CustomResponseDataGeneratorTests.cs
@@ -0,0 +1,63 @@
+extern alias sourcegen;
+
+namespace Visus.AddressValidation.SourceGeneration.Tests;
+
+using CustomResponseDataGenerator = sourcegen::Visus.AddressValidation.SourceGeneration.CustomResponseDataGenerator;
+
+internal sealed class CustomResponseDataGeneratorTests : SourceGeneratorTestBase
+{
+ protected override IEnumerable RequiredAssemblies =>
+ [
+ typeof(CustomResponseDataGenerator),
+ typeof(CustomResponseDataPropertyAttribute),
+ ];
+
+ [Test]
+ public Task Should_Generate_GetCustomResponseData_For_Nested_Class()
+ {
+ const string source = """
+ using Visus.AddressValidation;
+
+ namespace Visus.AddressValidation.SourceGeneration.Tests;
+
+ partial class Response
+ {
+ public string FirstName { get; set; }
+
+ public string LastName { get; set; }
+
+ partial class ApiData
+ {
+ [CustomResponseDataProperty]
+ public string ResponseId { get; set; }
+
+ [CustomResponseDataProperty("response")]
+ public string ResponseText { get; set; }
+ }
+ }
+ """;
+
+ return VerifyGenerateSourcesAsync(source, new CustomResponseDataGenerator());
+ }
+
+ [Test]
+ public Task Should_Generate_GetCustomResponseData_For_Root_Class()
+ {
+ const string source = """
+ using Visus.AddressValidation;
+
+ namespace Visus.AddressValidation.SourceGeneration.Tests;
+
+ partial class ApiResponse
+ {
+ [CustomResponseDataProperty]
+ public string ResponseId { get; set; }
+
+ [CustomResponseDataProperty("response")]
+ public string ResponseText { get; set; }
+ }
+ """;
+
+ return VerifyGenerateSourcesAsync(source, new CustomResponseDataGenerator());
+ }
+}
diff --git a/tests/Visus.AddressValidation.SourceGeneration.Tests/ModuleInitializer.cs b/tests/Visus.AddressValidation.SourceGeneration.Tests/ModuleInitializer.cs
new file mode 100644
index 0000000..a421616
--- /dev/null
+++ b/tests/Visus.AddressValidation.SourceGeneration.Tests/ModuleInitializer.cs
@@ -0,0 +1,16 @@
+namespace Visus.AddressValidation.SourceGeneration.Tests;
+
+using System.Runtime.CompilerServices;
+using JetBrains.Annotations;
+using VerifyTests.DiffPlex;
+
+[UsedImplicitly]
+internal static class ModuleInitializer
+{
+ [ModuleInitializer]
+ public static void Initialize()
+ {
+ VerifySourceGenerators.Initialize();
+ VerifyDiffPlex.Initialize(OutputType.Compact);
+ }
+}
diff --git a/tests/Visus.AddressValidation.SourceGeneration.Tests/SourceGeneratorTestBase.cs b/tests/Visus.AddressValidation.SourceGeneration.Tests/SourceGeneratorTestBase.cs
new file mode 100644
index 0000000..e404c0e
--- /dev/null
+++ b/tests/Visus.AddressValidation.SourceGeneration.Tests/SourceGeneratorTestBase.cs
@@ -0,0 +1,38 @@
+namespace Visus.AddressValidation.SourceGeneration.Tests;
+
+using System.Reflection;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+
+internal abstract class SourceGeneratorTestBase
+{
+ protected abstract IEnumerable RequiredAssemblies { get; }
+
+ private IEnumerable AssemblyReferencesForCodeGen =>
+ AppDomain.CurrentDomain
+ .GetAssemblies()
+ .Concat(new[]
+ {
+ typeof(Binder),
+ }.Concat(RequiredAssemblies).Select(s => s.Assembly))
+ .Distinct()
+ .Where(w => !w.IsDynamic)
+ .Select(s => MetadataReference.CreateFromFile(s.Location));
+
+ protected Task VerifyGenerateSourcesAsync(string source, params IIncrementalGenerator[] generators)
+ {
+ SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(source, CSharpParseOptions.Default);
+
+ CSharpCompilation compilation = CSharpCompilation.Create(
+ "compilation",
+ [syntaxTree,],
+ AssemblyReferencesForCodeGen,
+ new CSharpCompilationOptions(OutputKind.ConsoleApplication));
+
+ CSharpGeneratorDriver driver = CSharpGeneratorDriver.Create(generators);
+ GeneratorDriver runner = driver.RunGenerators(compilation);
+ SettingsTask verify = Verify(runner);
+
+ return verify;
+ }
+}
diff --git a/tests/Visus.AddressValidation.SourceGeneration.Tests/Visus.AddressValidation.SourceGeneration.Tests.csproj b/tests/Visus.AddressValidation.SourceGeneration.Tests/Visus.AddressValidation.SourceGeneration.Tests.csproj
index dfc7a44..4599428 100644
--- a/tests/Visus.AddressValidation.SourceGeneration.Tests/Visus.AddressValidation.SourceGeneration.Tests.csproj
+++ b/tests/Visus.AddressValidation.SourceGeneration.Tests/Visus.AddressValidation.SourceGeneration.Tests.csproj
@@ -7,6 +7,7 @@
+