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