/*
 *  Copyright (c) 2013-2015 Erik Doernenburg and contributors
 *
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 *  not use these files except in compliance with the License. You may obtain
 *  a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 *  License for the specific language governing permissions and limitations
 *  under the License.
 */

#import <XCTest/XCTest.h>
#import "NSMethodSignature+OCMAdditions.h"

#if TARGET_OS_IPHONE
#define NSPoint CGPoint
#define NSSize  CGSize
#define NSRect  CGRect
#endif

@interface NSMethodSignatureOCMAdditionsTests : XCTestCase

@end

@implementation NSMethodSignatureOCMAdditionsTests

- (void)testDeterminesThatSpecialReturnIsNotNeededForNonStruct
{
    const char *types = "i";
   	NSMethodSignature *sig = [NSMethodSignature signatureWithObjCTypes:types];
    XCTAssertFalse([sig usesSpecialStructureReturn], @"Should have determined no need for special (stret) return.");
}

- (void)testDeterminesThatSpecialReturnIsNeededForLargeStruct
{
    // This type should(!) require special returns for all architectures
    const char *types = "{CATransform3D=ffffffffffffffff}";
   	NSMethodSignature *sig = [NSMethodSignature signatureWithObjCTypes:types];
    XCTAssertTrue([sig usesSpecialStructureReturn], @"Should have determined need for special (stret) return.");
}

- (void)testArchDependentSpecialReturns
{
#define ASSERT_ENC(expected, enctype) do {\
   BOOL useSpecial = expected; \
   XCTAssertNoThrow(useSpecial = [[NSMethodSignature signatureWithObjCTypes:enctype] usesSpecialStructureReturn], \
                  @"NSMethodSignature failed for type '%s'", enctype); \
   XCTAssertEqual((int)useSpecial, (int)expected,\
                  @"Special (stret) return incorrect for type '%s'", enctype); \
 } while (0)
#define ASSERT_TYPE(expected, type) ASSERT_ENC(expected, @encode(type))
    
#if __x86_64__
    ASSERT_TYPE(YES,NSRect);
    ASSERT_TYPE(NO, NSPoint);
    ASSERT_TYPE(NO, NSRange);
    ASSERT_ENC(NO, "{foo=ffff}");
    ASSERT_ENC(YES,"{foo=fffff}");
    ASSERT_ENC(YES,"{foo=D}");
    ASSERT_ENC(NO, "{foo=t}");
    ASSERT_ENC(YES,"{foo=TT}");
    ASSERT_TYPE(NO, __int128_t);
    ASSERT_TYPE(NO, long double);
    ASSERT_ENC(YES,"{nlist_64=(?=I)CCSQ}16@0:8");
#endif
#if __i386__
    ASSERT_TYPE(YES,NSRect);
    ASSERT_TYPE(NO, NSPoint);
    ASSERT_TYPE(NO, NSRange);
    ASSERT_TYPE(NO, long double);
    ASSERT_ENC(NO, "{foo=ff}");
    ASSERT_ENC(YES,"{foo=fff}");
    ASSERT_ENC(NO, "{foo=c}");
    ASSERT_ENC(NO, "{foo=cc}");
    ASSERT_ENC(YES,"{foo=ccc}");
    ASSERT_ENC(NO, "{foo=cccc}");
    ASSERT_ENC(YES,"{foo=cccccc}");
    ASSERT_ENC(NO, "{foo=cccccccc}");
    ASSERT_ENC(YES,"{foo=D}");
#endif
#if __arm__
    ASSERT_TYPE(YES, NSRect);
    ASSERT_TYPE(YES, NSPoint);
    ASSERT_TYPE(YES, NSRange);
    ASSERT_ENC(NO, "{foo=f}");
    ASSERT_ENC(YES,"{foo=ff}");
    ASSERT_ENC(NO, "{foo=c}");
    ASSERT_ENC(NO, "{foo=cc}");
    ASSERT_ENC(NO, "{foo=ccc}");
    ASSERT_ENC(NO, "{foo=cccc}");
    ASSERT_ENC(YES,"{foo=ccccc}");
#endif
}

- (void)testNSMethodSignatureDebugDescriptionWorksTheWayWeExpectIt
{
	const char *types = "{CATransform3D=ffffffffffffffff}";
	NSMethodSignature *sig = [NSMethodSignature signatureWithObjCTypes:types];
	NSString *debugDescription = [sig debugDescription];
	NSRange stretYESRange = [debugDescription rangeOfString:@"is special struct return? YES"];
	NSRange stretNORange = [debugDescription rangeOfString:@"is special struct return? NO"];
	XCTAssertTrue(stretYESRange.length > 0 || stretNORange.length > 0, @"NSMethodSignature debugDescription has changed; need to change OCPartialMockObject impl");
}


@end
