Add test for checking whether a class supports fast ARC.

main
David Chisnall 6 years ago
parent 2d87ac45a1
commit 5a35fff19d

@ -26,6 +26,7 @@ set(TESTS
ConstantString.m
Category.m
ExceptionTest.m
FastARC.m
Forward.m
ManyManySelectors.m
NestedExceptions.m

@ -0,0 +1,104 @@
#include "Test.h"
#include <stdio.h>
static BOOL called;
@interface AllUnsafe : Test @end
@implementation AllUnsafe
- (id)retain
{
return self;
}
- (void)release {}
- (id)autorelease
{
return self;
}
@end
@interface Retain : AllUnsafe @end
@implementation Retain
- (id)retain
{
called = YES;
return self;
}
@end
@interface RetainSafe : AllUnsafe @end
@implementation RetainSafe
- (id)retain
{
return self;
}
- (void)_ARCCompliantRetainRelease {}
@end
@interface Release : AllUnsafe @end
@implementation Release
- (void)release
{
called = YES;
}
@end
@interface ReleaseSafe : AllUnsafe @end
@implementation ReleaseSafe
- (void)release
{
}
- (void)_ARCCompliantRetainRelease {}
@end
@interface Autorelease : AllUnsafe @end
@implementation Autorelease
- (id)autorelease
{
called = YES;
return self;
}
@end
@interface AutoreleaseSafe : AllUnsafe @end
@implementation AutoreleaseSafe
- (id)autorelease
{
return self;
}
- (void)_ARCCompliantRetainRelease {}
@end
void check(id obj, BOOL expected)
{
fprintf(stderr, "Checking %s\n", class_getName(object_getClass(obj)));
}
int main()
{
called = NO;
objc_retain([Retain new]);
assert(called == YES);
called = NO;
objc_retain([RetainSafe new]);
assert(called == NO);
called = NO;
objc_release([Release new]);
assert(called == YES);
called = NO;
objc_release([ReleaseSafe new]);
assert(called == NO);
called = NO;
objc_autorelease([Autorelease new]);
assert(called == YES);
called = NO;
objc_autorelease([AutoreleaseSafe new]);
assert(called == NO);
return 0;
}
Loading…
Cancel
Save