1 package com.google.code.beanmatchers;
2
3 import java.lang.reflect.Modifier;
4
5 class DefaultTypeBasedValueGenerator implements TypeBasedValueGenerator {
6
7 private final ValueGeneratorRepository valueGeneratorRepository;
8 private final TypeBasedValueGenerator nonFinalTypeBasedValueGenerator;
9 private final TypeBasedValueGenerator enumBasedValueGenerator;
10 private final TypeBasedValueGenerator arrayValueGenerator;
11
12 public DefaultTypeBasedValueGenerator(ValueGeneratorRepository valueGeneratorRepository,
13 TypeBasedValueGenerator nonFinalTypeBasedValueGenerator,
14 TypeBasedValueGenerator enumBasedValueGenerator,
15 TypeBasedValueGenerator arrayValueGenerator) {
16 this.valueGeneratorRepository = valueGeneratorRepository;
17 this.nonFinalTypeBasedValueGenerator = nonFinalTypeBasedValueGenerator;
18 this.enumBasedValueGenerator = enumBasedValueGenerator;
19 this.arrayValueGenerator = arrayValueGenerator;
20 }
21
22 public <T> T generate(Class<T> type) {
23 ValueGenerator<T> generator = valueGeneratorRepository.retrieveValueGenerator(type);
24 if (generator != null) {
25 return generator.generate();
26 }
27 if (!Modifier.isFinal(type.getModifiers())) {
28 return nonFinalTypeBasedValueGenerator.generate(type);
29 }
30 if (type.isEnum()) {
31 return enumBasedValueGenerator.generate(type);
32 }
33 if (type.isArray()) {
34 return arrayValueGenerator.generate(type);
35 }
36 throw new BeanMatchersException("Could not create a test value of type " + type.getName()
37 + ".\nPlease register a ValueGenerator to create the value:\n"
38 + " BeanMatchers.registerValueGenerator(new ValueGenerator<" + type.getSimpleName()
39 + ">() {\n"
40 + " public " + type.getSimpleName() + " generate() {\n"
41 + " return null; // Change to generate random instance\n"
42 + " }\n"
43 + " }, " + type.getSimpleName() + ".class);");
44 }
45 }