Home | History | Annotate | Download | only in OCMock
      1 //---------------------------------------------------------------------------------------
      2 //  $Id$
      3 //  Copyright (c) 2007-2010 by Mulle Kybernetik. See License file for details.
      4 //---------------------------------------------------------------------------------------
      5 
      6 #import <OCMock/OCMConstraint.h>
      7 
      8 
      9 @implementation OCMConstraint
     10 
     11 + (id)constraint
     12 {
     13 	return [[[self alloc] init] autorelease];
     14 }
     15 
     16 - (BOOL)evaluate:(id)value
     17 {
     18 	return NO;
     19 }
     20 
     21 - (id)copyWithZone:(NSZone *)zone
     22 {
     23 	return [self retain];
     24 }
     25 
     26 + (id)constraintWithSelector:(SEL)aSelector onObject:(id)anObject
     27 {
     28 	OCMInvocationConstraint *constraint = [OCMInvocationConstraint constraint];
     29 	NSMethodSignature *signature = [anObject methodSignatureForSelector:aSelector]; 
     30 	if(signature == nil)
     31 		[NSException raise:NSInvalidArgumentException format:@"Unkown selector %@ used in constraint.", NSStringFromSelector(aSelector)];
     32 	NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
     33 	[invocation setTarget:anObject];
     34 	[invocation setSelector:aSelector];
     35 	constraint->invocation = invocation;
     36 	return constraint;
     37 }
     38 
     39 + (id)constraintWithSelector:(SEL)aSelector onObject:(id)anObject withValue:(id)aValue
     40 {
     41 	OCMInvocationConstraint *constraint = [self constraintWithSelector:aSelector onObject:anObject];
     42 	if([[constraint->invocation methodSignature] numberOfArguments] < 4)
     43 		[NSException raise:NSInvalidArgumentException format:@"Constraint with value requires selector with two arguments."];
     44 	[constraint->invocation setArgument:&aValue atIndex:3];
     45 	return constraint;
     46 }
     47 
     48 
     49 @end
     50 
     51 
     52 
     53 #pragma mark  -
     54 
     55 @implementation OCMAnyConstraint
     56 
     57 - (BOOL)evaluate:(id)value
     58 {
     59 	return YES;
     60 }
     61 
     62 @end
     63 
     64 
     65 
     66 #pragma mark  -
     67 
     68 @implementation OCMIsNilConstraint
     69 
     70 - (BOOL)evaluate:(id)value
     71 {
     72 	return value == nil;
     73 }
     74 
     75 @end
     76 
     77 
     78 
     79 #pragma mark  -
     80 
     81 @implementation OCMIsNotNilConstraint
     82 
     83 - (BOOL)evaluate:(id)value
     84 {
     85 	return value != nil;
     86 }
     87 
     88 @end
     89 
     90 
     91 
     92 #pragma mark  -
     93 
     94 @implementation OCMIsNotEqualConstraint
     95 
     96 - (BOOL)evaluate:(id)value
     97 {
     98 	return ![value isEqual:testValue];
     99 }
    100 
    101 @end
    102 
    103 
    104 
    105 #pragma mark  -
    106 
    107 @implementation OCMInvocationConstraint
    108 
    109 - (BOOL)evaluate:(id)value
    110 {
    111 	[invocation setArgument:&value atIndex:2]; // should test if constraint takes arg
    112 	[invocation invoke];
    113 	BOOL returnValue;
    114 	[invocation getReturnValue:&returnValue];
    115 	return returnValue;
    116 }
    117 
    118 @end
    119 
    120 #pragma mark  -
    121 
    122 #if NS_BLOCKS_AVAILABLE
    123 
    124 @implementation OCMBlockConstraint
    125 
    126 - (id)initWithConstraintBlock:(BOOL (^)(id))aBlock;
    127 {
    128 	self = [super init];
    129 	block = aBlock;
    130 	return self;
    131 }
    132 
    133 - (BOOL)evaluate:(id)value 
    134 {
    135 	return block(value);
    136 }
    137 
    138 @end
    139 
    140 #endif
    141