Skip to content

Instantly share code, notes, and snippets.

@mihyaeru21
Last active December 18, 2015 00:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mihyaeru21/5693832 to your computer and use it in GitHub Desktop.
Save mihyaeru21/5693832 to your computer and use it in GitHub Desktop.
#import <Foundation/Foundation.h>
@interface JavaVersion : NSObject
@property (nonatomic, readonly) NSInteger familyNumber;
@property (nonatomic, readonly) NSInteger updateNumber;
+ (BOOL)isValid:(NSString *)version;
+ (id)parse:(NSString *)str;
- (NSComparisonResult)compare:(JavaVersion *)otherVersion;
- (BOOL)lessThan:(JavaVersion *)otherVersion;
- (BOOL)greaterThan:(JavaVersion *)otherVersion;
@end
#import "JavaVersion.h"
@implementation JavaVersion
+ (BOOL)isValid:(NSString *)version
{
@try {
[JavaVersion parse:version];
}
@catch (NSException *exception) {
if ([exception.name isEqualToString:@"JVParseException"]) {
return NO;
} else {
[exception raise];
}
}
return YES;
}
+ (id)parse:(NSString *)version
{
NSScanner *scanner = [NSScanner scannerWithString:version];
// VERSION FORMAT 'JDK7u40'
[scanner scanString:@"JDK" intoString:NULL];
int familyNumber, updateNumber;
[scanner scanInt:&familyNumber];
[scanner scanString:@"u" intoString:NULL];
[scanner scanInt:&updateNumber];
// 正しくスキャンできれば version lenght と scanLocation は等しい
if ([version length] != [scanner scanLocation]) {
[NSException raise:@"JVParseException" format:@"Format is invalid"];
}
JavaVersion *v = [[JavaVersion alloc] initWithFamilyNumber:familyNumber updateNumber:updateNumber];
return v;
}
- (id)initWithFamilyNumber:(NSInteger)familyNumber updateNumber:(NSInteger)updateNumber
{
self = [super init];
if (self) {
_familyNumber = familyNumber;
_updateNumber = updateNumber;
}
return self;
}
- (NSComparisonResult)compare:(JavaVersion *)otherVersion
{
// ファミリーナンバーを比較
if (self.familyNumber > otherVersion.familyNumber) {
return NSOrderedDescending;
}
if (self.familyNumber < otherVersion.familyNumber) {
return NSOrderedAscending;
}
// ファミリーナンバーが等しいときはアップデートナンバーを比較
if (self.updateNumber > otherVersion.updateNumber) {
return NSOrderedDescending;
}
if (self.updateNumber < otherVersion.updateNumber) {
return NSOrderedAscending;
}
return NSOrderedSame;
}
- (BOOL)lessThan:(JavaVersion *)otherVersion
{
return [self compare:otherVersion] == NSOrderedAscending;
}
- (BOOL)greaterThan:(JavaVersion *)otherVersion
{
return [self compare:otherVersion] == NSOrderedDescending;
}
@end
#import <Kiwi/Kiwi.h>
#import "JavaVersion.h"
SPEC_BEGIN(hoge)
describe(@"JavaVersion", ^{
it(@"isValidはJDK7u40のときture", ^{
[[@([JavaVersion isValid:@"JDK7u40"]) should] beYes];
});
it(@"JDK7u40以外はfalse", ^{
[[@([JavaVersion isValid:@"hoge"]) should] beNo];
});
it(@"isValidはJDK7u9xのときfalse", ^{
[[@([JavaVersion isValid:@"JDK7u9x"]) should] beNo];
});
it(@"インスタンスのfamilyNumberメソッドはファミリーナンバーを返す", ^{
JavaVersion *v = [JavaVersion parse:@"JDK7u40"];
[[@([v familyNumber]) should] equal:@7];
});
it(@"インスタンスのupdateNumberメソッドはアップデートナンバーを返す", ^{
JavaVersion *v = [JavaVersion parse:@"JDK7u40"];
[[@([v updateNumber]) should] equal:@40];
});
it(@"パースできないときは例外を投げる", ^{
[[theBlock(^{
[JavaVersion parse:@"Hohogheohoheoge"];
}) should] raiseWithName:@"JVParseException"];
});
describe(@"compare", ^{
__block JavaVersion *a, *b, *c, *d;
beforeAll(^{
a = [JavaVersion parse:@"JDK7u51"];
b = [JavaVersion parse:@"JDK7u40"];
c = [JavaVersion parse:@"JDK8u0"];
d = [JavaVersion parse:@"JDK7u51"];
});
it(@"a は b より大きい", ^{
[[@([a compare:b]) should] equal:@(NSOrderedDescending)];
[[@([a greaterThan:b]) should] beTrue];
});
it(@"a は c より小さい", ^{
[[@([a compare:c]) should] equal:@(NSOrderedAscending)];
[[@([a lessThan:c]) should] beTrue];
});
it(@"a は d と等しい", ^{
[[@([a compare:d]) should] equal:@(NSOrderedSame)];
});
});
});
SPEC_END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment