// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterPlatformViewController.h"

#import "flutter/shell/platform/darwin/common/framework/Headers/FlutterChannels.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/TestFlutterPlatformView.h"

#include "flutter/testing/testing.h"

namespace flutter::testing {

TEST(FlutterPlatformViewController, TestCreatePlatformViewNoMatchingViewType) {
  // Use id so we can access handleMethodCall method.
  id platformViewController = [[FlutterPlatformViewController alloc] init];

  FlutterMethodCall* methodCall =
      [FlutterMethodCall methodCallWithMethodName:@"create"
                                        arguments:@{
                                          @"id" : @2,
                                          @"viewType" : @"FlutterPlatformViewMock"
                                        }];

  __block bool errored = false;
  FlutterResult result = ^(id result) {
    if ([result isKindOfClass:[FlutterError class]]) {
      errored = true;
    }
  };

  [platformViewController handleMethodCall:methodCall result:result];

  // We expect the call to error since no factories are registered.
  EXPECT_TRUE(errored);
}

TEST(FlutterPlatformViewController, TestRegisterPlatformViewFactoryAndCreate) {
  // Use id so we can access handleMethodCall method.
  id platformViewController = [[FlutterPlatformViewController alloc] init];

  TestFlutterPlatformViewFactory* factory = [TestFlutterPlatformViewFactory alloc];

  [platformViewController registerViewFactory:factory withId:@"MockPlatformView"];

  NSDictionary* creationArgs = @{
    @"album" : @"スコットとリバース",
    @"releaseYear" : @2013,
    @"artists" : @[ @"Scott Murphy", @"Rivers Cuomo" ],
    @"playlist" : @[ @"おかしいやつ", @"ほどけていたんだ" ],
  };
  NSObject<FlutterMessageCodec>* codec = [factory createArgsCodec];
  FlutterStandardTypedData* creationArgsData =
      [FlutterStandardTypedData typedDataWithBytes:[codec encode:creationArgs]];

  FlutterMethodCall* methodCall =
      [FlutterMethodCall methodCallWithMethodName:@"create"
                                        arguments:@{
                                          @"id" : @2,
                                          @"viewType" : @"MockPlatformView",
                                          @"params" : creationArgsData,
                                        }];

  __block bool success = false;
  FlutterResult result = ^(id result) {
    // If a platform view is successfully created, the result is nil.
    if (result == nil) {
      success = true;
    }
  };
  [platformViewController handleMethodCall:methodCall result:result];
  EXPECT_TRUE(success);

  // Verify PlatformView parameters are decoded correctly.
  TestFlutterPlatformView* view =
      (TestFlutterPlatformView*)[platformViewController platformViewWithID:2];
  ASSERT_TRUE(view != nil);
  ASSERT_TRUE(view.args != nil);

  // Verify string type.
  NSString* album = [view.args objectForKey:@"album"];
  EXPECT_TRUE([album isEqualToString:@"スコットとリバース"]);

  // Verify int type.
  NSNumber* releaseYear = [view.args objectForKey:@"releaseYear"];
  EXPECT_EQ(releaseYear.intValue, 2013);

  // Verify list/array types.
  NSArray* artists = [view.args objectForKey:@"artists"];
  ASSERT_TRUE(artists != nil);
  ASSERT_EQ(artists.count, 2ul);
  EXPECT_TRUE([artists[0] isEqualToString:@"Scott Murphy"]);
  EXPECT_TRUE([artists[1] isEqualToString:@"Rivers Cuomo"]);

  NSArray* playlist = [view.args objectForKey:@"playlist"];
  ASSERT_EQ(playlist.count, 2ul);
  EXPECT_TRUE([playlist[0] isEqualToString:@"おかしいやつ"]);
  EXPECT_TRUE([playlist[1] isEqualToString:@"ほどけていたんだ"]);
}

TEST(FlutterPlatformViewController, TestCreateAndDispose) {
  // Use id so we can access handleMethodCall method.
  id platformViewController = [[FlutterPlatformViewController alloc] init];

  TestFlutterPlatformViewFactory* factory = [TestFlutterPlatformViewFactory alloc];

  [platformViewController registerViewFactory:factory withId:@"MockPlatformView"];

  FlutterMethodCall* methodCallOnCreate =
      [FlutterMethodCall methodCallWithMethodName:@"create"
                                        arguments:@{
                                          @"id" : @2,
                                          @"viewType" : @"MockPlatformView"
                                        }];

  __block bool created = false;
  FlutterResult resultOnCreate = ^(id result) {
    // If a platform view is successfully created, the result is nil.
    if (result == nil) {
      created = true;
    }
  };

  [platformViewController handleMethodCall:methodCallOnCreate result:resultOnCreate];

  FlutterMethodCall* methodCallOnDispose =
      [FlutterMethodCall methodCallWithMethodName:@"dispose"
                                        arguments:[NSNumber numberWithLongLong:2]];

  __block bool disposed = false;
  FlutterResult resultOnDispose = ^(id result) {
    // If a platform view is successfully created, the result is nil.
    if (result == nil) {
      disposed = true;
    }
  };

  [platformViewController handleMethodCall:methodCallOnDispose result:resultOnDispose];

  EXPECT_TRUE(created);
  EXPECT_TRUE(disposed);
}

TEST(FlutterPlatformViewController, TestDisposeOnMissingViewId) {
  // Use id so we can access handleMethodCall method.
  id platformViewController = [[FlutterPlatformViewController alloc] init];

  FlutterMethodCall* methodCall =
      [FlutterMethodCall methodCallWithMethodName:@"dispose"
                                        arguments:[NSNumber numberWithLongLong:20]];

  __block bool errored = false;
  FlutterResult result = ^(id result) {
    if ([result isKindOfClass:[FlutterError class]]) {
      errored = true;
    }
  };

  [platformViewController handleMethodCall:methodCall result:result];

  EXPECT_TRUE(errored);
}

TEST(FlutterPlatformViewController, TestAcceptGesture) {
  FlutterPlatformViewController* platformViewController =
      [[FlutterPlatformViewController alloc] init];
  [platformViewController registerViewFactory:[TestFlutterPlatformViewFactory alloc]
                                       withId:@"MockPlatformView"];

  // Create the PlatformView.
  const NSNumber* viewId = [NSNumber numberWithLongLong:2];
  FlutterMethodCall* methodCallOnCreate = [FlutterMethodCall
      methodCallWithMethodName:@"create"
                     arguments:@{@"id" : viewId, @"viewType" : @"MockPlatformView"}];
  __block bool created = false;
  FlutterResult resultOnCreate = ^(id result) {
    // If a platform view is successfully created, the result is nil.
    if (result == nil) {
      created = true;
    }
  };
  [platformViewController handleMethodCall:methodCallOnCreate result:resultOnCreate];

  // Call acceptGesture.
  FlutterMethodCall* methodCallAcceptGesture =
      [FlutterMethodCall methodCallWithMethodName:@"acceptGesture" arguments:@{@"id" : viewId}];
  __block bool acceptGestureCalled = false;
  FlutterResult resultAcceptGesture = ^(id result) {
    // If a acceptGesture is successful, the result is nil.
    if (result == nil) {
      acceptGestureCalled = true;
    }
  };
  [platformViewController handleMethodCall:methodCallAcceptGesture result:resultAcceptGesture];

  EXPECT_TRUE(created);
  EXPECT_TRUE(acceptGestureCalled);
}

TEST(FlutterPlatformViewController, TestAcceptGestureOnMissingViewId) {
  FlutterPlatformViewController* platformViewController =
      [[FlutterPlatformViewController alloc] init];
  [platformViewController registerViewFactory:[TestFlutterPlatformViewFactory alloc]
                                       withId:@"MockPlatformView"];

  // Call rejectGesture.
  FlutterMethodCall* methodCallAcceptGesture =
      [FlutterMethodCall methodCallWithMethodName:@"acceptGesture" arguments:@{
        @"id" : @20
      }];
  __block bool errored = false;
  FlutterResult result = ^(id result) {
    if ([result isKindOfClass:[FlutterError class]]) {
      errored = true;
    }
  };
  [platformViewController handleMethodCall:methodCallAcceptGesture result:result];

  EXPECT_TRUE(errored);
}

TEST(FlutterPlatformViewController, TestRejectGesture) {
  FlutterPlatformViewController* platformViewController =
      [[FlutterPlatformViewController alloc] init];
  [platformViewController registerViewFactory:[TestFlutterPlatformViewFactory alloc]
                                       withId:@"MockPlatformView"];

  // Create the PlatformView.
  const NSNumber* viewId = [NSNumber numberWithLongLong:2];
  FlutterMethodCall* methodCallOnCreate = [FlutterMethodCall
      methodCallWithMethodName:@"create"
                     arguments:@{@"id" : viewId, @"viewType" : @"MockPlatformView"}];
  __block bool created = false;
  FlutterResult resultOnCreate = ^(id result) {
    // If a platform view is successfully created, the result is nil.
    if (result == nil) {
      created = true;
    }
  };
  [platformViewController handleMethodCall:methodCallOnCreate result:resultOnCreate];

  // Call rejectGesture.
  FlutterMethodCall* methodCallRejectGesture =
      [FlutterMethodCall methodCallWithMethodName:@"rejectGesture" arguments:@{@"id" : viewId}];
  __block bool rejectGestureCalled = false;
  FlutterResult resultRejectGesture = ^(id result) {
    // If a rejectGesture is successful, the result is nil.
    if (result == nil) {
      rejectGestureCalled = true;
    }
  };
  [platformViewController handleMethodCall:methodCallRejectGesture result:resultRejectGesture];

  EXPECT_TRUE(created);
  EXPECT_TRUE(rejectGestureCalled);
}

TEST(FlutterPlatformViewController, TestRejectGestureOnMissingViewId) {
  FlutterPlatformViewController* platformViewController =
      [[FlutterPlatformViewController alloc] init];
  [platformViewController registerViewFactory:[TestFlutterPlatformViewFactory alloc]
                                       withId:@"MockPlatformView"];

  // Call rejectGesture.
  FlutterMethodCall* methodCallRejectGesture =
      [FlutterMethodCall methodCallWithMethodName:@"rejectGesture" arguments:@{
        @"id" : @20
      }];
  __block bool errored = false;
  FlutterResult result = ^(id result) {
    if ([result isKindOfClass:[FlutterError class]]) {
      errored = true;
    }
  };
  [platformViewController handleMethodCall:methodCallRejectGesture result:result];

  EXPECT_TRUE(errored);
}

}  // namespace flutter::testing
