Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix a bug in registering JavaBuilder and KotlinBuilder #1087

Merged
merged 1 commit into from
Nov 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion docs/content/v1.1.x-kor/release-notes/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ weight: 100
---
sectionStart
## v.1.1.2
Fix setting recursive implementations of self reference object
Fix setting recursive implementations of self reference object.

Fix registering JavaBuilder and KotlinBuilder.

sectionEnd

Expand Down
4 changes: 3 additions & 1 deletion docs/content/v1.1.x/release-notes/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ weight: 100
---
sectionStart
## v.1.1.2
Fix setting recursive implementations of self reference object
Fix setting recursive implementations of self reference object.

Fix registering JavaBuilder and KotlinBuilder.

sectionEnd

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import com.navercorp.fixturemonkey.api.expression.TypedPropertySelector
import com.navercorp.fixturemonkey.api.instantiator.Instantiator
import com.navercorp.fixturemonkey.api.property.PropertySelector
import com.navercorp.fixturemonkey.api.type.TypeReference
import com.navercorp.fixturemonkey.builder.ArbitraryBuilderContext
import com.navercorp.fixturemonkey.builder.ArbitraryBuilderContextProvider
import com.navercorp.fixturemonkey.customizer.InnerSpec
import com.navercorp.fixturemonkey.experimental.ExperimentalArbitraryBuilder
import net.jqwik.api.Arbitrary
Expand Down Expand Up @@ -55,17 +57,16 @@ inline fun <reified T : Any?> FixtureMonkey.giveMeBuilder(): ArbitraryBuilder<T>
this.giveMeBuilder(object : TypeReference<T>() {})

inline fun <reified T : Any?> FixtureMonkey.giveMeKotlinBuilder(): KotlinTypeDefaultArbitraryBuilder<T> =
KotlinTypeDefaultArbitraryBuilder(this.giveMeBuilder(object : TypeReference<T>() {}))
InternalKotlinTypeDefaultArbitraryBuilder(this.giveMeBuilder(object : TypeReference<T>() {}))

inline fun <reified T : Any?> FixtureMonkey.giveMeKotlinBuilder(value: T): KotlinTypeDefaultArbitraryBuilder<T> =
KotlinTypeDefaultArbitraryBuilder(this.giveMeBuilder(value))
InternalKotlinTypeDefaultArbitraryBuilder(this.giveMeBuilder(value))

inline fun <reified T : Any?> FixtureMonkey.giveMeExperimentalBuilder(): ExperimentalArbitraryBuilder<T> =
this.giveMeExperimentalBuilder(object : TypeReference<T>() {})

class KotlinTypeDefaultArbitraryBuilder<T>(
val delegate: ArbitraryBuilder<T>,
) : ArbitraryBuilder<T> {
open class KotlinTypeDefaultArbitraryBuilder<T> internal constructor(val delegate: ArbitraryBuilder<T>) :
ArbitraryBuilder<T> {
override fun set(expression: String, value: Any?): KotlinTypeDefaultArbitraryBuilder<T> = this.apply {
delegate.set(expression, value)
}
Expand Down Expand Up @@ -192,27 +193,29 @@ class KotlinTypeDefaultArbitraryBuilder<T>(
override fun <R> zipWith(
others: List<ArbitraryBuilder<*>>,
combinator: Function<List<*>, R>?,
): KotlinTypeDefaultArbitraryBuilder<R> = KotlinTypeDefaultArbitraryBuilder(delegate.zipWith(others, combinator))
): KotlinTypeDefaultArbitraryBuilder<R> =
InternalKotlinTypeDefaultArbitraryBuilder(delegate.zipWith(others, combinator))

override fun <U, R> zipWith(
other: ArbitraryBuilder<U>,
combinator: BiFunction<T, U, R>,
): KotlinTypeDefaultArbitraryBuilder<R> = KotlinTypeDefaultArbitraryBuilder(delegate.zipWith(other, combinator))
): KotlinTypeDefaultArbitraryBuilder<R> =
InternalKotlinTypeDefaultArbitraryBuilder(delegate.zipWith(other, combinator))

override fun <U, V, R> zipWith(
other: ArbitraryBuilder<U>,
another: ArbitraryBuilder<V>,
combinator: Combinators.F3<T, U, V, R>,
): KotlinTypeDefaultArbitraryBuilder<R> =
KotlinTypeDefaultArbitraryBuilder(delegate.zipWith(other, another, combinator))
InternalKotlinTypeDefaultArbitraryBuilder(delegate.zipWith(other, another, combinator))

override fun <U, V, W, R> zipWith(
other: ArbitraryBuilder<U>,
another: ArbitraryBuilder<V>,
theOther: ArbitraryBuilder<W>,
combinator: Combinators.F4<T, U, V, W, R>,
): KotlinTypeDefaultArbitraryBuilder<R> =
KotlinTypeDefaultArbitraryBuilder(delegate.zipWith(other, another, theOther, combinator))
InternalKotlinTypeDefaultArbitraryBuilder(delegate.zipWith(other, another, theOther, combinator))

override fun sampleList(size: Int): List<T> = delegate.sampleList(size)

Expand Down Expand Up @@ -242,7 +245,8 @@ class KotlinTypeDefaultArbitraryBuilder<T>(

override fun sampleStream(): Stream<T> = delegate.sampleStream()

override fun copy(): KotlinTypeDefaultArbitraryBuilder<T> = KotlinTypeDefaultArbitraryBuilder(delegate.copy())
override fun copy(): KotlinTypeDefaultArbitraryBuilder<T> =
InternalKotlinTypeDefaultArbitraryBuilder(delegate.copy())

override fun thenApply(biConsumer: BiConsumer<T, ArbitraryBuilder<T>>): KotlinTypeDefaultArbitraryBuilder<T> =
this.apply { delegate.thenApply(biConsumer) }
Expand All @@ -253,7 +257,7 @@ class KotlinTypeDefaultArbitraryBuilder<T>(
): KotlinTypeDefaultArbitraryBuilder<T> = this.apply { delegate.acceptIf(predicate, consumer) }

override fun <U> map(mapper: Function<T, U>): KotlinTypeDefaultArbitraryBuilder<U> =
KotlinTypeDefaultArbitraryBuilder(delegate.map(mapper))
InternalKotlinTypeDefaultArbitraryBuilder(delegate.map(mapper))

fun setInner(innerSpecConfigurer: (InnerSpec.() -> InnerSpec)): KotlinTypeDefaultArbitraryBuilder<T> =
this.apply { delegate.setInner(innerSpecConfigurer(InnerSpec())) }
Expand Down Expand Up @@ -588,3 +592,8 @@ class KotlinTypeDefaultArbitraryBuilder<T>(
): KotlinTypeDefaultArbitraryBuilder<T> =
this.setLazy(propertySelector, supplier)
}

class InternalKotlinTypeDefaultArbitraryBuilder<T>(delegate: ArbitraryBuilder<T>) :
KotlinTypeDefaultArbitraryBuilder<T>(delegate), ArbitraryBuilderContextProvider {
override fun getContext(): ArbitraryBuilderContext = (delegate as ArbitraryBuilderContextProvider).context
}
Original file line number Diff line number Diff line change
Expand Up @@ -1383,4 +1383,16 @@ void setListRecursiveImplementations() {

then(actual.getValue()).isEqualTo(expected);
}

@Test
void registerJavaTypebuilder() {
String expected = "test";
FixtureMonkey sut = FixtureMonkey.builder()
.register(String.class, it -> it.giveMeJavaBuilder(expected))
.build();

String actual = sut.giveMeOne(String.class);

then(actual).isEqualTo(expected);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,8 @@ import com.navercorp.fixturemonkey.api.introspector.FieldReflectionArbitraryIntr
import com.navercorp.fixturemonkey.api.matcher.AssignableTypeMatcher
import com.navercorp.fixturemonkey.api.matcher.MatcherOperator
import com.navercorp.fixturemonkey.api.plugin.InterfacePlugin
import com.navercorp.fixturemonkey.api.property.CandidateConcretePropertyResolver
import com.navercorp.fixturemonkey.api.property.ConcreteTypeCandidateConcretePropertyResolver
import com.navercorp.fixturemonkey.api.property.Property
import com.navercorp.fixturemonkey.api.property.PropertyUtils
import com.navercorp.fixturemonkey.api.type.Types
import com.navercorp.fixturemonkey.api.type.Types.GeneratingWildcardType
import com.navercorp.fixturemonkey.customizer.Values
import com.navercorp.fixturemonkey.kotlin.KotlinPlugin
Expand Down Expand Up @@ -1037,6 +1034,19 @@ class KotlinTest {
then(actual).isEqualTo(expected)
}

@Test
fun registerKotlinTypeBuilder() {
val expected = "test"
val sut = FixtureMonkey.builder()
.register(String::class.java) {
it.giveMeKotlinBuilder(expected)
}
.build()
val actual: String = sut.giveMeOne()

then(actual).isEqualTo(expected)
}

companion object {
private val SUT: FixtureMonkey = FixtureMonkey.builder()
.plugin(KotlinPlugin())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import com.navercorp.fixturemonkey.api.type.LazyAnnotatedType;
import com.navercorp.fixturemonkey.api.type.TypeReference;
import com.navercorp.fixturemonkey.builder.ArbitraryBuilderContext;
import com.navercorp.fixturemonkey.builder.ArbitraryBuilderContextProvider;
import com.navercorp.fixturemonkey.builder.DefaultArbitraryBuilder;
import com.navercorp.fixturemonkey.builder.JavaTypeDefaultTypeArbitraryBuilder;
import com.navercorp.fixturemonkey.customizer.ArbitraryManipulator;
Expand Down Expand Up @@ -88,8 +89,8 @@ public <T> ArbitraryBuilder<T> giveMeBuilder(TypeReference<T> type) {
.filter(it -> it.match(rootProperty))
.map(MatcherOperator::getOperator)
.findAny()
.map(DefaultArbitraryBuilder.class::cast)
.map(DefaultArbitraryBuilder::getContext)
.map(ArbitraryBuilderContextProvider.class::cast)
.map(ArbitraryBuilderContextProvider::getContext)
.orElse(new ArbitraryBuilderContext());

return new DefaultArbitraryBuilder<>(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Fixture Monkey
*
* Copyright (c) 2021-present NAVER Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.navercorp.fixturemonkey.builder;

import org.apiguardian.api.API;
import org.apiguardian.api.API.Status;

/**
* Retrieves the context of {@link com.navercorp.fixturemonkey.ArbitraryBuilder}
* <p>
* It is for internal use only. It can be changed or removed at any time.
**/
@API(since = "1.1.2", status = Status.INTERNAL)
public interface ArbitraryBuilderContextProvider {
ArbitraryBuilderContext getContext();
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,8 @@

@SuppressFBWarnings("NM_SAME_SIMPLE_NAME_AS_SUPERCLASS")
@API(since = "0.4.0", status = Status.MAINTAINED)
public final class DefaultArbitraryBuilder<T> implements ArbitraryBuilder<T>, ExperimentalArbitraryBuilder<T> {
public final class DefaultArbitraryBuilder<T>
implements ArbitraryBuilder<T>, ExperimentalArbitraryBuilder<T>, ArbitraryBuilderContextProvider {
private final FixtureMonkeyOptions fixtureMonkeyOptions;
private final RootProperty rootProperty;
private final ArbitraryResolver resolver;
Expand Down Expand Up @@ -510,6 +511,7 @@ public ArbitraryBuilder<T> copy() {
);
}

@Override
public ArbitraryBuilderContext getContext() {
return this.context;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@
import com.navercorp.fixturemonkey.customizer.InnerSpec;

@API(since = "1.1.0", status = Status.EXPERIMENTAL)
public final class JavaTypeDefaultTypeArbitraryBuilder<T> implements JavaTypeArbitraryBuilder<T> {
public final class JavaTypeDefaultTypeArbitraryBuilder<T>
implements JavaTypeArbitraryBuilder<T>, ArbitraryBuilderContextProvider {
private final ArbitraryBuilder<T> delegate;

public JavaTypeDefaultTypeArbitraryBuilder(ArbitraryBuilder<T> delegate) {
Expand Down Expand Up @@ -345,4 +346,9 @@ public <U> ArbitraryBuilder<T> customizeProperty(
) {
return delegate.customizeProperty(propertySelector, combinableArbitraryCustomizer);
}

@Override
public ArbitraryBuilderContext getContext() {
return ((ArbitraryBuilderContextProvider)delegate).getContext();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import com.navercorp.fixturemonkey.api.matcher.MatcherOperator;
import com.navercorp.fixturemonkey.api.property.Property;
import com.navercorp.fixturemonkey.builder.ArbitraryBuilderContext;
import com.navercorp.fixturemonkey.builder.ArbitraryBuilderContextProvider;
import com.navercorp.fixturemonkey.builder.DefaultArbitraryBuilder;
import com.navercorp.fixturemonkey.customizer.InnerSpecState.ManipulatorHolderSet;
import com.navercorp.fixturemonkey.customizer.Values.Just;
Expand Down Expand Up @@ -147,12 +148,12 @@ public List<ArbitraryManipulator> newRegisteredArbitraryManipulators(
Property property = nodeByType.getKey();
List<ObjectNode> objectNodes = nodeByType.getValue();

DefaultArbitraryBuilder<?> registeredArbitraryBuilder =
(DefaultArbitraryBuilder<?>)registeredArbitraryBuilders.stream()
ArbitraryBuilderContextProvider registeredArbitraryBuilder =
registeredArbitraryBuilders.stream()
.filter(it -> it.match(property))
.findFirst()
.map(MatcherOperator::getOperator)
.filter(it -> it instanceof DefaultArbitraryBuilder<?>)
.map(ArbitraryBuilderContextProvider.class::cast)
.orElse(null);

if (registeredArbitraryBuilder == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
import com.navercorp.fixturemonkey.api.property.Property;
import com.navercorp.fixturemonkey.api.property.RootProperty;
import com.navercorp.fixturemonkey.builder.ArbitraryBuilderContext;
import com.navercorp.fixturemonkey.builder.DefaultArbitraryBuilder;
import com.navercorp.fixturemonkey.builder.ArbitraryBuilderContextProvider;
import com.navercorp.fixturemonkey.customizer.ArbitraryManipulator;
import com.navercorp.fixturemonkey.customizer.ContainerInfoManipulator;
import com.navercorp.fixturemonkey.customizer.MonkeyManipulatorFactory;
Expand Down Expand Up @@ -75,7 +75,7 @@ public CombinableArbitrary<?> resolve(
registeredArbitraryBuilders.stream()
.map(it -> new MatcherOperator<>(
it.getMatcher(),
((DefaultArbitraryBuilder<?>)it.getOperator()).getContext().getContainerInfoManipulators()
((ArbitraryBuilderContextProvider)it.getOperator()).getContext().getContainerInfoManipulators()
))
.collect(Collectors.toList());

Expand Down
Loading