FUNSerializerTests.m 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. // Copyright 2017 Google
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #import <XCTest/XCTest.h>
  15. #import "FIRError.h"
  16. #import "FUNSerializer.h"
  17. @interface FUNSerializerTests : XCTestCase
  18. @end
  19. @implementation FUNSerializerTests
  20. - (void)setUp {
  21. [super setUp];
  22. }
  23. - (void)tearDown {
  24. [super tearDown];
  25. }
  26. - (void)testEncodeNull {
  27. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  28. XCTAssertEqualObjects([NSNull null], [serializer encode:[NSNull null]]);
  29. }
  30. - (void)testDecodeNull {
  31. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  32. NSError *error = nil;
  33. XCTAssertEqualObjects([NSNull null], [serializer decode:[NSNull null] error:&error]);
  34. XCTAssertNil(error);
  35. }
  36. - (void)testEncodeInt {
  37. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  38. XCTAssertEqualObjects(@1, [serializer encode:@1]);
  39. }
  40. - (void)testDecodeInt {
  41. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  42. NSError *error = nil;
  43. XCTAssertEqualObjects(@1, [serializer decode:@1 error:&error]);
  44. XCTAssertNil(error);
  45. }
  46. - (void)testEncodeLong {
  47. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  48. NSDictionary *expected = @{
  49. @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
  50. @"value" : @"-9223372036854775800",
  51. };
  52. XCTAssertEqualObjects(expected, [serializer encode:@-9223372036854775800L]);
  53. }
  54. - (void)testDecodeLong {
  55. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  56. NSDictionary *input = @{
  57. @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
  58. @"value" : @"-9223372036854775800",
  59. };
  60. NSError *error = nil;
  61. NSNumber *actual = [serializer decode:input error:&error];
  62. XCTAssertEqualObjects(@-9223372036854775800L, actual);
  63. // A naive implementation might convert a number to a double and think that's close enough.
  64. // We need to make sure it's a long long for accuracy.
  65. XCTAssertEqual('q', actual.objCType[0]);
  66. XCTAssertNil(error);
  67. }
  68. - (void)testDecodeInvalidLong {
  69. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  70. NSDictionary *input = @{
  71. @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
  72. @"value" : @"-9223372036854775800 and some other junk",
  73. };
  74. NSError *error = nil;
  75. NSNumber *actual = [serializer decode:input error:&error];
  76. XCTAssertNil(actual);
  77. XCTAssertNotNil(error);
  78. XCTAssertEqualObjects(FIRFunctionsErrorDomain, error.domain);
  79. XCTAssertEqual(FIRFunctionsErrorCodeInternal, error.code);
  80. }
  81. - (void)testEncodeUnsignedLong {
  82. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  83. NSDictionary *expected = @{
  84. @"@type" : @"type.googleapis.com/google.protobuf.UInt64Value",
  85. @"value" : @"18446744073709551600",
  86. };
  87. XCTAssertEqualObjects(expected, [serializer encode:@18446744073709551600UL]);
  88. }
  89. - (void)testDecodeUnsignedLong {
  90. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  91. NSDictionary *input = @{
  92. @"@type" : @"type.googleapis.com/google.protobuf.UInt64Value",
  93. @"value" : @"17446744073709551688",
  94. };
  95. NSError *error = nil;
  96. NSNumber *actual = [serializer decode:input error:&error];
  97. XCTAssertEqualObjects(@17446744073709551688UL, actual);
  98. // A naive NSNumberFormatter implementation will convert the number to a double and think
  99. // that's close enough. We need to make sure it's an unsigned long long for accuracy.
  100. XCTAssertEqual('Q', actual.objCType[0]);
  101. XCTAssertNil(error);
  102. }
  103. - (void)testEncodeDouble {
  104. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  105. XCTAssertEqualObjects(@1.2, [serializer encode:@1.2]);
  106. }
  107. - (void)testDecodeDouble {
  108. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  109. NSError *error = nil;
  110. XCTAssertEqualObjects(@1.2, [serializer decode:@1.2 error:&error]);
  111. XCTAssertNil(error);
  112. }
  113. - (void)testEncodeBool {
  114. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  115. XCTAssertEqualObjects(@YES, [serializer encode:@YES]);
  116. }
  117. - (void)testDecodeBool {
  118. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  119. NSError *error = nil;
  120. XCTAssertEqualObjects(@NO, [serializer decode:@NO error:&error]);
  121. XCTAssertNil(error);
  122. }
  123. - (void)testEncodeString {
  124. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  125. XCTAssertEqualObjects(@"hello", [serializer encode:@"hello"]);
  126. }
  127. - (void)testDecodeString {
  128. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  129. NSError *error = nil;
  130. XCTAssertEqualObjects(@"hello", [serializer decode:@"hello" error:&error]);
  131. XCTAssertNil(error);
  132. }
  133. - (void)testEncodeArray {
  134. NSArray *input = @[ @1, @"two", @[ @3, @9876543210LL ] ];
  135. NSArray *expected = @[
  136. @1, @"two",
  137. @[
  138. @3, @{
  139. @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
  140. @"value" : @"9876543210",
  141. }
  142. ]
  143. ];
  144. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  145. XCTAssertEqualObjects(expected, [serializer encode:input]);
  146. }
  147. - (void)testDecodeArray {
  148. NSArray *input = @[
  149. @1, @"two",
  150. @[
  151. @3, @{
  152. @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
  153. @"value" : @"9876543210",
  154. }
  155. ]
  156. ];
  157. NSArray *expected = @[ @1, @"two", @[ @3, @9876543210LL ] ];
  158. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  159. NSError *error = nil;
  160. XCTAssertEqualObjects(expected, [serializer decode:input error:&error]);
  161. XCTAssertNil(error);
  162. }
  163. - (void)testEncodeMap {
  164. NSDictionary *input = @{@"foo" : @1, @"bar" : @"hello", @"baz" : @[ @3, @9876543210LL ]};
  165. NSDictionary *expected = @{
  166. @"foo" : @1,
  167. @"bar" : @"hello",
  168. @"baz" : @[
  169. @3, @{
  170. @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
  171. @"value" : @"9876543210",
  172. }
  173. ]
  174. };
  175. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  176. XCTAssertEqualObjects(expected, [serializer encode:input]);
  177. }
  178. - (void)testDecodeMap {
  179. NSDictionary *input = @{
  180. @"foo" : @1,
  181. @"bar" : @"hello",
  182. @"baz" : @[
  183. @3, @{
  184. @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
  185. @"value" : @"9876543210",
  186. }
  187. ]
  188. };
  189. NSDictionary *expected = @{@"foo" : @1, @"bar" : @"hello", @"baz" : @[ @3, @9876543210LL ]};
  190. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  191. NSError *error = nil;
  192. XCTAssertEqualObjects(expected, [serializer decode:input error:&error]);
  193. XCTAssertNil(error);
  194. }
  195. - (void)testDecodeUnknownType {
  196. NSDictionary *input = @{@"@type" : @"unknown", @"value" : @"whatever"};
  197. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  198. NSError *error = nil;
  199. XCTAssertEqualObjects(input, [serializer decode:input error:&error]);
  200. XCTAssertNil(error);
  201. }
  202. - (void)testDecodeUnknownTypeWithoutValue {
  203. NSDictionary *input = @{
  204. @"@type" : @"unknown",
  205. };
  206. FUNSerializer *serializer = [[FUNSerializer alloc] init];
  207. NSError *error = nil;
  208. XCTAssertEqualObjects(input, [serializer decode:input error:&error]);
  209. XCTAssertNil(error);
  210. }
  211. @end