main
  1//
  2// Licensed under the terms in License.txt
  3//
  4// Copyright 2010 Allen Ding. All rights reserved.
  5//
  6
  7#import "KWInequalityMatcher.h"
  8#import "KWFormatter.h"
  9
 10@interface KWInequalityMatcher()
 11
 12#pragma mark -
 13#pragma mark Properties
 14
 15@property (nonatomic, readwrite) KWInequalityType inequalityType;
 16@property (nonatomic, readwrite, retain) id otherValue;
 17
 18@end
 19
 20@implementation KWInequalityMatcher
 21
 22#pragma mark -
 23#pragma mark Initializing
 24
 25- (void)dealloc {
 26    [otherValue release];
 27    [super dealloc];
 28}
 29
 30#pragma mark -
 31#pragma mark Properties
 32
 33@synthesize inequalityType;
 34@synthesize otherValue;
 35
 36#pragma mark -
 37#pragma mark Getting Matcher Strings
 38
 39+ (NSArray *)matcherStrings {
 40    return @[@"beLessThan:",
 41                                     @"beLessThanOrEqualTo:",
 42                                     @"beGreaterThan:",
 43                                     @"beGreaterThanOrEqualTo:"];
 44}
 45
 46#pragma mark -
 47#pragma mark Matching
 48
 49- (BOOL)evaluate {
 50    if (![self.subject respondsToSelector:@selector(compare:)])
 51        [NSException raise:@"KWMatcherException" format:@"subject does not respond to -compare:"];
 52
 53    NSComparisonResult result = [self.subject compare:self.otherValue];
 54
 55    switch (result) {
 56        case NSOrderedSame:
 57            return self.inequalityType == KWInequalityTypeLessThanOrEqualTo || self.inequalityType == KWInequalityTypeGreaterThanOrEqualTo;
 58        case NSOrderedAscending:
 59            return self.inequalityType == KWInequalityTypeLessThan || self.inequalityType == KWInequalityTypeLessThanOrEqualTo;
 60        case NSOrderedDescending:
 61            return self.inequalityType == KWInequalityTypeGreaterThan || self.inequalityType == KWInequalityTypeGreaterThanOrEqualTo;
 62    }
 63
 64    assert(0 && "should never reach here");
 65    return NO;
 66}
 67
 68#pragma mark -
 69#pragma mark Getting Failure Messages
 70
 71- (NSString *)comparisonPhrase {
 72    switch (self.inequalityType) {
 73        case KWInequalityTypeLessThan:
 74            return @"<";
 75        case KWInequalityTypeLessThanOrEqualTo:
 76            return @"<=";
 77        case KWInequalityTypeGreaterThan:
 78            return @">";
 79        case KWInequalityTypeGreaterThanOrEqualTo:
 80            return @">=";
 81    }
 82
 83    assert(0 && "should never reach here");
 84    return nil;
 85}
 86
 87- (NSString *)failureMessageForShould {
 88    return [NSString stringWithFormat:@"expected subject to be %@ %@, got %@",
 89                                      [self comparisonPhrase],
 90                                      [KWFormatter formatObject:self.otherValue],
 91                                      [KWFormatter formatObject:self.subject]];
 92}
 93
 94- (NSString *)description
 95{
 96  return [NSString stringWithFormat:@"be %@ %@", [self comparisonPhrase], [KWFormatter formatObject:self.otherValue]];
 97}
 98
 99#pragma mark -
100#pragma mark Configuring Matchers
101
102- (void)beLessThan:(id)aValue {
103    self.inequalityType = KWInequalityTypeLessThan;
104    self.otherValue = aValue;
105}
106
107- (void)beLessThanOrEqualTo:(id)aValue {
108    self.inequalityType = KWInequalityTypeLessThanOrEqualTo;
109    self.otherValue = aValue;
110}
111
112- (void)beGreaterThan:(id)aValue {
113    self.inequalityType = KWInequalityTypeGreaterThan;
114    self.otherValue = aValue;
115}
116
117- (void)beGreaterThanOrEqualTo:(id)aValue {
118    self.inequalityType = KWInequalityTypeGreaterThanOrEqualTo;
119    self.otherValue = aValue;
120}
121
122@end