diff options
Diffstat (limited to 'Functions/Example/Tests/FUNSerializerTests.m')
-rw-r--r-- | Functions/Example/Tests/FUNSerializerTests.m | 240 |
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 |