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

///////////////////////////////////////////////////////////////////////////////////////////
@interface AllDatatypesTest : XCTestCase
@end

///////////////////////////////////////////////////////////////////////////////////////////
@implementation AllDatatypesTest

- (void)testAllNull {
  Everything *everything = [[Everything alloc] init];
  EchoBinaryMessenger *binaryMessenger =
      [[EchoBinaryMessenger alloc] initWithCodec:FlutterEverythingGetCodec()];
  FlutterEverything *api = [[FlutterEverything alloc] initWithBinaryMessenger:binaryMessenger];
  XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
  [api echoEverything:everything
           completion:^(Everything *_Nonnull result, NSError *_Nullable error) {
             XCTAssertNil(result.aBool);
             XCTAssertNil(result.anInt);
             XCTAssertNil(result.aDouble);
             XCTAssertNil(result.aString);
             XCTAssertNil(result.aByteArray);
             XCTAssertNil(result.a4ByteArray);
             XCTAssertNil(result.a8ByteArray);
             XCTAssertNil(result.aFloatArray);
             XCTAssertNil(result.aList);
             XCTAssertNil(result.aMap);
             [expectation fulfill];
           }];
  [self waitForExpectations:@[ expectation ] timeout:1.0];
}

- (void)testAllEquals {
  Everything *everything = [[Everything alloc] init];
  everything.aBool = @NO;
  everything.anInt = @(1);
  everything.aDouble = @(2.0);
  everything.aString = @"123";
  everything.aByteArray = [FlutterStandardTypedData
      typedDataWithBytes:[@"1234" dataUsingEncoding:NSUTF8StringEncoding]];
  everything.a4ByteArray = [FlutterStandardTypedData
      typedDataWithInt32:[@"1234" dataUsingEncoding:NSUTF8StringEncoding]];
  everything.a8ByteArray = [FlutterStandardTypedData
      typedDataWithInt64:[@"12345678" dataUsingEncoding:NSUTF8StringEncoding]];
  everything.aFloatArray = [FlutterStandardTypedData
      typedDataWithFloat64:[@"12345678" dataUsingEncoding:NSUTF8StringEncoding]];
  everything.aList = @[ @(1), @(2) ];
  everything.aMap = @{@"hello" : @(1234)};
  everything.mapWithObject = @{@"hello" : @(1234), @"goodbye" : @"world"};
  EchoBinaryMessenger *binaryMessenger =
      [[EchoBinaryMessenger alloc] initWithCodec:FlutterEverythingGetCodec()];
  FlutterEverything *api = [[FlutterEverything alloc] initWithBinaryMessenger:binaryMessenger];
  XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
  [api echoEverything:everything
           completion:^(Everything *_Nonnull result, NSError *_Nullable error) {
             XCTAssertEqual(result.aBool, everything.aBool);
             XCTAssertEqual(result.anInt, everything.anInt);
             XCTAssertEqual(result.aDouble, everything.aDouble);
             XCTAssertEqualObjects(result.aString, everything.aString);
             XCTAssertEqualObjects(result.aByteArray.data, everything.aByteArray.data);
             XCTAssertEqualObjects(result.a4ByteArray.data, everything.a4ByteArray.data);
             XCTAssertEqualObjects(result.a8ByteArray.data, everything.a8ByteArray.data);
             XCTAssertEqualObjects(result.aFloatArray.data, everything.aFloatArray.data);
             XCTAssertEqualObjects(result.aList, everything.aList);
             XCTAssertEqualObjects(result.aMap, everything.aMap);
             XCTAssertEqualObjects(result.mapWithObject, everything.mapWithObject);
             [expectation fulfill];
           }];
  [self waitForExpectations:@[ expectation ] timeout:1.0];
}

@end
