diff --git a/Tests/Objective-J/Preprocessor/BehaviorTests/InheritanceTest.j b/Tests/Objective-J/Preprocessor/BehaviorTests/InheritanceTest.j new file mode 100644 index 000000000..5fcd7b5f4 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/BehaviorTests/InheritanceTest.j @@ -0,0 +1,131 @@ +@import + +@implementation ParentClass : CPObject +{ + id ivar; +} + +- (CPString)classNameString +{ + return @"ParentClass"; +} + +@end + +@implementation ChildClass : ParentClass +{ +} + +- (id)ivar +{ + return ivar; +} + +- (void)setIvar:(id)newValue +{ + ivar = newValue; +} + +- (CPString)classNameString +{ + return @"ChildClass"; +} + +- (CPString)parentClassNameString +{ + return [super classNameString]; +} + +@end + +@implementation GrandChildClass : ChildClass +{ +} + +- (CPString)classNameString +{ + return @"GrandChildClass"; +} + +- (CPString)parentClassNameString +{ + return [super classNameString]; +} + +- (CPString)grandParentClassNameString +{ + return [super parentClassNameString]; +} + +@end + +@implementation InheritanceTest : OJTestCase +{ + ParentClass parentClass; + ChildClass childClass; + GrandChildClass grandChildClass; +} + +- (void)setUp +{ + parentClass = [[ParentClass alloc] init]; + childClass = [[ChildClass alloc] init]; + grandChildClass = [[GrandChildClass alloc] init]; +} + +- (void)testIvarInheritance +{ + [self assert:nil equals:parentClass.ivar]; + [self assert:nil equals:childClass.ivar]; + [self assert:nil equals:grandChildClass.ivar]; + + parentClass.ivar = 1; + childClass.ivar = 2; + grandChildClass.ivar = 3; + + [self assert:1 equals:parentClass.ivar]; + [self assert:2 equals:childClass.ivar]; + [self assert:3 equals:grandChildClass.ivar]; +} + +- (void)testIvarIndependence +{ + parentClass.ivar = 1; + [self assert:1 equals:parentClass.ivar]; + [self assert:nil equals:childClass.ivar]; + [self assert:nil equals:grandChildClass.ivar]; + + childClass.ivar = 2; + [self assert:1 equals:parentClass.ivar]; + [self assert:2 equals:childClass.ivar]; + [self assert:nil equals:grandChildClass.ivar]; + + grandChildClass.ivar = 3; + [self assert:1 equals:parentClass.ivar]; + [self assert:2 equals:childClass.ivar]; + [self assert:3 equals:grandChildClass.ivar]; +} + +- (void)testMethodInheritance +{ + [self assertThrows:function() + { + [parentClass setIvar:5]; + }]; + [childClass setIvar:5]; + [grandChildClass setIvar:10]; + [self assert:nil equals:parentClass.ivar]; + [self assert:5 equals:childClass.ivar]; + [self assert:10 equals:grandChildClass.ivar]; +} + +- (void)testSuper +{ + [self assert:@"ParentClass" equals:[parentClass classNameString]]; + [self assert:@"ParentClass" equals:[childClass parentClassNameString]]; + [self assert:@"ParentClass" equals:[grandChildClass grandParentClassNameString]]; +} + +@end + + diff --git a/Tests/Objective-J/Preprocessor/BehaviorTests/IvarTest.j b/Tests/Objective-J/Preprocessor/BehaviorTests/IvarTest.j new file mode 100644 index 000000000..d0c38aad9 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/BehaviorTests/IvarTest.j @@ -0,0 +1,117 @@ +@import + +@implementation IvarTestClass : CPObject +{ + id ivar1 @accessors; + var ivar2 @accessors(readonly); + CPNumber ivar3; +} + +- (void)setIvar1UsingEval:(id)value +{ + eval(@"var ivar1 = " + value); +} + +- (void)doNothingToIvar1UsingEval:(id)value +{ + (function() + { + eval(@"var ivar1 = " + value); + })(); +} + +- (void)setIvar1DespiteAWithStatement:(id)value +{ + with({}) + { + ivar1 = value; + } +} + +- (void)doNothingToIvar1BecauseOfWithStatement:(id)value +{ + with({'ivar1':null}) + { + ivar1 = value; + } +} + +- (void)setIvar1UsingAShadowingLocalVariable:(id)ivar1 +{ + self.ivar1 = ivar1; +} + +@end + +@implementation IvarTest : OJTestCase +{ + IvarTestClass testClass; +} + +- (void)setUp +{ + testClass = [[IvarTestClass alloc] init]; +} + +- (void)testDirectAccess +{ + [self assert:nil equals:testClass.ivar1]; + testClass.ivar1 = 5; + [self assert:5 equals:testClass.ivar1]; +} + +- (void)testWithStatementInMethod +{ + [self assert:nil equals:testClass.ivar1]; + [testClass setIvar1DespiteAWithStatement:5]; + [self assert:5 equals:testClass.ivar1]; + [testClass doNothingToIvar1BecauseOfWithStatement:10]; + [self assert:5 equals:testClass.ivar1]; +} + +- (void)testEvalInMethod +{ + [self assert:nil equals:testClass.ivar1]; + [testClass setIvar1UsingEval:5]; + [self assert:5 equals:testClass.ivar1]; + [testClass doNothingToIvar1UsingEval:10]; + [self assert:5 equals:testClass.ivar1]; +} + +- (void)testIvarShadowing +{ + [self assert:nil equals:testClass.ivar1]; + [testClass setIvar1UsingAShadowingLocalVariable:5]; + [self assert:5 equals:testClass.ivar1]; +} + +- (void)testAccessorGeneration +{ + [self assert:nil equals:[testClass ivar1]]; + [testClass setIvar1:10]; + [self assert:10 equals:[testClass ivar1]]; + [self assert:10 equals:testClass.ivar1]; + + [self assert:nil equals:[testClass ivar2]]; + testClass.ivar2 = 5; + [self assert:5 equals:[testClass ivar2]]; + [self assert:5 equals:testClass.ivar2]; + [self assertThrows:function() + { + [testClass setIvar2:6]; + }]; + [self assert:5 equals:[testClass ivar2]]; + + [self assert:nil equals:testClass.ivar3]; + [self assertThrows:function() + { + [testClass ivar3]; + }]; + [self assertThrows:function() + { + [testClass setIvar3:20]; + }]; + [self assert:nil equals:testClass.ivar3]; +} + +@end diff --git a/Tests/Objective-J/Preprocessor/BehaviorTests/MethodTest.j b/Tests/Objective-J/Preprocessor/BehaviorTests/MethodTest.j new file mode 100644 index 000000000..0a4d74e69 --- /dev/null +++ b/Tests/Objective-J/Preprocessor/BehaviorTests/MethodTest.j @@ -0,0 +1,65 @@ +@import + +@implementation MathClass : CPObject +{ +} + +- (CPNumber)five +{ + return 5; +} + +- (CPNumber)sqrt:(CPNumber)operand +{ + return Math.sqrt(operand); +} + +- (CPNumber)multiply:(CPNumber)firstOperand with:(CPNumber)secondOperand +{ + return firstOperand * secondOperand; +} + +- (CPNumber)multiply:(CPNumber)operand, ... +{ + var product; + + for (var i = 0, ii = arguments.length; i < ii; ++i) + product = product ? product * arguments[i] : arguments[i]; + + return product; +} + +@end + +@implementation MethodTest : OJTestCase +{ + MathClass testClass; +} + +- (void)setUp +{ + testClass = [[MathClass alloc] init]; +} + +- (void)testNoParameters +{ + [self assert:5 equals:[testClass five]]; +} + +- (void)testOneParameter +{ + [self assert:2 equals:[testClass sqrt:4]]; +} + +- (void)testTwoParameters +{ + [self assert:6 equals:[testClass multiply:2 with:3]]; +} + +- (void)testVarArgs +{ + [self assert:30 equals:[testClass multiply:2,3,5]]; + [self assert:2310 equals:[testClass multiply:2,3,5,7,11]]; +} + +@end