mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-08-25 04:57:03 +00:00
add behavior tests for methods, ivars, and inheritance; currently, one of the ivar tests fails due to bug #498
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user