123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- //
- // Licensed under the terms in License.txt
- //
- // Copyright 2010 Allen Ding. All rights reserved.
- //
- #import "KiwiConfiguration.h"
- // This category is solely meant to coax Xcode into exposing the method names below during autocompletion.
- // There is no implementation and this class definition must come before the macro definitions below.
- @interface NSObject (KiwiVerifierMacroNames)
- - (void)should;
- - (void)shouldNot;
- - (void)shouldBeNil DEPRECATED_ATTRIBUTE;
- - (void)shouldNotBeNil DEPRECATED_ATTRIBUTE;
- - (void)shouldEventually;
- - (void)shouldNotEventually;
- - (void)shouldEventuallyBeforeTimingOutAfter;
- - (void)shouldNotEventuallyBeforeTimingOutAfter;
- - (void)shouldAfterWait;
- - (void)shouldNotAfterWait;
- - (void)shouldAfterWaitOf;
- - (void)shouldNotAfterWaitOf;
- @end
- #pragma mark - Support Macros
- #define KW_THIS_CALLSITE [KWCallSite callSiteWithFilename:@__FILE__ lineNumber:__LINE__]
- #define KW_ADD_EXIST_VERIFIER(expectationType) [KWSpec addExistVerifierWithExpectationType:expectationType callSite:KW_THIS_CALLSITE]
- #define KW_ADD_MATCH_VERIFIER(expectationType) [KWSpec addMatchVerifierWithExpectationType:expectationType callSite:KW_THIS_CALLSITE]
- #define KW_ADD_ASYNC_VERIFIER(expectationType, timeOut, wait) [KWSpec addAsyncVerifierWithExpectationType:expectationType callSite:KW_THIS_CALLSITE timeout:timeOut shouldWait:wait]
- #pragma mark - Keywords
- #ifndef KIWI_DISABLE_MATCHERS
- // Kiwi macros used in specs for verifying expectations.
- #define should attachToVerifier:KW_ADD_MATCH_VERIFIER(KWExpectationTypeShould)
- #define shouldNot attachToVerifier:KW_ADD_MATCH_VERIFIER(KWExpectationTypeShouldNot)
- #define shouldBeNil attachToVerifier:KW_ADD_EXIST_VERIFIER(KWExpectationTypeShouldNot)
- #define shouldNotBeNil attachToVerifier:KW_ADD_EXIST_VERIFIER(KWExpectationTypeShould)
- #define shouldEventually attachToVerifier:KW_ADD_ASYNC_VERIFIER(KWExpectationTypeShould, kKW_DEFAULT_PROBE_TIMEOUT, NO)
- #define shouldNotEventually attachToVerifier:KW_ADD_ASYNC_VERIFIER(KWExpectationTypeShouldNot, kKW_DEFAULT_PROBE_TIMEOUT, NO)
- #define shouldEventuallyBeforeTimingOutAfter(timeout) attachToVerifier:KW_ADD_ASYNC_VERIFIER(KWExpectationTypeShould, timeout, NO)
- #define shouldNotEventuallyBeforeTimingOutAfter(timeout) attachToVerifier:KW_ADD_ASYNC_VERIFIER(KWExpectationTypeShouldNot, timeout, NO)
- #define shouldAfterWait attachToVerifier:KW_ADD_ASYNC_VERIFIER(KWExpectationTypeShould, kKW_DEFAULT_PROBE_TIMEOUT, YES)
- #define shouldNotAfterWait attachToVerifier:KW_ADD_ASYNC_VERIFIER(KWExpectationTypeShouldNot, kKW_DEFAULT_PROBE_TIMEOUT, YES)
- #define shouldAfterWaitOf(timeout) attachToVerifier:KW_ADD_ASYNC_VERIFIER(KWExpectationTypeShould, timeout, YES)
- #define shouldNotAfterWaitOf(timeout) attachToVerifier:KW_ADD_ASYNC_VERIFIER(KWExpectationTypeShouldNot, timeout, YES)
- #define beNil beNil:[KWNilMatcher verifyNilSubject]
- #define beNonNil beNonNil:[KWNilMatcher verifyNonNilSubject]
- // used to wrap a pointer to an object that will change in the future (used with shouldEventually)
- #define expectFutureValue(futureValue) [KWFutureObject futureObjectWithBlock:^{ return futureValue; }]
- // `fail` triggers a failure report when called
- #define fail(message, ...) [[[KWExampleSuiteBuilder sharedExampleSuiteBuilder] currentExample] reportFailure:[KWFailure failureWithCallSite:KW_THIS_CALLSITE format:message, ##__VA_ARGS__]]
- // used for message patterns to allow matching any value
- #define kw_any() [KWAny any]
- #endif
- // If a gcc compatible compiler is available, use the statement and
- // declarations in expression extension to provide a convenient catch-all macro
- // to create KWValues.
- #if defined(__GNUC__)
- #define theValue(expr) \
- ({ \
- __typeof__(expr) kiwiReservedPrefix_lVar = expr; \
- [KWValue valueWithBytes:&kiwiReservedPrefix_lVar objCType:@encode(__typeof__(expr))]; \
- })
- #endif // #if defined(__GNUC__)
- // Allows for comparision of pointer values in expectations
- #define thePointerValue(expr) [NSValue valueWithPointer:(expr)]
- // Example group declarations.
- #define SPEC_BEGIN(name) \
- \
- @interface name : KWSpec \
- \
- @end \
- \
- @implementation name \
- \
- + (NSString *)file { return @__FILE__; } \
- \
- + (void)buildExampleGroups { \
- [super buildExampleGroups]; \
- \
- id _kw_test_case_class = self; \
- { \
- /* The shadow `self` must be declared inside a new scope to avoid compiler warnings. */ \
- /* The receiving class object delegates unrecognized selectors to the current example. */ \
- __unused name *self = _kw_test_case_class;
- #define SPEC_END \
- } \
- } \
- \
- @end
- // Test suite configuration declaration
- #define CONFIG_START \
- @interface KWSuiteConfiguration : KWSuiteConfigurationBase \
- \
- @end \
- \
- @implementation KWSuiteConfiguration \
- \
- - (void)configureSuite {
- #define CONFIG_END \
- } \
- \
- @end
- // Used to ensure that shared examples are registered before any
- // examples are evaluated. The name parameter is not used except
- // to define a category. Therefore, it must be unique.
- #define SHARED_EXAMPLES_BEGIN(name) \
- \
- @interface KWSharedExample (name) \
- \
- @end \
- \
- @implementation KWSharedExample (name) \
- \
- + (void)load { \
- #define SHARED_EXAMPLES_END \
- } \
- \
- @end \
|