diff --git a/Tests/base/GSFFIInvocation/TestInfo b/Tests/base/GSFFIInvocation/TestInfo new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Tests/base/GSFFIInvocation/basic.m b/Tests/base/GSFFIInvocation/basic.m new file mode 100644 index 0000000000..701628bd70 --- /dev/null +++ b/Tests/base/GSFFIInvocation/basic.m @@ -0,0 +1,117 @@ +#import +#import "Testing.h" +#import "ObjectTesting.h" + +@protocol NSMenuItem +- (NSString*) keyEquivalent; +- (void) setKeyEquivalent: (NSString*)aKeyEquivalent; +@end + +@interface NSMenuItem : NSObject +{ + NSString *_keyEquivalent; +} +@end + +@implementation NSMenuItem +- (void) setKeyEquivalent: (NSString*)aKeyEquivalent +{ + ASSIGNCOPY(_keyEquivalent, aKeyEquivalent); +} + +- (NSString*) keyEquivalent +{ + return _keyEquivalent; +} +@end + +@interface GSFakeNSMenuItem : NSObject +{ + NSMenuItem* _originalItem; +} + +- (id) initWithItem: (NSMenuItem*)item; +- (NSMenuItem*) originalItem; +- (id) target; +- (SEL)action; +- (void) action: (id)sender; +@end + +@implementation GSFakeNSMenuItem +- (id) initWithItem: (NSMenuItem*)item +{ + self = [super init]; + if (self) + { + _originalItem = item; + } + return self; +} + +- (NSMenuItem*) originalItem +{ + return _originalItem; +} + +- (id)target +{ + return self; +} + +- (SEL)action +{ + return @selector(action:); +} + +- (id)forwardingTargetForSelector:(SEL)selector +{ + if ([_originalItem respondsToSelector:selector]) + return _originalItem; + return nil; +} + +- (void)forwardInvocation:(NSInvocation *)invocation +{ + SEL selector = [invocation selector]; + + // Forward any invocation to the original item if it supports it... + if ([_originalItem respondsToSelector:selector]) + [invocation invokeWithTarget:_originalItem]; + else + [super forwardInvocation:invocation]; +} + +-(NSMethodSignature*)methodSignatureForSelector:(SEL)selector +{ + NSMethodSignature *signature = [[_originalItem class] instanceMethodSignatureForSelector:selector]; + if(signature == nil) + { + signature = [NSMethodSignature signatureWithObjCTypes:"@^v^c"]; + } + return(signature); +} + +- (void)doesNotRecognizeSelector:(SEL)selector +{ + NSLog(@"%s:selector not recognized: %@", __PRETTY_FUNCTION__, NSStringFromSelector(selector)); +} +@end + +int main(int argc,char **argv) +{ + START_SET("GSFFIInvocation") + + NSMenuItem *item = [NSMenuItem alloc]; + [item setKeyEquivalent:@"Hello, World!"]; + + GSFakeNSMenuItem *fakeItem = [[GSFakeNSMenuItem alloc] initWithItem:item]; + + NSString *itemKeyEquivalent = [item keyEquivalent]; + NSString *fakeItemKeyEquivalent = [fakeItem keyEquivalent]; + + PASS_EQUAL(itemKeyEquivalent, fakeItemKeyEquivalent, "keyEquivalent selector is forwarded from the fake item to the actual item"); + NSLog(@"Item key equivalent: %@, fake item key equivalent: %@", itemKeyEquivalent, fakeItemKeyEquivalent); + + END_SET("GSFFIInvocation") + return 0; +} diff --git a/Tests/base/GSFFIInvocation/forwardInvocation.m b/Tests/base/GSFFIInvocation/forwardInvocation.m new file mode 100644 index 0000000000..3d2390f419 --- /dev/null +++ b/Tests/base/GSFFIInvocation/forwardInvocation.m @@ -0,0 +1,68 @@ +#import +#import "Testing.h" +#import "ObjectTesting.h" + +@interface GSFakeNSString : NSObject +{ + NSString* _originalItem; +} + +- (id) initWithItem: (NSString*)item; +- (NSString*) originalItem; +@end + +@implementation GSFakeNSString +- (id) initWithItem: (NSString*)item +{ + self = [super init]; + if (self) + { + _originalItem = item; + } + return self; +} + +- (NSString*) originalItem +{ + return _originalItem; +} + +- (void)forwardInvocation:(NSInvocation *)invocation +{ + SEL selector = [invocation selector]; + + // Forward any invocation to the original item if it supports it... + if ([_originalItem respondsToSelector:selector]) + [invocation invokeWithTarget:_originalItem]; + else + [super forwardInvocation:invocation]; +} + +-(NSMethodSignature*)methodSignatureForSelector:(SEL)selector +{ + NSMethodSignature *signature = [[_originalItem class] instanceMethodSignatureForSelector:selector]; + if(signature == nil) + { + signature = [NSMethodSignature signatureWithObjCTypes:"@^v^c"]; + } + return(signature); +} +@end + +int main(int argc,char **argv) +{ + START_SET("GSFFIInvocation") + + NSString *string = @"Hello, World!"; + + GSFakeNSString *fakeString = [[GSFakeNSString alloc] initWithItem:string]; + + NSString *upperCaseString = [string uppercaseString]; + NSString *fakeUpperCaseString = [fakeString uppercaseString]; + + NSLog(@"Upper case string: %@, fake upper case string: %@", upperCaseString, fakeUpperCaseString); + PASS_EQUAL(upperCaseString, fakeUpperCaseString, "uppercaseString selector is forwarded from the fake string to the actual NSString object"); + + END_SET("GSFFIInvocation") + return 0; +} diff --git a/Tests/base/GSFFIInvocation/forwardingTargetForSelector.m b/Tests/base/GSFFIInvocation/forwardingTargetForSelector.m new file mode 100644 index 0000000000..f76acf51a4 --- /dev/null +++ b/Tests/base/GSFFIInvocation/forwardingTargetForSelector.m @@ -0,0 +1,55 @@ +#import +#import "Testing.h" +#import "ObjectTesting.h" + +@interface GSFakeNSString : NSObject +{ + NSString* _originalItem; +} + +- (id) initWithItem: (NSString*)item; +- (NSString*) originalItem; +@end + +@implementation GSFakeNSString +- (id) initWithItem: (NSString*)item +{ + self = [super init]; + if (self) + { + _originalItem = item; + } + return self; +} + +- (NSString*) originalItem +{ + return _originalItem; +} + +- (id)forwardingTargetForSelector:(SEL)selector +{ + if ([_originalItem respondsToSelector:selector]) + return _originalItem; + return nil; +} + +@end + +int main(int argc,char **argv) +{ + START_SET("GSFFIInvocation") + + NSString *string = @"Hello, World!"; + + GSFakeNSString *fakeString = [[GSFakeNSString alloc] initWithItem:string]; + + NSString *upperCaseString = [string uppercaseString]; + NSString *fakeUpperCaseString = [fakeString uppercaseString]; + + NSLog(@"Upper case string: %@, fake upper case string: %@", upperCaseString, fakeUpperCaseString); + PASS_EQUAL(upperCaseString, fakeUpperCaseString, "uppercaseString selector is forwarded from the fake string to the actual NSString object"); + + END_SET("GSFFIInvocation") + return 0; +}