// 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 <XCTest/XCTest.h>
#import "EchoMessenger.h"
#import "MockBinaryMessenger.h"
#import "nullable_returns.gen.h"

///////////////////////////////////////////////////////////////////////////////////////////
@interface MockNullableArgHostApi : NSObject <NRNullableArgHostApi>
@property(nonatomic, assign) BOOL didCall;
@property(nonatomic, copy) NSNumber *x;
@end

///////////////////////////////////////////////////////////////////////////////////////////
@implementation MockNullableArgHostApi
- (nullable NSNumber *)doitX:(NSNumber *_Nullable)x
                       error:(FlutterError *_Nullable __autoreleasing *_Nonnull)error {
  _didCall = YES;
  self.x = x;
  return x;
}

@end

///////////////////////////////////////////////////////////////////////////////////////////
@interface NullableReturnsTest : XCTestCase
@end

///////////////////////////////////////////////////////////////////////////////////////////
@implementation NullableReturnsTest

- (void)testNullableParameterWithFlutterApi {
  EchoBinaryMessenger *binaryMessenger =
      [[EchoBinaryMessenger alloc] initWithCodec:NRNullableArgHostApiGetCodec()];
  NRNullableArgFlutterApi *api =
      [[NRNullableArgFlutterApi alloc] initWithBinaryMessenger:binaryMessenger];
  XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
  [api doitX:nil
      completion:^(NSNumber *_Nonnull result, NSError *_Nullable error) {
        XCTAssertNil(result);
        [expectation fulfill];
      }];
  [self waitForExpectations:@[ expectation ] timeout:1.0];
}

- (void)testNullableParameterWithHostApi {
  MockNullableArgHostApi *api = [[MockNullableArgHostApi alloc] init];
  MockBinaryMessenger *binaryMessenger =
      [[MockBinaryMessenger alloc] initWithCodec:NRNullableArgHostApiGetCodec()];
  NSString *channel = @"dev.flutter.pigeon.NullableArgHostApi.doit";
  NRNullableArgHostApiSetup(binaryMessenger, api);
  XCTAssertNotNil(binaryMessenger.handlers[channel]);
  XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
  NSData *arguments = [NRNullableArgHostApiGetCodec() encode:@[ [NSNull null] ]];
  binaryMessenger.handlers[channel](arguments, ^(NSData *data) {
    [expectation fulfill];
  });
  XCTAssertTrue(api.didCall);
  XCTAssertNil(api.x);
  [self waitForExpectations:@[ expectation ] timeout:1.0];
}

@end
