Last active
December 18, 2015 00:08
-
-
Save mihyaeru21/5693832 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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