diff --git a/packages/pigeon/pigeons/enum.dart b/packages/pigeon/pigeons/enum.dart new file mode 100644 index 0000000000..570b68ed2a --- /dev/null +++ b/packages/pigeon/pigeons/enum.dart @@ -0,0 +1,25 @@ +// 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 'package:pigeon/pigeon.dart'; + +enum State { + Pending, + Success, + Error, +} + +class Data { + State? state; +} + +@HostApi() +abstract class EnumApi2Host { + Data echo(Data data); +} + +@FlutterApi() +abstract class EnumApi2Flutter { + Data echo(Data data); +} diff --git a/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner.xcodeproj/project.pbxproj b/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner.xcodeproj/project.pbxproj index 54e38d2b12..3b3edc8fda 100644 --- a/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner.xcodeproj/project.pbxproj @@ -11,9 +11,11 @@ 0D50127523FF75B100CD5B95 /* RunnerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D50127423FF75B100CD5B95 /* RunnerTests.m */; }; 0D8C35E825D45A3000B76435 /* async_handlers.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D8C35E725D45A3000B76435 /* async_handlers.m */; }; 0D8C35EB25D45A7900B76435 /* AsyncHandlersTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D8C35EA25D45A7900B76435 /* AsyncHandlersTest.m */; }; + 0DD2E690266FDB7000A7D764 /* enum.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DD2E68F266FDB7000A7D764 /* enum.m */; }; 0DF4E5C3266ECF0400AEA855 /* all_datatypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF4E5C2266ECF0400AEA855 /* all_datatypes.m */; }; 0DF4E5C5266ECF4A00AEA855 /* AllDatatypesTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF4E5C4266ECF4A00AEA855 /* AllDatatypesTest.m */; }; 0DF4E5C8266ED80900AEA855 /* EchoMessenger.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF4E5C7266ED80900AEA855 /* EchoMessenger.m */; }; + 0DF4E5CB266FDAE300AEA855 /* EnumTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DF4E5CA266FDAE300AEA855 /* EnumTest.m */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; @@ -55,11 +57,14 @@ 0D8C35E625D45A3000B76435 /* async_handlers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = async_handlers.h; sourceTree = ""; }; 0D8C35E725D45A3000B76435 /* async_handlers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = async_handlers.m; sourceTree = ""; }; 0D8C35EA25D45A7900B76435 /* AsyncHandlersTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AsyncHandlersTest.m; sourceTree = ""; }; + 0DD2E68E266FDB7000A7D764 /* enum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enum.h; sourceTree = ""; }; + 0DD2E68F266FDB7000A7D764 /* enum.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = enum.m; sourceTree = ""; }; 0DF4E5C1266ECF0400AEA855 /* all_datatypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = all_datatypes.h; sourceTree = ""; }; 0DF4E5C2266ECF0400AEA855 /* all_datatypes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = all_datatypes.m; sourceTree = ""; }; 0DF4E5C4266ECF4A00AEA855 /* AllDatatypesTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AllDatatypesTest.m; sourceTree = ""; }; 0DF4E5C6266ED80900AEA855 /* EchoMessenger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EchoMessenger.h; sourceTree = ""; }; 0DF4E5C7266ED80900AEA855 /* EchoMessenger.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EchoMessenger.m; sourceTree = ""; }; + 0DF4E5CA266FDAE300AEA855 /* EnumTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EnumTest.m; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; @@ -103,6 +108,7 @@ 0DF4E5C4266ECF4A00AEA855 /* AllDatatypesTest.m */, 0DF4E5C6266ED80900AEA855 /* EchoMessenger.h */, 0DF4E5C7266ED80900AEA855 /* EchoMessenger.m */, + 0DF4E5CA266FDAE300AEA855 /* EnumTest.m */, ); path = RunnerTests; sourceTree = ""; @@ -140,6 +146,8 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 0DD2E68E266FDB7000A7D764 /* enum.h */, + 0DD2E68F266FDB7000A7D764 /* enum.m */, 0DF4E5C1266ECF0400AEA855 /* all_datatypes.h */, 0DF4E5C2266ECF0400AEA855 /* all_datatypes.m */, 0D8C35E625D45A3000B76435 /* async_handlers.h */, @@ -306,6 +314,7 @@ 0D50127523FF75B100CD5B95 /* RunnerTests.m in Sources */, 0DF4E5C5266ECF4A00AEA855 /* AllDatatypesTest.m in Sources */, 0DF4E5C8266ED80900AEA855 /* EchoMessenger.m in Sources */, + 0DF4E5CB266FDAE300AEA855 /* EnumTest.m in Sources */, 0D8C35EB25D45A7900B76435 /* AsyncHandlersTest.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -319,6 +328,7 @@ 97C146F31CF9000F007C117D /* main.m in Sources */, 0DF4E5C3266ECF0400AEA855 /* all_datatypes.m in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + 0DD2E690266FDB7000A7D764 /* enum.m in Sources */, 0D8C35E825D45A3000B76435 /* async_handlers.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner/enum.h b/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner/enum.h new file mode 100644 index 0000000000..f7c7f18c28 --- /dev/null +++ b/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner/enum.h @@ -0,0 +1,37 @@ +// 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. + +// Autogenerated from Pigeon (v0.2.1), do not edit directly. +// See also: https://pub.dev/packages/pigeon +#import +@protocol FlutterBinaryMessenger; +@class FlutterError; +@class FlutterStandardTypedData; + +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSUInteger, ACState) { + ACStatePending = 0, + ACStateSuccess = 1, + ACStateError = 2, +}; + +@class ACData; + +@interface ACData : NSObject +@property(nonatomic, assign) ACState state; +@end + +@protocol ACEnumApi2Host +- (nullable ACData *)echo:(ACData *)input error:(FlutterError *_Nullable *_Nonnull)error; +@end + +extern void ACEnumApi2HostSetup(id binaryMessenger, + id _Nullable api); + +@interface ACEnumApi2Flutter : NSObject +- (instancetype)initWithBinaryMessenger:(id)binaryMessenger; +- (void)echo:(ACData *)input completion:(void (^)(ACData *, NSError *_Nullable))completion; +@end +NS_ASSUME_NONNULL_END diff --git a/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner/enum.m b/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner/enum.m new file mode 100644 index 0000000000..e34dc08960 --- /dev/null +++ b/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner/enum.m @@ -0,0 +1,87 @@ +// 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. + +// Autogenerated from Pigeon (v0.2.1), do not edit directly. +// See also: https://pub.dev/packages/pigeon +#import "enum.h" +#import + +#if !__has_feature(objc_arc) +#error File requires ARC to be enabled. +#endif + +static NSDictionary *wrapResult(NSDictionary *result, FlutterError *error) { + NSDictionary *errorDict = (NSDictionary *)[NSNull null]; + if (error) { + errorDict = @{ + @"code" : (error.code ? error.code : [NSNull null]), + @"message" : (error.message ? error.message : [NSNull null]), + @"details" : (error.details ? error.details : [NSNull null]), + }; + } + return @{ + @"result" : (result ? result : [NSNull null]), + @"error" : errorDict, + }; +} + +@interface ACData () ++ (ACData *)fromMap:(NSDictionary *)dict; +- (NSDictionary *)toMap; +@end + +@implementation ACData ++ (ACData *)fromMap:(NSDictionary *)dict { + ACData *result = [[ACData alloc] init]; + result.state = [dict[@"state"] integerValue]; + return result; +} +- (NSDictionary *)toMap { + return [NSDictionary dictionaryWithObjectsAndKeys:@(self.state), @"state", nil]; +} +@end + +void ACEnumApi2HostSetup(id binaryMessenger, id api) { + { + FlutterBasicMessageChannel *channel = + [FlutterBasicMessageChannel messageChannelWithName:@"dev.flutter.pigeon.EnumApi2Host.echo" + binaryMessenger:binaryMessenger]; + if (api) { + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + ACData *input = [ACData fromMap:message]; + FlutterError *error; + ACData *output = [api echo:input error:&error]; + callback(wrapResult([output toMap], error)); + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} +@interface ACEnumApi2Flutter () +@property(nonatomic, strong) NSObject *binaryMessenger; +@end + +@implementation ACEnumApi2Flutter +- (instancetype)initWithBinaryMessenger:(NSObject *)binaryMessenger { + self = [super init]; + if (self) { + _binaryMessenger = binaryMessenger; + } + return self; +} + +- (void)echo:(ACData *)input completion:(void (^)(ACData *, NSError *_Nullable))completion { + FlutterBasicMessageChannel *channel = + [FlutterBasicMessageChannel messageChannelWithName:@"dev.flutter.pigeon.EnumApi2Flutter.echo" + binaryMessenger:self.binaryMessenger]; + NSDictionary *inputMap = [input toMap]; + [channel sendMessage:inputMap + reply:^(id reply) { + NSDictionary *outputMap = reply; + ACData *output = [ACData fromMap:outputMap]; + completion(output, nil); + }]; +} +@end diff --git a/packages/pigeon/platform_tests/ios_unit_tests/ios/RunnerTests/EnumTest.m b/packages/pigeon/platform_tests/ios_unit_tests/ios/RunnerTests/EnumTest.m new file mode 100644 index 0000000000..a9f85b4279 --- /dev/null +++ b/packages/pigeon/platform_tests/ios_unit_tests/ios/RunnerTests/EnumTest.m @@ -0,0 +1,31 @@ +// 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 +#import +#import "EchoMessenger.h" +#import "enum.h" + +/////////////////////////////////////////////////////////////////////////////////////////// +@interface EnumTest : XCTestCase +@end + +/////////////////////////////////////////////////////////////////////////////////////////// +@implementation EnumTest + +- (void)testEcho { + ACData* data = [[ACData alloc] init]; + data.state = ACStateError; + EchoBinaryMessenger* binaryMessenger = [[EchoBinaryMessenger alloc] init]; + ACEnumApi2Flutter* api = [[ACEnumApi2Flutter alloc] initWithBinaryMessenger:binaryMessenger]; + XCTestExpectation* expectation = [self expectationWithDescription:@"callback"]; + [api echo:data + completion:^(ACData* _Nonnull result, NSError* _Nullable error) { + XCTAssertEqual(data.state, result.state); + [expectation fulfill]; + }]; + [self waitForExpectations:@[ expectation ] timeout:1.0]; +} + +@end diff --git a/packages/pigeon/run_tests.sh b/packages/pigeon/run_tests.sh index 2de9c6a053..920339e3fa 100755 --- a/packages/pigeon/run_tests.sh +++ b/packages/pigeon/run_tests.sh @@ -302,6 +302,14 @@ run_ios_unittests() { --objc_source_out platform_tests/ios_unit_tests/ios/Runner/all_datatypes.m clang-format -i platform_tests/ios_unit_tests/ios/Runner/all_datatypes.h clang-format -i platform_tests/ios_unit_tests/ios/Runner/all_datatypes.m + $run_pigeon \ + --input pigeons/enum.dart \ + --objc_prefix AC \ + --dart_out /dev/null \ + --objc_header_out platform_tests/ios_unit_tests/ios/Runner/enum.h \ + --objc_source_out platform_tests/ios_unit_tests/ios/Runner/enum.m + clang-format -i platform_tests/ios_unit_tests/ios/Runner/enum.h + clang-format -i platform_tests/ios_unit_tests/ios/Runner/enum.m pushd $PWD cd platform_tests/ios_unit_tests flutter build ios --simulator