KWInequalityMatcher.m 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. //
  2. // Licensed under the terms in License.txt
  3. //
  4. // Copyright 2010 Allen Ding. All rights reserved.
  5. //
  6. #import "KWInequalityMatcher.h"
  7. #import "KWFormatter.h"
  8. typedef NS_ENUM(NSUInteger, KWInequalityType) {
  9. KWInequalityTypeLessThan,
  10. KWInequalityTypeLessThanOrEqualTo,
  11. KWInequalityTypeGreaterThan,
  12. KWInequalityTypeGreaterThanOrEqualTo
  13. };
  14. @interface KWInequalityMatcher()
  15. #pragma mark - Properties
  16. @property (nonatomic, assign) KWInequalityType inequalityType;
  17. @property (nonatomic, strong) id otherValue;
  18. @end
  19. @implementation KWInequalityMatcher
  20. #pragma mark - Getting Matcher Strings
  21. + (NSArray *)matcherStrings {
  22. return @[@"beLessThan:",
  23. @"beLessThanOrEqualTo:",
  24. @"beGreaterThan:",
  25. @"beGreaterThanOrEqualTo:"];
  26. }
  27. #pragma mark - Matching
  28. - (BOOL)evaluate {
  29. if (![self.subject respondsToSelector:@selector(compare:)])
  30. [NSException raise:@"KWMatcherException" format:@"subject does not respond to -compare:"];
  31. NSComparisonResult result = [self.subject compare:self.otherValue];
  32. switch (result) {
  33. case NSOrderedSame:
  34. return self.inequalityType == KWInequalityTypeLessThanOrEqualTo || self.inequalityType == KWInequalityTypeGreaterThanOrEqualTo;
  35. case NSOrderedAscending:
  36. return self.inequalityType == KWInequalityTypeLessThan || self.inequalityType == KWInequalityTypeLessThanOrEqualTo;
  37. case NSOrderedDescending:
  38. return self.inequalityType == KWInequalityTypeGreaterThan || self.inequalityType == KWInequalityTypeGreaterThanOrEqualTo;
  39. }
  40. assert(0 && "should never reach here");
  41. return NO;
  42. }
  43. #pragma mark - Getting Failure Messages
  44. - (NSString *)comparisonPhrase {
  45. switch (self.inequalityType) {
  46. case KWInequalityTypeLessThan:
  47. return @"<";
  48. case KWInequalityTypeLessThanOrEqualTo:
  49. return @"<=";
  50. case KWInequalityTypeGreaterThan:
  51. return @">";
  52. case KWInequalityTypeGreaterThanOrEqualTo:
  53. return @">=";
  54. }
  55. assert(0 && "should never reach here");
  56. return nil;
  57. }
  58. - (NSString *)failureMessageForShould {
  59. return [NSString stringWithFormat:@"expected subject to be %@ %@, got %@",
  60. [self comparisonPhrase],
  61. [KWFormatter formatObject:self.otherValue],
  62. [KWFormatter formatObject:self.subject]];
  63. }
  64. - (NSString *)description {
  65. return [NSString stringWithFormat:@"be %@ %@", [self comparisonPhrase], [KWFormatter formatObject:self.otherValue]];
  66. }
  67. #pragma mark - Configuring Matchers
  68. - (void)beLessThan:(id)aValue {
  69. self.inequalityType = KWInequalityTypeLessThan;
  70. self.otherValue = aValue;
  71. }
  72. - (void)beLessThanOrEqualTo:(id)aValue {
  73. self.inequalityType = KWInequalityTypeLessThanOrEqualTo;
  74. self.otherValue = aValue;
  75. }
  76. - (void)beGreaterThan:(id)aValue {
  77. self.inequalityType = KWInequalityTypeGreaterThan;
  78. self.otherValue = aValue;
  79. }
  80. - (void)beGreaterThanOrEqualTo:(id)aValue {
  81. self.inequalityType = KWInequalityTypeGreaterThanOrEqualTo;
  82. self.otherValue = aValue;
  83. }
  84. @end