diff --git a/src/StaticSettingsTests/RegisterFileConverterTests.cs b/src/StaticSettingsTests/RegisterFileConverterTests.cs new file mode 100644 index 000000000..b5a784bda --- /dev/null +++ b/src/StaticSettingsTests/RegisterFileConverterTests.cs @@ -0,0 +1,21 @@ +public class RegisterFileConverterTests : + BaseTest +{ + [Fact] + public void ObjectThrows() + { + var exception = Assert.Throws( + () => VerifierSettings.RegisterFileConverter( + (_, _) => new(null, "txt", "value"))); + Assert.Contains("too greedy", exception.Message); + } + + [Fact] + public void ObjectAsyncThrows() + { + var exception = Assert.Throws( + () => VerifierSettings.RegisterFileConverter( + (_, _) => Task.FromResult(new(null, "txt", "value")))); + Assert.Contains("too greedy", exception.Message); + } +} diff --git a/src/Verify/Splitters/Settings_Typed.cs b/src/Verify/Splitters/Settings_Typed.cs index 4891b4b9c..848e5d49d 100644 --- a/src/Verify/Splitters/Settings_Typed.cs +++ b/src/Verify/Splitters/Settings_Typed.cs @@ -26,6 +26,7 @@ public static void RegisterFileConverter( CanConvert? canConvert = null) { InnerVerifier.ThrowIfVerifyHasBeenRun(); + ThrowIfObjectConverter(); RegisterFileConverter( (target, context) => Task.FromResult(conversion(target, context)), canConvert); @@ -36,10 +37,19 @@ public static void RegisterFileConverter( CanConvert? canConvert = null) { InnerVerifier.ThrowIfVerifyHasBeenRun(); + ThrowIfObjectConverter(); var converter = new TypeConverter((target, context) => conversion((T) target, context), DefaultCanConvert(canConvert)); typedConverters.Add(converter); } + static void ThrowIfObjectConverter() + { + if (typeof(T) == typeof(object)) + { + throw new("RegisterFileConverter is too greedy since object matches all verified values. Instead use a more specific type, or use the non-generic RegisterFileConverter overload that takes an explicit `canConvert`."); + } + } + public static void RegisterFileConverter( Conversion conversion, CanConvert canConvert)