/* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #include <string.h> #if !defined(__STDC_NO_COMPLEX__) && defined(HAVE_COMPLEX_H) # include <complex.h> #endif #import "OFMethodSignature.h" #import "OFAutoreleasePool.h" #import "OFInvalidFormatException.h" #import "TestsAppDelegate.h" static OFString *module = @"OFMethodSignature"; struct test1_struct { char c; int i; char d; }; struct test2_struct { char c; struct { short s; int i; } st; union { char c; int i; } u; double d; }; #if !defined(__STDC_NO_COMPLEX__) && defined(HAVE_COMPLEX_H) struct test3_struct { char c; complex double cd; }; #endif union test3_union { char c; int i; double d; }; union test4_union { char c; struct { short x, y; } st; int i; union { float f; double d; } u; }; @implementation TestsAppDelegate (OFMethodSignatureTests) - (void)methodSignatureTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFMethodSignature *ms; TEST(@"-[:signatureWithObjCTypes:] #1", (ms = [OFMethodSignature signatureWithObjCTypes: "i28@0:8S16*20"]) && [ms numberOfArguments] == 4 && strcmp([ms methodReturnType], "i") == 0 && strcmp([ms argumentTypeAtIndex: 0], "@") == 0 && strcmp([ms argumentTypeAtIndex: 1], ":") == 0 && strcmp([ms argumentTypeAtIndex: 2], "S") == 0 && strcmp([ms argumentTypeAtIndex: 3], "*") == 0 && [ms frameLength] == 28 && [ms argumentOffsetAtIndex: 0] == 0 && [ms argumentOffsetAtIndex: 1] == 8 && [ms argumentOffsetAtIndex: 2] == 16 && [ms argumentOffsetAtIndex: 3] == 20) TEST(@"-[signatureWithObjCTypes:] #2", (ms = [OFMethodSignature signatureWithObjCTypes: "{s0=csi(u1={s2=iii{s3=(u4=ic^v*)}})}24@0:8" "^{s0=csi(u1={s2=iii{s3=(u4=ic^v*)}})}16"]) && [ms numberOfArguments] == 3 && strcmp([ms methodReturnType], "{s0=csi(u1={s2=iii{s3=(u4=ic^v*)}})}") == 0 && strcmp([ms argumentTypeAtIndex: 0], "@") == 0 && strcmp([ms argumentTypeAtIndex: 1], ":") == 0 && strcmp([ms argumentTypeAtIndex: 2], "^{s0=csi(u1={s2=iii{s3=(u4=ic^v*)}})}") == 0 && [ms frameLength] == 24 && [ms argumentOffsetAtIndex: 0] == 0 && [ms argumentOffsetAtIndex: 1] == 8 && [ms argumentOffsetAtIndex: 2] == 16) EXPECT_EXCEPTION(@"-[signatureWithObjCTypes:] #3", OFInvalidFormatException, [OFMethodSignature signatureWithObjCTypes: "{ii"]) EXPECT_EXCEPTION(@"-[signatureWithObjCTypes:] #4", OFInvalidFormatException, [OFMethodSignature signatureWithObjCTypes: ""]) EXPECT_EXCEPTION(@"-[signatureWithObjCTypes:] #5", OFInvalidFormatException, [OFMethodSignature signatureWithObjCTypes: "0"]) EXPECT_EXCEPTION(@"-[signatureWithObjCTypes:] #6", OFInvalidFormatException, [OFMethodSignature signatureWithObjCTypes: "{{}0"]) TEST(@"of_sizeof_type_encoding() #1", of_sizeof_type_encoding(@encode(struct test1_struct)) == sizeof(struct test1_struct)) TEST(@"of_sizeof_type_encoding() #2", of_sizeof_type_encoding(@encode(struct test2_struct)) == sizeof(struct test2_struct)) #if !defined(__STDC_NO_COMPLEX__) && defined(HAVE_COMPLEX_H) TEST(@"of_sizeof_type_encoding() #3", of_sizeof_type_encoding(@encode(struct test3_struct)) == sizeof(struct test3_struct)) #endif TEST(@"of_sizeof_type_encoding() #4", of_sizeof_type_encoding(@encode(union test3_union)) == sizeof(union test3_union)) TEST(@"of_sizeof_type_encoding() #5", of_sizeof_type_encoding(@encode(union test4_union)) == sizeof(union test4_union)) TEST(@"of_sizeof_type_encoding() #6", of_sizeof_type_encoding(@encode(struct test1_struct [5])) == sizeof(struct test1_struct [5])) TEST(@"of_alignof_type_encoding() #1", of_alignof_type_encoding(@encode(struct test1_struct)) == OF_ALIGNOF(struct test1_struct)) TEST(@"of_alignof_type_encoding() #2", of_alignof_type_encoding(@encode(struct test2_struct)) == OF_ALIGNOF(struct test2_struct)) #if !defined(__STDC_NO_COMPLEX__) && defined(HAVE_COMPLEX_H) TEST(@"of_alignof_type_encoding() #3", of_alignof_type_encoding(@encode(struct test3_struct)) == OF_ALIGNOF(struct test3_struct)) #endif TEST(@"of_alignof_type_encoding() #4", of_alignof_type_encoding(@encode(union test3_union)) == OF_ALIGNOF(union test3_union)) TEST(@"of_alignof_type_encoding() #5", of_alignof_type_encoding(@encode(union test4_union)) == OF_ALIGNOF(union test4_union)) TEST(@"of_alignof_type_encoding() #6", of_alignof_type_encoding(@encode(struct test1_struct [5])) == OF_ALIGNOF(struct test1_struct [5])) [pool drain]; } @end