@@ -19,13 +19,15 @@ #if !defined(__STDC_NO_COMPLEX__) && defined(HAVE_COMPLEX_H) # include #endif -#import "TestsAppDelegate.h" +#import "ObjFW.h" +#import "ObjFWTest.h" -static OFString *const module = @"OFMethodSignature"; +@interface OFMethodSignatureTests: OTTestCase +@end struct Test1Struct { char c; int i; char d; @@ -67,115 +69,106 @@ float f; double d; } u; }; -@implementation TestsAppDelegate (OFMethodSignatureTests) -- (void)methodSignatureTests -{ - void *pool = objc_autoreleasePoolPush(); - OFMethodSignature *methodSignature; - - TEST(@"-[signatureWithObjCTypes:] #1", - (methodSignature = [OFMethodSignature signatureWithObjCTypes: - "i28@0:8S16*20"]) && - methodSignature.numberOfArguments == 4 && - strcmp(methodSignature.methodReturnType, "i") == 0 && - strcmp([methodSignature argumentTypeAtIndex: 0], "@") == 0 && - strcmp([methodSignature argumentTypeAtIndex: 1], ":") == 0 && - strcmp([methodSignature argumentTypeAtIndex: 2], "S") == 0 && - strcmp([methodSignature argumentTypeAtIndex: 3], "*") == 0 && - methodSignature.frameLength == 28 && - [methodSignature argumentOffsetAtIndex: 0] == 0 && - [methodSignature argumentOffsetAtIndex: 1] == 8 && - [methodSignature argumentOffsetAtIndex: 2] == 16 && - [methodSignature argumentOffsetAtIndex: 3] == 20) - - TEST(@"-[signatureWithObjCTypes:] #2", - (methodSignature = [OFMethodSignature signatureWithObjCTypes: - "{s0=csi(u1={s2=iii{s3=(u4=ic^v*)}})}24@0:8" - "^{s0=csi(u1={s2=iii{s3=(u4=ic^v*)}})}16"]) && - methodSignature.numberOfArguments == 3 && - strcmp(methodSignature.methodReturnType, - "{s0=csi(u1={s2=iii{s3=(u4=ic^v*)}})}") == 0 && - strcmp([methodSignature argumentTypeAtIndex: 0], "@") == 0 && - strcmp([methodSignature argumentTypeAtIndex: 1], ":") == 0 && - strcmp([methodSignature argumentTypeAtIndex: 2], - "^{s0=csi(u1={s2=iii{s3=(u4=ic^v*)}})}") == 0 && - methodSignature.frameLength == 24 && - [methodSignature argumentOffsetAtIndex: 0] == 0 && - [methodSignature argumentOffsetAtIndex: 1] == 8 && - [methodSignature 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(@"OFSizeOfTypeEncoding() #1", - OFSizeOfTypeEncoding(@encode(struct Test1Struct)) == - sizeof(struct Test1Struct)) - - TEST(@"OFSizeOfTypeEncoding() #2", - OFSizeOfTypeEncoding(@encode(struct Test2Struct)) == - sizeof(struct Test2Struct)) - -#if !defined(__STDC_NO_COMPLEX__) && defined(HAVE_COMPLEX_H) && \ - OF_GCC_VERSION >= 402 - TEST(@"OFSizeOfTypeEncoding() #3", - OFSizeOfTypeEncoding(@encode(struct Test3Struct)) == - sizeof(struct Test3Struct)) -#endif - - TEST(@"OFSizeOfTypeEncoding() #4", - OFSizeOfTypeEncoding(@encode(union Test3Union)) == - sizeof(union Test3Union)) - - TEST(@"OFSizeOfTypeEncoding() #5", - OFSizeOfTypeEncoding(@encode(union Test4Union)) == - sizeof(union Test4Union)) - - TEST(@"OFSizeOfTypeEncoding() #6", - OFSizeOfTypeEncoding(@encode(struct Test1Struct [5])) == - sizeof(struct Test1Struct [5])) - - TEST(@"OFAlignmentOfTypeEncoding() #1", - OFAlignmentOfTypeEncoding(@encode(struct Test1Struct)) == - OF_ALIGNOF(struct Test1Struct)) - - TEST(@"OFAlignmentOfTypeEncoding() #2", - OFAlignmentOfTypeEncoding(@encode(struct Test2Struct)) == - OF_ALIGNOF(struct Test2Struct)) - -#if !defined(__STDC_NO_COMPLEX__) && defined(HAVE_COMPLEX_H) && \ - OF_GCC_VERSION >= 402 - TEST(@"OFAlignmentOfTypeEncoding() #3", - OFAlignmentOfTypeEncoding(@encode(struct Test3Struct)) == - OF_ALIGNOF(struct Test3Struct)) -#endif - - TEST(@"OFAlignmentOfTypeEncoding() #4", - OFAlignmentOfTypeEncoding(@encode(union Test3Union)) == - OF_ALIGNOF(union Test3Union)) - - TEST(@"OFAlignmentOfTypeEncoding() #5", - OFAlignmentOfTypeEncoding(@encode(union Test4Union)) == - OF_ALIGNOF(union Test4Union)) - - TEST(@"OFAlignmentOfTypeEncoding() #6", - OFAlignmentOfTypeEncoding(@encode(struct Test1Struct [5])) == - OF_ALIGNOF(struct Test1Struct [5])) - - objc_autoreleasePoolPop(pool); +@implementation OFMethodSignatureTests +- (void)testSignatureWithObjCTypes +{ + OFMethodSignature *methodSignature; + + methodSignature = + [OFMethodSignature signatureWithObjCTypes: "i28@0:8S16*20"]; + OTAssertEqual(methodSignature.numberOfArguments, 4); + OTAssertEqual(strcmp(methodSignature.methodReturnType, "i"), 0); + OTAssertEqual(strcmp([methodSignature argumentTypeAtIndex: 0], "@"), 0); + OTAssertEqual(strcmp([methodSignature argumentTypeAtIndex: 1], ":"), 0); + OTAssertEqual(strcmp([methodSignature argumentTypeAtIndex: 2], "S"), 0); + OTAssertEqual(strcmp([methodSignature argumentTypeAtIndex: 3], "*"), 0); + OTAssertEqual(methodSignature.frameLength, 28); + OTAssertEqual([methodSignature argumentOffsetAtIndex: 0], 0); + OTAssertEqual([methodSignature argumentOffsetAtIndex: 1], 8); + OTAssertEqual([methodSignature argumentOffsetAtIndex: 2], 16); + OTAssertEqual([methodSignature argumentOffsetAtIndex: 3], 20); + + methodSignature = [OFMethodSignature signatureWithObjCTypes: + "{s0=csi(u1={s2=iii{s3=(u4=ic^v*)}})}24@0:8" + "^{s0=csi(u1={s2=iii{s3=(u4=ic^v*)}})}16"]; + OTAssertEqual(methodSignature.numberOfArguments, 3); + OTAssertEqual(strcmp(methodSignature.methodReturnType, + "{s0=csi(u1={s2=iii{s3=(u4=ic^v*)}})}"), 0); + OTAssertEqual(strcmp([methodSignature argumentTypeAtIndex: 0], "@"), 0); + OTAssertEqual(strcmp([methodSignature argumentTypeAtIndex: 1], ":"), 0); + OTAssertEqual(strcmp([methodSignature argumentTypeAtIndex: 2], + "^{s0=csi(u1={s2=iii{s3=(u4=ic^v*)}})}"), 0); + OTAssertEqual(methodSignature.frameLength, 24); + OTAssertEqual([methodSignature argumentOffsetAtIndex: 0], 0); + OTAssertEqual([methodSignature argumentOffsetAtIndex: 1], 8); + OTAssertEqual([methodSignature argumentOffsetAtIndex: 2], 16); +} + +- (void)testSignatureWithObjCTypesFailsWithInvalidFormat +{ + OTAssertThrowsSpecific( + [OFMethodSignature signatureWithObjCTypes: "{ii"], + OFInvalidFormatException); + + OTAssertThrowsSpecific([OFMethodSignature signatureWithObjCTypes: ""], + OFInvalidFormatException); + + OTAssertThrowsSpecific([OFMethodSignature signatureWithObjCTypes: "0"], + OFInvalidFormatException); + + OTAssertThrowsSpecific( + [OFMethodSignature signatureWithObjCTypes: "{{}0"], + OFInvalidFormatException); +} + +- (void)testSizeOfTypeEncoding +{ + OTAssertEqual(OFSizeOfTypeEncoding(@encode(struct Test1Struct)), + sizeof(struct Test1Struct)); + + OTAssertEqual(OFSizeOfTypeEncoding(@encode(struct Test2Struct)), + sizeof(struct Test2Struct)); + +#if !defined(__STDC_NO_COMPLEX__) && defined(HAVE_COMPLEX_H) && \ + OF_GCC_VERSION >= 402 + OTAssertEqual(OFSizeOfTypeEncoding(@encode(struct Test3Struct)), + sizeof(struct Test3Struct)); +#endif + + OTAssertEqual(OFSizeOfTypeEncoding(@encode(union Test3Union)), + sizeof(union Test3Union)); + + OTAssertEqual(OFSizeOfTypeEncoding(@encode(union Test4Union)), + sizeof(union Test4Union)); + + OTAssertEqual(OFSizeOfTypeEncoding(@encode(struct Test1Struct [5])), + sizeof(struct Test1Struct [5])); +} + +- (void)testAlignmentOfTypeEncoding +{ + OTAssertEqual(OFAlignmentOfTypeEncoding(@encode(struct Test1Struct)), + OF_ALIGNOF(struct Test1Struct)); + + OTAssertEqual(OFAlignmentOfTypeEncoding(@encode(struct Test2Struct)), + OF_ALIGNOF(struct Test2Struct)); + +#if !defined(__STDC_NO_COMPLEX__) && defined(HAVE_COMPLEX_H) && \ + OF_GCC_VERSION >= 402 + OTAssertEqual(OFAlignmentOfTypeEncoding(@encode(struct Test3Struct)), + OF_ALIGNOF(struct Test3Struct)); +#endif + + OTAssertEqual(OFAlignmentOfTypeEncoding(@encode(union Test3Union)), + OF_ALIGNOF(union Test3Union)); + + OTAssertEqual(OFAlignmentOfTypeEncoding(@encode(union Test4Union)), + OF_ALIGNOF(union Test4Union)); + + OTAssertEqual( + OFAlignmentOfTypeEncoding(@encode(struct Test1Struct [5])), + OF_ALIGNOF(struct Test1Struct [5])); } @end