Home | History | Annotate | Download | only in OCMock
      1 //---------------------------------------------------------------------------------------
      2 //  $Id$
      3 //  Copyright (c) 2009 by Mulle Kybernetik. See License file for details.
      4 //---------------------------------------------------------------------------------------
      5 
      6 #import "OCObserverMockObject.h"
      7 #import "OCMObserverRecorder.h"
      8 
      9 
     10 @implementation OCObserverMockObject
     11 
     12 #pragma mark  Initialisers, description, accessors, etc.
     13 
     14 - (id)init
     15 {
     16 	self = [super init];
     17 	recorders = [[NSMutableArray alloc] init];
     18 	return self;
     19 }
     20 
     21 - (void)dealloc
     22 {
     23 	[recorders release];
     24 	[super dealloc];
     25 }
     26 
     27 - (NSString *)description
     28 {
     29 	return @"OCMockObserver";
     30 }
     31 
     32 - (void)setExpectationOrderMatters:(BOOL)flag
     33 {
     34     expectationOrderMatters = flag;
     35 }
     36 
     37 
     38 #pragma mark  Public API
     39 
     40 - (id)expect
     41 {
     42 	OCMObserverRecorder *recorder = [[[OCMObserverRecorder alloc] init] autorelease];
     43 	[recorders addObject:recorder];
     44 	return recorder;
     45 }
     46 
     47 - (void)verify
     48 {
     49 	if([recorders count] == 1)
     50 	{
     51 		[NSException raise:NSInternalInconsistencyException format:@"%@: expected notification was not observed: %@", 
     52 		 [self description], [[recorders lastObject] description]];
     53 	}
     54 	if([recorders count] > 0)
     55 	{
     56 		[NSException raise:NSInternalInconsistencyException format:@"%@ : %ld expected notifications were not observed.", 
     57 		 [self description], (unsigned long)[recorders count]];
     58 	}
     59 }
     60 
     61 
     62 
     63 #pragma mark  Receiving notifications
     64 
     65 - (void)handleNotification:(NSNotification *)aNotification
     66 {
     67 	NSUInteger i, limit;
     68 	
     69 	limit = expectationOrderMatters ? 1 : [recorders count];
     70 	for(i = 0; i < limit; i++)
     71 	{
     72 		if([[recorders objectAtIndex:i] matchesNotification:aNotification])
     73 		{
     74 			[recorders removeObjectAtIndex:i];
     75 			return;
     76 		}
     77 	}
     78 	[NSException raise:NSInternalInconsistencyException format:@"%@: unexpected notification observed: %@", [self description], 
     79 	  [aNotification description]];
     80 }
     81 
     82 
     83 @end
     84