Project

General

Profile

Download (3.12 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 *
3
 */
4
package eu.etaxonomy.dataportal.junit;
5

    
6
import java.lang.annotation.ElementType;
7
import java.lang.annotation.Inherited;
8
import java.lang.annotation.Retention;
9
import java.lang.annotation.RetentionPolicy;
10
import java.lang.annotation.Target;
11
import java.util.ArrayList;
12
import java.util.Collections;
13
import java.util.List;
14

    
15
import org.junit.runner.Runner;
16
import org.junit.runner.notification.RunNotifier;
17
import org.junit.runners.BlockJUnit4ClassRunner;
18
import org.junit.runners.Suite;
19
import org.junit.runners.model.FrameworkMethod;
20
import org.junit.runners.model.InitializationError;
21
import org.junit.runners.model.Statement;
22

    
23
import eu.etaxonomy.dataportal.DataPortalContext;
24

    
25

    
26
/**
27
 * @author a.kohlbecker
28
 *
29
 */
30
public class DataPortalContextSuite extends Suite{
31

    
32
	/**
33
	 * Only to be used for test classes which extend {@link CdmDataPortalTestBase}
34
	 *
35
	 * @author a.kohlbecker
36
	 */
37
	@Retention(RetentionPolicy.RUNTIME)
38
	@Target(ElementType.TYPE)
39
	@Inherited
40
	public @interface DataPortalContexts {
41
		/**
42
		 * @return an array of DataPortalContext to which the annotated test
43
		 *         class is applicable
44
		 */
45
		DataPortalContext[] value();
46
	}
47

    
48
	private final List<Runner> runners = new ArrayList<Runner>();
49

    
50

    
51
	private class TestClassRunnerWithDataPortalContext extends BlockJUnit4ClassRunner {
52

    
53
		private final DataPortalContext context;
54

    
55

    
56
		public TestClassRunnerWithDataPortalContext(Class<?> klass, DataPortalContext context) throws InitializationError {
57
			super(klass);
58
			this.context = context;
59
		}
60

    
61
		@Override
62
		public Object createTest() throws Exception {
63
			Object testClass = getTestClass().getOnlyConstructor().newInstance();
64
			((CdmDataPortalTestBase)testClass).setContext(context);
65
			return testClass;
66
		}
67

    
68
		@Override
69
		protected String getName() {
70
			return String.format("%s@%s", getTestClass().getName(), context.name());
71
		}
72

    
73
		@Override
74
		protected String testName(final FrameworkMethod method) {
75
			return String.format("%s@%s", method.getName(), context.name());
76

    
77
		}
78

    
79
		@Override
80
		protected Statement classBlock(RunNotifier notifier) {
81
			return childrenInvoker(notifier);
82
		}
83

    
84
		@Override
85
		protected void validateZeroArgConstructor(List<Throwable> errors) {
86
			super.validateZeroArgConstructor(errors);
87
			validateCdmDataPortalTestBase(errors);
88
		}
89

    
90
		protected void validateCdmDataPortalTestBase(List<Throwable> errors) {
91
			// constructor should have exactly one arg
92
			if ( ! CdmDataPortalTestBase.class.isAssignableFrom(getTestClass().getJavaClass()) ){
93
				String gripe= "Test class must be a subclass of " + CdmDataPortalTestBase.class.getName();
94
				errors.add(new Exception(gripe));
95
			}
96
		}
97
	}
98

    
99
	/**
100
	 * Only called reflectively. Do not use programmatically.
101
	 */
102
	public DataPortalContextSuite(Class<?> klass) throws InitializationError {
103
		super(klass, Collections.<Runner>emptyList());
104
		DataPortalContexts dataPortalContextsAnotation = getTestClass().getJavaClass().getAnnotation(DataPortalContexts.class);
105
		for (DataPortalContext cntxt : dataPortalContextsAnotation.value()) {
106
			runners.add(new TestClassRunnerWithDataPortalContext(klass, cntxt));
107
		}
108
	}
109

    
110
	@Override
111
	protected List<Runner> getChildren() {
112
		return runners;
113
	}
114

    
115
}
(3-3/3)