add behavior tests for methods, ivars, and inheritance; currently, one of the ivar tests fails due to bug #498

This commit is contained in:
Paul Baumgart
2010-09-24 15:10:06 -07:00
parent 0802b80c35
commit 8cc61cccfd
3 changed files with 313 additions and 0 deletions
@@ -0,0 +1,131 @@
@import <Foundation/Foundation.j>
@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
@@ -0,0 +1,117 @@
@import <Foundation/Foundation.j>
@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
@@ -0,0 +1,65 @@
@import <Foundation/Foundation.j>
@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