Skip to content

Instantly share code, notes, and snippets.

@marksands
Last active August 29, 2015 14:10
Show Gist options
  • Save marksands/8a8b0123c469fc80d51e to your computer and use it in GitHub Desktop.
Save marksands/8a8b0123c469fc80d51e to your computer and use it in GitHub Desktop.
#import <Cocoa/Cocoa.h>
#import <Foundation/Foundation.h>
#import <XCTest/XCTest.h>
@interface NSDecimalNumberTests : XCTestCase
@end
@implementation DecimalTests
#pragma mark - NSDecimalNumberTests
- (void)testDecimalCompareDecimal {
NSDecimalNumber *decimalSeven = [NSDecimalNumber decimalNumberWithString:@"7"];
NSDecimalNumber *decimalEight = [NSDecimalNumber decimalNumberWithString:@"8"];
NSComparisonResult result = [decimalSeven compare:decimalEight];
XCTAssertEqual(result, NSOrderedAscending);
}
- (void)testDecimalCompareNil {
NSDecimalNumber *decimalSeven = [NSDecimalNumber decimalNumberWithString:@"7"];
NSDecimalNumber *decimalEight = nil;
NSComparisonResult result = [decimalSeven compare:decimalEight];
XCTAssertEqual(result, NSOrderedDescending);
}
- (void)testNilCompareDecimal {
NSDecimalNumber *decimalSeven = nil;
NSDecimalNumber *decimalEight = [NSDecimalNumber decimalNumberWithString:@"8"];
NSComparisonResult result = [decimalSeven compare:decimalEight];
XCTAssertEqual(result, NSOrderedSame);
}
- (void)testDecimalEqualToNumberDecimal {
NSDecimalNumber *decimalSeven1 = [NSDecimalNumber decimalNumberWithString:@"7"];
NSDecimalNumber *decimalSeven2 = [NSDecimalNumber decimalNumberWithString:@"7"];
BOOL result = [decimalSeven1 isEqualToNumber:decimalSeven2];
XCTAssertTrue(result);
}
- (void)testDecimalEqualToNumberNil {
NSDecimalNumber *decimalSeven = [NSDecimalNumber decimalNumberWithString:@"7"];
NSDecimalNumber *decimalEight = nil;
BOOL result = [decimalSeven isEqualToNumber:decimalEight];
XCTAssertFalse(result);
}
- (void)testNilEqualToNumberDecimal {
NSDecimalNumber *decimalSeven = nil;
NSDecimalNumber *decimalEight = [NSDecimalNumber decimalNumberWithString:@"8"];
BOOL result = [decimalSeven isEqualToNumber:decimalEight];
XCTAssertFalse(result);
}
- (void)testDecimalEqualToDecimal {
NSDecimalNumber *decimalSeven1 = [NSDecimalNumber decimalNumberWithString:@"7"];
NSDecimalNumber *decimalSeven2 = [NSDecimalNumber decimalNumberWithString:@"7"];
BOOL result = [decimalSeven1 isEqual:decimalSeven2];
XCTAssertTrue(result);
}
- (void)testDecimalEqualToNil {
NSDecimalNumber *decimalSeven = [NSDecimalNumber decimalNumberWithString:@"7"];
NSDecimalNumber *decimalEight = nil;
BOOL result = [decimalSeven isEqual:decimalEight];
XCTAssertFalse(result);
}
- (void)testNilEqualToDecimal {
NSDecimalNumber *decimalSeven = nil;
NSDecimalNumber *decimalEight = [NSDecimalNumber decimalNumberWithString:@"8"];
BOOL result = [decimalSeven isEqual:decimalEight];
XCTAssertFalse(result);
}
#pragma mark - NSNumber
- (void)testNumberCompareNumber {
NSNumber *numberSeven = @7;
NSNumber *numberEight = @8;
NSComparisonResult result = [numberSeven compare:numberEight];
XCTAssertEqual(result, NSOrderedAscending);
}
- (void)testNumberCompareNil_crashes {
NSNumber *numberSeven = @7;
NSNumber *numberEight = nil;
XCTAssertThrows([numberSeven compare:numberEight]);
}
- (void)testNilCompareNumber {
NSNumber *numberSeven = nil;
NSNumber *numberEight = @8;
NSComparisonResult result = [numberSeven compare:numberEight];
XCTAssertEqual(result, NSOrderedSame);
}
- (void)testNumberEqualToNumberNumber {
NSNumber *numberSeven1 = @7;
NSNumber *numberSeven2 = @7;
BOOL result = [numberSeven1 isEqualToNumber:numberSeven2];
XCTAssertTrue(result);
}
- (void)testNumberEqualToNumberNil_crashes {
NSNumber *numberSeven = @7;
NSNumber *numberEight = nil;
XCTAssertThrows([numberSeven isEqualToNumber:numberEight]);
}
- (void)testNilEqualToNumberNumber {
NSNumber *numberSeven = nil;
NSNumber *numberEight = @8;
BOOL result = [numberSeven isEqualToNumber:numberEight];
XCTAssertFalse(result);
}
- (void)testNumberEqualToNumber {
NSNumber *numberSeven1 = @7;
NSNumber *numberSeven2 = @7;
BOOL result = [numberSeven1 isEqual:numberSeven2];
XCTAssertTrue(result);
}
- (void)testNumberEqualToNil {
NSNumber *numberSeven = @7;
NSNumber *numberEight = nil;
BOOL result = [numberSeven isEqual:numberEight];
XCTAssertFalse(result);
}
- (void)testNilEqualToNumber {
NSNumber *numberSeven = nil;
NSNumber *numberEight = @8;
BOOL result = [numberSeven isEqual:numberEight];
XCTAssertFalse(result);
}
@end
@marksands
Copy link
Author

compare:
-(NSComparisonResult)compare:(NSNumber *)decimalNumber apparently turns nil into 0 when doing the comparison against nil. Even though the signature for NSDecimalNumber's compare is the same as NSNumber. However, when comparing nil against an NSNumber this statement throws an exception.

isEqualToNumber:
-(BOOL)isEqualToNumber:(NSNumber *)number silently fails with NSDecimalNumber, yet it crashes for NSNumber when the 2nd argument is nil. According to the documentation:

Two NSNumber objects are considered equal if they have the same id values or if they have equivalent values (as determined by the compare: method).

So it's no surprise that this method also crashes since it relies on compare:.

isEqual:
-(BOOL)isEqual:(id)object surprisingly silently fails for both NSDecimalNumber and NSNumber.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment