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

Add register and select ArbitraryBuilder by name #1036

Merged
Merged
Show file tree
Hide file tree
Changes from 3 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
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Stream;

Expand All @@ -36,7 +37,9 @@
import com.navercorp.fixturemonkey.api.property.RootProperty;
import com.navercorp.fixturemonkey.api.type.LazyAnnotatedType;
import com.navercorp.fixturemonkey.api.type.TypeReference;
import com.navercorp.fixturemonkey.buildergroup.ArbitraryBuilderCandidate;
import com.navercorp.fixturemonkey.customizer.ArbitraryManipulator;
import com.navercorp.fixturemonkey.customizer.ArbitraryManagerFactory;
import com.navercorp.fixturemonkey.customizer.MonkeyManipulatorFactory;
import com.navercorp.fixturemonkey.experimental.ExperimentalArbitraryBuilder;
import com.navercorp.fixturemonkey.resolver.ArbitraryBuilderContext;
Expand All @@ -53,21 +56,29 @@ public final class FixtureMonkey {
private final MonkeyContext monkeyContext;
private final List<MatcherOperator<? extends ArbitraryBuilder<?>>> registeredArbitraryBuilders = new ArrayList<>();
private final MonkeyManipulatorFactory monkeyManipulatorFactory;
private final ArbitraryManagerFactory arbitraryManagerFactory;

public FixtureMonkey(
FixtureMonkeyOptions fixtureMonkeyOptions,
ArbitraryTraverser traverser,
ManipulatorOptimizer manipulatorOptimizer,
MonkeyContext monkeyContext,
List<MatcherOperator<Function<FixtureMonkey, ? extends ArbitraryBuilder<?>>>> registeredArbitraryBuilders,
MonkeyManipulatorFactory monkeyManipulatorFactory
MonkeyManipulatorFactory monkeyManipulatorFactory,
Map<String, ArbitraryBuilderCandidate<?>> arbitraryBuilderCandidateMap
) {
this.fixtureMonkeyOptions = fixtureMonkeyOptions;
this.traverser = traverser;
this.manipulatorOptimizer = manipulatorOptimizer;
this.monkeyContext = monkeyContext;
this.monkeyManipulatorFactory = monkeyManipulatorFactory;
initializeRegisteredArbitraryBuilders(registeredArbitraryBuilders);
/*
ArbitraryBuilder에서 arbitaryBuilderName을 통해 선택을 한 후, 선택된 ArbitraryBuilder를 적용시킬 계획입니다.
위와 같이 구현을 하기 위해선, DefaultArbitraryBuilder에서 MatcherOperator을 사용해 변환을 해야 합니다.
이때 apply api에서 FixtureMonkey 객체를 필요로 하기 때문에 의존 객체를 생성자에 넘겨줘 인스턴스를 생성하는 방식으로 구현 했습니다.
*/
arbitraryManagerFactory = new ArbitraryManagerFactory(arbitraryBuilderCandidateMap, this);
}

public static FixtureMonkeyBuilder builder() {
Expand Down Expand Up @@ -111,7 +122,8 @@ public <T> ArbitraryBuilder<T> giveMeBuilder(TypeReference<T> type) {
builderContext.copy(),
registeredArbitraryBuilders,
monkeyContext,
fixtureMonkeyOptions.getInstantiatorProcessor()
fixtureMonkeyOptions.getInstantiatorProcessor(),
arbitraryManagerFactory
);
}

Expand All @@ -138,7 +150,8 @@ public <T> ArbitraryBuilder<T> giveMeBuilder(T value) {
context,
registeredArbitraryBuilders,
monkeyContext,
fixtureMonkeyOptions.getInstantiatorProcessor()
fixtureMonkeyOptions.getInstantiatorProcessor(),
arbitraryManagerFactory
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.function.UnaryOperator;
Expand Down Expand Up @@ -59,6 +61,7 @@
import com.navercorp.fixturemonkey.api.validator.ArbitraryValidator;
import com.navercorp.fixturemonkey.buildergroup.ArbitraryBuilderCandidate;
import com.navercorp.fixturemonkey.buildergroup.ArbitraryBuilderGroup;
import com.navercorp.fixturemonkey.buildergroup.ArbitraryManagerGroup;
import com.navercorp.fixturemonkey.customizer.MonkeyManipulatorFactory;
import com.navercorp.fixturemonkey.expression.ArbitraryExpressionFactory;
import com.navercorp.fixturemonkey.expression.MonkeyExpressionFactory;
Expand All @@ -76,6 +79,7 @@ public final class FixtureMonkeyBuilder {
private ManipulatorOptimizer manipulatorOptimizer = new NoneManipulatorOptimizer();
private MonkeyExpressionFactory monkeyExpressionFactory = new ArbitraryExpressionFactory();
private final MonkeyContextBuilder monkeyContextBuilder = MonkeyContext.builder();
private final Map<String, ArbitraryBuilderCandidate<?>> arbitraryBuilderCandidateMap = new HashMap<>();
private long seed = System.nanoTime();

// The default plugins are listed below.
Expand Down Expand Up @@ -381,6 +385,13 @@ public FixtureMonkeyBuilder registerGroup(ArbitraryBuilderGroup... arbitraryBuil
return this;
}

public FixtureMonkeyBuilder registerGroup(ArbitraryManagerGroup... arbitraryManagerGroups) {
for (ArbitraryManagerGroup arbitraryManagerGroup : arbitraryManagerGroups) {
this.arbitraryBuilderCandidateMap.putAll(arbitraryManagerGroup.generateCandidateList().getCandidates());
}
return this;
}

public FixtureMonkeyBuilder plugin(Plugin plugin) {
if (plugin instanceof InterfacePlugin) { // TODO: Added for backward compatibility. It will be removed in 1.1.0
this.defaultInterfacePlugin = (InterfacePlugin)plugin;
Expand Down Expand Up @@ -552,7 +563,8 @@ public FixtureMonkey build() {
manipulatorOptimizer,
monkeyContext,
registeredArbitraryBuilders,
monkeyManipulatorFactory
monkeyManipulatorFactory,
arbitraryBuilderCandidateMap
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* 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.buildergroup;

import com.navercorp.fixturemonkey.resolver.ArbitraryCandidateManager;

public interface ArbitraryManagerGroup {

ArbitraryCandidateManager generateCandidateList();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* 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.customizer;

import java.util.Collections;
import java.util.Map;

import com.navercorp.fixturemonkey.FixtureMonkey;
import com.navercorp.fixturemonkey.buildergroup.ArbitraryBuilderCandidate;

public final class ArbitraryManagerFactory {
private final Map<String, ArbitraryBuilderCandidate<?>> arbitraryBuilderCandidateMap;
private final FixtureMonkey fixtureMonkey;

public ArbitraryManagerFactory(
final Map<String, ArbitraryBuilderCandidate<?>> arbitraryBuilderCandidateMap,
final FixtureMonkey fixtureMonkey
) {
this.arbitraryBuilderCandidateMap = arbitraryBuilderCandidateMap;
this.fixtureMonkey = fixtureMonkey;
}

public Map<String, ArbitraryBuilderCandidate<?>> getArbitraryBuilderCandidateMap() {
return Collections.unmodifiableMap(arbitraryBuilderCandidateMap);
}

public FixtureMonkey getFixtureMonkey() {
return fixtureMonkey;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* 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.resolver;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import com.navercorp.fixturemonkey.buildergroup.ArbitraryBuilderCandidate;

public final class ArbitraryCandidateManager {

private final Map<String, ArbitraryBuilderCandidate<?>> candidateMap = new HashMap<>();

private ArbitraryCandidateManager() {
}

public static ArbitraryCandidateManager create() {
return new ArbitraryCandidateManager();
}

public ArbitraryCandidateManager add(String arbitraryBuilderName, ArbitraryBuilderCandidate<?> candidate) {
checkNull(arbitraryBuilderName);
checkDuplicate(arbitraryBuilderName);
candidateMap.put(arbitraryBuilderName, candidate);

return this;
}

private void checkNull(String arbitraryBuilderName) {
if (arbitraryBuilderName == null) {
throw new IllegalArgumentException("ArbitraryBuilder name must not be null");
}
}

private void checkDuplicate(String arbitraryBuilderName) {
if (candidateMap.containsKey(arbitraryBuilderName)) {
throw new IllegalArgumentException("Duplicated ArbitraryBuilder name: " + arbitraryBuilderName);
}
}

public Map<String, ArbitraryBuilderCandidate<?>> getCandidates() {
return Collections.unmodifiableMap(candidateMap);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

import com.navercorp.fixturemonkey.ArbitraryBuilder;
import com.navercorp.fixturemonkey.customizer.ArbitraryManagerFactory;
import com.navercorp.fixturemonkey.api.arbitrary.CombinableArbitrary;
import com.navercorp.fixturemonkey.api.context.MonkeyContext;
import com.navercorp.fixturemonkey.api.experimental.TypedPropertySelector;
Expand All @@ -65,6 +66,7 @@
import com.navercorp.fixturemonkey.api.type.LazyAnnotatedType;
import com.navercorp.fixturemonkey.api.type.TypeReference;
import com.navercorp.fixturemonkey.api.type.Types;
import com.navercorp.fixturemonkey.buildergroup.ArbitraryBuilderCandidate;
import com.navercorp.fixturemonkey.customizer.ArbitraryManipulator;
import com.navercorp.fixturemonkey.customizer.ContainerInfoManipulator;
import com.navercorp.fixturemonkey.customizer.InnerSpec;
Expand All @@ -85,6 +87,7 @@ public final class DefaultArbitraryBuilder<T> implements ArbitraryBuilder<T>, Ex
private final List<MatcherOperator<? extends ArbitraryBuilder<?>>> registeredArbitraryBuilders;
private final MonkeyContext monkeyContext;
private final InstantiatorProcessor instantiatorProcessor;
private final ArbitraryManagerFactory arbitraryManagerFactory;

public DefaultArbitraryBuilder(
FixtureMonkeyOptions fixtureMonkeyOptions,
Expand All @@ -95,7 +98,8 @@ public DefaultArbitraryBuilder(
ArbitraryBuilderContext context,
List<MatcherOperator<? extends ArbitraryBuilder<?>>> registeredArbitraryBuilders,
MonkeyContext monkeyContext,
InstantiatorProcessor instantiatorProcessor
InstantiatorProcessor instantiatorProcessor,
ArbitraryManagerFactory arbitraryManagerFactory
) {
this.fixtureMonkeyOptions = fixtureMonkeyOptions;
this.rootProperty = rootProperty;
Expand All @@ -106,6 +110,7 @@ public DefaultArbitraryBuilder(
this.registeredArbitraryBuilders = registeredArbitraryBuilders;
this.monkeyContext = monkeyContext;
this.instantiatorProcessor = instantiatorProcessor;
this.arbitraryManagerFactory = arbitraryManagerFactory;
}

@Override
Expand Down Expand Up @@ -178,6 +183,8 @@ public ArbitraryBuilder<T> setLazy(PropertySelector propertySelector, Supplier<?
);
}

// TODO 다음 PR에서 선택 api 구현

@Override
public ArbitraryBuilder<T> setInner(InnerSpec innerSpec) {
ManipulatorSet manipulatorSet = innerSpec.getManipulatorSet(monkeyManipulatorFactory);
Expand Down Expand Up @@ -510,7 +517,8 @@ public ArbitraryBuilder<T> copy() {
context.copy(),
registeredArbitraryBuilders,
monkeyContext,
instantiatorProcessor
instantiatorProcessor,
arbitraryManagerFactory
);
}

Expand Down Expand Up @@ -560,7 +568,8 @@ private <R> DefaultArbitraryBuilder<R> generateArbitraryBuilderLazily(LazyArbitr
context,
registeredArbitraryBuilders,
monkeyContext,
instantiatorProcessor
instantiatorProcessor,
arbitraryManagerFactory
);
}

Expand Down