From 48cda86e0705ea50df97149822305b3c8a0e8000 Mon Sep 17 00:00:00 2001 From: Johannes Link Date: Thu, 28 Nov 2024 14:11:56 +0100 Subject: [PATCH] Made Arbitrary provider method matching looser. Tackling bug https://github.com/jqwik-team/jqwik/issues/599 --- .../InstanceBasedSubtypeProvider.java | 7 +-- .../PropertyMethodArbitraryResolverTests.java | 47 ++++++++++++++++++- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/engine/src/main/java/net/jqwik/engine/properties/InstanceBasedSubtypeProvider.java b/engine/src/main/java/net/jqwik/engine/properties/InstanceBasedSubtypeProvider.java index c24b80370..326de32e8 100644 --- a/engine/src/main/java/net/jqwik/engine/properties/InstanceBasedSubtypeProvider.java +++ b/engine/src/main/java/net/jqwik/engine/properties/InstanceBasedSubtypeProvider.java @@ -125,12 +125,7 @@ private Optional findProviderMethodByName(String generatorToFind, TypeUs return provideAnnotation.map(Provide::value).orElse(""); }; - TypeUsage effectiveTargetType = targetType.isTypeVariableOrWildcard() ? targetType : TypeUsage.wildcard(targetType); - TypeUsage expectedReturnType = TypeUsage.of( - Arbitrary.class, - effectiveTargetType - ); - + TypeUsage expectedReturnType = TypeUsage.of(Arbitrary.class); return findGeneratorMethod(generatorToFind, contextInstance().getClass(), Provide.class, generatorNameSupplier, expectedReturnType); } diff --git a/engine/src/test/java/net/jqwik/engine/properties/PropertyMethodArbitraryResolverTests.java b/engine/src/test/java/net/jqwik/engine/properties/PropertyMethodArbitraryResolverTests.java index 5ce1d6075..b1efff55a 100644 --- a/engine/src/test/java/net/jqwik/engine/properties/PropertyMethodArbitraryResolverTests.java +++ b/engine/src/test/java/net/jqwik/engine/properties/PropertyMethodArbitraryResolverTests.java @@ -28,6 +28,16 @@ public String toString() { } } + private class ThingArbitrary extends ArbitraryDecorator { + + @Override + protected Arbitrary arbitrary() { + return Arbitraries.just(new Thing()); + } + } + + + @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Provide @@ -208,6 +218,14 @@ void providerMethodCanHaveWildcardArbitrary() { assertThingArbitrary(arbitraries.iterator().next()); } + @Example + void providerMethodCanReturnArbitrarySubtype() { + PropertyMethodArbitraryResolver provider = getResolver(WithNamedProviders.class); + MethodParameter parameter = getParameter(WithNamedProviders.class, "thingFromArbitrarySubtype"); + Set> arbitraries = provider.forParameter(parameter); + assertThingArbitrary(arbitraries.iterator().next()); + } + @Example void providerMethodCanHaveTypeUsageParameter() { PropertyMethodArbitraryResolver provider = getResolver(WithNamedProviders.class); @@ -240,6 +258,13 @@ void findGeneratorByName() { assertThingArbitrary(arbitraries.iterator().next()); } + @Example + void failWhenProviderMethodDoesNotReturnArbitrary() { + PropertyMethodArbitraryResolver provider = getResolver(WithNamedProviders.class); + MethodParameter parameter = getParameter(WithNamedProviders.class, "providerDoesNotReturnArbitrary"); + assertThat(provider.forParameter(parameter)).isEmpty(); + } + @Example void findGeneratorBySupplier() { PropertyMethodArbitraryResolver provider = getResolver(WithNamedProviders.class); @@ -402,7 +427,7 @@ Arbitrary aThingy() { } @Property - boolean thingFromWildcard(@ForAll("aThingFromWildcard") Object aThing) { + boolean thingFromWildcard(@ForAll("aThingFromWildcard") Thing aThing) { return true; } @@ -411,6 +436,16 @@ Arbitrary aThingFromWildcard() { return Arbitraries.just(new Thing()); } + @Property + boolean thingFromArbitrarySubtype(@ForAll("aThingFromArbitrarySubtype") Thing aThing) { + return true; + } + + @Provide + ThingArbitrary aThingFromArbitrarySubtype() { + return new ThingArbitrary(); + } + @Property boolean thingBySupplier(@ForAll(supplier = ThingSupplier.class) Thing aThing) { return true; @@ -514,6 +549,16 @@ Arbitrary aThing() { return Arbitraries.just(new Thing()); } + @Property + boolean providerDoesNotReturnArbitrary(@ForAll("notAnArbitrary") Thing aThing) { + return true; + } + + @Provide + Thing notAnArbitrary() { + return new Thing(); + } + @Group class NestedWithNamedProviders { @Property