darling-objc4/test/load.m
2020-06-09 21:50:17 -04:00

100 lines
2.0 KiB
Objective-C

// TEST_CONFIG
#include "test.h"
#include "testroot.i"
int state = 0;
int catstate = 0;
int deallocstate = 0;
@interface Deallocator : TestRoot @end
@implementation Deallocator
-(void)dealloc {
deallocstate = 1;
SUPER_DEALLOC();
}
@end
@interface Super : TestRoot @end
@implementation Super
+(void)initialize {
if (self == [Super class]) {
testprintf("in +[Super initialize]\n");
testassert(state == 2);
state = 3;
} else {
testprintf("in +[Super initialize] on behalf of Sub\n");
testassert(state == 3);
state = 4;
}
}
-(void)load { fail("-[Super load] called!"); }
+(void)load {
testprintf("in +[Super load]\n");
testassert(state == 0);
state = 1;
}
@end
@interface Sub : Super { } @end
@implementation Sub
+(void)load {
testprintf("in +[Sub load]\n");
testassert(state == 1);
state = 2;
}
-(void)load { fail("-[Sub load] called!"); }
@end
@interface SubNoLoad : Super { } @end
@implementation SubNoLoad @end
@interface Super (Category) @end
@implementation Super (Category)
-(void)load { fail("-[Super(Category) load called!"); }
+(void)load {
testprintf("in +[Super(Category) load]\n");
testassert(state >= 1);
catstate++;
}
@end
@interface Sub (Category) @end
@implementation Sub (Category)
-(void)load { fail("-[Sub(Category) load called!"); }
+(void)load {
testprintf("in +[Sub(Category) load]\n");
testassert(state >= 2);
catstate++;
// test autorelease pool
__autoreleasing id x;
x = AUTORELEASE([Deallocator new]);
}
@end
@interface SubNoLoad (Category) @end
@implementation SubNoLoad (Category)
-(void)load { fail("-[SubNoLoad(Category) load called!"); }
+(void)load {
testprintf("in +[SubNoLoad(Category) load]\n");
testassert(state >= 1);
catstate++;
}
@end
int main()
{
testassert(state == 2);
testassert(catstate == 3);
testassert(deallocstate == 1);
[Sub class];
testassert(state == 4);
testassert(catstate == 3);
succeed(__FILE__);
}