-
Notifications
You must be signed in to change notification settings - Fork 28
/
KWExampleGroupBuilder.m
200 lines (149 loc) · 6.64 KB
/
KWExampleGroupBuilder.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
//
// Licensed under the terms in License.txt
//
// Copyright 2010 Allen Ding. All rights reserved.
//
#import "KWExampleGroupBuilder.h"
#import "KWExample.h"
#import "KWAfterAllNode.h"
#import "KWAfterEachNode.h"
#import "KWBeforeAllNode.h"
#import "KWBeforeEachNode.h"
#import "KWContextNode.h"
#import "KWItNode.h"
#import "KWPendingNode.h"
#import "KWRegisterMatchersNode.h"
#import "KWExampleSuite.h"
@interface KWExampleGroupBuilder()
#pragma mark -
#pragma mark Building Example Groups
@property (nonatomic, retain, readwrite) KWExampleSuite *exampleSuite;
@property (nonatomic, readonly) NSMutableArray *contextNodeStack;
@end
@implementation KWExampleGroupBuilder
@synthesize exampleSuite;
@synthesize currentExample;
#pragma mark -
#pragma mark Initializing
static KWExampleGroupBuilder *sharedExampleGroupBuilder = nil;
- (id)init {
if ((self = [super init])) {
contextNodeStack = [[NSMutableArray alloc] init];
suites = [[NSMutableSet alloc] init];
}
return self;
}
- (void)dealloc {
[suites release];
[exampleSuite release];
[contextNodeStack release];
[super dealloc];
}
+ (id)sharedExampleGroupBuilder {
if (sharedExampleGroupBuilder == nil) {
sharedExampleGroupBuilder = [[super allocWithZone:nil] init];
}
return sharedExampleGroupBuilder;
}
+ (id)allocWithZone:(NSZone *)zone {
return [[self sharedExampleGroupBuilder] retain];
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)retain {
return self;
}
- (NSUInteger)retainCount {
return NSUIntegerMax;
}
- (oneway void)release {
}
- (id)autorelease {
return self;
}
#pragma mark -
#pragma mark Building Example Groups
@synthesize contextNodeStack;
- (BOOL)isBuildingExampleGroup {
return [self.contextNodeStack count] > 0;
}
- (KWExampleSuite *)buildExampleGroups:(void (^)(void))buildingBlock
{
KWContextNode *rootNode = [KWContextNode contextNodeWithCallSite:nil parentContext:nil description:nil];
self.exampleSuite = [[[KWExampleSuite alloc] initWithRootNode:rootNode] autorelease];
[suites addObject:self.exampleSuite];
[self.contextNodeStack addObject:rootNode];
buildingBlock();
[self.contextNodeStack removeAllObjects];
return self.exampleSuite;
}
- (void)pushContextNodeWithCallSite:(KWCallSite *)aCallSite description:(NSString *)aDescription {
KWContextNode *contextNode = [self.contextNodeStack lastObject];
KWContextNode *node = [KWContextNode contextNodeWithCallSite:aCallSite parentContext:contextNode description:aDescription];
[contextNode addContextNode:node];
[self.contextNodeStack addObject:node];
}
- (void)popContextNode {
KWContextNode *contextNode = [self.contextNodeStack lastObject];
[self.exampleSuite markLastExampleAsLastInContext:contextNode];
if ([self.contextNodeStack count] == 1)
[NSException raise:@"KWExampleGroupBuilderException" format:@"there is no open context to pop"];
[self.contextNodeStack removeLastObject];
}
- (void)setRegisterMatchersNodeWithCallSite:(KWCallSite *)aCallSite namespacePrefix:(NSString *)aNamespacePrefix {
if ([self.contextNodeStack count] == 0)
[NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
KWContextNode *contextNode = [self.contextNodeStack lastObject];
KWRegisterMatchersNode *registerMatchersNode = [KWRegisterMatchersNode registerMatchersNodeWithCallSite:aCallSite namespacePrefix:aNamespacePrefix];
[contextNode setRegisterMatchersNode:registerMatchersNode];
}
- (void)setBeforeAllNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock {
if ([self.contextNodeStack count] == 0)
[NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
KWContextNode *contextNode = [self.contextNodeStack lastObject];
KWBeforeAllNode *beforeAllNode = [KWBeforeAllNode beforeAllNodeWithCallSite:aCallSite block:aBlock];
[contextNode setBeforeAllNode:beforeAllNode];
}
- (void)setAfterAllNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock {
if ([self.contextNodeStack count] == 0)
[NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
KWContextNode *contextNode = [self.contextNodeStack lastObject];
KWAfterAllNode *afterAllNode = [KWAfterAllNode afterAllNodeWithCallSite:aCallSite block:aBlock];
[contextNode setAfterAllNode:afterAllNode];
}
- (void)setBeforeEachNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock {
if ([self.contextNodeStack count] == 0)
[NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
KWContextNode *contextNode = [self.contextNodeStack lastObject];
KWBeforeEachNode *beforeEachNode = [KWBeforeEachNode beforeEachNodeWithCallSite:aCallSite block:aBlock];
[contextNode setBeforeEachNode:beforeEachNode];
}
- (void)setAfterEachNodeWithCallSite:(KWCallSite *)aCallSite block:(KWVoidBlock)aBlock {
if ([self.contextNodeStack count] == 0)
[NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
KWContextNode *contextNode = [self.contextNodeStack lastObject];
KWAfterEachNode *afterEachNode = [KWAfterEachNode afterEachNodeWithCallSite:aCallSite block:aBlock];
[contextNode setAfterEachNode:afterEachNode];
}
- (void)addItNodeWithCallSite:(KWCallSite *)aCallSite description:(NSString *)aDescription block:(KWVoidBlock)aBlock {
if ([self.contextNodeStack count] == 0)
[NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
KWContextNode *contextNode = [self.contextNodeStack lastObject];
KWItNode* itNode = [KWItNode itNodeWithCallSite:aCallSite description:aDescription context:contextNode block:aBlock];
[contextNode addItNode:itNode];
KWExample *example = [[KWExample alloc] initWithExampleNode:itNode];
[self.exampleSuite addExample:example];
[example release];
}
- (void)addPendingNodeWithCallSite:(KWCallSite *)aCallSite description:(NSString *)aDescription {
if ([self.contextNodeStack count] == 0)
[NSException raise:@"KWExampleGroupBuilderException" format:@"an example group has not been started"];
KWContextNode *contextNode = [self.contextNodeStack lastObject];
KWPendingNode *pendingNode = [KWPendingNode pendingNodeWithCallSite:aCallSite context:contextNode description:aDescription];
[contextNode addPendingNode:pendingNode];
KWExample *example = [[KWExample alloc] initWithExampleNode:pendingNode];
[self.exampleSuite addExample:example];
[example release];
}
@end