mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-23 00:41:02 +00:00
Merge b1d96dd2d2
into 9c6bd9ed97
This commit is contained in:
commit
c83f27c822
4 changed files with 240 additions and 0 deletions
0
Tests/base/GSFFIInvocation/TestInfo
Normal file
0
Tests/base/GSFFIInvocation/TestInfo
Normal file
117
Tests/base/GSFFIInvocation/basic.m
Normal file
117
Tests/base/GSFFIInvocation/basic.m
Normal file
|
@ -0,0 +1,117 @@
|
|||
#import <Foundation/Foundation.h>
|
||||
#import "Testing.h"
|
||||
#import "ObjectTesting.h"
|
||||
|
||||
@protocol NSMenuItem <NSObject>
|
||||
- (NSString*) keyEquivalent;
|
||||
- (void) setKeyEquivalent: (NSString*)aKeyEquivalent;
|
||||
@end
|
||||
|
||||
@interface NSMenuItem : NSObject <NSMenuItem>
|
||||
{
|
||||
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;
|
||||
}
|
68
Tests/base/GSFFIInvocation/forwardInvocation.m
Normal file
68
Tests/base/GSFFIInvocation/forwardInvocation.m
Normal file
|
@ -0,0 +1,68 @@
|
|||
#import <Foundation/Foundation.h>
|
||||
#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;
|
||||
}
|
55
Tests/base/GSFFIInvocation/forwardingTargetForSelector.m
Normal file
55
Tests/base/GSFFIInvocation/forwardingTargetForSelector.m
Normal file
|
@ -0,0 +1,55 @@
|
|||
#import <Foundation/Foundation.h>
|
||||
#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;
|
||||
}
|
Loading…
Reference in a new issue