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