| Index: third_party/ocmock/OCMock/OCMRecorder.m
|
| diff --git a/third_party/ocmock/OCMock/OCMRecorder.m b/third_party/ocmock/OCMock/OCMRecorder.m
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..4f630b68d7e9bab15a49add347aeb72572fe4e69
|
| --- /dev/null
|
| +++ b/third_party/ocmock/OCMock/OCMRecorder.m
|
| @@ -0,0 +1,109 @@
|
| +/*
|
| + * Copyright (c) 2014-2015 Erik Doernenburg and contributors
|
| + *
|
| + * Licensed under the Apache License, Version 2.0 (the "License"); you may
|
| + * not use these files except in compliance with the License. You may obtain
|
| + * a copy of the License at
|
| + *
|
| + * http://www.apache.org/licenses/LICENSE-2.0
|
| + *
|
| + * Unless required by applicable law or agreed to in writing, software
|
| + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
| + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
| + * License for the specific language governing permissions and limitations
|
| + * under the License.
|
| + */
|
| +
|
| +#import <objc/runtime.h>
|
| +#import "OCMRecorder.h"
|
| +#import "OCMockObject.h"
|
| +#import "OCMInvocationMatcher.h"
|
| +#import "OCClassMockObject.h"
|
| +
|
| +@implementation OCMRecorder
|
| +
|
| +- (instancetype)init
|
| +{
|
| + // no super, we're inheriting from NSProxy
|
| + return self;
|
| +}
|
| +
|
| +- (instancetype)initWithMockObject:(OCMockObject *)aMockObject
|
| +{
|
| + [self init];
|
| + [self setMockObject:aMockObject];
|
| + return self;
|
| +}
|
| +
|
| +- (void)setMockObject:(OCMockObject *)aMockObject
|
| +{
|
| + mockObject = aMockObject;
|
| +}
|
| +
|
| +- (void)dealloc
|
| +{
|
| + [invocationMatcher release];
|
| + [super dealloc];
|
| +}
|
| +
|
| +- (NSString *)description
|
| +{
|
| + return [invocationMatcher description];
|
| +}
|
| +
|
| +- (OCMInvocationMatcher *)invocationMatcher
|
| +{
|
| + return invocationMatcher;
|
| +}
|
| +
|
| +
|
| +#pragma mark Modifying the matcher
|
| +
|
| +- (id)classMethod
|
| +{
|
| + // should we handle the case where this is called with a mock that isn't a class mock?
|
| + [invocationMatcher setRecordedAsClassMethod:YES];
|
| + return self;
|
| +}
|
| +
|
| +- (id)ignoringNonObjectArgs
|
| +{
|
| + [invocationMatcher setIgnoreNonObjectArgs:YES];
|
| + return self;
|
| +}
|
| +
|
| +
|
| +#pragma mark Recording the actual invocation
|
| +
|
| +- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
|
| +{
|
| + if([invocationMatcher recordedAsClassMethod])
|
| + return [[(OCClassMockObject *)mockObject mockedClass] methodSignatureForSelector:aSelector];
|
| +
|
| + NSMethodSignature *signature = [mockObject methodSignatureForSelector:aSelector];
|
| + if(signature == nil)
|
| + {
|
| + // if we're a working with a class mock and there is a class method, auto-switch
|
| + if(([object_getClass(mockObject) isSubclassOfClass:[OCClassMockObject class]]) &&
|
| + ([[(OCClassMockObject *)mockObject mockedClass] respondsToSelector:aSelector]))
|
| + {
|
| + [self classMethod];
|
| + signature = [self methodSignatureForSelector:aSelector];
|
| + }
|
| + }
|
| + return signature;
|
| +}
|
| +
|
| +- (void)forwardInvocation:(NSInvocation *)anInvocation
|
| +{
|
| + [anInvocation setTarget:nil];
|
| + [invocationMatcher setInvocation:anInvocation];
|
| +}
|
| +
|
| +- (void)doesNotRecognizeSelector:(SEL)aSelector
|
| +{
|
| + [NSException raise:NSInvalidArgumentException format:@"%@: cannot stub/expect/verify method '%@' because no such method exists in the mocked class.", mockObject, NSStringFromSelector(aSelector)];
|
| +}
|
| +
|
| +
|
| +@end
|
|
|