// Copyright 2012 Georg-August-Universität Göttingen, Germany // // 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 de.ugoe.cs.autoquest.testgeneration; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Random; import java.util.logging.Level; import de.ugoe.cs.autoquest.eventcore.Event; import de.ugoe.cs.autoquest.usageprofiles.IStochasticProcess; import de.ugoe.cs.util.console.Console; /** *
* Generates a test suite with a hybrid approach that is a mixture of random walks and drawing from * all possible sequences. *
* * @author Steffen Herbold * @version 1.0 */ public class HybridGenerator { /** ** Number of sequences in the test suite. *
*/ private final int numSequences; /** ** Length of a test sequence. *
*/ private final int length; /** ** Maximal length where it is possible to generate all sequences and draw from them. *
*/ private final int maxLengthAll; /** ** In case this member is true, only test cases that end in the global end event * {@link Event#ENDEVENT} are generated. If it is false, the end event can be any event. *
*/ private final boolean validEnd; /** ** Constructor. Creates a new HybridGenerator and ensures the validity of the parameters: *
** If one of these conditions is violated an {@link IllegalArgumentException} is thrown. *
* * @param numSequences * number of sequences desired for the test suite * @param length * length of a test sequence * @param maxLengthAll * maximal length where it is possible to generate all sequences and draw from them * @param validEnd * defines if test cases have to end with the global end event {@link Event#ENDEVENT} * (see {@link #validEnd}) */ public HybridGenerator(int numSequences, int length, int maxLengthAll, boolean validEnd) { // check validity of the parameters if (numSequences < 1) { throw new IllegalArgumentException("number of sequences must be at least 1 but is " + numSequences); } if (length < 1) { throw new IllegalArgumentException("length of test cases must be at least 1 but is " + length); } this.numSequences = numSequences; this.length = length; this.maxLengthAll = maxLengthAll; this.validEnd = validEnd; } /** ** Generates a test suite with a hybrid approach that is a mixture of random walks and drawing * from all possible sequences *
* * @param model * model used to determine the probability of each possible sequence * @return the test suite */ public Collection* Finishes a sequence with a random walk. *
* * @param sequence * sequence to be finished * @param model * model used for the random walk * @param length * desired length of the sequence * @param validEnd * if the sequence should end in {@link Event#ENDEVENT}. * @return finished sequence of the desired length */ private List