This commit is contained in:
Frederik Carlier 2025-03-11 13:41:45 -06:00 committed by GitHub
commit c83f27c822
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 240 additions and 0 deletions

View file

View 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;
}

View 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;
}

View 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;
}