| /* |
| * Copyright (c) 2009-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 "OCObserverMockObject.h" |
| #import "OCMObserverRecorder.h" |
| #import "OCMLocation.h" |
| #import "OCMFunctions.h" |
| |
| |
| @implementation OCObserverMockObject |
| |
| #pragma mark Initialisers, description, accessors, etc. |
| |
| - (id)init |
| { |
| if ((self = [super init])) |
| { |
| recorders = [[NSMutableArray alloc] init]; |
| centers = [[NSMutableArray alloc] init]; |
| } |
| |
| return self; |
| } |
| |
| - (id)retain |
| { |
| return [super retain]; |
| } |
| |
| - (void)dealloc |
| { |
| for(NSNotificationCenter *c in centers) |
| [c removeObserver:self]; |
| [centers release]; |
| [recorders release]; |
| [super dealloc]; |
| } |
| |
| - (NSString *)description |
| { |
| return @"OCMockObserver"; |
| } |
| |
| - (void)setExpectationOrderMatters:(BOOL)flag |
| { |
| expectationOrderMatters = flag; |
| } |
| |
| - (void)autoRemoveFromCenter:(NSNotificationCenter *)aCenter |
| { |
| [centers addObject:aCenter]; |
| } |
| |
| |
| #pragma mark Public API |
| |
| - (id)expect |
| { |
| OCMObserverRecorder *recorder = [[[OCMObserverRecorder alloc] init] autorelease]; |
| [recorders addObject:recorder]; |
| return recorder; |
| } |
| |
| - (void)verify |
| { |
| [self verifyAtLocation:nil]; |
| } |
| |
| - (void)verifyAtLocation:(OCMLocation *)location |
| { |
| if([recorders count] == 1) |
| { |
| NSString *description = [NSString stringWithFormat:@"%@: expected notification was not observed: %@", |
| [self description], [[recorders lastObject] description]]; |
| OCMReportFailure(location, description); |
| } |
| else if([recorders count] > 0) |
| { |
| NSString *description = [NSString stringWithFormat:@"%@ : %@ expected notifications were not observed.", |
| [self description], @([recorders count])]; |
| OCMReportFailure(location, description); |
| } |
| } |
| |
| |
| #pragma mark Receiving recording requests via macro |
| |
| - (void)notificationWithName:(NSString *)name object:(id)sender |
| { |
| [[self expect] notificationWithName:name object:sender]; |
| } |
| |
| |
| #pragma mark Receiving notifications |
| |
| - (void)handleNotification:(NSNotification *)aNotification |
| { |
| NSUInteger i, limit; |
| |
| limit = expectationOrderMatters ? 1 : [recorders count]; |
| for(i = 0; i < limit; i++) |
| { |
| if([[recorders objectAtIndex:i] matchesNotification:aNotification]) |
| { |
| [recorders removeObjectAtIndex:i]; |
| return; |
| } |
| } |
| [NSException raise:NSInternalInconsistencyException format:@"%@: unexpected notification observed: %@", [self description], |
| [aNotification description]]; |
| } |
| |
| |
| @end |