1*1b3f573fSAndroid Build Coastguard Worker // Protocol Buffers - Google's data interchange format 2*1b3f573fSAndroid Build Coastguard Worker // Copyright 2015 Google Inc. All rights reserved. 3*1b3f573fSAndroid Build Coastguard Worker // https://developers.google.com/protocol-buffers/ 4*1b3f573fSAndroid Build Coastguard Worker // 5*1b3f573fSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without 6*1b3f573fSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are 7*1b3f573fSAndroid Build Coastguard Worker // met: 8*1b3f573fSAndroid Build Coastguard Worker // 9*1b3f573fSAndroid Build Coastguard Worker // * Redistributions of source code must retain the above copyright 10*1b3f573fSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer. 11*1b3f573fSAndroid Build Coastguard Worker // * Redistributions in binary form must reproduce the above 12*1b3f573fSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer 13*1b3f573fSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the 14*1b3f573fSAndroid Build Coastguard Worker // distribution. 15*1b3f573fSAndroid Build Coastguard Worker // * Neither the name of Google Inc. nor the names of its 16*1b3f573fSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from 17*1b3f573fSAndroid Build Coastguard Worker // this software without specific prior written permission. 18*1b3f573fSAndroid Build Coastguard Worker // 19*1b3f573fSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20*1b3f573fSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22*1b3f573fSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23*1b3f573fSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24*1b3f573fSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26*1b3f573fSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27*1b3f573fSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28*1b3f573fSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29*1b3f573fSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30*1b3f573fSAndroid Build Coastguard Worker 31*1b3f573fSAndroid Build Coastguard Worker import Foundation 32*1b3f573fSAndroid Build Coastguard Worker import XCTest 33*1b3f573fSAndroid Build Coastguard Worker 34*1b3f573fSAndroid Build Coastguard Worker // Test some usage of the ObjC library from Swift. 35*1b3f573fSAndroid Build Coastguard Worker 36*1b3f573fSAndroid Build Coastguard Worker class GPBBridgeTests: XCTestCase { 37*1b3f573fSAndroid Build Coastguard Worker testProto2Basicsnull38*1b3f573fSAndroid Build Coastguard Worker func testProto2Basics() { 39*1b3f573fSAndroid Build Coastguard Worker let msg = Message2() 40*1b3f573fSAndroid Build Coastguard Worker let msg2 = Message2() 41*1b3f573fSAndroid Build Coastguard Worker let msg3 = Message2_OptionalGroup() 42*1b3f573fSAndroid Build Coastguard Worker 43*1b3f573fSAndroid Build Coastguard Worker msg.optionalInt32 = 100 44*1b3f573fSAndroid Build Coastguard Worker msg.optionalString = "abc" 45*1b3f573fSAndroid Build Coastguard Worker msg.optionalEnum = .bar 46*1b3f573fSAndroid Build Coastguard Worker msg2.optionalString = "other" 47*1b3f573fSAndroid Build Coastguard Worker msg.optional = msg2 48*1b3f573fSAndroid Build Coastguard Worker msg3.a = 200 49*1b3f573fSAndroid Build Coastguard Worker msg.optionalGroup = msg3 50*1b3f573fSAndroid Build Coastguard Worker msg.repeatedInt32Array.addValue(300) 51*1b3f573fSAndroid Build Coastguard Worker msg.repeatedInt32Array.addValue(301) 52*1b3f573fSAndroid Build Coastguard Worker msg.repeatedStringArray.add("mno") 53*1b3f573fSAndroid Build Coastguard Worker msg.repeatedStringArray.add("pqr") 54*1b3f573fSAndroid Build Coastguard Worker msg.repeatedEnumArray.addValue(Message2_Enum.bar.rawValue) 55*1b3f573fSAndroid Build Coastguard Worker msg.repeatedEnumArray.addValue(Message2_Enum.baz.rawValue) 56*1b3f573fSAndroid Build Coastguard Worker msg.mapInt32Int32.setInt32(400, forKey:500) 57*1b3f573fSAndroid Build Coastguard Worker msg.mapInt32Int32.setInt32(401, forKey:501) 58*1b3f573fSAndroid Build Coastguard Worker msg.mapStringString.setObject("foo", forKey:"bar" as NSString) 59*1b3f573fSAndroid Build Coastguard Worker msg.mapStringString.setObject("abc", forKey:"xyz" as NSString) 60*1b3f573fSAndroid Build Coastguard Worker msg.mapInt32Enum.setEnum(Message2_Enum.bar.rawValue, forKey:600) 61*1b3f573fSAndroid Build Coastguard Worker msg.mapInt32Enum.setEnum(Message2_Enum.baz.rawValue, forKey:601) 62*1b3f573fSAndroid Build Coastguard Worker 63*1b3f573fSAndroid Build Coastguard Worker // Check has*. 64*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.hasOptionalInt32) 65*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.hasOptionalString) 66*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.hasOptionalEnum) 67*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg2.hasOptionalString) 68*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.hasOptionalMessage) 69*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg3.hasA) 70*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.hasOptionalGroup) 71*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalInt64) 72*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalFloat) 73*1b3f573fSAndroid Build Coastguard Worker 74*1b3f573fSAndroid Build Coastguard Worker // Check values. 75*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalInt32, Int32(100)) 76*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalString, "abc") 77*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg2.optionalString, "other") 78*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.optional === msg2) 79*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalEnum, Message2_Enum.bar) 80*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg3.a, Int32(200)) 81*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.optionalGroup === msg3) 82*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedInt32Array.count, UInt(2)) 83*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedInt32Array.value(at: 0), Int32(300)) 84*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedInt32Array.value(at: 1), Int32(301)) 85*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedStringArray.count, Int(2)) 86*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedStringArray.object(at: 0) as? String, "mno") 87*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedStringArray.object(at: 1) as? String, "pqr") 88*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedEnumArray.count, UInt(2)) 89*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedEnumArray.value(at: 0), Message2_Enum.bar.rawValue) 90*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedEnumArray.value(at: 1), Message2_Enum.baz.rawValue) 91*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedInt64Array.count, UInt(0)) 92*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapInt32Int32.count, UInt(2)) 93*1b3f573fSAndroid Build Coastguard Worker var intValue: Int32 = 0 94*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 500)) 95*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(intValue, Int32(400)) 96*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 501)) 97*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(intValue, Int32(401)) 98*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapStringString.count, Int(2)) 99*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapStringString.object(forKey: "bar") as? String, "foo") 100*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapStringString.object(forKey: "xyz") as? String, "abc") 101*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapInt32Enum.count, UInt(2)) 102*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:600)) 103*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(intValue, Message2_Enum.bar.rawValue) 104*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:601)) 105*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(intValue, Message2_Enum.baz.rawValue) 106*1b3f573fSAndroid Build Coastguard Worker 107*1b3f573fSAndroid Build Coastguard Worker // Clearing a string with nil. 108*1b3f573fSAndroid Build Coastguard Worker msg2.optionalString = nil 109*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg2.hasOptionalString) 110*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg2.optionalString, "") 111*1b3f573fSAndroid Build Coastguard Worker 112*1b3f573fSAndroid Build Coastguard Worker // Clearing a message with nil. 113*1b3f573fSAndroid Build Coastguard Worker msg.optionalGroup = nil 114*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalGroup) 115*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.optionalGroup !== msg3) // New instance 116*1b3f573fSAndroid Build Coastguard Worker 117*1b3f573fSAndroid Build Coastguard Worker // Clear. 118*1b3f573fSAndroid Build Coastguard Worker msg.clear() 119*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalInt32) 120*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalString) 121*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalEnum) 122*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalMessage) 123*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalInt64) 124*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalFloat) 125*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalInt32, Int32(0)) 126*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalString, "") 127*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.optional !== msg2) // New instance 128*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalEnum, Message2_Enum.foo) // Default 129*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedInt32Array.count, UInt(0)) 130*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedStringArray.count, Int(0)) 131*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedEnumArray.count, UInt(0)) 132*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapInt32Int32.count, UInt(0)) 133*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapStringString.count, Int(0)) 134*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapInt32Enum.count, UInt(0)) 135*1b3f573fSAndroid Build Coastguard Worker } 136*1b3f573fSAndroid Build Coastguard Worker testProto3Basicsnull137*1b3f573fSAndroid Build Coastguard Worker func testProto3Basics() { 138*1b3f573fSAndroid Build Coastguard Worker let msg = Message3() 139*1b3f573fSAndroid Build Coastguard Worker let msg2 = Message3() 140*1b3f573fSAndroid Build Coastguard Worker 141*1b3f573fSAndroid Build Coastguard Worker msg.optionalInt32 = 100 142*1b3f573fSAndroid Build Coastguard Worker msg.optionalString = "abc" 143*1b3f573fSAndroid Build Coastguard Worker msg.optionalEnum = .bar 144*1b3f573fSAndroid Build Coastguard Worker msg2.optionalString = "other" 145*1b3f573fSAndroid Build Coastguard Worker msg.optional = msg2 146*1b3f573fSAndroid Build Coastguard Worker msg.repeatedInt32Array.addValue(300) 147*1b3f573fSAndroid Build Coastguard Worker msg.repeatedInt32Array.addValue(301) 148*1b3f573fSAndroid Build Coastguard Worker msg.repeatedStringArray.add("mno") 149*1b3f573fSAndroid Build Coastguard Worker msg.repeatedStringArray.add("pqr") 150*1b3f573fSAndroid Build Coastguard Worker // "proto3" syntax lets enum get unknown values. 151*1b3f573fSAndroid Build Coastguard Worker msg.repeatedEnumArray.addValue(Message3_Enum.bar.rawValue) 152*1b3f573fSAndroid Build Coastguard Worker msg.repeatedEnumArray.addRawValue(666) 153*1b3f573fSAndroid Build Coastguard Worker SetMessage3_OptionalEnum_RawValue(msg2, 666) 154*1b3f573fSAndroid Build Coastguard Worker msg.mapInt32Int32.setInt32(400, forKey:500) 155*1b3f573fSAndroid Build Coastguard Worker msg.mapInt32Int32.setInt32(401, forKey:501) 156*1b3f573fSAndroid Build Coastguard Worker msg.mapStringString.setObject("foo", forKey:"bar" as NSString) 157*1b3f573fSAndroid Build Coastguard Worker msg.mapStringString.setObject("abc", forKey:"xyz" as NSString) 158*1b3f573fSAndroid Build Coastguard Worker msg.mapInt32Enum.setEnum(Message2_Enum.bar.rawValue, forKey:600) 159*1b3f573fSAndroid Build Coastguard Worker // "proto3" syntax lets enum get unknown values. 160*1b3f573fSAndroid Build Coastguard Worker msg.mapInt32Enum.setRawValue(666, forKey:601) 161*1b3f573fSAndroid Build Coastguard Worker 162*1b3f573fSAndroid Build Coastguard Worker // Has only exists on for message fields. 163*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.hasOptionalMessage) 164*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg2.hasOptionalMessage) 165*1b3f573fSAndroid Build Coastguard Worker 166*1b3f573fSAndroid Build Coastguard Worker // Check values. 167*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalInt32, Int32(100)) 168*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalString, "abc") 169*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg2.optionalString, "other") 170*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.optional === msg2) 171*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalEnum, Message3_Enum.bar) 172*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedInt32Array.count, UInt(2)) 173*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedInt32Array.value(at: 0), Int32(300)) 174*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedInt32Array.value(at: 1), Int32(301)) 175*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedStringArray.count, Int(2)) 176*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedStringArray.object(at: 0) as? String, "mno") 177*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedStringArray.object(at: 1) as? String, "pqr") 178*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedInt64Array.count, UInt(0)) 179*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedEnumArray.count, UInt(2)) 180*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedEnumArray.value(at: 0), Message3_Enum.bar.rawValue) 181*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedEnumArray.value(at: 1), Message3_Enum.gpbUnrecognizedEnumeratorValue.rawValue) 182*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedEnumArray.rawValue(at: 1), 666) 183*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg2.optionalEnum, Message3_Enum.gpbUnrecognizedEnumeratorValue) 184*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(Message3_OptionalEnum_RawValue(msg2), Int32(666)) 185*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapInt32Int32.count, UInt(2)) 186*1b3f573fSAndroid Build Coastguard Worker var intValue: Int32 = 0 187*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey:500)) 188*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(intValue, Int32(400)) 189*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey:501)) 190*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(intValue, Int32(401)) 191*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapStringString.count, Int(2)) 192*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapStringString.object(forKey: "bar") as? String, "foo") 193*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapStringString.object(forKey: "xyz") as? String, "abc") 194*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapInt32Enum.count, UInt(2)) 195*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:600)) 196*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(intValue, Message2_Enum.bar.rawValue) 197*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:601)) 198*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(intValue, Message3_Enum.gpbUnrecognizedEnumeratorValue.rawValue) 199*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.mapInt32Enum.getRawValue(&intValue, forKey:601)) 200*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(intValue, 666) 201*1b3f573fSAndroid Build Coastguard Worker 202*1b3f573fSAndroid Build Coastguard Worker // Clearing a string with nil. 203*1b3f573fSAndroid Build Coastguard Worker msg2.optionalString = nil 204*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg2.optionalString, "") 205*1b3f573fSAndroid Build Coastguard Worker 206*1b3f573fSAndroid Build Coastguard Worker // Clearing a message with nil. 207*1b3f573fSAndroid Build Coastguard Worker msg.optional = nil 208*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalMessage) 209*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.optional !== msg2) // New instance 210*1b3f573fSAndroid Build Coastguard Worker 211*1b3f573fSAndroid Build Coastguard Worker // Clear. 212*1b3f573fSAndroid Build Coastguard Worker msg.clear() 213*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalMessage) 214*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalInt32, Int32(0)) 215*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalString, "") 216*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.optional !== msg2) // New instance 217*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalEnum, Message3_Enum.foo) // Default 218*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedInt32Array.count, UInt(0)) 219*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedStringArray.count, Int(0)) 220*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedEnumArray.count, UInt(0)) 221*1b3f573fSAndroid Build Coastguard Worker msg2.clear() 222*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg2.optionalEnum, Message3_Enum.foo) // Default 223*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(Message3_OptionalEnum_RawValue(msg2), Message3_Enum.foo.rawValue) 224*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapInt32Int32.count, UInt(0)) 225*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapStringString.count, Int(0)) 226*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapInt32Enum.count, UInt(0)) 227*1b3f573fSAndroid Build Coastguard Worker } 228*1b3f573fSAndroid Build Coastguard Worker testAutoCreationnull229*1b3f573fSAndroid Build Coastguard Worker func testAutoCreation() { 230*1b3f573fSAndroid Build Coastguard Worker let msg = Message2() 231*1b3f573fSAndroid Build Coastguard Worker 232*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalGroup) 233*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalMessage) 234*1b3f573fSAndroid Build Coastguard Worker 235*1b3f573fSAndroid Build Coastguard Worker // Access shouldn't result in has* but should return objects. 236*1b3f573fSAndroid Build Coastguard Worker let msg2 = msg.optionalGroup 237*1b3f573fSAndroid Build Coastguard Worker let msg3 = msg.optional.optional 238*1b3f573fSAndroid Build Coastguard Worker let msg4 = msg.optional 239*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(msg2) 240*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(msg3) 241*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalGroup) 242*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.optional.hasOptionalMessage) 243*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalMessage) 244*1b3f573fSAndroid Build Coastguard Worker 245*1b3f573fSAndroid Build Coastguard Worker // Setting things should trigger has* getting set. 246*1b3f573fSAndroid Build Coastguard Worker msg.optionalGroup.a = 10 247*1b3f573fSAndroid Build Coastguard Worker msg.optional.optional.optionalInt32 = 100 248*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.hasOptionalGroup) 249*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.optional.hasOptionalMessage) 250*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.hasOptionalMessage) 251*1b3f573fSAndroid Build Coastguard Worker 252*1b3f573fSAndroid Build Coastguard Worker // And they should be the same pointer as before. 253*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg2 === msg.optionalGroup) 254*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg3 === msg.optional.optional) 255*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg4 === msg.optional) 256*1b3f573fSAndroid Build Coastguard Worker 257*1b3f573fSAndroid Build Coastguard Worker // Clear gets us new objects next time around. 258*1b3f573fSAndroid Build Coastguard Worker msg.clear() 259*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalGroup) 260*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.optional.hasOptionalMessage) 261*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalMessage) 262*1b3f573fSAndroid Build Coastguard Worker msg.optionalGroup.a = 20 263*1b3f573fSAndroid Build Coastguard Worker msg.optional.optional.optionalInt32 = 200 264*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.hasOptionalGroup) 265*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.optional.hasOptionalMessage) 266*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.hasOptionalMessage) 267*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg2 !== msg.optionalGroup) 268*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg3 !== msg.optional.optional) 269*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg4 !== msg.optional) 270*1b3f573fSAndroid Build Coastguard Worker 271*1b3f573fSAndroid Build Coastguard Worker // Explicit set of a message, means autocreated object doesn't bind. 272*1b3f573fSAndroid Build Coastguard Worker msg.clear() 273*1b3f573fSAndroid Build Coastguard Worker let autoCreated = msg.optional 274*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse(msg.hasOptionalMessage) 275*1b3f573fSAndroid Build Coastguard Worker let msg5 = Message2() 276*1b3f573fSAndroid Build Coastguard Worker msg5.optionalInt32 = 123 277*1b3f573fSAndroid Build Coastguard Worker msg.optional = msg5 278*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.hasOptionalMessage) 279*1b3f573fSAndroid Build Coastguard Worker // Modifying the autocreated doesn't replaced the explicit set one. 280*1b3f573fSAndroid Build Coastguard Worker autoCreated?.optionalInt32 = 456 281*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.hasOptionalMessage) 282*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.optional === msg5) 283*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optional.optionalInt32, Int32(123)) 284*1b3f573fSAndroid Build Coastguard Worker } 285*1b3f573fSAndroid Build Coastguard Worker testProto2OneOfSupportnull286*1b3f573fSAndroid Build Coastguard Worker func testProto2OneOfSupport() { 287*1b3f573fSAndroid Build Coastguard Worker let msg = Message2() 288*1b3f573fSAndroid Build Coastguard Worker 289*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase) 290*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default 291*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default 292*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default 293*1b3f573fSAndroid Build Coastguard Worker let autoCreated = msg.oneof // Default create one. 294*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(autoCreated) 295*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase) 296*1b3f573fSAndroid Build Coastguard Worker 297*1b3f573fSAndroid Build Coastguard Worker msg.oneofInt32 = 10 298*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(10)) 299*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default 300*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default 301*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.oneof === autoCreated) // Still the same 302*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofInt32) 303*1b3f573fSAndroid Build Coastguard Worker 304*1b3f573fSAndroid Build Coastguard Worker msg.oneofFloat = 20.0 305*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default 306*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofFloat, Float(20.0)) 307*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default 308*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.oneof === autoCreated) // Still the same 309*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofFloat) 310*1b3f573fSAndroid Build Coastguard Worker 311*1b3f573fSAndroid Build Coastguard Worker msg.oneofEnum = .bar 312*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default 313*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default 314*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofEnum, Message2_Enum.bar) 315*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.oneof === autoCreated) // Still the same 316*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofEnum) 317*1b3f573fSAndroid Build Coastguard Worker 318*1b3f573fSAndroid Build Coastguard Worker // Sets via the autocreated instance. 319*1b3f573fSAndroid Build Coastguard Worker msg.oneof.optionalInt32 = 200 320*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default 321*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default 322*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default 323*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.oneof === autoCreated) // Still the same 324*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneof.optionalInt32, Int32(200)) 325*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofMessage) 326*1b3f573fSAndroid Build Coastguard Worker 327*1b3f573fSAndroid Build Coastguard Worker // Clear the oneof. 328*1b3f573fSAndroid Build Coastguard Worker Message2_ClearOOneOfCase(msg) 329*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default 330*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default 331*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default 332*1b3f573fSAndroid Build Coastguard Worker let autoCreated2 = msg.oneof // Default create one 333*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(autoCreated2) 334*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(autoCreated2 !== autoCreated) // New instance 335*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneof.optionalInt32, Int32(0)) // Default 336*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase) 337*1b3f573fSAndroid Build Coastguard Worker 338*1b3f573fSAndroid Build Coastguard Worker msg.oneofInt32 = 10 339*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(10)) 340*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofInt32) 341*1b3f573fSAndroid Build Coastguard Worker 342*1b3f573fSAndroid Build Coastguard Worker // Confirm Message.clear() handles the oneof correctly. 343*1b3f573fSAndroid Build Coastguard Worker msg.clear() 344*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default 345*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase) 346*1b3f573fSAndroid Build Coastguard Worker 347*1b3f573fSAndroid Build Coastguard Worker // Sets via the autocreated instance. 348*1b3f573fSAndroid Build Coastguard Worker msg.oneof.optionalInt32 = 300 349*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.oneof !== autoCreated) // New instance 350*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.oneof !== autoCreated2) // New instance 351*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneof.optionalInt32, Int32(300)) 352*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofMessage) 353*1b3f573fSAndroid Build Coastguard Worker 354*1b3f573fSAndroid Build Coastguard Worker // Set message to nil clears the oneof. 355*1b3f573fSAndroid Build Coastguard Worker msg.oneof = nil 356*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneof.optionalInt32, Int32(0)) // Default 357*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase) 358*1b3f573fSAndroid Build Coastguard Worker } 359*1b3f573fSAndroid Build Coastguard Worker testProto3OneOfSupportnull360*1b3f573fSAndroid Build Coastguard Worker func testProto3OneOfSupport() { 361*1b3f573fSAndroid Build Coastguard Worker let msg = Message3() 362*1b3f573fSAndroid Build Coastguard Worker 363*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase) 364*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default 365*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default 366*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default 367*1b3f573fSAndroid Build Coastguard Worker let autoCreated = msg.oneof // Default create one. 368*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(autoCreated) 369*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase) 370*1b3f573fSAndroid Build Coastguard Worker 371*1b3f573fSAndroid Build Coastguard Worker msg.oneofInt32 = 10 372*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(10)) 373*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default 374*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default 375*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.oneof === autoCreated) // Still the same 376*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofInt32) 377*1b3f573fSAndroid Build Coastguard Worker 378*1b3f573fSAndroid Build Coastguard Worker msg.oneofFloat = 20.0 379*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default 380*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofFloat, Float(20.0)) 381*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default 382*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.oneof === autoCreated) // Still the same 383*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofFloat) 384*1b3f573fSAndroid Build Coastguard Worker 385*1b3f573fSAndroid Build Coastguard Worker msg.oneofEnum = .bar 386*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default 387*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default 388*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofEnum, Message3_Enum.bar) 389*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.oneof === autoCreated) // Still the same 390*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofEnum) 391*1b3f573fSAndroid Build Coastguard Worker 392*1b3f573fSAndroid Build Coastguard Worker // Sets via the autocreated instance. 393*1b3f573fSAndroid Build Coastguard Worker msg.oneof.optionalInt32 = 200 394*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default 395*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default 396*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default 397*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.oneof === autoCreated) // Still the same 398*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneof.optionalInt32, Int32(200)) 399*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofMessage) 400*1b3f573fSAndroid Build Coastguard Worker 401*1b3f573fSAndroid Build Coastguard Worker // Clear the oneof. 402*1b3f573fSAndroid Build Coastguard Worker Message3_ClearOOneOfCase(msg) 403*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default 404*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default 405*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default 406*1b3f573fSAndroid Build Coastguard Worker let autoCreated2 = msg.oneof // Default create one 407*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(autoCreated2) 408*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(autoCreated2 !== autoCreated) // New instance 409*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneof.optionalInt32, Int32(0)) // Default 410*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase) 411*1b3f573fSAndroid Build Coastguard Worker 412*1b3f573fSAndroid Build Coastguard Worker msg.oneofInt32 = 10 413*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(10)) 414*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofInt32) 415*1b3f573fSAndroid Build Coastguard Worker 416*1b3f573fSAndroid Build Coastguard Worker // Confirm Message.clear() handles the oneof correctly. 417*1b3f573fSAndroid Build Coastguard Worker msg.clear() 418*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default 419*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase) 420*1b3f573fSAndroid Build Coastguard Worker 421*1b3f573fSAndroid Build Coastguard Worker // Sets via the autocreated instance. 422*1b3f573fSAndroid Build Coastguard Worker msg.oneof.optionalInt32 = 300 423*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.oneof !== autoCreated) // New instance 424*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg.oneof !== autoCreated2) // New instance 425*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneof.optionalInt32, Int32(300)) 426*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofMessage) 427*1b3f573fSAndroid Build Coastguard Worker 428*1b3f573fSAndroid Build Coastguard Worker // Set message to nil clears the oneof. 429*1b3f573fSAndroid Build Coastguard Worker msg.oneof = nil 430*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oneof.optionalInt32, Int32(0)) // Default 431*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase) 432*1b3f573fSAndroid Build Coastguard Worker } 433*1b3f573fSAndroid Build Coastguard Worker testSerializationnull434*1b3f573fSAndroid Build Coastguard Worker func testSerialization() { 435*1b3f573fSAndroid Build Coastguard Worker let msg = Message2() 436*1b3f573fSAndroid Build Coastguard Worker 437*1b3f573fSAndroid Build Coastguard Worker msg.optionalInt32 = 100 438*1b3f573fSAndroid Build Coastguard Worker msg.optionalInt64 = 101 439*1b3f573fSAndroid Build Coastguard Worker msg.optionalGroup.a = 102 440*1b3f573fSAndroid Build Coastguard Worker msg.repeatedStringArray.add("abc") 441*1b3f573fSAndroid Build Coastguard Worker msg.repeatedStringArray.add("def") 442*1b3f573fSAndroid Build Coastguard Worker msg.mapInt32Int32.setInt32(200, forKey:300) 443*1b3f573fSAndroid Build Coastguard Worker msg.mapInt32Int32.setInt32(201, forKey:201) 444*1b3f573fSAndroid Build Coastguard Worker msg.mapStringString.setObject("foo", forKey:"bar" as NSString) 445*1b3f573fSAndroid Build Coastguard Worker msg.mapStringString.setObject("abc", forKey:"xyz" as NSString) 446*1b3f573fSAndroid Build Coastguard Worker 447*1b3f573fSAndroid Build Coastguard Worker let data = msg.data() 448*1b3f573fSAndroid Build Coastguard Worker 449*1b3f573fSAndroid Build Coastguard Worker let msg2 = try! Message2(data: data!) 450*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(msg2 !== msg) // New instance 451*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalInt32, Int32(100)) 452*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalInt64, Int64(101)) 453*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.optionalGroup.a, Int32(102)) 454*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.repeatedStringArray.count, Int(2)) 455*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapInt32Int32.count, UInt(2)) 456*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg.mapStringString.count, Int(2)) 457*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(msg2, msg) 458*1b3f573fSAndroid Build Coastguard Worker } 459*1b3f573fSAndroid Build Coastguard Worker 460*1b3f573fSAndroid Build Coastguard Worker } 461