1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
#import "Testing.h"
#import "ObjectTesting.h"
#import "InvokeProxyProtocol.h"
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSBundle.h>
#import <Foundation/NSException.h>
#import <Foundation/NSFileManager.h>
#import <Foundation/NSGarbageCollector.h>
#import <Foundation/NSInvocation.h>
#import <Foundation/NSMethodSignature.h>
#import <Foundation/NSProxy.h>
int main()
{
NSAutoreleasePool *arp = [NSAutoreleasePool new];
NSInvocation *inv = nil;
NSObject <InvokeTarget>*tar;
NSMethodSignature *sig;
id ret;
Class tClass = Nil;
NSString *bundlePath;
NSBundle *bundle;
int retc;
bundlePath = [[[NSFileManager defaultManager]
currentDirectoryPath]
stringByAppendingPathComponent:@"Resources"];
bundlePath = [[NSBundle bundleWithPath:bundlePath]
pathForResource:@"InvokeProxy"
ofType:@"bundle"];
bundle = [NSBundle bundleWithPath:bundlePath];
PASS([bundle load],
"loading resources from bundle");
tClass = NSClassFromString(@"InvokeTarget");
tar = AUTORELEASE([tClass new]);
/*
Test if the return value is retained. It is in the Apple OpenStep edition
for Windows (YellowBox)
matt: this doesn't seem like a valid test as PASS/fail will vary on
platforms
*/
sig = [tar methodSignatureForSelector:@selector(retObject)];
inv = [NSInvocation invocationWithMethodSignature: sig];
retc = [[tar retObject] retainCount];
[inv setSelector:@selector(retObject)];
[inv invokeWithTarget:tar];
if (nil == [NSGarbageCollector defaultCollector])
{
PASS(retc + 1 == [[tar retObject] retainCount],
"Retain return value")
}
sig = [tar methodSignatureForSelector:@selector(loopObject:)];
inv = [NSInvocation invocationWithMethodSignature: sig];
retc = [tar retainCount];
[inv setSelector:@selector(loopObject:)];
[inv invokeWithTarget:tar];
[inv retainArguments];
[inv setArgument:&tar atIndex:2];
if (nil == [NSGarbageCollector defaultCollector])
{
PASS(retc + 1 == [tar retainCount],
"Will Retain arguments after -retainArguments")
}
sig = [tar methodSignatureForSelector:@selector(loopObject:)];
inv = [NSInvocation invocationWithMethodSignature: sig];
retc = [tar retainCount];
[inv setSelector:@selector(loopObject:)];
[inv invokeWithTarget:tar];
[inv setArgument:&tar atIndex:2];
PASS(retc == [tar retainCount],
"default will not retain arguments");
sig = [tar methodSignatureForSelector:@selector(retObject)];
inv = [NSInvocation invocationWithMethodSignature: sig];
[inv setSelector:@selector(retObject)];
[inv invokeWithTarget:nil];
[inv getReturnValue:&ret];
PASS(ret == nil,"Check if nil target works");
sig = [tar methodSignatureForSelector:@selector(returnIdButThrowException)];
inv = [NSInvocation invocationWithMethodSignature: sig];
[inv setSelector:@selector(returnIdButThrowException)];
PASS_EXCEPTION([inv invokeWithTarget:tar];,@"AnException","Exception in invocation #1");
PASS_EXCEPTION([inv getReturnValue:&ret];,NSGenericException,"Exception getting return value #1");
/* same as above but with a successful call first */
sig = [tar methodSignatureForSelector:@selector(returnIdButThrowException)];
inv = [NSInvocation invocationWithMethodSignature: sig];
[inv setSelector:@selector(retObject)];
[inv invokeWithTarget:tar]; /* these two lines */
[inv getReturnValue:&ret];
[inv setSelector:@selector(returnIdButThrowException)];
PASS_EXCEPTION([inv invokeWithTarget:tar];,@"AnException","Exception in invocation #2");
PASS_EXCEPTION([inv getReturnValue:&ret];,NSGenericException,"Exception getting return value #2");
[arp release]; arp = nil;
return 0;
}
|