1 /*******************************************************************************
2 * Copyright 2013 André Rouél and Dominik Seichter
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 ******************************************************************************/
16 package net.sf.qualitytest.blueprint.strategy.creation;
17
18 import java.util.Random;
19
20 import net.sf.qualitycheck.Check;
21 import net.sf.qualitycheck.Throws;
22 import net.sf.qualitycheck.exception.IllegalNullArgumentException;
23 import net.sf.qualitycheck.exception.IllegalStateOfArgumentException;
24
25 /**
26 * Creation strategy which creates a random enum constant during construction of a blueprint.
27 *
28 * @author Dominik Seichter
29 */
30 public class RandomEnumCreationStrategy extends ValueCreationStrategy<Enum<?>> {
31
32 private final Random random = new Random();
33
34 /**
35 * Blueprint an enum value using the default configuration.
36 * <p>
37 * This method returns the a randomly selected value of a given enumeration.
38 *
39 * @param expectedClazz
40 * the class of an enumeration
41 * @return a valid enum value
42 */
43 @Override
44 @Throws({ IllegalNullArgumentException.class, IllegalStateOfArgumentException.class })
45 public Enum<?> createValue(final Class<?> expectedClazz) {
46 Check.notNull(expectedClazz, "expectedClazz");
47 Check.stateIsTrue(expectedClazz.isEnum(), "Argument 'expectedClazz' must be an enum.");
48 @SuppressWarnings("unchecked")
49 final Class<? extends Enum<?>> enumClazz = (Class<? extends Enum<?>>) expectedClazz;
50 final Enum<?>[] enumConstants = enumClazz.getEnumConstants();
51 final int index = enumConstants.length > 0 ? random.nextInt(enumConstants.length) : -1;
52 return enumConstants.length > 0 ? enumConstants[index] : null;
53 }
54
55 }