/* * Copyright 2012 Red Hat, Inc. and/or its affiliates. * * 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 org.optaplanner.core.impl.testdata.util; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.function.Consumer; import com.thoughtworks.xstream.XStream; import org.apache.commons.lang3.SerializationUtils; import org.mockito.AdditionalAnswers; import org.optaplanner.core.api.score.buildin.simple.SimpleScore; import org.optaplanner.core.api.solver.SolverFactory; import org.optaplanner.core.config.constructionheuristic.ConstructionHeuristicPhaseConfig; import org.optaplanner.core.config.localsearch.LocalSearchPhaseConfig; import org.optaplanner.core.config.phase.PhaseConfig; import org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig; import org.optaplanner.core.config.score.trend.InitializingScoreTrendLevel; import org.optaplanner.core.config.solver.SolverConfig; import org.optaplanner.core.config.solver.termination.TerminationConfig; import org.optaplanner.core.impl.domain.solution.descriptor.SolutionDescriptor; import org.optaplanner.core.impl.score.DummySimpleScoreEasyScoreCalculator; import org.optaplanner.core.impl.score.director.InnerScoreDirector; import org.optaplanner.core.impl.score.director.easy.EasyScoreCalculator; import org.optaplanner.core.impl.score.director.easy.EasyScoreDirectorFactory; import org.optaplanner.core.impl.score.trend.InitializingScoreTrend; import static org.mockito.Mockito.*; /** * @see PlannerAssert */ public class PlannerTestUtils { public static final int TERMINATION_STEP_COUNT_LIMIT = 10; // ************************************************************************ // SolverFactory methods // ************************************************************************ public static <Solution_> SolverFactory<Solution_> buildSolverFactory( Class<Solution_> solutionClass, Class<?>... entityClasses) { SolverFactory<Solution_> solverFactory = SolverFactory.createEmpty(); SolverConfig solverConfig = solverFactory.getSolverConfig(); solverConfig.setSolutionClass(solutionClass); solverConfig.setEntityClassList(Arrays.asList(entityClasses)); ScoreDirectorFactoryConfig scoreDirectorFactoryConfig = new ScoreDirectorFactoryConfig(); scoreDirectorFactoryConfig.setEasyScoreCalculatorClass(DummySimpleScoreEasyScoreCalculator.class); solverConfig.setScoreDirectorFactoryConfig(scoreDirectorFactoryConfig); List<PhaseConfig> phaseConfigList = new ArrayList<>(2); phaseConfigList.add(new ConstructionHeuristicPhaseConfig()); LocalSearchPhaseConfig localSearchPhaseConfig = new LocalSearchPhaseConfig(); TerminationConfig terminationConfig = new TerminationConfig(); terminationConfig.setStepCountLimit(TERMINATION_STEP_COUNT_LIMIT); localSearchPhaseConfig.setTerminationConfig(terminationConfig); phaseConfigList.add(localSearchPhaseConfig); solverConfig.setPhaseConfigList(phaseConfigList); return solverFactory; } public static <Solution_> SolverFactory<Solution_> buildSolverFactoryWithDroolsScoreDirector( Class<Solution_> solutionClass, Class<?>... entityClasses) { SolverFactory<Solution_> solverFactory = buildSolverFactory(solutionClass, entityClasses); SolverConfig solverConfig = solverFactory.getSolverConfig(); ScoreDirectorFactoryConfig scoreDirectorFactoryConfig = solverConfig.getScoreDirectorFactoryConfig(); scoreDirectorFactoryConfig.setEasyScoreCalculatorClass(null); scoreDirectorFactoryConfig.setScoreDrlList(Collections.singletonList( "org/optaplanner/core/impl/score/dummySimpleScoreDroolsScoreRules.drl")); return solverFactory; } // ************************************************************************ // ScoreDirector methods // ************************************************************************ public static <Solution_> InnerScoreDirector<Solution_> mockScoreDirector(SolutionDescriptor<Solution_> solutionDescriptor) { EasyScoreDirectorFactory<Solution_> scoreDirectorFactory = new EasyScoreDirectorFactory<>((EasyScoreCalculator<Solution_>) (solution_) -> SimpleScore.valueOf(0)); scoreDirectorFactory.setSolutionDescriptor(solutionDescriptor); scoreDirectorFactory.setInitializingScoreTrend( InitializingScoreTrend.buildUniformTrend(InitializingScoreTrendLevel.ONLY_DOWN, 1)); return mock(InnerScoreDirector.class, AdditionalAnswers.delegatesTo(scoreDirectorFactory.buildScoreDirector(false, false))); } // ************************************************************************ // Serialization methods // ************************************************************************ public static <T> void serializeAndDeserializeWithAll(T input, Consumer<T> outputAsserter) { outputAsserter.accept(serializeAndDeserializeWithJavaSerialization(input)); outputAsserter.accept(serializeAndDeserializeWithXStream(input)); } public static <T> T serializeAndDeserializeWithJavaSerialization(T input) { byte[] bytes = SerializationUtils.serialize((Serializable) input); return (T) SerializationUtils.deserialize(bytes); } public static <T> T serializeAndDeserializeWithXStream(T input) { XStream xStream = new XStream(); xStream.setMode(XStream.ID_REFERENCES); if (input != null) { xStream.processAnnotations(input.getClass()); } String xmlString = xStream.toXML(input); return (T) xStream.fromXML(xmlString); } // ************************************************************************ // Private constructor // ************************************************************************ private PlannerTestUtils() { } }