This commit is contained in:
giuseppenuc committed 2016-02-24 16:56:39 +01:00
1 parent d281d765ea
commit 5b074a5176
1261 files changed
+199158 -7303

No files matched your search

@@ -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
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,10 @@
//---------------------------------------------------------------------------------------
// $Id$
// Copyright (c) 2013 by Mulle Kybernetik. See License file for details.
//---------------------------------------------------------------------------------------
#import <SenTestingKit/SenTestingKit.h>
@interface OCMockObjectClassMethodMockingTests : SenTestCase
@end
@@ -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
@@ -0,0 +1,10 @@
//---------------------------------------------------------------------------------------
// $Id$
// Copyright (c) 2013 by Mulle Kybernetik. See License file for details.
//---------------------------------------------------------------------------------------
#import <SenTestingKit/SenTestingKit.h>
@interface OCMockForwardingTargetTests : SenTestCase
@end
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,10 @@
//---------------------------------------------------------------------------------------
// $Id$
// Copyright (c) 2013 by Mulle Kybernetik. See License file for details.
//---------------------------------------------------------------------------------------
#import <SenTestingKit/SenTestingKit.h>
@interface OCMockObjectPartialMocksTests : SenTestCase
@end
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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>
@@ -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
@@ -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
@@ -0,0 +1,2 @@
/* Localized versions of Info.plist keys */