File: test01.m

package info (click to toggle)
gnustep-base 1.31.1-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 26,580 kB
  • sloc: objc: 239,446; ansic: 36,519; cpp: 122; sh: 112; makefile: 100; xml: 32
file content (105 lines) | stat: -rw-r--r-- 3,790 bytes parent folder | download | duplicates (2)
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;
}