Project

General

Profile

Download (3.21 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
import eu.etaxonomy.dataportal.DataPortalSite;
25

    
26

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

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

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

    
51

    
52
	private class TestClassRunnerWithDataPortalContext extends BlockJUnit4ClassRunner {
53

    
54
		private final DataPortalContext context;
55

    
56

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

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

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

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

    
78
		}
79

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

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

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

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

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

    
116
}
(3-3/3)