Skip to content

Commit

Permalink
Move all iVars to external storage
Browse files Browse the repository at this point in the history
  • Loading branch information
dmaclach committed Jul 14, 2020
1 parent 6218395 commit a837057
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 13 deletions.
56 changes: 51 additions & 5 deletions Source/OCMock/OCClassMockObject.m
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,23 @@
#import "OCMInvocationStub.h"
#import "NSMethodSignature+OCMAdditions.h"

@interface OCClassMockObjectInstanceVars : NSObject
@property (nonatomic) Class mockedClass;
@property (nonatomic) Class originalMetaClass;
@property (nonatomic) Class classCreatedForNewMetaClass;
@end

@implementation OCClassMockObjectInstanceVars
@end

@interface OCClassMockObject ()
@property (nonatomic) Class mockedClass;
@property (nonatomic) Class originalMetaClass;
@property (nonatomic) Class classCreatedForNewMetaClass;
@property (nonatomic) Class mockedClass;
@property (nonatomic) Class originalMetaClass;
@property (nonatomic) Class classCreatedForNewMetaClass;
@end

static const char *OCClassMockObjectInstanceVarsKey = "OCClassMockObjectInstanceVarsKey";

@implementation OCClassMockObject

#pragma mark Initialisers, description, accessors, etc.
Expand All @@ -37,6 +48,10 @@ - (id)initWithClass:(Class)aClass
[NSException raise:NSInvalidArgumentException format:@"Class cannot be Nil."];

self = [super init];
OCClassMockObjectInstanceVars *vars = [[OCClassMockObjectInstanceVars alloc] init];
objc_setAssociatedObject(self, OCClassMockObjectInstanceVarsKey, vars, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[vars release];

self.mockedClass = aClass;
[self prepareClassForClassMethodMocking];
return self;
Expand All @@ -53,9 +68,40 @@ - (NSString *)description
return [NSString stringWithFormat:@"OCClassMockObject(%@)", NSStringFromClass(self.mockedClass)];
}

#pragma mark Setters/Getters

- (OCClassMockObjectInstanceVars *)classMockObjectInstanceVars {
return objc_getAssociatedObject(self, OCClassMockObjectInstanceVarsKey);
}

- (Class)mockedClass
{
return _mockedClass;
return self.classMockObjectInstanceVars.mockedClass;
}

- (Class)classCreatedForNewMetaClass
{
return self.classMockObjectInstanceVars.classCreatedForNewMetaClass;
}

- (Class)originalMetaClass
{
return self.classMockObjectInstanceVars.originalMetaClass;
}

- (void)setMockedClass:(Class)mockedClass
{
self.classMockObjectInstanceVars.mockedClass = mockedClass;
}

- (void)setClassCreatedForNewMetaClass:(Class)classCreatedForNewMetaClass
{
self.classMockObjectInstanceVars.classCreatedForNewMetaClass = classCreatedForNewMetaClass;
}

- (void)setOriginalMetaClass:(Class)originalMetaClass
{
self.classMockObjectInstanceVars.originalMetaClass = originalMetaClass;
}


Expand Down Expand Up @@ -209,7 +255,7 @@ - (Class)mockObjectClass

- (Class)class
{
return _mockedClass;
return self.mockedClass;
}

- (BOOL)respondsToSelector:(SEL)selector
Expand Down
67 changes: 61 additions & 6 deletions Source/OCMock/OCMockObject.m
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,20 @@
#import "OCMExceptionReturnValueProvider.h"
#import "OCMExpectationRecorder.h"

@interface OCMockObjectInstanceVars : NSObject
@property (nonatomic) BOOL isNice;
@property (nonatomic) BOOL expectationOrderMatters;
@property (nonatomic, assign) NSMutableArray *stubs;
@property (nonatomic, assign) NSMutableArray *expectations;
@property (nonatomic, assign) NSMutableArray *exceptions;
@property (nonatomic, assign) NSMutableArray *invocations;
@end

@implementation OCMockObjectInstanceVars
@end

static const char *OCMockObjectInstanceVarsKey = "OCMockObjectInstanceVarsKey";

@interface OCMockObject ()
@property (nonatomic) BOOL isNice;
@property (nonatomic) BOOL expectationOrderMatters;
Expand Down Expand Up @@ -105,11 +119,14 @@ - (instancetype)init
}

// skip initialisation when init is called again, which can happen when stubbing alloc/init
if(self.stubs != nil)
if(self.mockObjectInstanceVars != nil)
{
return self;
}

OCMockObjectInstanceVars *vars = [[OCMockObjectInstanceVars alloc] init];
objc_setAssociatedObject(self, OCMockObjectInstanceVarsKey, vars, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[vars release];
// no [super init], we're inheriting from NSProxy
self.expectationOrderMatters = NO;
self.stubs = [[NSMutableArray alloc] init];
Expand Down Expand Up @@ -158,13 +175,52 @@ - (void)assertInvocationsArrayIsPresent
}
}

# pragma mark Getters/Setters
- (OCMockObjectInstanceVars *)mockObjectInstanceVars {
return objc_getAssociatedObject(self, OCMockObjectInstanceVarsKey);
}

#pragma mark Public API
- (BOOL)isNice {
return self.mockObjectInstanceVars.isNice;
}

- (void)setExpectationOrderMatters:(BOOL)flag
{
_expectationOrderMatters = flag;
- (BOOL)expectationOrderMatters {
return self.mockObjectInstanceVars.expectationOrderMatters;
}
- (NSMutableArray *)stubs {
return self.mockObjectInstanceVars.stubs;
}
- (NSMutableArray *)expectations {
return self.mockObjectInstanceVars.expectations;
}
- (NSMutableArray *)exceptions {
return self.mockObjectInstanceVars.exceptions;
}
- (NSMutableArray *)invocations {
return self.mockObjectInstanceVars.invocations;
}

- (void)setIsNice:(BOOL)isNice {
self.mockObjectInstanceVars.isNice = isNice;
}

- (void)setExpectationOrderMatters:(BOOL)expectationOrderMatters {
self.mockObjectInstanceVars.expectationOrderMatters = expectationOrderMatters;
}
- (void)setStubs:(NSMutableArray *)stubs {
self.mockObjectInstanceVars.stubs = stubs;
}
- (void)setExpectations:(NSMutableArray *)expectations {
self.mockObjectInstanceVars.expectations = expectations;
}
- (void)setExceptions:(NSMutableArray *)exceptions {
self.mockObjectInstanceVars.exceptions = exceptions;
}
- (void)setInvocations:(NSMutableArray *)invocations {
self.mockObjectInstanceVars.invocations = invocations;
}

#pragma mark Public API

- (void)stopMocking
{
Expand All @@ -175,7 +231,6 @@ - (void)stopMocking
@synchronized(self.invocations)
{
[self.invocations removeAllObjects];
[self.invocations autorelease];
self.invocations = nil;
}
}
Expand Down
25 changes: 24 additions & 1 deletion Source/OCMock/OCPartialMockObject.m
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,15 @@
#import "OCMInvocationStub.h"
#import "NSInvocation+OCMAdditions.h"

@interface OCPartialMockObjectInstanceVars : NSObject
@property (nonatomic, assign) NSObject *realObject;
@end

@implementation OCPartialMockObjectInstanceVars
@end

static const char *OCPartialMockObjectInstanceVarsKey = "OCPartialMockObjectInstanceVarsKey";

@interface OCPartialMockObject ()
@property (nonatomic) NSObject *realObject;
@end
Expand All @@ -39,6 +48,9 @@ - (id)initWithObject:(NSObject *)anObject
Class const class = [self classToSubclassForObject:anObject];
[self assertClassIsSupported:class];
self = [super initWithClass:class];
OCPartialMockObjectInstanceVars *vars = [[OCPartialMockObjectInstanceVars alloc] init];
objc_setAssociatedObject(self, OCPartialMockObjectInstanceVarsKey, vars, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[vars release];
self.realObject = [anObject retain];
[self prepareObjectForInstanceMethodMocking];
return self;
Expand All @@ -49,9 +61,20 @@ - (NSString *)description
return [NSString stringWithFormat:@"OCPartialMockObject(%@)", NSStringFromClass(self.mockedClass)];
}

#pragma mark Setters/Getters

- (OCPartialMockObjectInstanceVars *)partialMockObjectInstanceVars {
return objc_getAssociatedObject(self, OCPartialMockObjectInstanceVarsKey);
}

- (NSObject *)realObject
{
return _realObject;
return self.partialMockObjectInstanceVars.realObject;
}

- (void)setRealObject:(NSObject *)realObject
{
self.partialMockObjectInstanceVars.realObject = realObject;
}

#pragma mark Helper methods
Expand Down
9 changes: 8 additions & 1 deletion Source/OCMockTests/OCMockObjectTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
#import <XCTest/XCTest.h>
#import <OCMock/OCMock.h>
#import "OCMBoxedReturnValueProvider.h"

#import "OCPartialMockObject.h"
#import "OCClassMockObject.h"

#pragma mark Helper classes and protocols for testing

Expand Down Expand Up @@ -1100,6 +1101,12 @@ - (void)testUncalledRejectStubDoesNotCountAsExpectation

}

- (void)testMockObjectsHaveNoInstanceVariables
{
XCTAssertEqual(class_getInstanceSize([NSProxy class]), class_getInstanceSize([OCMockObject class]));
XCTAssertEqual(class_getInstanceSize([NSProxy class]), class_getInstanceSize([OCPartialMockObject class]));
XCTAssertEqual(class_getInstanceSize([NSProxy class]), class_getInstanceSize([OCClassMockObject class]));
}

@end

Expand Down

0 comments on commit a837057

Please sign in to comment.