From 44627f69e70ba088913fc7bd1a57d3f56881cb8f Mon Sep 17 00:00:00 2001 From: Niels Grewe Date: Sun, 6 Sep 2015 21:39:24 +0200 Subject: [PATCH] Also fix method_getArgumentType(). Add test case. --- Test/MethodArguments.m | 91 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 Test/MethodArguments.m diff --git a/Test/MethodArguments.m b/Test/MethodArguments.m new file mode 100644 index 0000000..30dac38 --- /dev/null +++ b/Test/MethodArguments.m @@ -0,0 +1,91 @@ +#import "Test.h" +#include +#include +#include +#include + +#ifdef __has_attribute +#if __has_attribute(objc_root_class) +__attribute__((objc_root_class)) +#endif +#endif +@interface Foo +-(id)bar; +-(void)setBar:(id)b; +@end +@implementation Foo +- (id)bar +{ + return nil; +} + +- (void)setBar: (id)b +{ + return; +} +@end + +int main(void) +{ + Class foo = objc_getClass("Foo"); + Method barMethod = class_getInstanceMethod(foo, @selector(bar)); + Method setBarMethod = class_getInstanceMethod(foo,@selector(setBar:)); + char arg[16]; + + memset(&arg[0], '\0', 16 * sizeof(char)); + method_getReturnType(barMethod, &arg[0], 16); + assert(0 == strcmp(&arg[0],"@")); + + char* expected[3] = {"@", ":", "" }; + for (int i = 0; i < 3; i++) + { + memset(&arg[0], '\0', 16 * sizeof(char)); + method_getArgumentType(barMethod, i, &arg[0], 16); + assert(0 == strcmp(&arg[0],expected[i])); + } + + + memset(&arg[0], '\0', 16 * sizeof(char)); + method_getReturnType(setBarMethod, &arg[0], 16); + assert(0 == strcmp(&arg[0],"v")); + + expected[2] = "@"; + + for (int i = 0; i < 3; i++) + { + memset(&arg[0], '\0', 16 * sizeof(char)); + method_getArgumentType(setBarMethod, i, &arg[0], 16); + assert(0 == strcmp(&arg[0],expected[i])); + } + + char *arg_copied = method_copyReturnType(barMethod); + assert(0 == strcmp(arg_copied,"@")); + free(arg_copied); + arg_copied = NULL; + + for (int i = 0; i < 2; i++) + { + arg_copied = method_copyArgumentType(barMethod, i); + assert(0 == strcmp(arg_copied,expected[i])); + free(arg_copied); + } + + arg_copied = method_copyArgumentType(barMethod, 2); + assert(NULL == arg_copied); + + + + arg_copied = method_copyReturnType(setBarMethod); + assert(0 == strcmp(arg_copied,"v")); + free(arg_copied); + + for (int i = 0; i < 3; i++) + { + arg_copied = method_copyArgumentType(setBarMethod, i); + assert(0 == strcmp(arg_copied,expected[i])); + free(arg_copied); + } + + + return 0; +}