• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2023 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 url = URL(fileURLWithPath: path, isDirectory: true)
38       .appendingPathComponent("monsterdata_test")
39       .appendingPathExtension("mon")
40     let data = try! Data(contentsOf: url)
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     var buffer = bytes.buffer
51     let monster: MyGame_Example_Monster = getRoot(byteBuffer: &buffer)
52     readMonster(monster: monster)
53     mutateMonster(fb: bytes.buffer)
54     readMonster(monster: monster)
55   }
56 
testCreateMonsterResizedBuffernull57   func testCreateMonsterResizedBuffer() {
58     let bytes = createMonster(withPrefix: false)
59     // swiftformat:disable all
60     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])
61     // swiftformat:enable all
62     readVerifiedMonster(fb: bytes.sizedBuffer)
63   }
64 
testCreateMonsterPrefixednull65   func testCreateMonsterPrefixed() {
66     let bytes = createMonster(withPrefix: true)
67     // swiftformat:disable all
68     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])
69     // swiftformat:enable all
70 
71     var buffer = bytes.buffer
72     readMonster(monster: getPrefixedSizeRoot(byteBuffer: &buffer))
73   }
74 
testCreateMonsterUsingCreateMonsterMethodWithNilPosnull75   func testCreateMonsterUsingCreateMonsterMethodWithNilPos() {
76     var fbb = FlatBufferBuilder(initialSize: 1)
77     let name = fbb.create(string: "Frodo")
78     let mStart = Monster.startMonster(&fbb)
79     Monster.add(name: name, &fbb)
80     let root = Monster.endMonster(&fbb, start: mStart)
81     fbb.finish(offset: root)
82     var buffer = fbb.sizedBuffer
83     let newMonster: Monster = getRoot(byteBuffer: &buffer)
84     XCTAssertNil(newMonster.pos)
85     XCTAssertEqual(newMonster.name, "Frodo")
86   }
87 
testCreateMonsterUsingCreateMonsterMethodWithPosXnull88   func testCreateMonsterUsingCreateMonsterMethodWithPosX() {
89     var fbb = FlatBufferBuilder(initialSize: 1)
90     let name = fbb.create(string: "Barney")
91     let mStart = Monster.startMonster(&fbb)
92     Monster.add(
93       pos: MyGame_Example_Vec3(
94         x: 10,
95         y: 0,
96         z: 0,
97         test1: 0,
98         test2: .blue,
99         test3: .init()),
100       &fbb)
101     Monster.add(name: name, &fbb)
102     let root = Monster.endMonster(&fbb, start: mStart)
103     fbb.finish(offset: root)
104 
105     var buffer = fbb.sizedBuffer
106     let newMonster: Monster = getRoot(byteBuffer: &buffer)
107     XCTAssertEqual(newMonster.pos!.x, 10)
108     XCTAssertEqual(newMonster.name, "Barney")
109   }
110 
testReadMonsterFromUnsafePointerWithoutCopyingnull111   func testReadMonsterFromUnsafePointerWithoutCopying() {
112     // swiftformat:disable all
113     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]
114     // swiftformat:enable all
115     let unpacked = array
116       .withUnsafeMutableBytes { memory -> MyGame_Example_MonsterT in
117         var bytes = ByteBuffer(
118           assumingMemoryBound: memory.baseAddress!,
119           capacity: memory.count)
120         var monster: Monster = getRoot(byteBuffer: &bytes)
121         readFlatbufferMonster(monster: &monster)
122         let unpacked = monster.unpack()
123         return unpacked
124       }
125     readObjectApi(monster: unpacked)
126   }
127 
testArrayOfBoolsnull128   func testArrayOfBools() {
129     let boolArray = [false, true, false, true, false, true, false]
130     var fbb = FlatBufferBuilder(initialSize: 1)
131     let name = fbb.create(string: "Frodo")
132     let bools = fbb.createVector(boolArray)
133     let root = Monster.createMonster(
134       &fbb,
135       nameOffset: name,
136       testarrayofboolsVectorOffset: bools)
137     fbb.finish(offset: root)
138     var buffer = fbb.sizedBuffer
139     let monster: Monster = getRoot(byteBuffer: &buffer)
140     let values = monster.testarrayofbools
141 
142     XCTAssertEqual(boolArray, values)
143 
144     for i in 0..<monster.testarrayofboolsCount {
145       XCTAssertEqual(boolArray[Int(i)], monster.testarrayofbools(at: i))
146     }
147   }
148 
readVerifiedMonsternull149   func readVerifiedMonster(fb: ByteBuffer) {
150     var byteBuffer = fb
151     XCTAssertNoThrow(
152       try readMonster(
153         monster: getCheckedRoot(
154           byteBuffer: &byteBuffer) as MyGame_Example_Monster))
155   }
156 
testUnalignedReadnull157   func testUnalignedRead() {
158     // Aligned read
159     let fbb = createMonster(withPrefix: false)
160     let testAligned: () -> Bool = {
161       var buffer = fbb.sizedBuffer
162       var monster: Monster = getRoot(byteBuffer: &buffer)
163       self.readFlatbufferMonster(monster: &monster)
164       return true
165     }
166     XCTAssertEqual(testAligned(), true)
167     let testUnaligned: () -> Bool = {
168       var bytes: [UInt8] = [0x00]
169       bytes.append(contentsOf: fbb.sizedByteArray)
170       return bytes.withUnsafeMutableBytes { ptr in
171         guard var baseAddress = ptr.baseAddress else {
172           XCTFail("Base pointer is not defined")
173           return false
174         }
175         baseAddress = baseAddress.advanced(by: 1)
176         let unlignedPtr = UnsafeMutableRawPointer(baseAddress)
177         var bytes = ByteBuffer(
178           assumingMemoryBound: unlignedPtr,
179           capacity: ptr.count - 1,
180           allowReadingUnalignedBuffers: true)
181         var monster: Monster = getRoot(byteBuffer: &bytes)
182         self.readFlatbufferMonster(monster: &monster)
183         return true
184       }
185     }
186     XCTAssertEqual(testUnaligned(), true)
187   }
188 
testCopyUnalignedToAlignedBuffersnull189   func testCopyUnalignedToAlignedBuffers() {
190     // Aligned read
191     let fbb = createMonster(withPrefix: true)
192     let testUnaligned: () -> Bool = {
193       var bytes: [UInt8] = [0x00]
194       bytes.append(contentsOf: fbb.sizedByteArray)
195       return bytes.withUnsafeMutableBytes { ptr in
196         guard var baseAddress = ptr.baseAddress else {
197           XCTFail("Base pointer is not defined")
198           return false
199         }
200         baseAddress = baseAddress.advanced(by: 1)
201         let unlignedPtr = UnsafeMutableRawPointer(baseAddress)
202         let bytes = ByteBuffer(
203           assumingMemoryBound: unlignedPtr,
204           capacity: ptr.count - 1,
205           allowReadingUnalignedBuffers: false)
206         var newBuf = FlatBuffersUtils.removeSizePrefix(bb: bytes)
207         var monster: Monster = getRoot(byteBuffer: &newBuf)
208         self.readFlatbufferMonster(monster: &monster)
209         return true
210       }
211     }
212     XCTAssertEqual(testUnaligned(), true)
213   }
214 
readMonsternull215   func readMonster(monster: Monster) {
216     var monster = monster
217     readFlatbufferMonster(monster: &monster)
218     let unpacked: MyGame_Example_MonsterT? = monster.unpack()
219     readObjectApi(monster: unpacked!)
220     guard var buffer = unpacked?.serialize()
221     else { fatalError("Couldnt generate bytebuffer") }
222     var newMonster: Monster = getRoot(byteBuffer: &buffer)
223     readFlatbufferMonster(monster: &newMonster)
224   }
225 
createMonsternull226   func createMonster(withPrefix prefix: Bool) -> FlatBufferBuilder {
227     var fbb = FlatBufferBuilder(initialSize: 1)
228     let names = [
229       fbb.create(string: "Frodo"),
230       fbb.create(string: "Barney"),
231       fbb.create(string: "Wilma"),
232     ]
233     var offsets: [Offset] = []
234     let start1 = Monster.startMonster(&fbb)
235     Monster.add(name: names[0], &fbb)
236     offsets.append(Monster.endMonster(&fbb, start: start1))
237     let start2 = Monster.startMonster(&fbb)
238     Monster.add(name: names[1], &fbb)
239     offsets.append(Monster.endMonster(&fbb, start: start2))
240     let start3 = Monster.startMonster(&fbb)
241     Monster.add(name: names[2], &fbb)
242     offsets.append(Monster.endMonster(&fbb, start: start3))
243 
244     let sortedArray = Monster.sortVectorOfMonster(offsets: offsets, &fbb)
245 
246     let str = fbb.create(string: "MyMonster")
247     let test1 = fbb.create(string: "test1")
248     let test2 = fbb.create(string: "test2")
249     let _inv: [Byte] = [0, 1, 2, 3, 4]
250     let inv = fbb.createVector(_inv)
251 
252     let fred = fbb.create(string: "Fred")
253     let mon1Start = Monster.startMonster(&fbb)
254     Monster.add(name: fred, &fbb)
255     let mon2 = Monster.endMonster(&fbb, start: mon1Start)
256 
257     let test4 = fbb.createVector(ofStructs: [
258       MyGame_Example_Test(a: 30, b: 40),
259       MyGame_Example_Test(a: 10, b: 20),
260     ])
261 
262     let stringTestVector = fbb.createVector(ofOffsets: [test1, test2])
263     let mStart = Monster.startMonster(&fbb)
264     Monster.add(
265       pos: MyGame_Example_Vec3(
266         x: 1,
267         y: 2,
268         z: 3,
269         test1: 3,
270         test2: .green,
271         test3: .init(a: 5, b: 6)),
272       &fbb)
273     Monster.add(hp: 80, &fbb)
274     Monster.add(name: str, &fbb)
275     Monster.addVectorOf(inventory: inv, &fbb)
276     Monster.add(testType: .monster, &fbb)
277     Monster.add(test: mon2, &fbb)
278     Monster.addVectorOf(test4: test4, &fbb)
279     Monster.addVectorOf(testarrayofstring: stringTestVector, &fbb)
280     Monster.add(testbool: true, &fbb)
281     Monster.addVectorOf(testarrayoftables: sortedArray, &fbb)
282     let end = Monster.endMonster(&fbb, start: mStart)
283     Monster.finish(&fbb, end: end, prefix: prefix)
284     return fbb
285   }
286 
mutateMonsternull287   func mutateMonster(fb: ByteBuffer) {
288     var fb = fb
289     let monster: Monster = getRoot(byteBuffer: &fb)
290     XCTAssertFalse(monster.mutate(mana: 10))
291     XCTAssertEqual(monster.testarrayoftables(at: 0)?.name, "Barney")
292     XCTAssertEqual(monster.testarrayoftables(at: 1)?.name, "Frodo")
293     XCTAssertEqual(monster.testarrayoftables(at: 2)?.name, "Wilma")
294 
295     // Example of searching for a table by the key
296     XCTAssertNotNil(monster.testarrayoftablesBy(key: "Frodo"))
297     XCTAssertNotNil(monster.testarrayoftablesBy(key: "Barney"))
298     XCTAssertNotNil(monster.testarrayoftablesBy(key: "Wilma"))
299 
300     XCTAssertEqual(monster.testType, .monster)
301 
302     XCTAssertEqual(monster.mutate(inventory: 1, at: 0), true)
303     XCTAssertEqual(monster.mutate(inventory: 2, at: 1), true)
304     XCTAssertEqual(monster.mutate(inventory: 3, at: 2), true)
305     XCTAssertEqual(monster.mutate(inventory: 4, at: 3), true)
306     XCTAssertEqual(monster.mutate(inventory: 5, at: 4), true)
307 
308     for i in 0..<monster.inventoryCount {
309       XCTAssertEqual(monster.inventory(at: i), Byte(i + 1))
310     }
311 
312     XCTAssertEqual(monster.mutate(inventory: 0, at: 0), true)
313     XCTAssertEqual(monster.mutate(inventory: 1, at: 1), true)
314     XCTAssertEqual(monster.mutate(inventory: 2, at: 2), true)
315     XCTAssertEqual(monster.mutate(inventory: 3, at: 3), true)
316     XCTAssertEqual(monster.mutate(inventory: 4, at: 4), true)
317 
318     let vec = monster.mutablePos
319     XCTAssertEqual(vec?.x, 1)
320     XCTAssertTrue(vec?.mutate(x: 55.0) ?? false)
321     XCTAssertTrue(vec?.mutate(test1: 55) ?? false)
322     XCTAssertEqual(vec?.x, 55.0)
323     XCTAssertEqual(vec?.test1, 55.0)
324     XCTAssertTrue(vec?.mutate(x: 1) ?? false)
325     XCTAssertEqual(vec?.x, 1)
326     XCTAssertTrue(vec?.mutate(test1: 3) ?? false)
327   }
328 
readFlatbufferMonsternull329   func readFlatbufferMonster(monster: inout MyGame_Example_Monster) {
330     XCTAssertEqual(monster.hp, 80)
331     XCTAssertEqual(monster.mana, 150)
332     XCTAssertEqual(monster.name, "MyMonster")
333     let pos = monster.pos
334     XCTAssertEqual(pos?.x, 1)
335     XCTAssertEqual(pos?.y, 2)
336     XCTAssertEqual(pos?.z, 3)
337     XCTAssertEqual(pos?.test1, 3)
338     XCTAssertEqual(pos?.test2, .green)
339     let test = pos?.test3
340     XCTAssertEqual(test?.a, 5)
341     XCTAssertEqual(test?.b, 6)
342     XCTAssertEqual(monster.testType, .monster)
343     let monster2 = monster.test(type: Monster.self)
344     XCTAssertEqual(monster2?.name, "Fred")
345 
346     XCTAssertEqual(monster.mutate(mana: 10), false)
347 
348     XCTAssertEqual(monster.mana, 150)
349     XCTAssertEqual(monster.inventoryCount, 5)
350     var sum: Byte = 0
351     for i in 0...monster.inventoryCount {
352       sum += monster.inventory(at: i)
353     }
354     XCTAssertEqual(sum, 10)
355     XCTAssertEqual(monster.test4Count, 2)
356 
357     let test0 = monster.test4(at: 0)
358     let test1 = monster.test4(at: 1)
359     var sum0 = 0
360     var sum1 = 0
361     if let a = test0?.a, let b = test0?.b {
362       sum0 = Int(a) + Int(b)
363     }
364     if let a = test1?.a, let b = test1?.b {
365       sum1 = Int(a) + Int(b)
366     }
367     XCTAssertEqual(sum0 + sum1, 100)
368 
369     let mutableTest0 = monster.mutableTest4(at: 0)
370     let mutableTest1 = monster.mutableTest4(at: 1)
371     var sum2 = 0
372     var sum3 = 0
373     if let a = mutableTest0?.a, let b = mutableTest0?.b {
374       sum2 = Int(a) + Int(b)
375     }
376     if let a = mutableTest1?.a, let b = mutableTest1?.b {
377       sum3 = Int(a) + Int(b)
378     }
379     XCTAssertEqual(sum2 + sum3, 100)
380 
381     XCTAssertEqual(monster.testarrayofstringCount, 2)
382     XCTAssertEqual(monster.testarrayofstring(at: 0), "test1")
383     XCTAssertEqual(monster.testarrayofstring(at: 1), "test2")
384     XCTAssertEqual(monster.testbool, true)
385 
386     let array = monster.nameSegmentArray
387     XCTAssertEqual(String(bytes: array ?? [], encoding: .utf8), "MyMonster")
388 
389     if 0 == monster.testarrayofboolsCount  {
390       XCTAssertEqual(monster.testarrayofbools.isEmpty, true)
391     } else {
392       XCTAssertEqual(monster.testarrayofbools.isEmpty, false)
393     }
394   }
395 
readObjectApinull396   func readObjectApi(monster: MyGame_Example_MonsterT) {
397     XCTAssertEqual(monster.hp, 80)
398     XCTAssertEqual(monster.mana, 150)
399     XCTAssertEqual(monster.name, "MyMonster")
400     let pos = monster.pos
401     XCTAssertEqual(pos?.x, 1)
402     XCTAssertEqual(pos?.y, 2)
403     XCTAssertEqual(pos?.z, 3)
404     XCTAssertEqual(pos?.test1, 3)
405     XCTAssertEqual(pos?.test2, .green)
406     let test = pos?.test3
407     XCTAssertEqual(test?.a, 5)
408     XCTAssertEqual(test?.b, 6)
409     let monster2 = monster.test?.value as? MyGame_Example_MonsterT
410     XCTAssertEqual(monster2?.name, "Fred")
411     XCTAssertEqual(monster.mana, 150)
412     monster.mana = 10
413     XCTAssertEqual(monster.mana, 10)
414     monster.mana = 150
415     XCTAssertEqual(monster.mana, 150)
416 
417     XCTAssertEqual(monster.inventory.count, 5)
418     var sum: Byte = 0
419     for i in monster.inventory {
420       sum += i
421     }
422     XCTAssertEqual(sum, 10)
423     XCTAssertEqual(monster.test4.count, 2)
424     let test0 = monster.test4[0]
425     let test1 = monster.test4[1]
426     var sum0 = 0
427     var sum1 = 0
428     if let a = test0?.a, let b = test0?.b {
429       sum0 = Int(a) + Int(b)
430     }
431     if let a = test1?.a, let b = test1?.b {
432       sum1 = Int(a) + Int(b)
433     }
434     XCTAssertEqual(sum0 + sum1, 100)
435     XCTAssertEqual(monster.testbool, true)
436   }
437 
testEncodingnull438   func testEncoding() {
439     let fbb = createMonster(withPrefix: false)
440     var sizedBuffer = fbb.sizedBuffer
441     do {
442       struct Test: Decodable {
443         struct Pos: Decodable {
444           let x, y, z: Int
445         }
446         let hp: Int
447         let inventory: [UInt8]
448         let name: String
449         let pos: Pos
450       }
451       let reader: Monster = try getCheckedRoot(byteBuffer: &sizedBuffer)
452       let encoder = JSONEncoder()
453       encoder.keyEncodingStrategy = .convertToSnakeCase
454       let data = try encoder.encode(reader)
455       let decoder = JSONDecoder()
456       decoder.keyDecodingStrategy = .convertFromSnakeCase
457       let value = try decoder.decode(Test.self, from: data)
458       XCTAssertEqual(value.name, "MyMonster")
459       XCTAssertEqual(value.pos.x, 1)
460       XCTAssertEqual(value.pos.y, 2)
461       XCTAssertEqual(value.pos.z, 3)
462     } catch {
463       XCTFail(error.localizedDescription)
464     }
465   }
466 
467   var jsonData: String {
468     """
469     {\"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\"}
470     """
471   }
472 
473   private var path: String {
474     #if os(macOS)
475     // Gets the current path of this test file then
476     // strips out the nested directories.
477     let filePath = URL(filePath: #file)
478       .deletingLastPathComponent()
479       .deletingLastPathComponent()
480       .deletingLastPathComponent()
481     return filePath.absoluteString
482     #else
483     return FileManager.default.currentDirectoryPath
484     #endif
485   }
486 
testContiguousBytesnull487   func testContiguousBytes() {
488     let byteArray: [UInt8] = [3, 1, 4, 1, 5, 9]
489     var fbb = FlatBufferBuilder(initialSize: 1)
490     let name = fbb.create(string: "Frodo")
491     let bytes = fbb.createVector(bytes: byteArray)
492     let root = Monster.createMonster(
493       &fbb,
494       nameOffset: name,
495       inventoryVectorOffset: bytes)
496     fbb.finish(offset: root)
497     var buffer = fbb.sizedBuffer
498     let monster: Monster = getRoot(byteBuffer: &buffer)
499     let values = monster.inventory
500 
501     XCTAssertEqual(byteArray, values)
502   }
503 
504 }
505