Project

General

Profile

Download (3.3 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
52
	BlockJUnit4ClassRunner {
53

    
54
		private final DataPortalContext context;
55

    
56
		/**
57
		 * @param klass
58
		 * @throws InitializationError
59
		 */
60
		public TestClassRunnerWithDataPortalContext(Class<?> klass, DataPortalContext context) throws InitializationError {
61
			super(klass);
62
			this.context = context;
63
		}
64

    
65
		@Override
66
		public Object createTest() throws Exception {
67
			Object testClass = getTestClass().getOnlyConstructor().newInstance();
68
			((CdmDataPortalTestBase)testClass).setContext(context);
69
			return testClass;
70
		}
71

    
72
		@Override
73
		protected String getName() {
74
			return String.format("%s@%s", getTestClass().getName(), context.name());
75
		}
76

    
77
		@Override
78
		protected String testName(final FrameworkMethod method) {
79
			return String.format("%s@%s", method.getName(), context.name());
80

    
81
		}
82

    
83
		@Override
84
		protected Statement classBlock(RunNotifier notifier) {
85
			return childrenInvoker(notifier);
86
		}
87

    
88
		@Override
89
		protected void validateZeroArgConstructor(List<Throwable> errors) {
90
			super.validateZeroArgConstructor(errors);
91
			validateCdmDataPortalTestBase(errors);
92
		}
93

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

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

    
114
	@Override
115
	protected List<Runner> getChildren() {
116
		return runners;
117
	}
118

    
119
}
(3-3/3)