1 /*
2  * Copyright 2021 Google Inc. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 import Foundation
18 import XCTest
19 @testable import FlatBuffers
20 
21 typealias Test = MyGame_Example_Test
22 typealias Monster = MyGame_Example_Monster
23 typealias Vec3 = MyGame_Example_Vec3
24 typealias Stat = MyGame_Example_Stat
25 
26 class FlatBuffersMonsterWriterTests: XCTestCase {
27 
testDatanull28   func testData() {
29     // swiftformat:disable all
30     let data = Data([48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0])
31     // swiftformat:enable all
32     let _data = ByteBuffer(data: data)
33     readVerifiedMonster(fb: _data)
34   }
35 
testReadFromOtherLanguagesnull36   func testReadFromOtherLanguages() {
37     let path = FileManager.default.currentDirectoryPath
38     let url = URL(fileURLWithPath: path, isDirectory: true)
39       .appendingPathComponent("monsterdata_test").appendingPathExtension("mon")
40     guard let data = try? Data(contentsOf: url) else { return }
41     let _data = ByteBuffer(data: data)
42     readVerifiedMonster(fb: _data)
43   }
44 
testCreateMonsternull45   func testCreateMonster() {
46     let bytes = createMonster(withPrefix: false)
47     // swiftformat:disable all
48     XCTAssertEqual(bytes.sizedByteArray, [48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0])
49     // swiftformat:enable all
50     let monster = MyGame_Example_Monster.getRootAsMonster(bb: bytes.buffer)
51     readMonster(monster: monster)
52     mutateMonster(fb: bytes.buffer)
53     readMonster(monster: monster)
54   }
55 
testCreateMonsterResizedBuffernull56   func testCreateMonsterResizedBuffer() {
57     let bytes = createMonster(withPrefix: false)
58     // swiftformat:disable all
59     XCTAssertEqual(bytes.sizedByteArray, [48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0])
60     // swiftformat:enable all
61     readVerifiedMonster(fb: bytes.sizedBuffer)
62   }
63 
testCreateMonsterPrefixednull64   func testCreateMonsterPrefixed() {
65     let bytes = createMonster(withPrefix: true)
66     // swiftformat:disable all
67     XCTAssertEqual(bytes.sizedByteArray, [44, 1, 0, 0, 44, 0, 0, 0, 77, 79, 78, 83, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0])
68     // swiftformat:enable all
69 
70     var buffer = bytes.buffer
71     readMonster(monster: getPrefixedSizeRoot(byteBuffer: &buffer))
72   }
73 
testCreateMonsterUsingCreateMonsterMethodWithNilPosnull74   func testCreateMonsterUsingCreateMonsterMethodWithNilPos() {
75     var fbb = FlatBufferBuilder(initialSize: 1)
76     let name = fbb.create(string: "Frodo")
77     let mStart = Monster.startMonster(&fbb)
78     Monster.add(name: name, &fbb)
79     let root = Monster.endMonster(&fbb, start: mStart)
80     fbb.finish(offset: root)
81     let newMonster = Monster.getRootAsMonster(bb: fbb.sizedBuffer)
82     XCTAssertNil(newMonster.pos)
83     XCTAssertEqual(newMonster.name, "Frodo")
84   }
85 
testCreateMonsterUsingCreateMonsterMethodWithPosXnull86   func testCreateMonsterUsingCreateMonsterMethodWithPosX() {
87     var fbb = FlatBufferBuilder(initialSize: 1)
88     let name = fbb.create(string: "Barney")
89     let mStart = Monster.startMonster(&fbb)
90     Monster.add(
91       pos: MyGame_Example_Vec3(
92         x: 10,
93         y: 0,
94         z: 0,
95         test1: 0,
96         test2: .blue,
97         test3: .init()),
98       &fbb)
99     Monster.add(name: name, &fbb)
100     let root = Monster.endMonster(&fbb, start: mStart)
101     fbb.finish(offset: root)
102 
103     let newMonster = Monster.getRootAsMonster(bb: fbb.sizedBuffer)
104     XCTAssertEqual(newMonster.pos!.x, 10)
105     XCTAssertEqual(newMonster.name, "Barney")
106   }
107 
testReadMonsterFromUnsafePointerWithoutCopyingnull108   func testReadMonsterFromUnsafePointerWithoutCopying() {
109     // swiftformat:disable all
110     var array: [UInt8] = [48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0]
111     // swiftformat:enable all
112     let unpacked = array
113       .withUnsafeMutableBytes { (memory) -> MyGame_Example_MonsterT in
114         let bytes = ByteBuffer(
115           assumingMemoryBound: memory.baseAddress!,
116           capacity: memory.count)
117         var monster = Monster.getRootAsMonster(bb: bytes)
118         readFlatbufferMonster(monster: &monster)
119         let unpacked = monster.unpack()
120         return unpacked
121       }
122     readObjectApi(monster: unpacked)
123   }
124 
testArrayOfBoolsnull125   func testArrayOfBools() {
126     let boolArray = [false, true, false, true, false, true, false]
127     var fbb = FlatBufferBuilder(initialSize: 1)
128     let name = fbb.create(string: "Frodo")
129     let bools = fbb.createVector(boolArray)
130     let root = Monster.createMonster(
131       &fbb,
132       nameOffset: name,
133       testarrayofboolsVectorOffset: bools)
134     fbb.finish(offset: root)
135     let monster = Monster.getRootAsMonster(bb: fbb.sizedBuffer)
136 
137     let values = monster.testarrayofbools
138 
139     XCTAssertEqual(boolArray, values)
140 
141     for i in 0..<monster.testarrayofboolsCount {
142       XCTAssertEqual(boolArray[Int(i)], monster.testarrayofbools(at: i))
143     }
144   }
145 
readVerifiedMonsternull146   func readVerifiedMonster(fb: ByteBuffer) {
147     var byteBuffer = fb
148     XCTAssertNoThrow(
149       try readMonster(
150         monster: getCheckedRoot(
151           byteBuffer: &byteBuffer) as MyGame_Example_Monster))
152   }
153 
readMonsternull154   func readMonster(monster: Monster) {
155     var monster = monster
156     readFlatbufferMonster(monster: &monster)
157     let unpacked: MyGame_Example_MonsterT? = monster.unpack()
158     readObjectApi(monster: unpacked!)
159     guard let buffer = unpacked?.serialize()
160     else { fatalError("Couldnt generate bytebuffer") }
161     var newMonster = Monster.getRootAsMonster(bb: buffer)
162     readFlatbufferMonster(monster: &newMonster)
163   }
164 
createMonsternull165   func createMonster(withPrefix prefix: Bool) -> FlatBufferBuilder {
166     var fbb = FlatBufferBuilder(initialSize: 1)
167     let names = [
168       fbb.create(string: "Frodo"),
169       fbb.create(string: "Barney"),
170       fbb.create(string: "Wilma"),
171     ]
172     var offsets: [Offset] = []
173     let start1 = Monster.startMonster(&fbb)
174     Monster.add(name: names[0], &fbb)
175     offsets.append(Monster.endMonster(&fbb, start: start1))
176     let start2 = Monster.startMonster(&fbb)
177     Monster.add(name: names[1], &fbb)
178     offsets.append(Monster.endMonster(&fbb, start: start2))
179     let start3 = Monster.startMonster(&fbb)
180     Monster.add(name: names[2], &fbb)
181     offsets.append(Monster.endMonster(&fbb, start: start3))
182 
183     let sortedArray = Monster.sortVectorOfMonster(offsets: offsets, &fbb)
184 
185     let str = fbb.create(string: "MyMonster")
186     let test1 = fbb.create(string: "test1")
187     let test2 = fbb.create(string: "test2")
188     let _inv: [Byte] = [0, 1, 2, 3, 4]
189     let inv = fbb.createVector(_inv)
190 
191     let fred = fbb.create(string: "Fred")
192     let mon1Start = Monster.startMonster(&fbb)
193     Monster.add(name: fred, &fbb)
194     let mon2 = Monster.endMonster(&fbb, start: mon1Start)
195 
196     let test4 = fbb.createVector(ofStructs: [
197       MyGame_Example_Test(a: 30, b: 40),
198       MyGame_Example_Test(a: 10, b: 20),
199     ])
200 
201     let stringTestVector = fbb.createVector(ofOffsets: [test1, test2])
202     let mStart = Monster.startMonster(&fbb)
203     Monster.add(
204       pos: MyGame_Example_Vec3(
205         x: 1,
206         y: 2,
207         z: 3,
208         test1: 3,
209         test2: .green,
210         test3: .init(a: 5, b: 6)),
211       &fbb)
212     Monster.add(hp: 80, &fbb)
213     Monster.add(name: str, &fbb)
214     Monster.addVectorOf(inventory: inv, &fbb)
215     Monster.add(testType: .monster, &fbb)
216     Monster.add(test: mon2, &fbb)
217     Monster.addVectorOf(test4: test4, &fbb)
218     Monster.addVectorOf(testarrayofstring: stringTestVector, &fbb)
219     Monster.add(testbool: true, &fbb)
220     Monster.addVectorOf(testarrayoftables: sortedArray, &fbb)
221     let end = Monster.endMonster(&fbb, start: mStart)
222     Monster.finish(&fbb, end: end, prefix: prefix)
223     return fbb
224   }
225 
mutateMonsternull226   func mutateMonster(fb: ByteBuffer) {
227     let monster = Monster.getRootAsMonster(bb: fb)
228     XCTAssertFalse(monster.mutate(mana: 10))
229     XCTAssertEqual(monster.testarrayoftables(at: 0)?.name, "Barney")
230     XCTAssertEqual(monster.testarrayoftables(at: 1)?.name, "Frodo")
231     XCTAssertEqual(monster.testarrayoftables(at: 2)?.name, "Wilma")
232 
233     // Example of searching for a table by the key
234     XCTAssertNotNil(monster.testarrayoftablesBy(key: "Frodo"))
235     XCTAssertNotNil(monster.testarrayoftablesBy(key: "Barney"))
236     XCTAssertNotNil(monster.testarrayoftablesBy(key: "Wilma"))
237 
238     XCTAssertEqual(monster.testType, .monster)
239 
240     XCTAssertEqual(monster.mutate(inventory: 1, at: 0), true)
241     XCTAssertEqual(monster.mutate(inventory: 2, at: 1), true)
242     XCTAssertEqual(monster.mutate(inventory: 3, at: 2), true)
243     XCTAssertEqual(monster.mutate(inventory: 4, at: 3), true)
244     XCTAssertEqual(monster.mutate(inventory: 5, at: 4), true)
245 
246     for i in 0..<monster.inventoryCount {
247       XCTAssertEqual(monster.inventory(at: i), Byte(i + 1))
248     }
249 
250     XCTAssertEqual(monster.mutate(inventory: 0, at: 0), true)
251     XCTAssertEqual(monster.mutate(inventory: 1, at: 1), true)
252     XCTAssertEqual(monster.mutate(inventory: 2, at: 2), true)
253     XCTAssertEqual(monster.mutate(inventory: 3, at: 3), true)
254     XCTAssertEqual(monster.mutate(inventory: 4, at: 4), true)
255 
256     let vec = monster.mutablePos
257     XCTAssertEqual(vec?.x, 1)
258     XCTAssertTrue(vec?.mutate(x: 55.0) ?? false)
259     XCTAssertTrue(vec?.mutate(test1: 55) ?? false)
260     XCTAssertEqual(vec?.x, 55.0)
261     XCTAssertEqual(vec?.test1, 55.0)
262     XCTAssertTrue(vec?.mutate(x: 1) ?? false)
263     XCTAssertEqual(vec?.x, 1)
264     XCTAssertTrue(vec?.mutate(test1: 3) ?? false)
265   }
266 
readFlatbufferMonsternull267   func readFlatbufferMonster(monster: inout MyGame_Example_Monster) {
268     XCTAssertEqual(monster.hp, 80)
269     XCTAssertEqual(monster.mana, 150)
270     XCTAssertEqual(monster.name, "MyMonster")
271     let pos = monster.pos
272     XCTAssertEqual(pos?.x, 1)
273     XCTAssertEqual(pos?.y, 2)
274     XCTAssertEqual(pos?.z, 3)
275     XCTAssertEqual(pos?.test1, 3)
276     XCTAssertEqual(pos?.test2, .green)
277     let test = pos?.test3
278     XCTAssertEqual(test?.a, 5)
279     XCTAssertEqual(test?.b, 6)
280     XCTAssertEqual(monster.testType, .monster)
281     let monster2 = monster.test(type: Monster.self)
282     XCTAssertEqual(monster2?.name, "Fred")
283 
284     XCTAssertEqual(monster.mutate(mana: 10), false)
285 
286     XCTAssertEqual(monster.mana, 150)
287     XCTAssertEqual(monster.inventoryCount, 5)
288     var sum: Byte = 0
289     for i in 0...monster.inventoryCount {
290       sum += monster.inventory(at: i)
291     }
292     XCTAssertEqual(sum, 10)
293     XCTAssertEqual(monster.test4Count, 2)
294 
295     let test0 = monster.test4(at: 0)
296     let test1 = monster.test4(at: 1)
297     var sum0 = 0
298     var sum1 = 0
299     if let a = test0?.a, let b = test0?.b {
300       sum0 = Int(a) + Int(b)
301     }
302     if let a = test1?.a, let b = test1?.b {
303       sum1 = Int(a) + Int(b)
304     }
305     XCTAssertEqual(sum0 + sum1, 100)
306 
307     let mutableTest0 = monster.mutableTest4(at: 0)
308     let mutableTest1 = monster.mutableTest4(at: 1)
309     var sum2 = 0
310     var sum3 = 0
311     if let a = mutableTest0?.a, let b = mutableTest0?.b {
312       sum2 = Int(a) + Int(b)
313     }
314     if let a = mutableTest1?.a, let b = mutableTest1?.b {
315       sum3 = Int(a) + Int(b)
316     }
317     XCTAssertEqual(sum2 + sum3, 100)
318 
319     XCTAssertEqual(monster.testarrayofstringCount, 2)
320     XCTAssertEqual(monster.testarrayofstring(at: 0), "test1")
321     XCTAssertEqual(monster.testarrayofstring(at: 1), "test2")
322     XCTAssertEqual(monster.testbool, true)
323 
324     let array = monster.nameSegmentArray
325     XCTAssertEqual(String(bytes: array ?? [], encoding: .utf8), "MyMonster")
326 
327     if 0 == monster.testarrayofboolsCount  {
328       XCTAssertEqual(monster.testarrayofbools.isEmpty, true)
329     } else {
330       XCTAssertEqual(monster.testarrayofbools.isEmpty, false)
331     }
332   }
333 
readObjectApinull334   func readObjectApi(monster: MyGame_Example_MonsterT) {
335     XCTAssertEqual(monster.hp, 80)
336     XCTAssertEqual(monster.mana, 150)
337     XCTAssertEqual(monster.name, "MyMonster")
338     let pos = monster.pos
339     XCTAssertEqual(pos?.x, 1)
340     XCTAssertEqual(pos?.y, 2)
341     XCTAssertEqual(pos?.z, 3)
342     XCTAssertEqual(pos?.test1, 3)
343     XCTAssertEqual(pos?.test2, .green)
344     let test = pos?.test3
345     XCTAssertEqual(test?.a, 5)
346     XCTAssertEqual(test?.b, 6)
347     let monster2 = monster.test?.value as? MyGame_Example_MonsterT
348     XCTAssertEqual(monster2?.name, "Fred")
349     XCTAssertEqual(monster.mana, 150)
350     monster.mana = 10
351     XCTAssertEqual(monster.mana, 10)
352     monster.mana = 150
353     XCTAssertEqual(monster.mana, 150)
354 
355     XCTAssertEqual(monster.inventory.count, 5)
356     var sum: Byte = 0
357     for i in monster.inventory {
358       sum += i
359     }
360     XCTAssertEqual(sum, 10)
361     XCTAssertEqual(monster.test4.count, 2)
362     let test0 = monster.test4[0]
363     let test1 = monster.test4[1]
364     var sum0 = 0
365     var sum1 = 0
366     if let a = test0?.a, let b = test0?.b {
367       sum0 = Int(a) + Int(b)
368     }
369     if let a = test1?.a, let b = test1?.b {
370       sum1 = Int(a) + Int(b)
371     }
372     XCTAssertEqual(sum0 + sum1, 100)
373     XCTAssertEqual(monster.testbool, true)
374   }
375 
testEncodingnull376   func testEncoding() {
377     let fbb = createMonster(withPrefix: false)
378     var sizedBuffer = fbb.sizedBuffer
379     do {
380       let reader: Monster = try getCheckedRoot(byteBuffer: &sizedBuffer)
381       let encoder = JSONEncoder()
382       encoder.keyEncodingStrategy = .convertToSnakeCase
383       let data = try encoder.encode(reader)
384       XCTAssertEqual(data, jsonData.data(using: .utf8))
385     } catch {
386       XCTFail(error.localizedDescription)
387     }
388   }
389 
390   var jsonData: String {
391     """
392     {\"hp\":80,\"inventory\":[0,1,2,3,4],\"test\":{\"name\":\"Fred\"},\"testarrayofstring\":[\"test1\",\"test2\"],\"testarrayoftables\":[{\"name\":\"Barney\"},{\"name\":\"Frodo\"},{\"name\":\"Wilma\"}],\"test4\":[{\"a\":30,\"b\":40},{\"a\":10,\"b\":20}],\"testbool\":true,\"test_type\":\"Monster\",\"pos\":{\"y\":2,\"test3\":{\"a\":5,\"b\":6},\"z\":3,\"x\":1,\"test1\":3,\"test2\":\"Green\"},\"name\":\"MyMonster\"}
393     """
394   }
395 }
396