aboutsummaryrefslogtreecommitdiffhomepage
path: root/Functions/Example/Tests/FUNSerializerTests.m
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/Example/Tests/FUNSerializerTests.m')
-rw-r--r--Functions/Example/Tests/FUNSerializerTests.m240
1 files changed, 240 insertions, 0 deletions
diff --git a/Functions/Example/Tests/FUNSerializerTests.m b/Functions/Example/Tests/FUNSerializerTests.m
new file mode 100644
index 0000000..707c3e7
--- /dev/null
+++ b/Functions/Example/Tests/FUNSerializerTests.m
@@ -0,0 +1,240 @@
+// Copyright 2017 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+@import XCTest;
+
+#import "FIRError.h"
+#import "FUNSerializer.h"
+
+@interface FUNSerializerTests : XCTestCase
+@end
+
+@implementation FUNSerializerTests
+
+- (void)setUp {
+ [super setUp];
+}
+
+- (void)tearDown {
+ [super tearDown];
+}
+
+- (void)testEncodeNull {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ XCTAssertEqualObjects([NSNull null], [serializer encode:[NSNull null]]);
+}
+
+- (void)testDecodeNull {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSError *error = nil;
+ XCTAssertEqualObjects([NSNull null], [serializer decode:[NSNull null] error:&error]);
+ XCTAssertNil(error);
+}
+
+- (void)testEncodeInt {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ XCTAssertEqualObjects(@1, [serializer encode:@1]);
+}
+
+- (void)testDecodeInt {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSError *error = nil;
+ XCTAssertEqualObjects(@1, [serializer decode:@1 error:&error]);
+ XCTAssertNil(error);
+}
+
+- (void)testEncodeLong {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSDictionary *expected = @{
+ @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
+ @"value" : @"-9223372036854775800",
+ };
+ XCTAssertEqualObjects(expected, [serializer encode:@-9223372036854775800L]);
+}
+
+- (void)testDecodeLong {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSDictionary *input = @{
+ @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
+ @"value" : @"-9223372036854775800",
+ };
+ NSError *error = nil;
+ NSNumber *actual = [serializer decode:input error:&error];
+ XCTAssertEqualObjects(@-9223372036854775800L, actual);
+ // A naive implementation might convert a number to a double and think that's close enough.
+ // We need to make sure it's a long long for accuracy.
+ XCTAssertEqual('q', actual.objCType[0]);
+ XCTAssertNil(error);
+}
+
+- (void)testDecodeInvalidLong {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSDictionary *input = @{
+ @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
+ @"value" : @"-9223372036854775800 and some other junk",
+ };
+ NSError *error = nil;
+ NSNumber *actual = [serializer decode:input error:&error];
+ XCTAssertNil(actual);
+ XCTAssertNotNil(error);
+ XCTAssertEqualObjects(FIRFunctionsErrorDomain, error.domain);
+ XCTAssertEqual(FIRFunctionsErrorCodeInternal, error.code);
+}
+
+- (void)testEncodeUnsignedLong {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSDictionary *expected = @{
+ @"@type" : @"type.googleapis.com/google.protobuf.UInt64Value",
+ @"value" : @"18446744073709551600",
+ };
+ XCTAssertEqualObjects(expected, [serializer encode:@18446744073709551600UL]);
+}
+
+- (void)testDecodeUnsignedLong {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSDictionary *input = @{
+ @"@type" : @"type.googleapis.com/google.protobuf.UInt64Value",
+ @"value" : @"17446744073709551688",
+ };
+ NSError *error = nil;
+ NSNumber *actual = [serializer decode:input error:&error];
+ XCTAssertEqualObjects(@17446744073709551688UL, actual);
+ // A naive NSNumberFormatter implementation will convert the number to a double and think
+ // that's close enough. We need to make sure it's an unsigned long long for accuracy.
+ XCTAssertEqual('Q', actual.objCType[0]);
+ XCTAssertNil(error);
+}
+
+- (void)testEncodeDouble {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ XCTAssertEqualObjects(@1.2, [serializer encode:@1.2]);
+}
+
+- (void)testDecodeDouble {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSError *error = nil;
+ XCTAssertEqualObjects(@1.2, [serializer decode:@1.2 error:&error]);
+ XCTAssertNil(error);
+}
+
+- (void)testEncodeBool {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ XCTAssertEqualObjects(@YES, [serializer encode:@YES]);
+}
+
+- (void)testDecodeBool {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSError *error = nil;
+ XCTAssertEqualObjects(@NO, [serializer decode:@NO error:&error]);
+ XCTAssertNil(error);
+}
+
+- (void)testEncodeString {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ XCTAssertEqualObjects(@"hello", [serializer encode:@"hello"]);
+}
+
+- (void)testDecodeString {
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSError *error = nil;
+ XCTAssertEqualObjects(@"hello", [serializer decode:@"hello" error:&error]);
+ XCTAssertNil(error);
+}
+
+- (void)testEncodeArray {
+ NSArray *input = @[ @1, @"two", @[ @3, @4L ] ];
+ NSArray *expected = @[
+ @1, @"two",
+ @[
+ @3, @{
+ @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
+ @"value" : @"4",
+ }
+ ]
+ ];
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ XCTAssertEqualObjects(expected, [serializer encode:input]);
+}
+
+- (void)testDecodeArray {
+ NSArray *input = @[
+ @1, @"two",
+ @[
+ @3, @{
+ @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
+ @"value" : @"4",
+ }
+ ]
+ ];
+ NSArray *expected = @[ @1, @"two", @[ @3, @4L ] ];
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSError *error = nil;
+
+ XCTAssertEqualObjects(expected, [serializer decode:input error:&error]);
+ XCTAssertNil(error);
+}
+
+- (void)testEncodeMap {
+ NSDictionary *input = @{ @"foo" : @1, @"bar" : @"hello", @"baz" : @[ @3, @4L ] };
+ NSDictionary *expected = @{
+ @"foo" : @1,
+ @"bar" : @"hello",
+ @"baz" : @[
+ @3, @{
+ @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
+ @"value" : @"4",
+ }
+ ]
+ };
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ XCTAssertEqualObjects(expected, [serializer encode:input]);
+}
+
+- (void)testDecodeMap {
+ NSDictionary *input = @{
+ @"foo" : @1,
+ @"bar" : @"hello",
+ @"baz" : @[
+ @3, @{
+ @"@type" : @"type.googleapis.com/google.protobuf.Int64Value",
+ @"value" : @"4",
+ }
+ ]
+ };
+ NSDictionary *expected = @{ @"foo" : @1, @"bar" : @"hello", @"baz" : @[ @3, @4L ] };
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSError *error = nil;
+ XCTAssertEqualObjects(expected, [serializer decode:input error:&error]);
+ XCTAssertNil(error);
+}
+
+- (void)testDecodeUnknownType {
+ NSDictionary *input = @{@"@type" : @"unknown", @"value" : @"whatever"};
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSError *error = nil;
+ XCTAssertEqualObjects(input, [serializer decode:input error:&error]);
+ XCTAssertNil(error);
+}
+
+- (void)testDecodeUnknownTypeWithoutValue {
+ NSDictionary *input = @{
+ @"@type" : @"unknown",
+ };
+ FUNSerializer *serializer = [[FUNSerializer alloc] init];
+ NSError *error = nil;
+ XCTAssertEqualObjects(input, [serializer decode:input error:&error]);
+ XCTAssertNil(error);
+}
+
+@end