7 #include "gtest/gtest.h"
12 @property(atomic, readonly, strong, nullable) NSObject*
left;
13 @property(atomic, readonly, strong, nullable) NSObject*
right;
14 - (instancetype)initWithLeft:(NSObject*)first right:(NSObject*)right;
18 - (instancetype)initWithLeft:(NSObject*)left right:(NSObject*)right {
32 - (void)writeValue:(
id)value;
36 - (void)writeValue:(
id)value {
37 if ([value isKindOfClass:[NSDate
class]]) {
40 NSTimeInterval time = date.timeIntervalSince1970;
41 SInt64 ms = (SInt64)(time * 1000.0);
43 }
else if ([value isKindOfClass:[
Pair class]]) {
55 - (
id)readValueOfType:(UInt8)type;
59 - (
id)readValueOfType:(UInt8)type {
64 NSTimeInterval time = [NSNumber numberWithLong:value].doubleValue / 1000.0;
65 return [NSDate dateWithTimeIntervalSince1970:time];
92 NSData* encoded = [codec
encode:value];
93 if (expectedEncoding == nil) {
94 ASSERT_TRUE(encoded == nil);
96 ASSERT_TRUE([encoded isEqual:expectedEncoding]);
98 id decoded = [codec
decode:encoded];
99 if (value == nil || value == [NSNull
null]) {
100 ASSERT_TRUE(decoded == nil);
102 ASSERT_TRUE([value isEqual:decoded]);
108 NSData* encoded = [codec
encode:value];
109 id decoded = [codec
decode:encoded];
110 if (value == nil || value == [NSNull
null]) {
111 ASSERT_TRUE(decoded == nil);
113 ASSERT_TRUE([value isEqual:decoded]);
117 TEST(FlutterStandardCodec, CanDecodeZeroLength) {
119 id decoded = [codec
decode:[NSData data]];
120 ASSERT_TRUE(decoded == nil);
123 TEST(FlutterStandardCodec, CanEncodeAndDecodeNil) {
127 TEST(FlutterStandardCodec, CanEncodeAndDecodeNSNull) {
128 uint8_t bytes[1] = {0x00};
132 TEST(FlutterStandardCodec, CanEncodeAndDecodeYes) {
133 uint8_t bytes[1] = {0x01};
137 TEST(FlutterStandardCodec, CanEncodeAndDecodeNo) {
138 uint8_t bytes[1] = {0x02};
142 TEST(FlutterStandardCodec, CanEncodeAndDecodeUInt8) {
143 uint8_t bytes[5] = {0x03, 0xfe, 0x00, 0x00, 0x00};
148 TEST(FlutterStandardCodec, CanEncodeAndDecodeUInt16) {
149 uint8_t bytes[5] = {0x03, 0xdc, 0xfe, 0x00, 0x00};
150 UInt16 value = 0xfedc;
154 TEST(FlutterStandardCodec, CanEncodeAndDecodeUInt32) {
155 uint8_t bytes[9] = {0x04, 0x09, 0xba, 0xdc, 0xfe, 0x00, 0x00, 0x00, 0x00};
156 UInt32 value = 0xfedcba09;
160 TEST(FlutterStandardCodec, CanEncodeUInt64) {
162 UInt64 u64 = 0xfffffffffffffffa;
163 uint8_t bytes[9] = {0x04, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
164 NSData* encoded = [codec
encode:@(u64)];
165 ASSERT_TRUE([encoded isEqual:[NSData dataWithBytes:bytes length:9]]);
168 TEST(FlutterStandardCodec, CanEncodeAndDecodeSInt8) {
169 uint8_t bytes[5] = {0x03, 0xfe, 0xff, 0xff, 0xff};
174 TEST(FlutterStandardCodec, CanEncodeAndDecodeSInt16) {
175 uint8_t bytes[5] = {0x03, 0xdc, 0xfe, 0xff, 0xff};
176 SInt16 value = 0xfedc;
180 TEST(FlutterStandardCodec, CanEncodeAndDecodeSInt32) {
181 uint8_t bytes[5] = {0x03, 0x78, 0x56, 0x34, 0x12};
185 TEST(FlutterStandardCodec, CanEncodeAndDecodeSInt64) {
186 uint8_t bytes[9] = {0x04, 0xef, 0xcd, 0xab, 0x90, 0x78, 0x56, 0x34, 0x12};
190 TEST(FlutterStandardCodec, CanEncodeAndDecodeFloat32) {
191 uint8_t bytes[16] = {0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192 0x00, 0x00, 0x00, 0x60, 0xfb, 0x21, 0x09, 0x40};
196 TEST(FlutterStandardCodec, CanEncodeAndDecodeFloat64) {
197 uint8_t bytes[16] = {0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
198 0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40};
199 CheckEncodeDecode(@3.14159265358979311599796346854, [NSData dataWithBytes:bytes length:16]);
202 TEST(FlutterStandardCodec, CanEncodeAndDecodeString) {
203 uint8_t bytes[13] = {0x07, 0x0b, 0x68, 0x65, 0x6c, 0x6c, 0x6f,
204 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64};
208 TEST(FlutterStandardCodec, CanEncodeAndDecodeStringWithNonAsciiCodePoint) {
209 uint8_t bytes[7] = {0x07, 0x05, 0x68, 0xe2, 0x98, 0xba, 0x77};
213 TEST(FlutterStandardCodec, CanEncodeAndDecodeStringWithNonBMPCodePoint) {
214 uint8_t bytes[8] = {0x07, 0x06, 0x68, 0xf0, 0x9f, 0x98, 0x82, 0x77};
218 TEST(FlutterStandardCodec, CanEncodeAndDecodeArray) {
219 NSArray* value = @[ [NSNull null], @"hello", @3.14, @47, @{@42 : @"nested"} ];
223 TEST(FlutterStandardCodec, CanEncodeAndDecodeDictionary) {
224 NSDictionary* value =
227 [NSNull null] : [NSNull null],
228 @3.14 : @[ @"nested" ]};
232 TEST(FlutterStandardCodec, CanEncodeAndDecodeByteArray) {
233 uint8_t bytes[4] = {0xBA, 0x5E, 0xBA, 0x11};
234 NSData* data = [NSData dataWithBytes:bytes length:4];
239 TEST(FlutterStandardCodec, CanEncodeAndDecodeNSData) {
241 uint8_t bytes[4] = {0xBA, 0x5E, 0xBA, 0x11};
242 NSData* data = [NSData dataWithBytes:bytes length:4];
245 NSData* encoded = [codec
encode:data];
246 ASSERT_TRUE([encoded isEqual:[codec encode:standardData]]);
249 TEST(FlutterStandardCodec, CanEncodeAndDecodeInt32Array) {
250 uint8_t bytes[8] = {0xBA, 0x5E, 0xBA, 0x11, 0xff, 0xff, 0xff, 0xff};
251 NSData* data = [NSData dataWithBytes:bytes length:8];
256 TEST(FlutterStandardCodec, CanEncodeAndDecodeInt64Array) {
257 uint8_t bytes[8] = {0xBA, 0x5E, 0xBA, 0x11, 0xff, 0xff, 0xff, 0xff};
258 NSData* data = [NSData dataWithBytes:bytes length:8];
263 TEST(FlutterStandardCodec, CanEncodeAndDecodeFloat32Array) {
264 uint8_t bytes[8] = {0xd8, 0x0f, 0x49, 0x40, 0x00, 0x00, 0x7a, 0x44};
265 NSData* data = [NSData dataWithBytes:bytes length:8];
270 TEST(FlutterStandardCodec, CanEncodeAndDecodeFloat64Array) {
271 uint8_t bytes[16] = {0xBA, 0x5E, 0xBA, 0x11, 0xff, 0xff, 0xff, 0xff,
272 0xBA, 0x5E, 0xBA, 0x11, 0xff, 0xff, 0xff, 0xff};
273 NSData* data = [NSData dataWithBytes:bytes length:16];
278 TEST(FlutterStandardCodec, HandlesMethodCallsWithNilArguments) {
281 NSData* encoded = [codec encodeMethodCall:call];
283 ASSERT_TRUE([decoded isEqual:call]);
286 TEST(FlutterStandardCodec, HandlesMethodCallsWithSingleArgument) {
289 NSData* encoded = [codec encodeMethodCall:call];
291 ASSERT_TRUE([decoded isEqual:call]);
294 TEST(FlutterStandardCodec, HandlesMethodCallsWithArgumentList) {
296 NSArray* arguments = @[ @42, @"world" ];
299 NSData* encoded = [codec encodeMethodCall:call];
301 ASSERT_TRUE([decoded isEqual:call]);
304 TEST(FlutterStandardCodec, HandlesSuccessEnvelopesWithNilResult) {
306 NSData* encoded = [codec encodeSuccessEnvelope:nil];
307 id decoded = [codec decodeEnvelope:encoded];
308 ASSERT_TRUE(decoded == nil);
311 TEST(FlutterStandardCodec, HandlesSuccessEnvelopesWithSingleResult) {
313 NSData* encoded = [codec encodeSuccessEnvelope:@42];
314 id decoded = [codec decodeEnvelope:encoded];
315 ASSERT_TRUE([decoded isEqual:@42]);
318 TEST(FlutterStandardCodec, HandlesSuccessEnvelopesWithResultMap) {
320 NSDictionary* result = @{
@"a" : @42, @42 :
@"a"};
321 NSData* encoded = [codec encodeSuccessEnvelope:result];
322 id decoded = [codec decodeEnvelope:encoded];
323 ASSERT_TRUE([decoded isEqual:result]);
326 TEST(FlutterStandardCodec, HandlesErrorEnvelopes) {
328 NSDictionary* details = @{
@"a" : @42, @42 :
@"a"};
332 NSData* encoded = [codec encodeErrorEnvelope:error];
333 id decoded = [codec decodeEnvelope:encoded];
334 ASSERT_TRUE([decoded isEqual:error]);
337 TEST(FlutterStandardCodec, HandlesSubclasses) {
341 Pair* pair = [[
Pair alloc] initWithLeft:@1 right:@2];
342 NSData* encoded = [codec
encode:pair];
344 ASSERT_TRUE([pair.
left isEqual:decoded.
left]);
345 ASSERT_TRUE([pair.
right isEqual:decoded.
right]);