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 XCTest
18*890232f2SAndroid Build Coastguard Worker @testable import FlatBuffers
19*890232f2SAndroid Build Coastguard Worker 
20*890232f2SAndroid Build Coastguard Worker final class FlatBuffersUnionTests: XCTestCase {
21*890232f2SAndroid Build Coastguard Worker 
testCreateMonstornull22*890232f2SAndroid Build Coastguard Worker   func testCreateMonstor() {
23*890232f2SAndroid Build Coastguard Worker 
24*890232f2SAndroid Build Coastguard Worker     var b = FlatBufferBuilder(initialSize: 20)
25*890232f2SAndroid Build Coastguard Worker     let dmg: Int16 = 5
26*890232f2SAndroid Build Coastguard Worker     let str = "Axe"
27*890232f2SAndroid Build Coastguard Worker     let axe = b.create(string: str)
28*890232f2SAndroid Build Coastguard Worker     let weapon = Weapon.createWeapon(builder: &b, offset: axe, dmg: dmg)
29*890232f2SAndroid Build Coastguard Worker     let weapons = b.createVector(ofOffsets: [weapon])
30*890232f2SAndroid Build Coastguard Worker     let root = LocalMonster.createMonster(
31*890232f2SAndroid Build Coastguard Worker       builder: &b,
32*890232f2SAndroid Build Coastguard Worker       offset: weapons,
33*890232f2SAndroid Build Coastguard Worker       equipment: .Weapon,
34*890232f2SAndroid Build Coastguard Worker       equippedOffset: weapon.o)
35*890232f2SAndroid Build Coastguard Worker     b.finish(offset: root)
36*890232f2SAndroid Build Coastguard Worker     let buffer = b.sizedByteArray
37*890232f2SAndroid Build Coastguard Worker     // swiftformat:disable all
38*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(buffer, [16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 8, 0, 7, 0, 12, 0, 10, 0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 20, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 8, 0, 12, 0, 8, 0, 6, 0, 8, 0, 0, 0, 0, 0, 5, 0, 4, 0, 0, 0, 3, 0, 0, 0, 65, 120, 101, 0])
39*890232f2SAndroid Build Coastguard Worker     // swiftformat:enable all
40*890232f2SAndroid Build Coastguard Worker     let monster = LocalMonster.getRootAsMonster(bb: ByteBuffer(bytes: buffer))
41*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(monster.weapon(at: 0)?.dmg, dmg)
42*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(monster.weapon(at: 0)?.name, str)
43*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(monster.weapon(at: 0)?.nameVector, [65, 120, 101])
44*890232f2SAndroid Build Coastguard Worker     let p: Weapon? = monster.equiped()
45*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(p?.dmg, dmg)
46*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(p?.name, str)
47*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(p?.nameVector, [65, 120, 101])
48*890232f2SAndroid Build Coastguard Worker   }
49*890232f2SAndroid Build Coastguard Worker 
testEndTableFinishnull50*890232f2SAndroid Build Coastguard Worker   func testEndTableFinish() {
51*890232f2SAndroid Build Coastguard Worker     var builder = FlatBufferBuilder(initialSize: 20)
52*890232f2SAndroid Build Coastguard Worker     let sword = builder.create(string: "Sword")
53*890232f2SAndroid Build Coastguard Worker     let axe = builder.create(string: "Axe")
54*890232f2SAndroid Build Coastguard Worker     let weaponOne = Weapon.createWeapon(
55*890232f2SAndroid Build Coastguard Worker       builder: &builder,
56*890232f2SAndroid Build Coastguard Worker       offset: sword,
57*890232f2SAndroid Build Coastguard Worker       dmg: 3)
58*890232f2SAndroid Build Coastguard Worker     let weaponTwo = Weapon.createWeapon(builder: &builder, offset: axe, dmg: 5)
59*890232f2SAndroid Build Coastguard Worker     let name = builder.create(string: "Orc")
60*890232f2SAndroid Build Coastguard Worker     let inventory: [UInt8] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
61*890232f2SAndroid Build Coastguard Worker     let inv = builder.createVector(inventory, size: 10)
62*890232f2SAndroid Build Coastguard Worker     let weapons = builder.createVector(ofOffsets: [weaponOne, weaponTwo])
63*890232f2SAndroid Build Coastguard Worker     let path = builder.createVector(ofStructs: [
64*890232f2SAndroid Build Coastguard Worker       Vec(x: 4.0, y: 5.0, z: 6.0),
65*890232f2SAndroid Build Coastguard Worker       Vec(x: 1.0, y: 2.0, z: 3.0),
66*890232f2SAndroid Build Coastguard Worker     ])
67*890232f2SAndroid Build Coastguard Worker     let orc = FinalMonster.createMonster(
68*890232f2SAndroid Build Coastguard Worker       builder: &builder,
69*890232f2SAndroid Build Coastguard Worker       position: Vec(x: 1, y: 2, z: 3),
70*890232f2SAndroid Build Coastguard Worker       hp: 300,
71*890232f2SAndroid Build Coastguard Worker       name: name,
72*890232f2SAndroid Build Coastguard Worker       inventory: inv,
73*890232f2SAndroid Build Coastguard Worker       color: .red,
74*890232f2SAndroid Build Coastguard Worker       weapons: weapons,
75*890232f2SAndroid Build Coastguard Worker       equipment: .Weapon,
76*890232f2SAndroid Build Coastguard Worker       equippedOffset: weaponTwo,
77*890232f2SAndroid Build Coastguard Worker       path: path)
78*890232f2SAndroid Build Coastguard Worker     builder.finish(offset: orc)
79*890232f2SAndroid Build Coastguard Worker     // swiftformat:disable all
80*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(builder.sizedByteArray, [32, 0, 0, 0, 0, 0, 26, 0, 48, 0, 36, 0, 0, 0, 34, 0, 28, 0, 0, 0, 24, 0, 23, 0, 16, 0, 15, 0, 8, 0, 4, 0, 26, 0, 0, 0, 44, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 76, 0, 0, 0, 0, 0, 44, 1, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 0, 0, 0, 0, 128, 64, 0, 0, 160, 64, 0, 0, 192, 64, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 0, 0, 52, 0, 0, 0, 28, 0, 0, 0, 10, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 3, 0, 0, 0, 79, 114, 99, 0, 244, 255, 255, 255, 0, 0, 5, 0, 24, 0, 0, 0, 8, 0, 12, 0, 8, 0, 6, 0, 8, 0, 0, 0, 0, 0, 3, 0, 12, 0, 0, 0, 3, 0, 0, 0, 65, 120, 101, 0, 5, 0, 0, 0, 83, 119, 111, 114, 100, 0, 0, 0])
81*890232f2SAndroid Build Coastguard Worker     // swiftformat:enable all
82*890232f2SAndroid Build Coastguard Worker   }
83*890232f2SAndroid Build Coastguard Worker 
testEnumVectornull84*890232f2SAndroid Build Coastguard Worker   func testEnumVector() {
85*890232f2SAndroid Build Coastguard Worker     let vectorOfEnums: [ColorsNameSpace.RGB] = [.blue, .green]
86*890232f2SAndroid Build Coastguard Worker 
87*890232f2SAndroid Build Coastguard Worker     var builder = FlatBufferBuilder(initialSize: 1)
88*890232f2SAndroid Build Coastguard Worker     let off = builder.createVector(vectorOfEnums)
89*890232f2SAndroid Build Coastguard Worker     let start = ColorsNameSpace.Monster.startMonster(&builder)
90*890232f2SAndroid Build Coastguard Worker     ColorsNameSpace.Monster.add(colors: off, &builder)
91*890232f2SAndroid Build Coastguard Worker     let end = ColorsNameSpace.Monster.endMonster(&builder, start: start)
92*890232f2SAndroid Build Coastguard Worker     builder.finish(offset: end)
93*890232f2SAndroid Build Coastguard Worker     // swiftformat:disable all
94*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(builder.sizedByteArray, [12, 0, 0, 0, 0, 0, 6, 0, 8, 0, 4, 0, 6, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0])
95*890232f2SAndroid Build Coastguard Worker     // swiftformat:enable all
96*890232f2SAndroid Build Coastguard Worker     let monster = ColorsNameSpace.Monster.getRootAsMonster(bb: builder.buffer)
97*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(monster.colorsCount, 2)
98*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(monster.colors(at: 0), .blue)
99*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(monster.colors(at: 1), .green)
100*890232f2SAndroid Build Coastguard Worker   }
101*890232f2SAndroid Build Coastguard Worker 
testUnionVectornull102*890232f2SAndroid Build Coastguard Worker   func testUnionVector() {
103*890232f2SAndroid Build Coastguard Worker     var fb = FlatBufferBuilder()
104*890232f2SAndroid Build Coastguard Worker 
105*890232f2SAndroid Build Coastguard Worker     let swordDmg: Int32 = 8
106*890232f2SAndroid Build Coastguard Worker     let attackStart = Attacker.startAttacker(&fb)
107*890232f2SAndroid Build Coastguard Worker     Attacker.add(swordAttackDamage: swordDmg, &fb)
108*890232f2SAndroid Build Coastguard Worker     let attack = Attacker.endAttacker(&fb, start: attackStart)
109*890232f2SAndroid Build Coastguard Worker 
110*890232f2SAndroid Build Coastguard Worker     let characterType: [Character] = [.belle, .mulan, .bookfan]
111*890232f2SAndroid Build Coastguard Worker 
112*890232f2SAndroid Build Coastguard Worker     let characters = [
113*890232f2SAndroid Build Coastguard Worker       fb.create(struct: BookReader(booksRead: 7)),
114*890232f2SAndroid Build Coastguard Worker       attack,
115*890232f2SAndroid Build Coastguard Worker       fb.create(struct: BookReader(booksRead: 2)),
116*890232f2SAndroid Build Coastguard Worker     ]
117*890232f2SAndroid Build Coastguard Worker     let types = fb.createVector(characterType)
118*890232f2SAndroid Build Coastguard Worker     let characterVector = fb.createVector(ofOffsets: characters)
119*890232f2SAndroid Build Coastguard Worker     let end = Movie.createMovie(
120*890232f2SAndroid Build Coastguard Worker       &fb,
121*890232f2SAndroid Build Coastguard Worker       charactersTypeVectorOffset: types,
122*890232f2SAndroid Build Coastguard Worker       charactersVectorOffset: characterVector)
123*890232f2SAndroid Build Coastguard Worker     Movie.finish(&fb, end: end)
124*890232f2SAndroid Build Coastguard Worker 
125*890232f2SAndroid Build Coastguard Worker     var movie = Movie.getRootAsMovie(bb: fb.buffer)
126*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(movie.charactersTypeCount, Int32(characterType.count))
127*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(movie.charactersCount, Int32(characters.count))
128*890232f2SAndroid Build Coastguard Worker 
129*890232f2SAndroid Build Coastguard Worker     for i in 0..<movie.charactersTypeCount {
130*890232f2SAndroid Build Coastguard Worker       XCTAssertEqual(movie.charactersType(at: i), characterType[Int(i)])
131*890232f2SAndroid Build Coastguard Worker     }
132*890232f2SAndroid Build Coastguard Worker 
133*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(
134*890232f2SAndroid Build Coastguard Worker       movie.characters(at: 0, type: BookReader_Mutable.self)?.booksRead,
135*890232f2SAndroid Build Coastguard Worker       7)
136*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(
137*890232f2SAndroid Build Coastguard Worker       movie.characters(at: 1, type: Attacker.self)?.swordAttackDamage,
138*890232f2SAndroid Build Coastguard Worker       swordDmg)
139*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(
140*890232f2SAndroid Build Coastguard Worker       movie.characters(at: 2, type: BookReader_Mutable.self)?.booksRead,
141*890232f2SAndroid Build Coastguard Worker       2)
142*890232f2SAndroid Build Coastguard Worker 
143*890232f2SAndroid Build Coastguard Worker     var objc: MovieT? = movie.unpack()
144*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(
145*890232f2SAndroid Build Coastguard Worker       movie.charactersTypeCount,
146*890232f2SAndroid Build Coastguard Worker       Int32(objc?.characters.count ?? 0))
147*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(
148*890232f2SAndroid Build Coastguard Worker       movie.characters(at: 0, type: BookReader_Mutable.self)?.booksRead,
149*890232f2SAndroid Build Coastguard Worker       (objc?.characters[0]?.value as? BookReader)?.booksRead)
150*890232f2SAndroid Build Coastguard Worker     fb.clear()
151*890232f2SAndroid Build Coastguard Worker     let newMovie = Movie.pack(&fb, obj: &objc)
152*890232f2SAndroid Build Coastguard Worker     fb.finish(offset: newMovie)
153*890232f2SAndroid Build Coastguard Worker 
154*890232f2SAndroid Build Coastguard Worker     let packedMovie = Movie.getRootAsMovie(bb: fb.buffer)
155*890232f2SAndroid Build Coastguard Worker 
156*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(
157*890232f2SAndroid Build Coastguard Worker       packedMovie.characters(at: 0, type: BookReader_Mutable.self)?.booksRead,
158*890232f2SAndroid Build Coastguard Worker       movie.characters(at: 0, type: BookReader_Mutable.self)?.booksRead)
159*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(
160*890232f2SAndroid Build Coastguard Worker       packedMovie.characters(at: 1, type: Attacker.self)?.swordAttackDamage,
161*890232f2SAndroid Build Coastguard Worker       movie.characters(at: 1, type: Attacker.self)?.swordAttackDamage)
162*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(
163*890232f2SAndroid Build Coastguard Worker       packedMovie.characters(at: 2, type: BookReader_Mutable.self)?.booksRead,
164*890232f2SAndroid Build Coastguard Worker       movie.characters(at: 2, type: BookReader_Mutable.self)?.booksRead)
165*890232f2SAndroid Build Coastguard Worker   }
166*890232f2SAndroid Build Coastguard Worker 
testStringUnionnull167*890232f2SAndroid Build Coastguard Worker   func testStringUnion() {
168*890232f2SAndroid Build Coastguard Worker     let string = "Awesome \\\\t\t\nstring!"
169*890232f2SAndroid Build Coastguard Worker     var fb = FlatBufferBuilder()
170*890232f2SAndroid Build Coastguard Worker     let stringOffset = fb.create(string: string)
171*890232f2SAndroid Build Coastguard Worker     let characterType: [Character] = [.bookfan, .other]
172*890232f2SAndroid Build Coastguard Worker 
173*890232f2SAndroid Build Coastguard Worker     let characters = [
174*890232f2SAndroid Build Coastguard Worker       fb.create(struct: BookReader(booksRead: 7)),
175*890232f2SAndroid Build Coastguard Worker       stringOffset,
176*890232f2SAndroid Build Coastguard Worker     ]
177*890232f2SAndroid Build Coastguard Worker     let types = fb.createVector(characterType)
178*890232f2SAndroid Build Coastguard Worker     let characterVector = fb.createVector(ofOffsets: characters)
179*890232f2SAndroid Build Coastguard Worker 
180*890232f2SAndroid Build Coastguard Worker     let end = Movie.createMovie(
181*890232f2SAndroid Build Coastguard Worker       &fb,
182*890232f2SAndroid Build Coastguard Worker       mainCharacterType: .other,
183*890232f2SAndroid Build Coastguard Worker       mainCharacterOffset: Offset(offset: stringOffset.o),
184*890232f2SAndroid Build Coastguard Worker       charactersTypeVectorOffset: types,
185*890232f2SAndroid Build Coastguard Worker       charactersVectorOffset: characterVector)
186*890232f2SAndroid Build Coastguard Worker     Movie.finish(&fb, end: end)
187*890232f2SAndroid Build Coastguard Worker 
188*890232f2SAndroid Build Coastguard Worker     var movie = Movie.getRootAsMovie(bb: fb.sizedBuffer)
189*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(movie.mainCharacter(type: String.self), string)
190*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(
191*890232f2SAndroid Build Coastguard Worker       movie.characters(at: 0, type: BookReader_Mutable.self)?.booksRead,
192*890232f2SAndroid Build Coastguard Worker       7)
193*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(movie.characters(at: 1, type: String.self), string)
194*890232f2SAndroid Build Coastguard Worker 
195*890232f2SAndroid Build Coastguard Worker     var objc: MovieT? = movie.unpack()
196*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(objc?.mainCharacter?.value as? String, string)
197*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual((objc?.characters[0]?.value as? BookReader)?.booksRead, 7)
198*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(objc?.characters[1]?.value as? String, string)
199*890232f2SAndroid Build Coastguard Worker     fb.clear()
200*890232f2SAndroid Build Coastguard Worker     let newMovie = Movie.pack(&fb, obj: &objc)
201*890232f2SAndroid Build Coastguard Worker     fb.finish(offset: newMovie)
202*890232f2SAndroid Build Coastguard Worker 
203*890232f2SAndroid Build Coastguard Worker     let packedMovie = Movie.getRootAsMovie(bb: fb.buffer)
204*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(packedMovie.mainCharacter(type: String.self), string)
205*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(
206*890232f2SAndroid Build Coastguard Worker       packedMovie.characters(at: 0, type: BookReader_Mutable.self)?.booksRead,
207*890232f2SAndroid Build Coastguard Worker       7)
208*890232f2SAndroid Build Coastguard Worker     XCTAssertEqual(packedMovie.characters(at: 1, type: String.self), string)
209*890232f2SAndroid Build Coastguard Worker   }
210*890232f2SAndroid Build Coastguard Worker 
testEncodingnull211*890232f2SAndroid Build Coastguard Worker   func testEncoding() {
212*890232f2SAndroid Build Coastguard Worker     let string = "Awesome \\\\t\t\nstring!"
213*890232f2SAndroid Build Coastguard Worker     var fb = FlatBufferBuilder()
214*890232f2SAndroid Build Coastguard Worker 
215*890232f2SAndroid Build Coastguard Worker     let stringOffset = fb.create(string: string)
216*890232f2SAndroid Build Coastguard Worker 
217*890232f2SAndroid Build Coastguard Worker     let swordDmg: Int32 = 8
218*890232f2SAndroid Build Coastguard Worker     let attackStart = Attacker.startAttacker(&fb)
219*890232f2SAndroid Build Coastguard Worker     Attacker.add(swordAttackDamage: swordDmg, &fb)
220*890232f2SAndroid Build Coastguard Worker     let attack = Attacker.endAttacker(&fb, start: attackStart)
221*890232f2SAndroid Build Coastguard Worker 
222*890232f2SAndroid Build Coastguard Worker     let characterType: [Character] = [.belle, .mulan, .bookfan, .other]
223*890232f2SAndroid Build Coastguard Worker 
224*890232f2SAndroid Build Coastguard Worker     let characters = [
225*890232f2SAndroid Build Coastguard Worker       fb.create(struct: BookReader(booksRead: 7)),
226*890232f2SAndroid Build Coastguard Worker       attack,
227*890232f2SAndroid Build Coastguard Worker       fb.create(struct: BookReader(booksRead: 2)),
228*890232f2SAndroid Build Coastguard Worker       stringOffset,
229*890232f2SAndroid Build Coastguard Worker     ]
230*890232f2SAndroid Build Coastguard Worker     let types = fb.createVector(characterType)
231*890232f2SAndroid Build Coastguard Worker     let characterVector = fb.createVector(ofOffsets: characters)
232*890232f2SAndroid Build Coastguard Worker     let end = Movie.createMovie(
233*890232f2SAndroid Build Coastguard Worker       &fb,
234*890232f2SAndroid Build Coastguard Worker       charactersTypeVectorOffset: types,
235*890232f2SAndroid Build Coastguard Worker       charactersVectorOffset: characterVector)
236*890232f2SAndroid Build Coastguard Worker     Movie.finish(&fb, end: end)
237*890232f2SAndroid Build Coastguard Worker 
238*890232f2SAndroid Build Coastguard Worker     var sizedBuffer = fb.sizedBuffer
239*890232f2SAndroid Build Coastguard Worker     do {
240*890232f2SAndroid Build Coastguard Worker       let reader: Movie = try getCheckedRoot(byteBuffer: &sizedBuffer)
241*890232f2SAndroid Build Coastguard Worker       let encoder = JSONEncoder()
242*890232f2SAndroid Build Coastguard Worker       encoder.keyEncodingStrategy = .convertToSnakeCase
243*890232f2SAndroid Build Coastguard Worker       let data = try encoder.encode(reader)
244*890232f2SAndroid Build Coastguard Worker       XCTAssertEqual(data, jsonData.data(using: .utf8))
245*890232f2SAndroid Build Coastguard Worker     } catch {
246*890232f2SAndroid Build Coastguard Worker       XCTFail(error.localizedDescription)
247*890232f2SAndroid Build Coastguard Worker     }
248*890232f2SAndroid Build Coastguard Worker   }
249*890232f2SAndroid Build Coastguard Worker 
250*890232f2SAndroid Build Coastguard Worker   var jsonData: String {
251*890232f2SAndroid Build Coastguard Worker     "{\"characters_type\":[\"Belle\",\"MuLan\",\"BookFan\",\"Other\"],\"characters\":[{\"books_read\":7},{\"sword_attack_damage\":8},{\"books_read\":2},\"Awesome \\\\\\\\t\\t\\nstring!\"]}"
252*890232f2SAndroid Build Coastguard Worker   }
253*890232f2SAndroid Build Coastguard Worker }
254*890232f2SAndroid Build Coastguard Worker 
255*890232f2SAndroid Build Coastguard Worker public enum ColorsNameSpace {
256*890232f2SAndroid Build Coastguard Worker 
257*890232f2SAndroid Build Coastguard Worker   enum RGB: Int32, Enum {
258*890232f2SAndroid Build Coastguard Worker     typealias T = Int32
259*890232f2SAndroid Build Coastguard Worker     static var byteSize: Int { MemoryLayout<Int32>.size }
260*890232f2SAndroid Build Coastguard Worker     var value: Int32 { rawValue }
261*890232f2SAndroid Build Coastguard Worker     case red = 0, green = 1, blue = 2
262*890232f2SAndroid Build Coastguard Worker   }
263*890232f2SAndroid Build Coastguard Worker 
264*890232f2SAndroid Build Coastguard Worker   struct Monster: FlatBufferObject {
265*890232f2SAndroid Build Coastguard Worker     var __buffer: ByteBuffer! { _accessor.bb }
266*890232f2SAndroid Build Coastguard Worker 
267*890232f2SAndroid Build Coastguard Worker     private var _accessor: Table
getRootAsMonsternull268*890232f2SAndroid Build Coastguard Worker     static func getRootAsMonster(bb: ByteBuffer) -> Monster { Monster(Table(
269*890232f2SAndroid Build Coastguard Worker       bb: bb,
270*890232f2SAndroid Build Coastguard Worker       position: Int32(bb.read(def: UOffset.self, position: bb.reader)) +
271*890232f2SAndroid Build Coastguard Worker         Int32(bb.reader))) }
272*890232f2SAndroid Build Coastguard Worker 
273*890232f2SAndroid Build Coastguard Worker     init(_ t: Table) { _accessor = t }
274*890232f2SAndroid Build Coastguard Worker     init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
275*890232f2SAndroid Build Coastguard Worker 
276*890232f2SAndroid Build Coastguard Worker     public var colorsCount: Int32 {
277*890232f2SAndroid Build Coastguard Worker       let o = _accessor.offset(4); return o == 0 ? 0 : _accessor
278*890232f2SAndroid Build Coastguard Worker         .vector(count: o) }
colorsnull279*890232f2SAndroid Build Coastguard Worker     public func colors(at index: Int32) -> ColorsNameSpace
280*890232f2SAndroid Build Coastguard Worker       .RGB?
281*890232f2SAndroid Build Coastguard Worker     { let o = _accessor.offset(4); return o == 0 ? ColorsNameSpace
282*890232f2SAndroid Build Coastguard Worker       .RGB(rawValue: 0)! : ColorsNameSpace.RGB(rawValue: _accessor.directRead(
283*890232f2SAndroid Build Coastguard Worker         of: Int32.self,
284*890232f2SAndroid Build Coastguard Worker         offset: _accessor.vector(at: o) + index * 4)) }
startMonsternull285*890232f2SAndroid Build Coastguard Worker     static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb
286*890232f2SAndroid Build Coastguard Worker       .startTable(with: 1) }
addnull287*890232f2SAndroid Build Coastguard Worker     static func add(colors: Offset, _ fbb: inout FlatBufferBuilder) { fbb.add(
288*890232f2SAndroid Build Coastguard Worker       offset: colors,
289*890232f2SAndroid Build Coastguard Worker       at: 4)  }
290*890232f2SAndroid Build Coastguard Worker     static func endMonster(
291*890232f2SAndroid Build Coastguard Worker       _ fbb: inout FlatBufferBuilder,
292*890232f2SAndroid Build Coastguard Worker       start: UOffset)
293*890232f2SAndroid Build Coastguard Worker       -> Offset
294*890232f2SAndroid Build Coastguard Worker     { let end = Offset(offset: fbb.endTable(at: start)); return end
295*890232f2SAndroid Build Coastguard Worker     }
296*890232f2SAndroid Build Coastguard Worker   }
297*890232f2SAndroid Build Coastguard Worker }
298*890232f2SAndroid Build Coastguard Worker 
299*890232f2SAndroid Build Coastguard Worker 
300*890232f2SAndroid Build Coastguard Worker enum Equipment: Byte { case none, Weapon }
301*890232f2SAndroid Build Coastguard Worker 
302*890232f2SAndroid Build Coastguard Worker enum Color3: Int8 { case red = 0, green, blue }
303*890232f2SAndroid Build Coastguard Worker 
304*890232f2SAndroid Build Coastguard Worker struct FinalMonster {
305*890232f2SAndroid Build Coastguard Worker 
306*890232f2SAndroid Build Coastguard Worker   @inlinable
307*890232f2SAndroid Build Coastguard Worker   static func createMonster(
308*890232f2SAndroid Build Coastguard Worker     builder: inout FlatBufferBuilder,
309*890232f2SAndroid Build Coastguard Worker     position: Vec,
310*890232f2SAndroid Build Coastguard Worker     hp: Int16,
311*890232f2SAndroid Build Coastguard Worker     name: Offset,
312*890232f2SAndroid Build Coastguard Worker     inventory: Offset,
313*890232f2SAndroid Build Coastguard Worker     color: Color3,
314*890232f2SAndroid Build Coastguard Worker     weapons: Offset,
315*890232f2SAndroid Build Coastguard Worker     equipment: Equipment = .none,
316*890232f2SAndroid Build Coastguard Worker     equippedOffset: Offset,
317*890232f2SAndroid Build Coastguard Worker     path: Offset) -> Offset
318*890232f2SAndroid Build Coastguard Worker   {
319*890232f2SAndroid Build Coastguard Worker     let start = builder.startTable(with: 11)
320*890232f2SAndroid Build Coastguard Worker     builder.create(struct: position, position: 4)
321*890232f2SAndroid Build Coastguard Worker     builder.add(element: hp, def: 100, at: 8)
322*890232f2SAndroid Build Coastguard Worker     builder.add(offset: name, at: 10)
323*890232f2SAndroid Build Coastguard Worker     builder.add(offset: inventory, at: 14)
324*890232f2SAndroid Build Coastguard Worker     builder.add(element: color.rawValue, def: Color3.green.rawValue, at: 16)
325*890232f2SAndroid Build Coastguard Worker     builder.add(offset: weapons, at: 18)
326*890232f2SAndroid Build Coastguard Worker     builder.add(
327*890232f2SAndroid Build Coastguard Worker       element: equipment.rawValue,
328*890232f2SAndroid Build Coastguard Worker       def: Equipment.none.rawValue,
329*890232f2SAndroid Build Coastguard Worker       at: 20)
330*890232f2SAndroid Build Coastguard Worker     builder.add(offset: equippedOffset, at: 22)
331*890232f2SAndroid Build Coastguard Worker     builder.add(offset: path, at: 24)
332*890232f2SAndroid Build Coastguard Worker     return Offset(offset: builder.endTable(at: start))
333*890232f2SAndroid Build Coastguard Worker   }
334*890232f2SAndroid Build Coastguard Worker }
335*890232f2SAndroid Build Coastguard Worker 
336*890232f2SAndroid Build Coastguard Worker struct LocalMonster {
337*890232f2SAndroid Build Coastguard Worker 
338*890232f2SAndroid Build Coastguard Worker   private var __t: Table
339*890232f2SAndroid Build Coastguard Worker 
340*890232f2SAndroid Build Coastguard Worker   init(_ fb: ByteBuffer, o: Int32) { __t = Table(bb: fb, position: o) }
341*890232f2SAndroid Build Coastguard Worker   init(_ t: Table) { __t = t }
342*890232f2SAndroid Build Coastguard Worker 
weaponnull343*890232f2SAndroid Build Coastguard Worker   func weapon(at index: Int32) -> Weapon? { let o = __t
344*890232f2SAndroid Build Coastguard Worker     .offset(4); return o == 0 ? nil : Weapon.assign(
345*890232f2SAndroid Build Coastguard Worker       __t.indirect(__t.vector(at: o) + (index * 4)),
346*890232f2SAndroid Build Coastguard Worker       __t.bb) }
347*890232f2SAndroid Build Coastguard Worker 
equiped<T: FlatBufferObject>null348*890232f2SAndroid Build Coastguard Worker   func equiped<T: FlatBufferObject>() -> T? {
349*890232f2SAndroid Build Coastguard Worker     let o = __t.offset(8); return o == 0 ? nil : __t.union(o)
350*890232f2SAndroid Build Coastguard Worker   }
351*890232f2SAndroid Build Coastguard Worker 
getRootAsMonsternull352*890232f2SAndroid Build Coastguard Worker   static func getRootAsMonster(bb: ByteBuffer) -> LocalMonster {
353*890232f2SAndroid Build Coastguard Worker     LocalMonster(Table(
354*890232f2SAndroid Build Coastguard Worker       bb: bb,
355*890232f2SAndroid Build Coastguard Worker       position: Int32(bb.read(def: UOffset.self, position: 0))))
356*890232f2SAndroid Build Coastguard Worker   }
357*890232f2SAndroid Build Coastguard Worker 
358*890232f2SAndroid Build Coastguard Worker   @inlinable
359*890232f2SAndroid Build Coastguard Worker   static func createMonster(
360*890232f2SAndroid Build Coastguard Worker     builder: inout FlatBufferBuilder,
361*890232f2SAndroid Build Coastguard Worker     offset: Offset,
362*890232f2SAndroid Build Coastguard Worker     equipment: Equipment = .none,
363*890232f2SAndroid Build Coastguard Worker     equippedOffset: UOffset) -> Offset
364*890232f2SAndroid Build Coastguard Worker   {
365*890232f2SAndroid Build Coastguard Worker     let start = builder.startTable(with: 3)
366*890232f2SAndroid Build Coastguard Worker     builder.add(element: equippedOffset, def: 0, at: 8)
367*890232f2SAndroid Build Coastguard Worker     builder.add(offset: offset, at: 4)
368*890232f2SAndroid Build Coastguard Worker     builder.add(
369*890232f2SAndroid Build Coastguard Worker       element: equipment.rawValue,
370*890232f2SAndroid Build Coastguard Worker       def: Equipment.none.rawValue,
371*890232f2SAndroid Build Coastguard Worker       at: 6)
372*890232f2SAndroid Build Coastguard Worker     return Offset(offset: builder.endTable(at: start))
373*890232f2SAndroid Build Coastguard Worker   }
374*890232f2SAndroid Build Coastguard Worker }
375*890232f2SAndroid Build Coastguard Worker 
376*890232f2SAndroid Build Coastguard Worker struct Weapon: FlatBufferObject {
377*890232f2SAndroid Build Coastguard Worker 
378*890232f2SAndroid Build Coastguard Worker   var __buffer: ByteBuffer! { __t.bb }
379*890232f2SAndroid Build Coastguard Worker 
380*890232f2SAndroid Build Coastguard Worker   static let offsets: (name: VOffset, dmg: VOffset) = (4, 6)
381*890232f2SAndroid Build Coastguard Worker   private var __t: Table
382*890232f2SAndroid Build Coastguard Worker 
383*890232f2SAndroid Build Coastguard Worker   init(_ t: Table) { __t = t }
384*890232f2SAndroid Build Coastguard Worker   init(_ fb: ByteBuffer, o: Int32) { __t = Table(bb: fb, position: o)}
385*890232f2SAndroid Build Coastguard Worker 
386*890232f2SAndroid Build Coastguard Worker   var dmg: Int16 { let o = __t.offset(6); return o == 0 ? 0 : __t.readBuffer(
387*890232f2SAndroid Build Coastguard Worker     of: Int16.self,
388*890232f2SAndroid Build Coastguard Worker     at: o) }
389*890232f2SAndroid Build Coastguard Worker   var nameVector: [UInt8]? { __t.getVector(at: 4) }
390*890232f2SAndroid Build Coastguard Worker   var name: String? {
391*890232f2SAndroid Build Coastguard Worker     let o = __t.offset(4); return o == 0 ? nil : __t.string(at: o) }
392*890232f2SAndroid Build Coastguard Worker 
assignnull393*890232f2SAndroid Build Coastguard Worker   static func assign(_ i: Int32, _ bb: ByteBuffer) -> Weapon { Weapon(Table(
394*890232f2SAndroid Build Coastguard Worker     bb: bb,
395*890232f2SAndroid Build Coastguard Worker     position: i)) }
396*890232f2SAndroid Build Coastguard Worker 
397*890232f2SAndroid Build Coastguard Worker   @inlinable
398*890232f2SAndroid Build Coastguard Worker   static func createWeapon(
399*890232f2SAndroid Build Coastguard Worker     builder: inout FlatBufferBuilder,
400*890232f2SAndroid Build Coastguard Worker     offset: Offset,
401*890232f2SAndroid Build Coastguard Worker     dmg: Int16) -> Offset
402*890232f2SAndroid Build Coastguard Worker   {
403*890232f2SAndroid Build Coastguard Worker     let _start = builder.startTable(with: 2)
404*890232f2SAndroid Build Coastguard Worker     Weapon.add(builder: &builder, name: offset)
405*890232f2SAndroid Build Coastguard Worker     Weapon.add(builder: &builder, dmg: dmg)
406*890232f2SAndroid Build Coastguard Worker     return Weapon.end(builder: &builder, startOffset: _start)
407*890232f2SAndroid Build Coastguard Worker   }
408*890232f2SAndroid Build Coastguard Worker 
409*890232f2SAndroid Build Coastguard Worker   @inlinable
410*890232f2SAndroid Build Coastguard Worker   static func end(
411*890232f2SAndroid Build Coastguard Worker     builder: inout FlatBufferBuilder,
412*890232f2SAndroid Build Coastguard Worker     startOffset: UOffset) -> Offset
413*890232f2SAndroid Build Coastguard Worker   {
414*890232f2SAndroid Build Coastguard Worker     Offset(offset: builder.endTable(at: startOffset))
415*890232f2SAndroid Build Coastguard Worker   }
416*890232f2SAndroid Build Coastguard Worker 
417*890232f2SAndroid Build Coastguard Worker   @inlinable
addnull418*890232f2SAndroid Build Coastguard Worker   static func add(builder: inout FlatBufferBuilder, name: Offset) {
419*890232f2SAndroid Build Coastguard Worker     builder.add(offset: name, at: Weapon.offsets.name)
420*890232f2SAndroid Build Coastguard Worker   }
421*890232f2SAndroid Build Coastguard Worker 
422*890232f2SAndroid Build Coastguard Worker   @inlinable
addnull423*890232f2SAndroid Build Coastguard Worker   static func add(builder: inout FlatBufferBuilder, dmg: Int16) {
424*890232f2SAndroid Build Coastguard Worker     builder.add(element: dmg, def: 0, at: Weapon.offsets.dmg)
425*890232f2SAndroid Build Coastguard Worker   }
426*890232f2SAndroid Build Coastguard Worker }
427