//
//  RCTModuleMethodTests.m
//  UIExplorer
//
//  Created by Nick Lockwood on 28/07/2015.
//  Copyright (c) 2015 Facebook. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <XCTest/XCTest.h>

#import "RCTModuleMethod.h"

@interface RCTModuleMethodTests : XCTestCase

@end

@implementation RCTModuleMethodTests

extern void RCTParseObjCMethodName(NSString **objCMethodName, NSArray **argTypes);

- (void)testOneArgument
{
  NSArray *argTypes;
  NSString *methodName = @"foo:(NSInteger)foo";
  RCTParseObjCMethodName(&methodName, &argTypes);
  XCTAssertEqualObjects(methodName, @"foo:");
  XCTAssertEqual(argTypes.count, (NSUInteger)1);
  XCTAssertEqualObjects(argTypes[0], @"NSInteger");
}

- (void)testTwoArguments
{
  NSArray *argTypes;
  NSString *methodName = @"foo:(NSInteger)foo bar:(BOOL)bar";
  RCTParseObjCMethodName(&methodName, &argTypes);
  XCTAssertEqualObjects(methodName, @"foo:bar:");
  XCTAssertEqual(argTypes.count, (NSUInteger)2);
  XCTAssertEqualObjects(argTypes[0], @"NSInteger");
  XCTAssertEqualObjects(argTypes[1], @"BOOL");
}

- (void)testSpaces
{
  NSArray *argTypes;
  NSString *methodName = @"foo : (NSInteger)foo bar : (BOOL) bar";
  RCTParseObjCMethodName(&methodName, &argTypes);
  XCTAssertEqualObjects(methodName, @"foo:bar:");
  XCTAssertEqual(argTypes.count, (NSUInteger)2);
  XCTAssertEqualObjects(argTypes[0], @"NSInteger");
  XCTAssertEqualObjects(argTypes[1], @"BOOL");
}

- (void)testNewlines
{
  NSArray *argTypes;
  NSString *methodName = @"foo : (NSInteger)foo\nbar : (BOOL) bar";
  RCTParseObjCMethodName(&methodName, &argTypes);
  XCTAssertEqualObjects(methodName, @"foo:bar:");
  XCTAssertEqual(argTypes.count, (NSUInteger)2);
  XCTAssertEqualObjects(argTypes[0], @"NSInteger");
  XCTAssertEqualObjects(argTypes[1], @"BOOL");
}

- (void)testUnnamedArgs
{
  NSArray *argTypes;
  NSString *methodName = @"foo:(NSInteger)foo:(BOOL)bar";
  RCTParseObjCMethodName(&methodName, &argTypes);
  XCTAssertEqualObjects(methodName, @"foo::");
  XCTAssertEqual(argTypes.count, (NSUInteger)2);
  XCTAssertEqualObjects(argTypes[0], @"NSInteger");
  XCTAssertEqualObjects(argTypes[1], @"BOOL");
}

- (void)testUntypedUnnamedArgs
{
  NSArray *argTypes;
  NSString *methodName = @"foo:foo:bar:bar";
  RCTParseObjCMethodName(&methodName, &argTypes);
  XCTAssertEqualObjects(methodName, @"foo:::");
  XCTAssertEqual(argTypes.count, (NSUInteger)3);
  XCTAssertEqualObjects(argTypes[0], @"id");
  XCTAssertEqualObjects(argTypes[1], @"id");
  XCTAssertEqualObjects(argTypes[2], @"id");
}

- (void)testAttributes
{
  NSArray *argTypes;
  NSString *methodName = @"foo:(__attribute__((nonnull)) NSString *)foo bar:(__unused BOOL)bar";
  RCTParseObjCMethodName(&methodName, &argTypes);
  XCTAssertEqualObjects(methodName, @"foo:bar:");
  XCTAssertEqual(argTypes.count, (NSUInteger)2);
  XCTAssertEqualObjects(argTypes[0], @"NSString");
  XCTAssertEqualObjects(argTypes[1], @"BOOL");
}

- (void)testSemicolonStripping
{
  NSArray *argTypes;
  NSString *methodName = @"foo:(NSString *)foo bar:(BOOL)bar;";
  RCTParseObjCMethodName(&methodName, &argTypes);
  XCTAssertEqualObjects(methodName, @"foo:bar:");
  XCTAssertEqual(argTypes.count, (NSUInteger)2);
  XCTAssertEqualObjects(argTypes[0], @"NSString");
  XCTAssertEqualObjects(argTypes[1], @"BOOL");
}

@end