- Update
This commit is contained in:
1 parent
d281d765ea
commit
5b074a5176
1261 files changed
+199158
-7303
No files matched your search
+12
@@ -0,0 +1,12 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2006-2008 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <SenTestingKit/SenTestingKit.h>
|
||||
|
||||
@interface NSInvocationOCMAdditionsTests : SenTestCase
|
||||
{
|
||||
}
|
||||
|
||||
@end
|
||||
+346
@@ -0,0 +1,346 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2006-2008 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import "NSInvocationOCMAdditionsTests.h"
|
||||
#import "NSInvocation+OCMAdditions.h"
|
||||
|
||||
#define TestString @"foo"
|
||||
#define TestInt 1
|
||||
|
||||
@implementation NSInvocationOCMAdditionsTests
|
||||
|
||||
- (void)testInvocationDescriptionWithNoArguments
|
||||
{
|
||||
SEL selector = @selector(lowercaseString);
|
||||
NSMethodSignature *signature = [[NSString string] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
|
||||
STAssertEqualObjects(@"lowercaseString", [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithObjectArgument
|
||||
{
|
||||
SEL selector = @selector(isEqualToNumber:);
|
||||
NSMethodSignature *signature = [[NSNumber alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it one argument (starts at index 2)
|
||||
NSNumber *argument = [NSNumber numberWithInt:TestInt];
|
||||
[invocation setArgument:&argument atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"isEqualToNumber:%d", TestInt];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithNSStringArgument
|
||||
{
|
||||
SEL selector = @selector(isEqualToString:);
|
||||
NSMethodSignature *signature = [[NSString string] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it one argument (starts at index 2)
|
||||
NSString *argument = TestString;
|
||||
[invocation setArgument:&argument atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"isEqualToString:@\"%@\"", TestString];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithObjectArguments
|
||||
{
|
||||
SEL selector = @selector(setValue:forKey:);
|
||||
NSMethodSignature *signature = [[NSArray array] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it two arguments
|
||||
NSNumber *argumentOne = [NSNumber numberWithInt:TestInt];
|
||||
NSString *argumentTwo = TestString;
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
[invocation setArgument:&argumentTwo atIndex:3];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"setValue:%d forKey:@\"%@\"", TestInt, TestString];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithArrayArgument
|
||||
{
|
||||
SEL selector = @selector(addObjectsFromArray:);
|
||||
NSMethodSignature *signature = [[NSMutableArray array] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it one argument (starts at index 2)
|
||||
NSArray *argument = [NSArray arrayWithObject:TestString];
|
||||
[invocation setArgument:&argument atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"addObjectsFromArray:%@", [argument description]];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithIntArgument
|
||||
{
|
||||
SEL selector = @selector(initWithInt:);
|
||||
NSMethodSignature *signature = [[NSNumber alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
int argumentOne = TestInt;
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithInt:%d", TestInt];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithUnsignedIntArgument
|
||||
{
|
||||
SEL selector = @selector(initWithUnsignedInt:);
|
||||
NSMethodSignature *signature = [[NSNumber alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
unsigned int argumentOne = TestInt;
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithUnsignedInt:%d", TestInt];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithBoolArgument
|
||||
{
|
||||
SEL selector = @selector(initWithBool:);
|
||||
NSMethodSignature *signature = [[NSNumber alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
BOOL argumentOne = TRUE;
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithBool:YES"];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithCharArgument
|
||||
{
|
||||
SEL selector = @selector(initWithChar:);
|
||||
NSMethodSignature *signature = [[NSNumber alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
char argumentOne = 'd';
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithChar:'%c'", argumentOne];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithUnsignedCharArgument
|
||||
{
|
||||
NSNumber *dummyNumber = [NSNumber alloc];
|
||||
|
||||
SEL selector = @selector(initWithUnsignedChar:);
|
||||
NSMethodSignature *signature = [dummyNumber methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
unsigned char argumentOne = 'd';
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithUnsignedChar:'%c'", argumentOne];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithDoubleArgument
|
||||
{
|
||||
SEL selector = @selector(initWithDouble:);
|
||||
NSMethodSignature *signature = [[NSNumber alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
double argumentOne = 1;
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithDouble:%f", argumentOne];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithFloatArgument
|
||||
{
|
||||
SEL selector = @selector(initWithFloat:);
|
||||
NSMethodSignature *signature = [[NSNumber alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
float argumentOne = 1;
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithFloat:%f", argumentOne];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithLongArgument
|
||||
{
|
||||
SEL selector = @selector(initWithLong:);
|
||||
NSMethodSignature *signature = [[NSNumber alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
long argumentOne = 1;
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithLong:%ld", argumentOne];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithUnsignedLongArgument
|
||||
{
|
||||
SEL selector = @selector(initWithUnsignedLong:);
|
||||
NSMethodSignature *signature = [[NSNumber alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
unsigned long argumentOne = 1;
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithUnsignedLong:%lu", argumentOne];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithLongLongArgument
|
||||
{
|
||||
SEL selector = @selector(initWithLongLong:);
|
||||
NSMethodSignature *signature = [[NSNumber alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
long long argumentOne = 1;
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithLongLong:%qi", argumentOne];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithUnsignedLongLongArgument
|
||||
{
|
||||
SEL selector = @selector(initWithUnsignedLongLong:);
|
||||
NSMethodSignature *signature = [[NSNumber alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
unsigned long long argumentOne = 1;
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithUnsignedLongLong:%qu", argumentOne];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithShortArgument
|
||||
{
|
||||
SEL selector = @selector(initWithShort:);
|
||||
NSMethodSignature *signature = [[NSNumber alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
short argumentOne = 1;
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithShort:%hi", argumentOne];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithUnsignedShortArgument
|
||||
{
|
||||
SEL selector = @selector(initWithUnsignedShort:);
|
||||
NSMethodSignature *signature = [[NSNumber alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
unsigned short argumentOne = 1;
|
||||
[invocation setArgument:&argumentOne atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithUnsignedShort:%hu", argumentOne];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
/*
|
||||
- (void)testInvocationDescriptionWithStructArgument
|
||||
{
|
||||
SEL selector = @selector(setFrameSize:);
|
||||
NSMethodSignature *signature = [[[NSView alloc] init] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
NSSize size;
|
||||
size.width = 1;
|
||||
size.height = 1;
|
||||
[invocation setArgument:&size atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"setFrameSize:(struct)"];
|
||||
STAssertTrue(expected, [[invocation invocationDescription] rangeOfString:description].length > 0, @"");
|
||||
}
|
||||
*/
|
||||
/*
|
||||
- (void)testInvocationDescriptionWithCStringArgument
|
||||
{
|
||||
SEL selector = @selector(initWithUTF8String:);
|
||||
NSMethodSignature *signature = [[NSString alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
NSString *string = [NSString stringWithString:@"foo"];
|
||||
const char *cString = [string UTF8String];
|
||||
[invocation setArgument:&cString atIndex:2];
|
||||
|
||||
NSString *expected = @"initWithUTF8String:\"foo\"";
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
*/
|
||||
- (void)testInvocationDescriptionWithSelectorArgument
|
||||
{
|
||||
SEL selector = @selector(respondsToSelector:);
|
||||
NSMethodSignature *signature = [[NSString alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
SEL selectorValue = @selector(foo);
|
||||
[invocation setArgument:&selectorValue atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"respondsToSelector:@selector(%@)", NSStringFromSelector(selectorValue)];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithPointerArgument
|
||||
{
|
||||
SEL selector = @selector(initWithBytes:length:);
|
||||
NSMethodSignature *signature = [[NSData alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
NSData *data = [@"foo" dataUsingEncoding:NSUTF8StringEncoding];
|
||||
const void *bytes = [[@"foo" dataUsingEncoding:NSUTF8StringEncoding] bytes];
|
||||
NSUInteger length = [data length];
|
||||
[invocation setArgument:&bytes atIndex:2];
|
||||
[invocation setArgument:&length atIndex:3];
|
||||
|
||||
NSString *expected1 = [NSString stringWithFormat:@"initWithBytes:"];
|
||||
NSString *expected2 = [NSString stringWithFormat:@"length:%ld", length];
|
||||
NSString *invocationDescription = [invocation invocationDescription];
|
||||
STAssertTrue([invocationDescription rangeOfString:expected1].length > 0, @"");
|
||||
STAssertTrue([invocationDescription rangeOfString:expected2].length > 0, @"");
|
||||
}
|
||||
|
||||
- (void)testInvocationDescriptionWithNilArgument
|
||||
{
|
||||
SEL selector = @selector(initWithString:);
|
||||
NSMethodSignature *signature = [[NSString alloc] methodSignatureForSelector:selector];
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[invocation setSelector:selector];
|
||||
// Give it an argument
|
||||
NSString *argString = nil;
|
||||
[invocation setArgument:&argString atIndex:2];
|
||||
|
||||
NSString *expected = [NSString stringWithFormat:@"initWithString:nil"];
|
||||
STAssertEqualObjects(expected, [invocation invocationDescription], @"");
|
||||
}
|
||||
|
||||
@end
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2004-2008 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <SenTestingKit/SenTestingKit.h>
|
||||
|
||||
|
||||
@interface OCMConstraintTests : SenTestCase
|
||||
{
|
||||
BOOL didCallCustomConstraint;
|
||||
}
|
||||
|
||||
@end
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2004-2010 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import "OCMConstraintTests.h"
|
||||
#import <OCMock/OCMConstraint.h>
|
||||
|
||||
|
||||
@implementation OCMConstraintTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
didCallCustomConstraint = NO;
|
||||
}
|
||||
|
||||
- (void)testAnyAcceptsAnything
|
||||
{
|
||||
OCMConstraint *constraint = [OCMAnyConstraint constraint];
|
||||
|
||||
STAssertTrue([constraint evaluate:@"foo"], @"Should have accepted a value.");
|
||||
STAssertTrue([constraint evaluate:@"foo"], @"Should have accepted another value.");
|
||||
STAssertTrue([constraint evaluate:@"foo"], @"Should have accepted nil.");
|
||||
}
|
||||
|
||||
- (void)testIsNilAcceptsOnlyNil
|
||||
{
|
||||
OCMConstraint *constraint = [OCMIsNilConstraint constraint];
|
||||
|
||||
STAssertFalse([constraint evaluate:@"foo"], @"Should not have accepted a value.");
|
||||
STAssertTrue([constraint evaluate:nil], @"Should have accepted nil.");
|
||||
}
|
||||
|
||||
- (void)testIsNotNilAcceptsAnythingButNil
|
||||
{
|
||||
OCMConstraint *constraint = [OCMIsNotNilConstraint constraint];
|
||||
|
||||
STAssertTrue([constraint evaluate:@"foo"], @"Should have accepted a value.");
|
||||
STAssertFalse([constraint evaluate:nil], @"Should not have accepted nil.");
|
||||
}
|
||||
|
||||
- (void)testNotEqualAcceptsAnythingButValue
|
||||
{
|
||||
OCMIsNotEqualConstraint *constraint = [OCMIsNotEqualConstraint constraint];
|
||||
constraint->testValue = @"foo";
|
||||
|
||||
STAssertFalse([constraint evaluate:@"foo"], @"Should not have accepted value.");
|
||||
STAssertTrue([constraint evaluate:@"bar"], @"Should have accepted other value.");
|
||||
STAssertTrue([constraint evaluate:nil], @"Should have accepted nil.");
|
||||
}
|
||||
|
||||
|
||||
- (BOOL)checkArg:(id)theArg
|
||||
{
|
||||
didCallCustomConstraint = YES;
|
||||
return [theArg isEqualToString:@"foo"];
|
||||
}
|
||||
|
||||
- (void)testUsesPlainMethod
|
||||
{
|
||||
OCMConstraint *constraint = CONSTRAINT(@selector(checkArg:));
|
||||
|
||||
STAssertTrue([constraint evaluate:@"foo"], @"Should have accepted foo.");
|
||||
STAssertTrue(didCallCustomConstraint, @"Should have used custom method.");
|
||||
STAssertFalse([constraint evaluate:@"bar"], @"Should not have accepted bar.");
|
||||
}
|
||||
|
||||
|
||||
- (BOOL)checkArg:(id)theArg withValue:(id)value
|
||||
{
|
||||
didCallCustomConstraint = YES;
|
||||
return [theArg isEqual:value];
|
||||
}
|
||||
|
||||
- (void)testUsesMethodWithValue
|
||||
{
|
||||
OCMConstraint *constraint = CONSTRAINTV(@selector(checkArg:withValue:), @"foo");
|
||||
|
||||
STAssertTrue([constraint evaluate:@"foo"], @"Should have accepted foo.");
|
||||
STAssertTrue(didCallCustomConstraint, @"Should have used custom method.");
|
||||
STAssertFalse([constraint evaluate:@"bar"], @"Should not have accepted bar.");
|
||||
}
|
||||
|
||||
|
||||
- (void)testRaisesExceptionWhenConstraintMethodDoesNotTakeArgument
|
||||
{
|
||||
STAssertThrows(CONSTRAINTV(@selector(checkArg:), @"bar"), @"Should have thrown for invalid constraint method.");
|
||||
}
|
||||
|
||||
|
||||
- (void)testRaisesExceptionOnUnknownSelector
|
||||
{
|
||||
STAssertThrows(CONSTRAINTV(@selector(checkArgXXX:), @"bar"), @"Should have thrown for unknown constraint method.");
|
||||
}
|
||||
|
||||
|
||||
#if NS_BLOCKS_AVAILABLE
|
||||
|
||||
-(void)testUsesBlock
|
||||
{
|
||||
BOOL (^checkForFooBlock)(id) = ^(id value)
|
||||
{
|
||||
return [value isEqualToString:@"foo"];
|
||||
};
|
||||
|
||||
OCMBlockConstraint *constraint = [[[OCMBlockConstraint alloc] initWithConstraintBlock:checkForFooBlock] autorelease];
|
||||
|
||||
STAssertTrue([constraint evaluate:@"foo"], @"Should have accepted foo.");
|
||||
STAssertFalse([constraint evaluate:@"bar"], @"Should not have accepted bar.");
|
||||
}
|
||||
|
||||
-(void)testBlockConstraintCanCaptureArgument
|
||||
{
|
||||
__block NSString *captured;
|
||||
BOOL (^captureArgBlock)(id) = ^(id value)
|
||||
{
|
||||
captured = value;
|
||||
return YES;
|
||||
};
|
||||
|
||||
OCMBlockConstraint *constraint = [[[OCMBlockConstraint alloc] initWithConstraintBlock:captureArgBlock] autorelease];
|
||||
|
||||
[constraint evaluate:@"foo"];
|
||||
STAssertEqualObjects(@"foo", captured, @"Should have captured value from last invocation.");
|
||||
[constraint evaluate:@"bar"];
|
||||
STAssertEqualObjects(@"bar", captured, @"Should have captured value from last invocation.");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@end
|
||||
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2013 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <SenTestingKit/SenTestingKit.h>
|
||||
|
||||
@interface OCMockObjectClassMethodMockingTests : SenTestCase
|
||||
|
||||
@end
|
||||
Vendored
+119
@@ -0,0 +1,119 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2013 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <OCMock/OCMock.h>
|
||||
#import "OCClassMockObject.h"
|
||||
#import "OCMockObjectClassMethodMockingTests.h"
|
||||
|
||||
#pragma mark Helper classes
|
||||
|
||||
@interface TestClassWithClassMethods : NSObject
|
||||
+ (NSString *)foo;
|
||||
+ (NSString *)bar;
|
||||
- (NSString *)bar;
|
||||
@end
|
||||
|
||||
@implementation TestClassWithClassMethods
|
||||
|
||||
+ (NSString *)foo
|
||||
{
|
||||
return @"Foo-ClassMethod";
|
||||
}
|
||||
|
||||
+ (NSString *)bar
|
||||
{
|
||||
return @"Bar-ClassMethod";
|
||||
}
|
||||
|
||||
- (NSString *)bar
|
||||
{
|
||||
return @"Bar";
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
@implementation OCMockObjectClassMethodMockingTests
|
||||
|
||||
#pragma mark Tests stubbing class methods
|
||||
|
||||
- (void)testCanStubClassMethod
|
||||
{
|
||||
id mock = [OCMockObject mockForClass:[TestClassWithClassMethods class]];
|
||||
|
||||
[[[[mock stub] classMethod] andReturn:@"mocked"] foo];
|
||||
|
||||
STAssertEqualObjects(@"mocked", [TestClassWithClassMethods foo], @"Should have stubbed class method.");
|
||||
}
|
||||
|
||||
- (void)testClassReceivesMethodsAfterStopWasCalled
|
||||
{
|
||||
id mock = [OCMockObject mockForClass:[TestClassWithClassMethods class]];
|
||||
|
||||
[[[[mock stub] classMethod] andReturn:@"mocked"] foo];
|
||||
[mock stopMocking];
|
||||
|
||||
STAssertEqualObjects(@"Foo-ClassMethod", [TestClassWithClassMethods foo], @"Should not have stubbed class method.");
|
||||
}
|
||||
|
||||
- (void)testClassReceivesMethodAgainWhenExpectedCallOccurred
|
||||
{
|
||||
id mock = [OCMockObject mockForClass:[TestClassWithClassMethods class]];
|
||||
|
||||
[[[[mock expect] classMethod] andReturn:@"mocked"] foo];
|
||||
|
||||
STAssertEqualObjects(@"mocked", [TestClassWithClassMethods foo], @"Should have stubbed method.");
|
||||
STAssertEqualObjects(@"Foo-ClassMethod", [TestClassWithClassMethods foo], @"Should have 'unstubbed' method.");
|
||||
}
|
||||
|
||||
- (void)testStubsOnlyClassMethodWhenInstanceMethodWithSameNameExists
|
||||
{
|
||||
id mock = [OCMockObject mockForClass:[TestClassWithClassMethods class]];
|
||||
|
||||
[[[[mock stub] classMethod] andReturn:@"mocked"] bar];
|
||||
|
||||
STAssertEqualObjects(@"mocked", [TestClassWithClassMethods bar], @"Should have stubbed class method.");
|
||||
STAssertThrows([mock bar], @"Should not have stubbed instance method.");
|
||||
}
|
||||
|
||||
- (void)testStubsClassMethodWhenNoInstanceMethodExistsWithName
|
||||
{
|
||||
id mock = [OCMockObject mockForClass:[TestClassWithClassMethods class]];
|
||||
|
||||
[[[mock stub] andReturn:@"mocked"] foo];
|
||||
|
||||
STAssertEqualObjects(@"mocked", [TestClassWithClassMethods foo], @"Should have stubbed class method.");
|
||||
}
|
||||
|
||||
- (void)testStubsCanDistinguishInstanceAndClassMethods
|
||||
{
|
||||
id mock = [OCMockObject mockForClass:[TestClassWithClassMethods class]];
|
||||
|
||||
[[[[mock stub] classMethod] andReturn:@"mocked-class"] bar];
|
||||
[[[mock stub] andReturn:@"mocked-instance"] bar];
|
||||
|
||||
STAssertEqualObjects(@"mocked-class", [TestClassWithClassMethods bar], @"Should have stubbed class method.");
|
||||
STAssertEqualObjects(@"mocked-instance", [mock bar], @"Should have stubbed instance method.");
|
||||
}
|
||||
|
||||
- (void)testRevertsAllStubbedMethodsOnDealloc
|
||||
{
|
||||
id mock = [[OCClassMockObject alloc] initWithClass:[TestClassWithClassMethods class]];
|
||||
|
||||
[[[[mock stub] classMethod] andReturn:@"mocked-foo"] foo];
|
||||
[[[[mock stub] classMethod] andReturn:@"mocked-bar"] bar];
|
||||
|
||||
STAssertEqualObjects(@"mocked-foo", [TestClassWithClassMethods foo], @"Should have stubbed class method 'foo'.");
|
||||
STAssertEqualObjects(@"mocked-bar", [TestClassWithClassMethods bar], @"Should have stubbed class method 'bar'.");
|
||||
|
||||
[mock release];
|
||||
|
||||
STAssertEqualObjects(@"Foo-ClassMethod", [TestClassWithClassMethods foo], @"Should have 'unstubbed' class method 'foo'.");
|
||||
STAssertEqualObjects(@"Bar-ClassMethod", [TestClassWithClassMethods bar], @"Should have 'unstubbed' class method 'bar'.");
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2013 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <SenTestingKit/SenTestingKit.h>
|
||||
|
||||
@interface OCMockForwardingTargetTests : SenTestCase
|
||||
|
||||
@end
|
||||
Vendored
+136
@@ -0,0 +1,136 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2013 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import "OCMockObjectForwardingTargetTests.h"
|
||||
#import <OCMock/OCMock.h>
|
||||
#import <objc/runtime.h>
|
||||
|
||||
#pragma mark Helper classes
|
||||
|
||||
@interface InternalObject : NSObject
|
||||
@property (nonatomic, strong) NSString *name;
|
||||
@end
|
||||
|
||||
@interface PublicObject : NSObject
|
||||
@property (nonatomic, strong) NSString *name;
|
||||
@end
|
||||
|
||||
@implementation InternalObject
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[_name release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation PublicObject
|
||||
{
|
||||
InternalObject *_internal;
|
||||
};
|
||||
|
||||
@dynamic name;
|
||||
|
||||
- (instancetype)initWithInternal:(InternalObject *)internal
|
||||
{
|
||||
self = [super init];
|
||||
if (!self)
|
||||
return self;
|
||||
|
||||
_internal = internal;
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)init
|
||||
{
|
||||
return [self initWithInternal:[[InternalObject alloc] init]];
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[_internal release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (id)forwardingTargetForSelector:(SEL)selector
|
||||
{
|
||||
if (selector == @selector(name) ||
|
||||
selector == @selector(setName:))
|
||||
return _internal;
|
||||
return [super forwardingTargetForSelector:selector];
|
||||
}
|
||||
|
||||
+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)selector
|
||||
{
|
||||
NSMethodSignature *signature = [super instanceMethodSignatureForSelector:selector];
|
||||
if (signature)
|
||||
return signature;
|
||||
else
|
||||
return [InternalObject instanceMethodSignatureForSelector:selector];
|
||||
}
|
||||
|
||||
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
|
||||
{
|
||||
NSMethodSignature *signature = [super methodSignatureForSelector:selector];
|
||||
if (signature)
|
||||
return signature;
|
||||
|
||||
return [[self forwardingTargetForSelector:selector] methodSignatureForSelector:selector];
|
||||
}
|
||||
|
||||
- (BOOL)respondsToSelector:(SEL)selector
|
||||
{
|
||||
if ([super respondsToSelector:selector])
|
||||
return YES;
|
||||
|
||||
return [[self forwardingTargetForSelector:selector] respondsToSelector:selector];
|
||||
}
|
||||
|
||||
+ (BOOL)instancesRespondToSelector:(SEL)selector
|
||||
{
|
||||
if (class_respondsToSelector(self, selector))
|
||||
return YES;
|
||||
|
||||
return [InternalObject instancesRespondToSelector:selector];
|
||||
}
|
||||
|
||||
- (id)valueForUndefinedKey:(NSString *)key
|
||||
{
|
||||
return [_internal valueForKey:key];
|
||||
}
|
||||
|
||||
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
|
||||
{
|
||||
[_internal setValue:value forKey:key];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
#pragma mark Tests
|
||||
|
||||
|
||||
@implementation OCMockForwardingTargetTests
|
||||
|
||||
- (void)testNameShouldForwardToInternal
|
||||
{
|
||||
InternalObject *internal = [[InternalObject alloc] init];
|
||||
internal.name = @"Internal Object";
|
||||
PublicObject *public = [[PublicObject alloc] initWithInternal:internal];
|
||||
STAssertEqualObjects(@"Internal Object", public.name, nil);
|
||||
}
|
||||
|
||||
- (void)testStubsMethodImplementation
|
||||
{
|
||||
PublicObject *public = [[PublicObject alloc] init];
|
||||
id mock = [OCMockObject partialMockForObject:public];
|
||||
|
||||
[[[mock stub] andReturn:@"FOO"] name];
|
||||
STAssertEqualObjects(@"FOO", [mock name], nil);
|
||||
}
|
||||
|
||||
@end
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2004-2008 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <SenTestingKit/SenTestingKit.h>
|
||||
|
||||
|
||||
@interface OCMockObjectHamcrestTests : SenTestCase
|
||||
{
|
||||
}
|
||||
|
||||
@end
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id: OCMockObjectTests.m 21 2008-01-24 18:59:39Z erik $
|
||||
// Copyright (c) 2004-2008 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <OCMock/OCMock.h>
|
||||
#import "OCMockObjectHamcrestTests.h"
|
||||
|
||||
#define HC_SHORTHAND
|
||||
#import <OCHamcrest/OCHamcrest.h>
|
||||
|
||||
|
||||
@implementation OCMockObjectHamcrestTests
|
||||
|
||||
- (void)testAcceptsStubbedMethodWithHamcrestConstraint
|
||||
{
|
||||
id mock = [OCMockObject mockForClass:[NSString class]];
|
||||
[[mock stub] hasSuffix:(id)startsWith(@"foo")];
|
||||
[mock hasSuffix:@"foobar"];
|
||||
}
|
||||
|
||||
|
||||
- (void)testRejectsUnstubbedMethodWithHamcrestConstraint
|
||||
{
|
||||
id mock = [OCMockObject mockForClass:[NSString class]];
|
||||
[[mock stub] hasSuffix:(id)anyOf(equalTo(@"foo"), equalTo(@"bar"), NULL)];
|
||||
STAssertThrows([mock hasSuffix:@"foobar"], @"Should have raised an exception.");
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2013 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <SenTestingKit/SenTestingKit.h>
|
||||
|
||||
@interface OCMockObjectPartialMocksTests : SenTestCase
|
||||
|
||||
@end
|
||||
+174
@@ -0,0 +1,174 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2013 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <OCMock/OCMock.h>
|
||||
#import "OCMockObjectPartialMocksTests.h"
|
||||
|
||||
#pragma mark Helper classes
|
||||
|
||||
@interface TestClassWithSimpleMethod : NSObject
|
||||
- (NSString *)foo;
|
||||
@end
|
||||
|
||||
@implementation TestClassWithSimpleMethod
|
||||
|
||||
- (NSString *)foo
|
||||
{
|
||||
return @"Foo";
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface TestClassThatCallsSelf : NSObject
|
||||
- (NSString *)method1;
|
||||
- (NSString *)method2;
|
||||
@end
|
||||
|
||||
@implementation TestClassThatCallsSelf
|
||||
|
||||
- (NSString *)method1
|
||||
{
|
||||
id retVal = [self method2];
|
||||
return retVal;
|
||||
}
|
||||
|
||||
- (NSString *)method2
|
||||
{
|
||||
return @"Foo";
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
@implementation OCMockObjectPartialMocksTests
|
||||
|
||||
#pragma mark Tests for stubbing with partial mocks
|
||||
|
||||
- (void)testStubsMethodsOnPartialMock
|
||||
{
|
||||
TestClassWithSimpleMethod *object = [[[TestClassWithSimpleMethod alloc] init] autorelease];
|
||||
id mock = [OCMockObject partialMockForObject:object];
|
||||
[[[mock stub] andReturn:@"hi"] foo];
|
||||
STAssertEqualObjects(@"hi", [mock foo], @"Should have returned stubbed value");
|
||||
}
|
||||
|
||||
//- (void)testStubsMethodsOnPartialMockForTollFreeBridgedClasses
|
||||
//{
|
||||
// mock = [OCMockObject partialMockForObject:[NSString stringWithString:@"hello"]];
|
||||
// [[[mock stub] andReturn:@"hi"] uppercaseString];
|
||||
// STAssertEqualObjects(@"hi", [mock uppercaseString], @"Should have returned stubbed value");
|
||||
//}
|
||||
|
||||
- (void)testForwardsUnstubbedMethodsCallsToRealObjectOnPartialMock
|
||||
{
|
||||
TestClassWithSimpleMethod *object = [[[TestClassWithSimpleMethod alloc] init] autorelease];
|
||||
id mock = [OCMockObject partialMockForObject:object];
|
||||
STAssertEqualObjects(@"Foo", [mock foo], @"Should have returned value from real object.");
|
||||
}
|
||||
|
||||
//- (void)testForwardsUnstubbedMethodsCallsToRealObjectOnPartialMockForTollFreeBridgedClasses
|
||||
//{
|
||||
// mock = [OCMockObject partialMockForObject:[NSString stringWithString:@"hello2"]];
|
||||
// STAssertEqualObjects(@"HELLO2", [mock uppercaseString], @"Should have returned value from real object.");
|
||||
//}
|
||||
|
||||
- (void)testStubsMethodOnRealObjectReference
|
||||
{
|
||||
TestClassWithSimpleMethod *realObject = [[[TestClassWithSimpleMethod alloc] init] autorelease];
|
||||
id mock = [OCMockObject partialMockForObject:realObject];
|
||||
[[[mock stub] andReturn:@"TestFoo"] foo];
|
||||
STAssertEqualObjects(@"TestFoo", [realObject foo], @"Should have stubbed method.");
|
||||
}
|
||||
|
||||
- (void)testCallsToSelfInRealObjectAreShadowedByPartialMock
|
||||
{
|
||||
TestClassThatCallsSelf *realObject = [[[TestClassThatCallsSelf alloc] init] autorelease];
|
||||
id mock = [OCMockObject partialMockForObject:realObject];
|
||||
[[[mock stub] andReturn:@"FooFoo"] method2];
|
||||
STAssertEqualObjects(@"FooFoo", [mock method1], @"Should have called through to stubbed method.");
|
||||
}
|
||||
|
||||
|
||||
#pragma mark Tests for end of stubbing with partial mocks
|
||||
|
||||
- (void)testReturnsToRealImplementationWhenExpectedCallOccurred
|
||||
{
|
||||
TestClassWithSimpleMethod *realObject = [[[TestClassWithSimpleMethod alloc] init] autorelease];
|
||||
id mock = [OCMockObject partialMockForObject:realObject];
|
||||
[[[mock expect] andReturn:@"TestFoo"] foo];
|
||||
STAssertEqualObjects(@"TestFoo", [realObject foo], @"Should have stubbed method.");
|
||||
STAssertEqualObjects(@"Foo", [realObject foo], @"Should have 'unstubbed' method.");
|
||||
}
|
||||
|
||||
- (void)testRestoresObjectWhenStopped
|
||||
{
|
||||
TestClassWithSimpleMethod *realObject = [[[TestClassWithSimpleMethod alloc] init] autorelease];
|
||||
id mock = [OCMockObject partialMockForObject:realObject];
|
||||
[[[mock stub] andReturn:@"TestFoo"] foo];
|
||||
STAssertEqualObjects(@"TestFoo", [realObject foo], @"Should have stubbed method.");
|
||||
STAssertEqualObjects(@"TestFoo", [realObject foo], @"Should have stubbed method.");
|
||||
[mock stopMocking];
|
||||
STAssertEqualObjects(@"Foo", [realObject foo], @"Should have 'unstubbed' method.");
|
||||
}
|
||||
|
||||
|
||||
#pragma mark Tests for explicit forward to real object with partial mocks
|
||||
|
||||
- (void)testForwardsToRealObjectWhenSetUpAndCalledOnMock
|
||||
{
|
||||
TestClassWithSimpleMethod *realObject = [[[TestClassWithSimpleMethod alloc] init] autorelease];
|
||||
id mock = [OCMockObject partialMockForObject:realObject];
|
||||
|
||||
[[[mock expect] andForwardToRealObject] foo];
|
||||
STAssertEquals(@"Foo", [mock foo], @"Should have called method on real object.");
|
||||
|
||||
[mock verify];
|
||||
}
|
||||
|
||||
- (void)testForwardsToRealObjectWhenSetUpAndCalledOnRealObject
|
||||
{
|
||||
TestClassWithSimpleMethod *realObject = [[[TestClassWithSimpleMethod alloc] init] autorelease];
|
||||
id mock = [OCMockObject partialMockForObject:realObject];
|
||||
|
||||
[[[mock expect] andForwardToRealObject] foo];
|
||||
STAssertEquals(@"Foo", [realObject foo], @"Should have called method on real object.");
|
||||
|
||||
[mock verify];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark Tests for method swizzling with partial mocks
|
||||
|
||||
- (NSString *)differentMethodInDifferentClass
|
||||
{
|
||||
return @"swizzled!";
|
||||
}
|
||||
|
||||
- (void)testImplementsMethodSwizzling
|
||||
{
|
||||
// using partial mocks and the indirect return value provider
|
||||
TestClassThatCallsSelf *foo = [[[TestClassThatCallsSelf alloc] init] autorelease];
|
||||
id mock = [OCMockObject partialMockForObject:foo];
|
||||
[[[mock stub] andCall:@selector(differentMethodInDifferentClass) onObject:self] method1];
|
||||
STAssertEqualObjects(@"swizzled!", [foo method1], @"Should have returned value from different method");
|
||||
}
|
||||
|
||||
|
||||
- (void)aMethodWithVoidReturn
|
||||
{
|
||||
}
|
||||
|
||||
- (void)testMethodSwizzlingWorksForVoidReturns
|
||||
{
|
||||
TestClassThatCallsSelf *foo = [[[TestClassThatCallsSelf alloc] init] autorelease];
|
||||
id mock = [OCMockObject partialMockForObject:foo];
|
||||
[[[mock stub] andCall:@selector(aMethodWithVoidReturn) onObject:self] method1];
|
||||
STAssertNoThrow([foo method1], @"Should have worked.");
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,13 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2004-2008 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <SenTestingKit/SenTestingKit.h>
|
||||
|
||||
@interface OCMockObjectTests : SenTestCase
|
||||
{
|
||||
id mock;
|
||||
}
|
||||
|
||||
@end
|
||||
+812
@@ -0,0 +1,812 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2004-2010 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <OCMock/OCMock.h>
|
||||
#import "OCMockObjectTests.h"
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Helper classes and protocols for testing
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
@interface InterfaceForTypedef : NSObject
|
||||
@end
|
||||
|
||||
@implementation InterfaceForTypedef
|
||||
@end
|
||||
|
||||
typedef InterfaceForTypedef TypedefInterface;
|
||||
typedef InterfaceForTypedef* PointerTypedefInterface;
|
||||
typedef int intTypedef;
|
||||
|
||||
@protocol TestProtocol
|
||||
- (int)primitiveValue;
|
||||
@optional
|
||||
- (id)objectValue;
|
||||
@end
|
||||
|
||||
@protocol ProtocolWithTypeQualifierMethod
|
||||
- (void)aSpecialMethod:(byref in void *)someArg;
|
||||
@end
|
||||
|
||||
@protocol ProtocolWithTypedefs
|
||||
- (TypedefInterface*)typedefReturnValue1;
|
||||
- (PointerTypedefInterface)typedefReturnValue2;
|
||||
- (void)typedefParameter:(TypedefInterface*)parameter;
|
||||
- (void)typedefPointerParameter:(PointerTypedefInterface)parameter;
|
||||
@end
|
||||
|
||||
@interface ProtocolWithTypedefsImplementation : NSObject<ProtocolWithTypedefs>
|
||||
- (TypedefInterface*)typedefReturnValue1;
|
||||
- (PointerTypedefInterface)typedefReturnValue2;
|
||||
- (void)typedefParameter:(TypedefInterface*)parameter;
|
||||
- (void)typedefPointerParameter:(PointerTypedefInterface)parameter;
|
||||
@end
|
||||
|
||||
@implementation ProtocolWithTypedefsImplementation
|
||||
|
||||
- (TypedefInterface*)typedefReturnValue1 {
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (PointerTypedefInterface)typedefReturnValue2 {
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)typedefParameter:(TypedefInterface*)parameter {
|
||||
}
|
||||
|
||||
-(void)typedefPointerParameter:(PointerTypedefInterface)parameter {
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface TestClassWithIntPointerMethod : NSObject
|
||||
|
||||
- (void)returnValueInPointer:(int *)ptr;
|
||||
|
||||
@end
|
||||
|
||||
@implementation TestClassWithIntPointerMethod
|
||||
|
||||
- (void)returnValueInPointer:(int *)ptr
|
||||
{
|
||||
*ptr = 555;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
@interface TestObserver : NSObject
|
||||
{
|
||||
@public
|
||||
NSNotification *notification;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation TestObserver
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
[notification release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)receiveNotification:(NSNotification *)aNotification
|
||||
{
|
||||
notification = [aNotification retain];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
static NSString *TestNotification = @"TestNotification";
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// setup
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@implementation OCMockObjectTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
mock = [OCMockObject mockForClass:[NSString class]];
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// accepting stubbed methods / rejecting methods not stubbed
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
- (void)testAcceptsStubbedMethod
|
||||
{
|
||||
[[mock stub] lowercaseString];
|
||||
[mock lowercaseString];
|
||||
}
|
||||
|
||||
- (void)testRaisesExceptionWhenUnknownMethodIsCalled
|
||||
{
|
||||
[[mock stub] lowercaseString];
|
||||
STAssertThrows([mock uppercaseString], @"Should have raised an exception.");
|
||||
}
|
||||
|
||||
|
||||
- (void)testAcceptsStubbedMethodWithSpecificArgument
|
||||
{
|
||||
[[mock stub] hasSuffix:@"foo"];
|
||||
[mock hasSuffix:@"foo"];
|
||||
}
|
||||
|
||||
|
||||
- (void)testAcceptsStubbedMethodWithConstraint
|
||||
{
|
||||
[[mock stub] hasSuffix:[OCMArg any]];
|
||||
[mock hasSuffix:@"foo"];
|
||||
[mock hasSuffix:@"bar"];
|
||||
}
|
||||
|
||||
#if NS_BLOCKS_AVAILABLE
|
||||
|
||||
- (void)testAcceptsStubbedMethodWithBlockArgument
|
||||
{
|
||||
mock = [OCMockObject mockForClass:[NSArray class]];
|
||||
[[mock stub] indexesOfObjectsPassingTest:[OCMArg any]];
|
||||
[mock indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) { return YES; }];
|
||||
}
|
||||
|
||||
|
||||
- (void)testAcceptsStubbedMethodWithBlockConstraint
|
||||
{
|
||||
[[mock stub] hasSuffix:[OCMArg checkWithBlock:^(id value) { return [value isEqualToString:@"foo"]; }]];
|
||||
|
||||
STAssertNoThrow([mock hasSuffix:@"foo"], @"Should not have thrown a exception");
|
||||
STAssertThrows([mock hasSuffix:@"bar"], @"Should have thrown a exception");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
- (void)testAcceptsStubbedMethodWithNilArgument
|
||||
{
|
||||
[[mock stub] hasSuffix:nil];
|
||||
|
||||
[mock hasSuffix:nil];
|
||||
}
|
||||
|
||||
- (void)testRaisesExceptionWhenMethodWithWrongArgumentIsCalled
|
||||
{
|
||||
[[mock stub] hasSuffix:@"foo"];
|
||||
STAssertThrows([mock hasSuffix:@"xyz"], @"Should have raised an exception.");
|
||||
}
|
||||
|
||||
|
||||
- (void)testAcceptsStubbedMethodWithScalarArgument
|
||||
{
|
||||
[[mock stub] stringByPaddingToLength:20 withString:@"foo" startingAtIndex:5];
|
||||
[mock stringByPaddingToLength:20 withString:@"foo" startingAtIndex:5];
|
||||
}
|
||||
|
||||
|
||||
- (void)testRaisesExceptionWhenMethodWithOneWrongScalarArgumentIsCalled
|
||||
{
|
||||
[[mock stub] stringByPaddingToLength:20 withString:@"foo" startingAtIndex:5];
|
||||
STAssertThrows([mock stringByPaddingToLength:20 withString:@"foo" startingAtIndex:3], @"Should have raised an exception.");
|
||||
}
|
||||
|
||||
- (void)testAcceptsStubbedMethodWithPointerArgument
|
||||
{
|
||||
NSError *error;
|
||||
[[[mock stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})] writeToFile:OCMOCK_ANY atomically:YES encoding:NSMacOSRomanStringEncoding error:&error];
|
||||
|
||||
STAssertTrue([mock writeToFile:@"foo" atomically:YES encoding:NSMacOSRomanStringEncoding error:&error], nil);
|
||||
}
|
||||
|
||||
- (void)testAcceptsStubbedMethodWithAnyPointerArgument
|
||||
{
|
||||
NSError *error;
|
||||
[[[mock stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})] writeToFile:OCMOCK_ANY atomically:YES encoding:NSMacOSRomanStringEncoding error:[OCMArg anyPointer]];
|
||||
|
||||
STAssertTrue([mock writeToFile:@"foo" atomically:YES encoding:NSMacOSRomanStringEncoding error:&error], nil);
|
||||
}
|
||||
|
||||
- (void)testRaisesExceptionWhenMethodWithWrongPointerArgumentIsCalled
|
||||
{
|
||||
NSString *string;
|
||||
NSString *anotherString;
|
||||
NSArray *array;
|
||||
|
||||
[[mock stub] completePathIntoString:&string caseSensitive:YES matchesIntoArray:&array filterTypes:OCMOCK_ANY];
|
||||
|
||||
STAssertThrows([mock completePathIntoString:&anotherString caseSensitive:YES matchesIntoArray:&array filterTypes:OCMOCK_ANY], nil);
|
||||
}
|
||||
|
||||
- (void)testAcceptsStubbedMethodWithVoidPointerArgument
|
||||
{
|
||||
mock = [OCMockObject mockForClass:[NSMutableData class]];
|
||||
[[mock stub] appendBytes:NULL length:0];
|
||||
[mock appendBytes:NULL length:0];
|
||||
}
|
||||
|
||||
|
||||
- (void)testRaisesExceptionWhenMethodWithWrongVoidPointerArgumentIsCalled
|
||||
{
|
||||
mock = [OCMockObject mockForClass:[NSMutableData class]];
|
||||
[[mock stub] appendBytes:"foo" length:3];
|
||||
STAssertThrows([mock appendBytes:"bar" length:3], @"Should have raised an exception.");
|
||||
}
|
||||
|
||||
|
||||
- (void)testAcceptsStubbedMethodWithPointerPointerArgument
|
||||
{
|
||||
NSError *error = nil;
|
||||
[[mock stub] initWithContentsOfFile:@"foo.txt" encoding:NSASCIIStringEncoding error:&error];
|
||||
[mock initWithContentsOfFile:@"foo.txt" encoding:NSASCIIStringEncoding error:&error];
|
||||
}
|
||||
|
||||
|
||||
- (void)testRaisesExceptionWhenMethodWithWrongPointerPointerArgumentIsCalled
|
||||
{
|
||||
NSError *error = nil, *error2;
|
||||
[[mock stub] initWithContentsOfFile:@"foo.txt" encoding:NSASCIIStringEncoding error:&error];
|
||||
STAssertThrows([mock initWithContentsOfFile:@"foo.txt" encoding:NSASCIIStringEncoding error:&error2], @"Should have raised.");
|
||||
}
|
||||
|
||||
|
||||
- (void)testAcceptsStubbedMethodWithStructArgument
|
||||
{
|
||||
NSRange range = NSMakeRange(0,20);
|
||||
[[mock stub] substringWithRange:range];
|
||||
[mock substringWithRange:range];
|
||||
}
|
||||
|
||||
|
||||
- (void)testRaisesExceptionWhenMethodWithWrongStructArgumentIsCalled
|
||||
{
|
||||
NSRange range = NSMakeRange(0,20);
|
||||
NSRange otherRange = NSMakeRange(0,10);
|
||||
[[mock stub] substringWithRange:range];
|
||||
STAssertThrows([mock substringWithRange:otherRange], @"Should have raised an exception.");
|
||||
}
|
||||
|
||||
|
||||
- (void)testCanPassMocksAsArguments
|
||||
{
|
||||
id mockArg = [OCMockObject mockForClass:[NSString class]];
|
||||
[[mock stub] stringByAppendingString:[OCMArg any]];
|
||||
[mock stringByAppendingString:mockArg];
|
||||
}
|
||||
|
||||
- (void)testCanStubWithMockArguments
|
||||
{
|
||||
id mockArg = [OCMockObject mockForClass:[NSString class]];
|
||||
[[mock stub] stringByAppendingString:mockArg];
|
||||
[mock stringByAppendingString:mockArg];
|
||||
}
|
||||
|
||||
- (void)testRaisesExceptionWhenStubbedMockArgIsNotUsed
|
||||
{
|
||||
id mockArg = [OCMockObject mockForClass:[NSString class]];
|
||||
[[mock stub] stringByAppendingString:mockArg];
|
||||
STAssertThrows([mock stringByAppendingString:@"foo"], @"Should have raised an exception.");
|
||||
}
|
||||
|
||||
- (void)testRaisesExceptionWhenDifferentMockArgumentIsPassed
|
||||
{
|
||||
id expectedArg = [OCMockObject mockForClass:[NSString class]];
|
||||
id otherArg = [OCMockObject mockForClass:[NSString class]];
|
||||
[[mock stub] stringByAppendingString:otherArg];
|
||||
STAssertThrows([mock stringByAppendingString:expectedArg], @"Should have raised an exception.");
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// returning values from stubbed methods
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
- (void)testReturnsStubbedReturnValue
|
||||
{
|
||||
id returnValue;
|
||||
|
||||
[[[mock stub] andReturn:@"megamock"] lowercaseString];
|
||||
returnValue = [mock lowercaseString];
|
||||
|
||||
STAssertEqualObjects(@"megamock", returnValue, @"Should have returned stubbed value.");
|
||||
|
||||
}
|
||||
|
||||
- (void)testReturnsStubbedIntReturnValue
|
||||
{
|
||||
int expectedValue = 42;
|
||||
[[[mock stub] andReturnValue:OCMOCK_VALUE(expectedValue)] intValue];
|
||||
int returnValue = [mock intValue];
|
||||
|
||||
STAssertEquals(expectedValue, returnValue, @"Should have returned stubbed value.");
|
||||
}
|
||||
|
||||
- (void)testRaisesWhenBoxedValueTypesDoNotMatch
|
||||
{
|
||||
double expectedValue = 42;
|
||||
[[[mock stub] andReturnValue:OCMOCK_VALUE(expectedValue)] intValue];
|
||||
|
||||
STAssertThrows([mock intValue], @"Should have raised an exception.");
|
||||
}
|
||||
|
||||
- (void)testReturnsStubbedNilReturnValue
|
||||
{
|
||||
[[[mock stub] andReturn:nil] uppercaseString];
|
||||
|
||||
id returnValue = [mock uppercaseString];
|
||||
|
||||
STAssertNil(returnValue, @"Should have returned stubbed value, which is nil.");
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// raising exceptions, posting notifications, etc.
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
- (void)testRaisesExceptionWhenAskedTo
|
||||
{
|
||||
NSException *exception = [NSException exceptionWithName:@"TestException" reason:@"test" userInfo:nil];
|
||||
[[[mock expect] andThrow:exception] lowercaseString];
|
||||
|
||||
STAssertThrows([mock lowercaseString], @"Should have raised an exception.");
|
||||
}
|
||||
|
||||
- (void)testPostsNotificationWhenAskedTo
|
||||
{
|
||||
TestObserver *observer = [[[TestObserver alloc] init] autorelease];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:observer selector:@selector(receiveNotification:) name:TestNotification object:nil];
|
||||
|
||||
NSNotification *notification = [NSNotification notificationWithName:TestNotification object:self];
|
||||
[[[mock stub] andPost:notification] lowercaseString];
|
||||
|
||||
[mock lowercaseString];
|
||||
|
||||
STAssertNotNil(observer->notification, @"Should have sent a notification.");
|
||||
STAssertEqualObjects(TestNotification, [observer->notification name], @"Name should match posted one.");
|
||||
STAssertEqualObjects(self, [observer->notification object], @"Object should match posted one.");
|
||||
}
|
||||
|
||||
- (void)testPostsNotificationInAddtionToReturningValue
|
||||
{
|
||||
TestObserver *observer = [[[TestObserver alloc] init] autorelease];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:observer selector:@selector(receiveNotification:) name:TestNotification object:nil];
|
||||
|
||||
NSNotification *notification = [NSNotification notificationWithName:TestNotification object:self];
|
||||
[[[[mock stub] andReturn:@"foo"] andPost:notification] lowercaseString];
|
||||
|
||||
STAssertEqualObjects(@"foo", [mock lowercaseString], @"Should have returned stubbed value.");
|
||||
STAssertNotNil(observer->notification, @"Should have sent a notification.");
|
||||
}
|
||||
|
||||
|
||||
- (NSString *)valueForString:(NSString *)aString andMask:(NSStringCompareOptions)mask
|
||||
{
|
||||
return [NSString stringWithFormat:@"[%@, %ld]", aString, mask];
|
||||
}
|
||||
|
||||
- (void)testCallsAlternativeMethodAndPassesOriginalArgumentsAndReturnsValue
|
||||
{
|
||||
[[[mock stub] andCall:@selector(valueForString:andMask:) onObject:self] commonPrefixWithString:@"FOO" options:NSCaseInsensitiveSearch];
|
||||
|
||||
NSString *returnValue = [mock commonPrefixWithString:@"FOO" options:NSCaseInsensitiveSearch];
|
||||
|
||||
STAssertEqualObjects(@"[FOO, 1]", returnValue, @"Should have passed and returned invocation.");
|
||||
}
|
||||
|
||||
#if NS_BLOCKS_AVAILABLE
|
||||
|
||||
- (void)testCallsBlockWhichCanSetUpReturnValue
|
||||
{
|
||||
void (^theBlock)(NSInvocation *) = ^(NSInvocation *invocation)
|
||||
{
|
||||
NSString *value;
|
||||
[invocation getArgument:&value atIndex:2];
|
||||
value = [NSString stringWithFormat:@"MOCK %@", value];
|
||||
[invocation setReturnValue:&value];
|
||||
};
|
||||
|
||||
[[[mock stub] andDo:theBlock] stringByAppendingString:[OCMArg any]];
|
||||
|
||||
STAssertEqualObjects(@"MOCK foo", [mock stringByAppendingString:@"foo"], @"Should have called block.");
|
||||
STAssertEqualObjects(@"MOCK bar", [mock stringByAppendingString:@"bar"], @"Should have called block.");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
- (void)testThrowsWhenTryingToUseForwardToRealObjectOnNonPartialMock
|
||||
{
|
||||
STAssertThrows([[[mock expect] andForwardToRealObject] name], @"Should have raised and exception.");
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// returning values in pass-by-reference arguments
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
- (void)testReturnsValuesInPassByReferenceArguments
|
||||
{
|
||||
NSString *expectedName = @"Test";
|
||||
NSArray *expectedArray = [NSArray array];
|
||||
|
||||
[[mock expect] completePathIntoString:[OCMArg setTo:expectedName] caseSensitive:YES
|
||||
matchesIntoArray:[OCMArg setTo:expectedArray] filterTypes:OCMOCK_ANY];
|
||||
|
||||
NSString *actualName = nil;
|
||||
NSArray *actualArray = nil;
|
||||
[mock completePathIntoString:&actualName caseSensitive:YES matchesIntoArray:&actualArray filterTypes:nil];
|
||||
|
||||
STAssertNoThrow([mock verify], @"An unexpected exception was thrown");
|
||||
STAssertEqualObjects(expectedName, actualName, @"The two string objects should be equal");
|
||||
STAssertEqualObjects(expectedArray, actualArray, @"The two array objects should be equal");
|
||||
}
|
||||
|
||||
|
||||
- (void)testReturnsValuesInNonObjectPassByReferenceArguments
|
||||
{
|
||||
int expectedValue = 1234;
|
||||
mock = [OCMockObject mockForClass:[TestClassWithIntPointerMethod class]];
|
||||
[[mock stub] returnValueInPointer:[OCMArg setToValue:[NSValue value:&expectedValue withObjCType:@encode(int)]]];
|
||||
|
||||
int actualValue = 0;
|
||||
[mock returnValueInPointer:&actualValue];
|
||||
|
||||
STAssertEquals(expectedValue, actualValue, @"Should have returned value via pass by ref argument.");
|
||||
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// accepting expected methods
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
- (void)testAcceptsExpectedMethod
|
||||
{
|
||||
[[mock expect] lowercaseString];
|
||||
[mock lowercaseString];
|
||||
}
|
||||
|
||||
|
||||
- (void)testAcceptsExpectedMethodAndReturnsValue
|
||||
{
|
||||
id returnValue;
|
||||
|
||||
[[[mock expect] andReturn:@"Objective-C"] lowercaseString];
|
||||
returnValue = [mock lowercaseString];
|
||||
|
||||
STAssertEqualObjects(@"Objective-C", returnValue, @"Should have returned stubbed value.");
|
||||
}
|
||||
|
||||
|
||||
- (void)testAcceptsExpectedMethodsInRecordedSequence
|
||||
{
|
||||
[[mock expect] lowercaseString];
|
||||
[[mock expect] uppercaseString];
|
||||
|
||||
[mock lowercaseString];
|
||||
[mock uppercaseString];
|
||||
}
|
||||
|
||||
|
||||
- (void)testAcceptsExpectedMethodsInDifferentSequence
|
||||
{
|
||||
[[mock expect] lowercaseString];
|
||||
[[mock expect] uppercaseString];
|
||||
|
||||
[mock uppercaseString];
|
||||
[mock lowercaseString];
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// verifying expected methods
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
- (void)testAcceptsAndVerifiesExpectedMethods
|
||||
{
|
||||
[[mock expect] lowercaseString];
|
||||
[[mock expect] uppercaseString];
|
||||
|
||||
[mock lowercaseString];
|
||||
[mock uppercaseString];
|
||||
|
||||
[mock verify];
|
||||
}
|
||||
|
||||
|
||||
- (void)testRaisesExceptionOnVerifyWhenNotAllExpectedMethodsWereCalled
|
||||
{
|
||||
[[mock expect] lowercaseString];
|
||||
[[mock expect] uppercaseString];
|
||||
|
||||
[mock lowercaseString];
|
||||
|
||||
STAssertThrows([mock verify], @"Should have raised an exception.");
|
||||
}
|
||||
|
||||
- (void)testAcceptsAndVerifiesTwoExpectedInvocationsOfSameMethod
|
||||
{
|
||||
[[mock expect] lowercaseString];
|
||||
[[mock expect] lowercaseString];
|
||||
|
||||
[mock lowercaseString];
|
||||
[mock lowercaseString];
|
||||
|
||||
[mock verify];
|
||||
}
|
||||
|
||||
|
||||
- (void)testAcceptsAndVerifiesTwoExpectedInvocationsOfSameMethodAndReturnsCorrespondingValues
|
||||
{
|
||||
[[[mock expect] andReturn:@"foo"] lowercaseString];
|
||||
[[[mock expect] andReturn:@"bar"] lowercaseString];
|
||||
|
||||
STAssertEqualObjects(@"foo", [mock lowercaseString], @"Should have returned first stubbed value");
|
||||
STAssertEqualObjects(@"bar", [mock lowercaseString], @"Should have returned seconds stubbed value");
|
||||
|
||||
[mock verify];
|
||||
}
|
||||
|
||||
- (void)testReturnsStubbedValuesIndependentOfExpectations
|
||||
{
|
||||
[[mock stub] hasSuffix:@"foo"];
|
||||
[[mock expect] hasSuffix:@"bar"];
|
||||
|
||||
[mock hasSuffix:@"foo"];
|
||||
[mock hasSuffix:@"bar"];
|
||||
[mock hasSuffix:@"foo"]; // Since it's a stub, shouldn't matter how many times we call this
|
||||
|
||||
[mock verify];
|
||||
}
|
||||
|
||||
-(void)testAcceptsAndVerifiesMethodsWithSelectorArgument
|
||||
{
|
||||
[[mock expect] performSelector:@selector(lowercaseString)];
|
||||
[mock performSelector:@selector(lowercaseString)];
|
||||
[mock verify];
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// ordered expectations
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
- (void)testAcceptsExpectedMethodsInRecordedSequenceWhenOrderMatters
|
||||
{
|
||||
[mock setExpectationOrderMatters:YES];
|
||||
|
||||
[[mock expect] lowercaseString];
|
||||
[[mock expect] uppercaseString];
|
||||
|
||||
STAssertNoThrow([mock lowercaseString], @"Should have accepted expected method in sequence.");
|
||||
STAssertNoThrow([mock uppercaseString], @"Should have accepted expected method in sequence.");
|
||||
}
|
||||
|
||||
- (void)testRaisesExceptionWhenSequenceIsWrongAndOrderMatters
|
||||
{
|
||||
[mock setExpectationOrderMatters:YES];
|
||||
|
||||
[[mock expect] lowercaseString];
|
||||
[[mock expect] uppercaseString];
|
||||
|
||||
STAssertThrows([mock uppercaseString], @"Should have complained about wrong sequence.");
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// explicitly rejecting methods (mostly for nice mocks, see below)
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
- (void)testThrowsWhenRejectedMethodIsCalledOnNiceMock
|
||||
{
|
||||
mock = [OCMockObject niceMockForClass:[NSString class]];
|
||||
|
||||
[[mock reject] uppercaseString];
|
||||
STAssertThrows([mock uppercaseString], @"Should have complained about rejected method being called.");
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// protocol mocks
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
- (void)testCanMockFormalProtocol
|
||||
{
|
||||
mock = [OCMockObject mockForProtocol:@protocol(NSLocking)];
|
||||
[[mock expect] lock];
|
||||
|
||||
[mock lock];
|
||||
|
||||
[mock verify];
|
||||
}
|
||||
|
||||
- (void)testSetsCorrectNameForProtocolMockObjects
|
||||
{
|
||||
mock = [OCMockObject mockForProtocol:@protocol(NSLocking)];
|
||||
STAssertEqualObjects(@"OCMockObject[NSLocking]", [mock description], @"Should have returned correct description.");
|
||||
}
|
||||
|
||||
- (void)testRaisesWhenUnknownMethodIsCalledOnProtocol
|
||||
{
|
||||
mock = [OCMockObject mockForProtocol:@protocol(NSLocking)];
|
||||
STAssertThrows([mock lowercaseString], @"Should have raised an exception.");
|
||||
}
|
||||
|
||||
- (void)testConformsToMockedProtocol
|
||||
{
|
||||
mock = [OCMockObject mockForProtocol:@protocol(NSLocking)];
|
||||
STAssertTrue([mock conformsToProtocol:@protocol(NSLocking)], nil);
|
||||
}
|
||||
|
||||
- (void)testRespondsToValidProtocolRequiredSelector
|
||||
{
|
||||
mock = [OCMockObject mockForProtocol:@protocol(TestProtocol)];
|
||||
STAssertTrue([mock respondsToSelector:@selector(primitiveValue)], nil);
|
||||
}
|
||||
|
||||
- (void)testRespondsToValidProtocolOptionalSelector
|
||||
{
|
||||
mock = [OCMockObject mockForProtocol:@protocol(TestProtocol)];
|
||||
STAssertTrue([mock respondsToSelector:@selector(objectValue)], nil);
|
||||
}
|
||||
|
||||
- (void)testDoesNotRespondToInvalidProtocolSelector
|
||||
{
|
||||
mock = [OCMockObject mockForProtocol:@protocol(TestProtocol)];
|
||||
STAssertFalse([mock respondsToSelector:@selector(fooBar)], nil);
|
||||
}
|
||||
|
||||
- (void)testWithTypedefReturnType {
|
||||
mock = [OCMockObject mockForProtocol:@protocol(ProtocolWithTypedefs)];
|
||||
STAssertNoThrow([[[mock stub] andReturn:[TypedefInterface new]] typedefReturnValue1], @"Should accept a typedefed return-type");
|
||||
STAssertNoThrow([mock typedefReturnValue1], @"bla");
|
||||
}
|
||||
|
||||
- (void)testWithTypedefPointerReturnType {
|
||||
mock = [OCMockObject mockForProtocol:@protocol(ProtocolWithTypedefs)];
|
||||
STAssertNoThrow([[[mock stub] andReturn:[TypedefInterface new]] typedefReturnValue2], @"Should accept a typedefed return-type");
|
||||
STAssertNoThrow([mock typedefReturnValue2], @"bla");
|
||||
}
|
||||
|
||||
- (void)testWithTypedefParameter {
|
||||
mock = [OCMockObject mockForProtocol:@protocol(ProtocolWithTypedefs)];
|
||||
STAssertNoThrow([[mock stub] typedefParameter:nil], @"Should accept a typedefed parameter-type");
|
||||
STAssertNoThrow([mock typedefParameter:nil], @"bla");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// nice mocks don't complain about unknown methods
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
- (void)testReturnsDefaultValueWhenUnknownMethodIsCalledOnNiceClassMock
|
||||
{
|
||||
mock = [OCMockObject niceMockForClass:[NSString class]];
|
||||
STAssertNil([mock lowercaseString], @"Should return nil on unexpected method call (for nice mock).");
|
||||
[mock verify];
|
||||
}
|
||||
|
||||
- (void)testRaisesAnExceptionWhenAnExpectedMethodIsNotCalledOnNiceClassMock
|
||||
{
|
||||
mock = [OCMockObject niceMockForClass:[NSString class]];
|
||||
[[[mock expect] andReturn:@"HELLO!"] uppercaseString];
|
||||
STAssertThrows([mock verify], @"Should have raised an exception because method was not called.");
|
||||
}
|
||||
|
||||
- (void)testReturnDefaultValueWhenUnknownMethodIsCalledOnProtocolMock
|
||||
{
|
||||
mock = [OCMockObject niceMockForProtocol:@protocol(TestProtocol)];
|
||||
STAssertTrue(0 == [mock primitiveValue], @"Should return 0 on unexpected method call (for nice mock).");
|
||||
[mock verify];
|
||||
}
|
||||
|
||||
- (void)testRaisesAnExceptionWenAnExpectedMethodIsNotCalledOnNiceProtocolMock
|
||||
{
|
||||
mock = [OCMockObject niceMockForProtocol:@protocol(TestProtocol)];
|
||||
[[mock expect] primitiveValue];
|
||||
STAssertThrows([mock verify], @"Should have raised an exception because method was not called.");
|
||||
}
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// mocks should honour the NSObject contract, etc.
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
- (void)testRespondsToValidSelector
|
||||
{
|
||||
STAssertTrue([mock respondsToSelector:@selector(lowercaseString)], nil);
|
||||
}
|
||||
|
||||
- (void)testDoesNotRespondToInvalidSelector
|
||||
{
|
||||
STAssertFalse([mock respondsToSelector:@selector(fooBar)], nil);
|
||||
}
|
||||
|
||||
- (void)testCanStubValueForKeyMethod
|
||||
{
|
||||
id returnValue;
|
||||
|
||||
mock = [OCMockObject mockForClass:[NSObject class]];
|
||||
[[[mock stub] andReturn:@"SomeValue"] valueForKey:@"SomeKey"];
|
||||
|
||||
returnValue = [mock valueForKey:@"SomeKey"];
|
||||
|
||||
STAssertEqualObjects(@"SomeValue", returnValue, @"Should have returned value that was set up.");
|
||||
}
|
||||
|
||||
- (void)testForwardsIsKindOfClass
|
||||
{
|
||||
STAssertTrue([mock isKindOfClass:[NSString class]], @"Should have pretended to be the mocked class.");
|
||||
}
|
||||
|
||||
- (void)testWorksWithTypeQualifiers
|
||||
{
|
||||
id myMock = [OCMockObject mockForProtocol:@protocol(ProtocolWithTypeQualifierMethod)];
|
||||
|
||||
STAssertNoThrow([[myMock expect] aSpecialMethod:"foo"], @"Should not complain about method with type qualifiers.");
|
||||
STAssertNoThrow([myMock aSpecialMethod:"foo"], @"Should not complain about method with type qualifiers.");
|
||||
}
|
||||
|
||||
|
||||
- (void)testAdjustsRetainCountWhenStubbingMethodsThatCreateObjects
|
||||
{
|
||||
NSString *objectToReturn = [NSString stringWithFormat:@"This is not a %@.", @"string constant"];
|
||||
[[[mock stub] andReturn:objectToReturn] mutableCopy];
|
||||
|
||||
NSUInteger retainCountBefore = [objectToReturn retainCount];
|
||||
id returnedObject = [mock mutableCopy];
|
||||
[returnedObject release]; // the expectation is that we have to call release after a copy
|
||||
NSUInteger retainCountAfter = [objectToReturn retainCount];
|
||||
|
||||
STAssertEqualObjects(objectToReturn, returnedObject, @"Should not stubbed copy method");
|
||||
STAssertEquals(retainCountBefore, retainCountAfter, @"Should have incremented retain count in copy stub.");
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// some internal tests
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
- (void)testReRaisesFailFastExceptionsOnVerify
|
||||
{
|
||||
@try
|
||||
{
|
||||
[mock lowercaseString];
|
||||
}
|
||||
@catch(NSException *exception)
|
||||
{
|
||||
// expected
|
||||
}
|
||||
STAssertThrows([mock verify], @"Should have reraised the exception.");
|
||||
}
|
||||
|
||||
- (void)testReRaisesRejectExceptionsOnVerify
|
||||
{
|
||||
mock = [OCMockObject niceMockForClass:[NSString class]];
|
||||
[[mock reject] uppercaseString];
|
||||
@try
|
||||
{
|
||||
[mock uppercaseString];
|
||||
}
|
||||
@catch(NSException *exception)
|
||||
{
|
||||
// expected
|
||||
}
|
||||
STAssertThrows([mock verify], @"Should have reraised the exception.");
|
||||
}
|
||||
|
||||
|
||||
- (void)testCanCreateExpectationsAfterInvocations
|
||||
{
|
||||
[[mock expect] lowercaseString];
|
||||
[mock lowercaseString];
|
||||
[mock expect];
|
||||
}
|
||||
|
||||
@end
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2004-2008 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <SenTestingKit/SenTestingKit.h>
|
||||
|
||||
@interface OCMockRecorderTests : SenTestCase
|
||||
{
|
||||
NSInvocation *testInvocation;
|
||||
}
|
||||
|
||||
@end
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2004-2009 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import "OCMockRecorderTests.h"
|
||||
#import <OCMock/OCMockRecorder.h>
|
||||
#import "OCMReturnValueProvider.h"
|
||||
#import "OCMExceptionReturnValueProvider.h"
|
||||
|
||||
|
||||
@implementation OCMockRecorderTests
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
NSMethodSignature *signature;
|
||||
|
||||
signature = [NSString instanceMethodSignatureForSelector:@selector(initWithString:)];
|
||||
testInvocation = [NSInvocation invocationWithMethodSignature:signature];
|
||||
[testInvocation setSelector:@selector(initWithString:)];
|
||||
}
|
||||
|
||||
|
||||
- (void)testStoresAndMatchesInvocation
|
||||
{
|
||||
OCMockRecorder *recorder;
|
||||
NSString *arg;
|
||||
|
||||
arg = @"I love mocks.";
|
||||
[testInvocation setArgument:&arg atIndex:2];
|
||||
|
||||
recorder = [[[OCMockRecorder alloc] initWithSignatureResolver:[NSString string]] autorelease];
|
||||
[(id)recorder initWithString:arg];
|
||||
|
||||
STAssertTrue([recorder matchesInvocation:testInvocation], @"Should match.");
|
||||
}
|
||||
|
||||
|
||||
- (void)testOnlyMatchesInvocationWithRightArguments
|
||||
{
|
||||
OCMockRecorder *recorder;
|
||||
NSString *arg;
|
||||
|
||||
arg = @"I love mocks.";
|
||||
[testInvocation setArgument:&arg atIndex:2];
|
||||
|
||||
recorder = [[[OCMockRecorder alloc] initWithSignatureResolver:[NSString string]] autorelease];
|
||||
[(id)recorder initWithString:@"whatever"];
|
||||
|
||||
STAssertFalse([recorder matchesInvocation:testInvocation], @"Should not match.");
|
||||
}
|
||||
|
||||
|
||||
- (void)testAddsReturnValueProvider
|
||||
{
|
||||
OCMockRecorder *recorder;
|
||||
NSArray *handlerList;
|
||||
|
||||
recorder = [[[OCMockRecorder alloc] initWithSignatureResolver:[NSString string]] autorelease];
|
||||
[recorder andReturn:@"foo"];
|
||||
handlerList = [recorder invocationHandlers];
|
||||
|
||||
STAssertEquals((NSUInteger)1, [handlerList count], @"Should have added one handler.");
|
||||
STAssertEqualObjects([OCMReturnValueProvider class], [[handlerList objectAtIndex:0] class], @"Should have added correct handler.");
|
||||
}
|
||||
|
||||
- (void)testAddsExceptionReturnValueProvider
|
||||
{
|
||||
OCMockRecorder *recorder;
|
||||
NSArray *handlerList;
|
||||
|
||||
recorder = [[[OCMockRecorder alloc] initWithSignatureResolver:[NSString string]] autorelease];
|
||||
[recorder andThrow:[NSException exceptionWithName:@"TestException" reason:@"A reason" userInfo:nil]];
|
||||
handlerList = [recorder invocationHandlers];
|
||||
|
||||
STAssertEquals((NSUInteger)1, [handlerList count], @"Should have added one handler.");
|
||||
STAssertEqualObjects([OCMExceptionReturnValueProvider class], [[handlerList objectAtIndex:0] class], @"Should have added correct handler.");
|
||||
|
||||
}
|
||||
|
||||
@end
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.mulle-kybernetik.${PRODUCT_NAME:rfc1034identifier}</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</plist>
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2009 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <SenTestingKit/SenTestingKit.h>
|
||||
|
||||
|
||||
@interface OCObserverMockObjectTest : SenTestCase
|
||||
{
|
||||
NSNotificationCenter *center;
|
||||
|
||||
id mock;
|
||||
}
|
||||
|
||||
@end
|
||||
+127
@@ -0,0 +1,127 @@
|
||||
//---------------------------------------------------------------------------------------
|
||||
// $Id$
|
||||
// Copyright (c) 2009 by Mulle Kybernetik. See License file for details.
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
||||
#import <OCMock/OCMock.h>
|
||||
#import "OCObserverMockObjectTests.h"
|
||||
|
||||
static NSString *TestNotificationOne = @"TestNotificationOne";
|
||||
|
||||
|
||||
@implementation OCObserverMockObjectTest
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
center = [[[NSNotificationCenter alloc] init] autorelease];
|
||||
mock = [OCMockObject observerMock];
|
||||
}
|
||||
|
||||
- (void)testAcceptsExpectedNotification
|
||||
{
|
||||
[center addMockObserver:mock name:TestNotificationOne object:nil];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:[OCMArg any]];
|
||||
|
||||
[center postNotificationName:TestNotificationOne object:self];
|
||||
|
||||
[mock verify];
|
||||
}
|
||||
|
||||
- (void)testAcceptsExpectedNotificationWithSpecifiedObjectAndUserInfo
|
||||
{
|
||||
[center addMockObserver:mock name:TestNotificationOne object:nil];
|
||||
NSDictionary *info = [NSDictionary dictionaryWithObject:@"foo" forKey:@"key"];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:self userInfo:info];
|
||||
|
||||
[center postNotificationName:TestNotificationOne object:self userInfo:info];
|
||||
|
||||
[mock verify];
|
||||
}
|
||||
|
||||
- (void)testAcceptsNotificationsInAnyOrder
|
||||
{
|
||||
[center addMockObserver:mock name:TestNotificationOne object:nil];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:self];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:[OCMArg any]];
|
||||
|
||||
[center postNotificationName:TestNotificationOne object:[NSString string]];
|
||||
[center postNotificationName:TestNotificationOne object:self];
|
||||
}
|
||||
|
||||
- (void)testAcceptsNotificationsInCorrectOrderWhenOrderMatters
|
||||
{
|
||||
[mock setExpectationOrderMatters:YES];
|
||||
|
||||
[center addMockObserver:mock name:TestNotificationOne object:nil];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:self];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:[OCMArg any]];
|
||||
|
||||
[center postNotificationName:TestNotificationOne object:self];
|
||||
[center postNotificationName:TestNotificationOne object:[NSString string]];
|
||||
}
|
||||
|
||||
- (void)testRaisesExceptionWhenSequenceIsWrongAndOrderMatters
|
||||
{
|
||||
[mock setExpectationOrderMatters:YES];
|
||||
|
||||
[center addMockObserver:mock name:TestNotificationOne object:nil];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:self];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:[OCMArg any]];
|
||||
|
||||
STAssertThrows([center postNotificationName:TestNotificationOne object:[NSString string]], @"Should have complained about sequence.");
|
||||
}
|
||||
|
||||
- (void)testRaisesEvenThoughOverlappingExpectationsCouldHaveBeenSatisfied
|
||||
{
|
||||
// this test demonstrates a shortcoming, not a feature
|
||||
[center addMockObserver:mock name:TestNotificationOne object:nil];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:[OCMArg any]];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:self];
|
||||
|
||||
[center postNotificationName:TestNotificationOne object:self];
|
||||
STAssertThrows([center postNotificationName:TestNotificationOne object:[NSString string]], nil);
|
||||
}
|
||||
|
||||
- (void)testRaisesExceptionWhenUnexpectedNotificationIsReceived
|
||||
{
|
||||
[center addMockObserver:mock name:TestNotificationOne object:nil];
|
||||
|
||||
STAssertThrows([center postNotificationName:TestNotificationOne object:self], nil);
|
||||
}
|
||||
|
||||
- (void)testRaisesWhenNotificationWithWrongObjectIsReceived
|
||||
{
|
||||
[center addMockObserver:mock name:TestNotificationOne object:nil];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:self];
|
||||
|
||||
STAssertThrows([center postNotificationName:TestNotificationOne object:[NSString string]], nil);
|
||||
}
|
||||
|
||||
- (void)testRaisesWhenNotificationWithWrongUserInfoIsReceived
|
||||
{
|
||||
[center addMockObserver:mock name:TestNotificationOne object:nil];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:self
|
||||
userInfo:[NSDictionary dictionaryWithObject:@"foo" forKey:@"key"]];
|
||||
STAssertThrows([center postNotificationName:TestNotificationOne object:[NSString string]
|
||||
userInfo:[NSDictionary dictionaryWithObject:@"bar" forKey:@"key"]], nil);
|
||||
}
|
||||
|
||||
- (void)testRaisesOnVerifyWhenExpectedNotificationIsNotSent
|
||||
{
|
||||
[center addMockObserver:mock name:TestNotificationOne object:nil];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:[OCMArg any]];
|
||||
|
||||
STAssertThrows([mock verify], nil);
|
||||
}
|
||||
|
||||
- (void)testRaisesOnVerifyWhenNotAllNotificationsWereSent
|
||||
{
|
||||
[center addMockObserver:mock name:TestNotificationOne object:nil];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:[OCMArg any]];
|
||||
[[mock expect] notificationWithName:TestNotificationOne object:self];
|
||||
|
||||
[center postNotificationName:TestNotificationOne object:self];
|
||||
STAssertThrows([mock verify], nil);
|
||||
}
|
||||
|
||||
@end
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
/* Localized versions of Info.plist keys */
|
||||
|
||||
Reference in new issue
Block a user