1 module feature_test.callbacks;
2 
3 debug (featureTest) {
4     alias FTCallback = void delegate();
5 
6     mixin template FTCallbacks() {
7 		final void addBeforeAll(FTCallback d) {
8 			_beforeAllCallbacks ~= d;
9 		}
10 		
11 		final void addBeforeEach(FTCallback d) {
12 			_beforeEachCallbacks ~= d;
13 		}
14 		
15 		final void addAfterEach(FTCallback d) {
16 			_afterEachCallbacks ~= d;
17 		}
18 		
19 		final void addAfterAll(FTCallback d) {
20 			_afterAllCallbacks ~= d;
21 		}
22 		
23 		// To be overridden 
24 		void beforeAll() {
25 		}
26 		
27 		// To be overridden 
28 		void beforeEach() {
29 		}
30 		
31 		// To be overridden 
32 		void afterEach() {
33 		}
34 		
35 		// To be overridden 
36 		void afterAll() {
37 		}
38 	
39 		void runBeforeAll() {
40 			beforeAll;
41 			runCallbacks(_beforeAllCallbacks);
42 		}
43 		
44 		void runBeforeEach() {
45 			beforeEach;
46 			runCallbacks(_beforeEachCallbacks);
47 		}
48 		
49 		void runAfterEach() {
50 			runCallbacks(_afterEachCallbacks);
51 			afterEach;
52 		}
53 		
54 		void runAfterAll() {
55 			runCallbacks(_afterAllCallbacks);
56 			afterAll;
57 		}
58     protected:
59 		FTCallback[] _beforeEachCallbacks, _afterEachCallbacks, _beforeAllCallbacks, _afterAllCallbacks;
60 		
61 		void runCallbacks(FTCallback[] callbacks) {
62 			foreach(callback; callbacks) callback();
63 		}
64     }
65 }