Index: tests/ForwardingTests.m ================================================================== --- tests/ForwardingTests.m +++ tests/ForwardingTests.m @@ -13,26 +13,41 @@ * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" + +#include #import "OFString.h" #import "OFAutoreleasePool.h" + +#import "macros.h" #import "TestsAppDelegate.h" static OFString *module = @"Forwarding"; static size_t forwardings = 0; static bool success = false; +static id target = nil; + +struct stret_test { + char s[27]; +}; @interface ForwardingTest: OFObject @end @interface ForwardingTest (Test) + (void)test; - (void)test; +- (OFString*)forwardingTargetTest: (OFConstantString*)fmt, ...; +- (long double)forwardingTargetFPRetTest; +- (struct stret_test)forwardingTargetStRetTest; +@end + +@interface ForwardingTarget: OFObject @end static void test(id self, SEL _cmd) { @@ -65,10 +80,55 @@ return true; } return false; } + +- (id)forwardingTargetForSelector: (SEL)selector +{ + if (sel_isEqual(selector, @selector(forwardingTargetTest:)) || + sel_isEqual(selector, @selector(forwardingTargetFPRetTest)) || + sel_isEqual(selector, @selector(forwardingTargetStRetTest))) + return target; + + return nil; +} +@end + +@implementation ForwardingTarget +- (OFString*)forwardingTargetTest: (OFConstantString*)fmt, ... +{ + va_list args; + OFString *ret; + + OF_ENSURE(self == target); + + va_start(args, fmt); + ret = [[[OFString alloc] initWithFormat: fmt + arguments: args] autorelease]; + va_end(args); + + return ret; +} + +- (long double)forwardingTargetFPRetTest +{ + OF_ENSURE(self == target); + + return 12345678.00006103515625; +} + +- (struct stret_test)forwardingTargetStRetTest +{ + struct stret_test ret; + + OF_ENSURE(self == target); + + memcpy(ret.s, "abcdefghijklmnopqrstuvwxyz", 27); + + return ret; +} @end @implementation TestsAppDelegate (ForwardingTests) - (void)forwardingTests { @@ -83,9 +143,24 @@ success = false; forwardings = 0; TEST(@"Forwarding a message and adding an instance method", R([t test]) && success && R([t test]) && forwardings == 1); + +#ifdef OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR + target = [[[ForwardingTarget alloc] init] autorelease]; + TEST(@"-[forwardingTargetForSelector:]", + [([t forwardingTargetTest: @"%@ %@ %@ %@ %@ %@ %@ %@ %@", @"1", @"2", + @"3", @"4", @"5", @"6", @"7", @"8", @"9"]) + isEqual: @"1 2 3 4 5 6 7 8 9"]) + TEST(@"-[forwardingTargetForSelector:] with fp return", + [t forwardingTargetFPRetTest] == 12345678.00006103515625) +# ifdef OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR_STRET + TEST(@"-[forwardingTargetForSelector:] with struct return", + !memcmp([t forwardingTargetStRetTest].s, + "abcdefghijklmnopqrstuvwxyz", 27)) +# endif +#endif [pool drain]; } @end