Skip to content

Commit

Permalink
Add DSL for setup/teardown of entire test suite
Browse files Browse the repository at this point in the history
Example usage:

    #import <Kiwi/Kiwi.h>

    CONFIG_START

    beforeAllSpecs(^{
        NSLog(@"BEFORE ALL SPECS");
    });

    afterAllSpecs(^{
        NSLog(@"AFTER ALL SPECS");
    });

    CONFIG_END

(Add this code to a file `<tests-dir>/Support/Config.m` and ensure it is
part of your unit test bundle's Compile Sources build phase.)

- - -

Defines a `KWSuiteConfigurationBase` class that provides a
`+defaultConfiguration` singleton instance. The first time this method
is called, we look for a class named `KWSuiteConfiguration` that is a
subclass of `KWSuiteConfigurationBase`, and instantiate it. This class
is declared by using the `CONFIG_START` and `CONFIG_END` macros.

When the default configuration receives the `-setUp` message, it sends
`-configureSuite` to `self`, which executes the code between
`CONFIG_START` and `CONFIG_END`.

The blocks passed to `beforeAllSpecs` and `afterAllSpecs` are then
executed in `-setUp` and `-tearDown`, respectively.
  • Loading branch information
Adam Sharp committed Dec 16, 2013
1 parent e86cc03 commit 253322a
Show file tree
Hide file tree
Showing 6 changed files with 114 additions and 2 deletions.
26 changes: 26 additions & 0 deletions Classes/Core/KWSuiteConfigurationBase.h
@@ -0,0 +1,26 @@
//
// KWSuiteConfigurationBase.h
// Kiwi
//
// Created by Adam Sharp on 14/12/2013.
// Copyright (c) 2013 Allen Ding. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface KWSuiteConfigurationBase : NSObject

+ (instancetype)defaultConfiguration;

- (void)configureSuite;

- (void)setUp;
- (void)tearDown;

@property (nonatomic, copy) void (^beforeAllSpecsBlock)(void);
@property (nonatomic, copy) void (^afterAllSpecsBlock)(void);

@end

void beforeAllSpecs(void (^block)(void));
void afterAllSpecs(void (^block)(void));
53 changes: 53 additions & 0 deletions Classes/Core/KWSuiteConfigurationBase.m
@@ -0,0 +1,53 @@
//
// KWSuiteConfigurationBase.m
// Kiwi
//
// Created by Adam Sharp on 14/12/2013.
// Copyright (c) 2013 Allen Ding. All rights reserved.
//

#import "KWSuiteConfigurationBase.h"

@implementation KWSuiteConfigurationBase

+ (instancetype)defaultConfiguration
{
static Class configClass;
static KWSuiteConfigurationBase *defaultConfiguration;

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
configClass = NSClassFromString(@"KWSuiteConfiguration");
if (configClass && [configClass isSubclassOfClass:[self class]]) {
defaultConfiguration = [configClass new];
}
});

return defaultConfiguration;
}

- (void)configureSuite {}

- (void)setUp {
[self configureSuite];

if (self.beforeAllSpecsBlock) {
self.beforeAllSpecsBlock();
}
}

- (void)tearDown {
if (self.afterAllSpecsBlock) {
self.afterAllSpecsBlock();
}
}

@end

void beforeAllSpecs(void (^block)(void)) {
[[KWSuiteConfigurationBase defaultConfiguration] setBeforeAllSpecsBlock:block];
}

void afterAllSpecs(void (^block)(void)) {
[[KWSuiteConfigurationBase defaultConfiguration] setAfterAllSpecsBlock:block];
}
1 change: 1 addition & 0 deletions Classes/Core/Kiwi.h
Expand Up @@ -73,6 +73,7 @@ extern "C" {
#import "KWSpec.h"
#import "KWStringUtilities.h"
#import "KWStub.h"
#import "KWSuiteConfigurationBase.h"
#import "KWUserDefinedMatcher.h"
#import "KWValue.h"
#import "KWVerifying.h"
Expand Down
15 changes: 15 additions & 0 deletions Classes/Core/KiwiMacros.h
Expand Up @@ -96,3 +96,18 @@
} \
\
@end

// Test suite configuration declaration
#define CONFIG_START \
@interface KWSuiteConfiguration : KWSuiteConfigurationBase \
\
@end \
\
@implementation KWSuiteConfiguration \
\
- (void)configureSuite {

#define CONFIG_END \
} \
\
@end
16 changes: 16 additions & 0 deletions Kiwi.xcodeproj/project.pbxproj
Expand Up @@ -118,6 +118,12 @@
4A8699B817E9B399007F250E /* KWLetNodeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A0941AB17E7A6A800FD0EB7 /* KWLetNodeTest.m */; };
4A8699B917E9B3CE007F250E /* KWLetNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A71047F17CC016600A7B718 /* KWLetNode.m */; };
4A8699BA17E9B3CF007F250E /* KWLetNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A71047F17CC016600A7B718 /* KWLetNode.m */; };
4AD1307E185BFE5E003E7145 /* KWSuiteConfigurationBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AD1307C185BFE5E003E7145 /* KWSuiteConfigurationBase.h */; };
4AD1307F185BFE5E003E7145 /* KWSuiteConfigurationBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AD1307C185BFE5E003E7145 /* KWSuiteConfigurationBase.h */; };
4AD13080185BFE5E003E7145 /* KWSuiteConfigurationBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AD1307C185BFE5E003E7145 /* KWSuiteConfigurationBase.h */; };
4AD13081185BFE5E003E7145 /* KWSuiteConfigurationBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AD1307D185BFE5E003E7145 /* KWSuiteConfigurationBase.m */; };
4AD13082185BFE5E003E7145 /* KWSuiteConfigurationBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AD1307D185BFE5E003E7145 /* KWSuiteConfigurationBase.m */; };
4AD13083185BFE5E003E7145 /* KWSuiteConfigurationBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AD1307D185BFE5E003E7145 /* KWSuiteConfigurationBase.m */; };
4BA52D0115487F0C00FC957B /* KWCaptureTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BA52D0015487F0C00FC957B /* KWCaptureTest.m */; };
4C23EBE01752F72700505782 /* KWContainStringMatcher.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4E7659A8172DAC6500105B93 /* KWContainStringMatcher.h */; };
4C23EBE11752F76700505782 /* KWGenericMatchEvaluator.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9F90FBEE16BA5FF20057426D /* KWGenericMatchEvaluator.h */; };
Expand Down Expand Up @@ -1034,6 +1040,8 @@
4A0941AB17E7A6A800FD0EB7 /* KWLetNodeTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWLetNodeTest.m; sourceTree = "<group>"; };
4A71047E17CC016600A7B718 /* KWLetNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWLetNode.h; sourceTree = "<group>"; };
4A71047F17CC016600A7B718 /* KWLetNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWLetNode.m; sourceTree = "<group>"; };
4AD1307C185BFE5E003E7145 /* KWSuiteConfigurationBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWSuiteConfigurationBase.h; sourceTree = "<group>"; };
4AD1307D185BFE5E003E7145 /* KWSuiteConfigurationBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWSuiteConfigurationBase.m; sourceTree = "<group>"; };
4BA52D0015487F0C00FC957B /* KWCaptureTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWCaptureTest.m; sourceTree = "<group>"; };
4E3C5DB01716C34900835B62 /* KWRegularExpressionPatternMatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KWRegularExpressionPatternMatcher.h; sourceTree = "<group>"; };
4E3C5DB11716C34900835B62 /* KWRegularExpressionPatternMatcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KWRegularExpressionPatternMatcher.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1476,6 +1484,8 @@
9F982CBC16A802920030A0B1 /* KWSpec.m */,
9F982CC116A802920030A0B1 /* KWStringUtilities.h */,
9F982CC216A802920030A0B1 /* KWStringUtilities.m */,
4AD1307C185BFE5E003E7145 /* KWSuiteConfigurationBase.h */,
4AD1307D185BFE5E003E7145 /* KWSuiteConfigurationBase.m */,
9F982CC916A802920030A0B1 /* KWValue.h */,
9F982CCA16A802920030A0B1 /* KWValue.m */,
9F982CCC16A802920030A0B1 /* KWWorkarounds.h */,
Expand Down Expand Up @@ -1868,6 +1878,7 @@
9F982DAB16A802920030A0B1 /* KWMatching.h in Headers */,
9F982DAD16A802920030A0B1 /* KWMatchVerifier.h in Headers */,
9F982DB116A802920030A0B1 /* KWMessagePattern.h in Headers */,
4AD1307F185BFE5E003E7145 /* KWSuiteConfigurationBase.h in Headers */,
9F982DB516A802920030A0B1 /* KWMessageSpying.h in Headers */,
9F982DB716A802920030A0B1 /* KWMessageTracker.h in Headers */,
9F982DBB16A802920030A0B1 /* KWMock.h in Headers */,
Expand Down Expand Up @@ -2004,6 +2015,7 @@
DA084DB717E3838100592D5A /* KWChangeMatcher.h in Headers */,
DA084DB817E3838100592D5A /* KWGenericMatchEvaluator.h in Headers */,
DA084DB917E3838100592D5A /* NSProxy+KiwiVerifierAdditions.h in Headers */,
4AD13080185BFE5E003E7145 /* KWSuiteConfigurationBase.h in Headers */,
DA084DBA17E3838100592D5A /* KWRegularExpressionPatternMatcher.h in Headers */,
DA084DBB17E3838100592D5A /* KWContainStringMatcher.h in Headers */,
DA084DBC17E3838100592D5A /* KWSymbolicator.h in Headers */,
Expand Down Expand Up @@ -2036,6 +2048,7 @@
9F982D2216A802920030A0B1 /* KWBeTrueMatcher.h in Headers */,
9F982D2616A802920030A0B1 /* KWBeWithinMatcher.h in Headers */,
9F982D2A16A802920030A0B1 /* KWBeZeroMatcher.h in Headers */,
4AD1307E185BFE5E003E7145 /* KWSuiteConfigurationBase.h in Headers */,
9F982D2E16A802920030A0B1 /* KWBlock.h in Headers */,
9F982D3216A802920030A0B1 /* KWBlockNode.h in Headers */,
9F982D3616A802920030A0B1 /* KWBlockRaiseMatcher.h in Headers */,
Expand Down Expand Up @@ -2378,6 +2391,7 @@
9F982DA516A802920030A0B1 /* KWMatcherFactory.m in Sources */,
9F982DA916A802920030A0B1 /* KWMatchers.m in Sources */,
9F982DAF16A802920030A0B1 /* KWMatchVerifier.m in Sources */,
4AD13082185BFE5E003E7145 /* KWSuiteConfigurationBase.m in Sources */,
9F982DB316A802920030A0B1 /* KWMessagePattern.m in Sources */,
9F982DB916A802920030A0B1 /* KWMessageTracker.m in Sources */,
9F982DBD16A802920030A0B1 /* KWMock.m in Sources */,
Expand Down Expand Up @@ -2473,6 +2487,7 @@
DA084DE917E3838100592D5A /* KWMatcher.m in Sources */,
DA084DEA17E3838100592D5A /* KWMatcherFactory.m in Sources */,
DA084DEB17E3838100592D5A /* KWMatchers.m in Sources */,
4AD13083185BFE5E003E7145 /* KWSuiteConfigurationBase.m in Sources */,
DA084DEC17E3838100592D5A /* KWMatchVerifier.m in Sources */,
DA084DED17E3838100592D5A /* KWMessagePattern.m in Sources */,
DA084DEE17E3838100592D5A /* KWMessageTracker.m in Sources */,
Expand Down Expand Up @@ -2547,6 +2562,7 @@
9F982D6816A802920030A0B1 /* KWExampleSuite.m in Sources */,
9F982D6C16A802920030A0B1 /* KWExistVerifier.m in Sources */,
9F982D7216A802920030A0B1 /* KWFailure.m in Sources */,
4AD13081185BFE5E003E7145 /* KWSuiteConfigurationBase.m in Sources */,
9F982D7616A802920030A0B1 /* KWFormatter.m in Sources */,
9F982D7A16A802920030A0B1 /* KWFutureObject.m in Sources */,
9F982D7E16A802920030A0B1 /* KWGenericMatcher.m in Sources */,
Expand Down
5 changes: 3 additions & 2 deletions SenTestingKit/SenTestSuite+KiwiAdditions.m
Expand Up @@ -13,6 +13,7 @@
#import "KWExampleSuiteBuilder.h"
#import "KWCallSite.h"
#import "KWSpec.h"
#import "KWSuiteConfigurationBase.h"

@implementation SenTestSuite (KiwiAdditions)

Expand Down Expand Up @@ -40,12 +41,12 @@ + (void)patchTestSuiteForBundlePathIMP {

Method setUpMethod = class_getInstanceMethod([suite class], @selector(setUp));
method_setImplementation(setUpMethod, imp_implementationWithBlock(^(id _self){
NSLog(@"SETUP TEST SUITE %@", _self);
[[KWSuiteConfigurationBase defaultConfiguration] setUp];
}));

Method tearDownMethod = class_getInstanceMethod([suite class], @selector(tearDown));
method_setImplementation(tearDownMethod, imp_implementationWithBlock(^(id _self){
NSLog(@"TEARDOWN TEST SUITE %@", _self);
[[KWSuiteConfigurationBase defaultConfiguration] tearDown];
}));

return suite;
Expand Down

0 comments on commit 253322a

Please sign in to comment.