// 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
