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: [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] 31 // swiftformat:enable all 32 let _data = ByteBuffer(bytes: data) 33 readVerifiedMonster(fb: _data) 34 } 35 testCreateMonsternull36 func testCreateMonster() { 37 let bytes = createMonster(withPrefix: false) 38 // swiftformat:disable all 39 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]) 40 // swiftformat:enable all 41 var buffer = bytes.buffer 42 let monster: MyGame_Example_Monster = getRoot(byteBuffer: &buffer) 43 readMonster(monster: monster) 44 mutateMonster(fb: bytes.buffer) 45 readMonster(monster: monster) 46 } 47 testCreateMonsterResizedBuffernull48 func testCreateMonsterResizedBuffer() { 49 let bytes = createMonster(withPrefix: false) 50 // swiftformat:disable all 51 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]) 52 // swiftformat:enable all 53 readVerifiedMonster(fb: bytes.sizedBuffer) 54 } 55 testCreateMonsterPrefixednull56 func testCreateMonsterPrefixed() { 57 let bytes = createMonster(withPrefix: true) 58 // swiftformat:disable all 59 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]) 60 // swiftformat:enable all 61 62 var buffer = bytes.buffer 63 readMonster(monster: getPrefixedSizeRoot(byteBuffer: &buffer)) 64 } 65 testCreateMonsterUsingCreateMonsterMethodWithNilPosnull66 func testCreateMonsterUsingCreateMonsterMethodWithNilPos() { 67 var fbb = FlatBufferBuilder(initialSize: 1) 68 let name = fbb.create(string: "Frodo") 69 let mStart = Monster.startMonster(&fbb) 70 Monster.add(name: name, &fbb) 71 let root = Monster.endMonster(&fbb, start: mStart) 72 fbb.finish(offset: root) 73 var buffer = fbb.sizedBuffer 74 let newMonster: MyGame_Example_Monster = getRoot(byteBuffer: &buffer) 75 XCTAssertNil(newMonster.pos) 76 XCTAssertEqual(newMonster.name, "Frodo") 77 } 78 testCreateMonsterUsingCreateMonsterMethodWithPosXnull79 func testCreateMonsterUsingCreateMonsterMethodWithPosX() { 80 var fbb = FlatBufferBuilder(initialSize: 1) 81 let name = fbb.create(string: "Barney") 82 let mStart = Monster.startMonster(&fbb) 83 Monster.add( 84 pos: MyGame_Example_Vec3( 85 x: 10, 86 y: 0, 87 z: 0, 88 test1: 0, 89 test2: .blue, 90 test3: .init()), 91 &fbb) 92 Monster.add(name: name, &fbb) 93 let root = Monster.endMonster(&fbb, start: mStart) 94 fbb.finish(offset: root) 95 96 var buffer = fbb.sizedBuffer 97 let newMonster: MyGame_Example_Monster = getRoot(byteBuffer: &buffer) 98 XCTAssertEqual(newMonster.pos!.x, 10) 99 XCTAssertEqual(newMonster.name, "Barney") 100 } 101 testArrayOfBoolsnull102 func testArrayOfBools() { 103 let boolArray = [false, true, false, true, false, true, false] 104 var fbb = FlatBufferBuilder(initialSize: 1) 105 let name = fbb.create(string: "Frodo") 106 let bools = fbb.createVector(boolArray) 107 let root = Monster.createMonster( 108 &fbb, 109 nameOffset: name, 110 testarrayofboolsVectorOffset: bools) 111 fbb.finish(offset: root) 112 var buffer = fbb.sizedBuffer 113 let monster: MyGame_Example_Monster = getRoot(byteBuffer: &buffer) 114 115 let values = monster.testarrayofbools 116 117 XCTAssertEqual(boolArray, values) 118 119 for i in 0..<monster.testarrayofboolsCount { 120 XCTAssertEqual(boolArray[Int(i)], monster.testarrayofbools(at: i)) 121 } 122 } 123 readVerifiedMonsternull124 func readVerifiedMonster(fb: ByteBuffer) { 125 var byteBuffer = fb 126 XCTAssertNoThrow( 127 try readMonster( 128 monster: getCheckedRoot( 129 byteBuffer: &byteBuffer) as MyGame_Example_Monster)) 130 } 131 readMonsternull132 func readMonster(monster: Monster) { 133 var monster = monster 134 readFlatbufferMonster(monster: &monster) 135 let unpacked: MyGame_Example_MonsterT? = monster.unpack() 136 readObjectApi(monster: unpacked!) 137 guard var buffer = unpacked?.serialize() 138 else { fatalError("Couldnt generate bytebuffer") } 139 var newMonster: MyGame_Example_Monster = getRoot(byteBuffer: &buffer) 140 readFlatbufferMonster(monster: &newMonster) 141 } 142 createMonsternull143 func createMonster(withPrefix prefix: Bool) -> FlatBufferBuilder { 144 var fbb = FlatBufferBuilder(initialSize: 1) 145 let names = [ 146 fbb.create(string: "Frodo"), 147 fbb.create(string: "Barney"), 148 fbb.create(string: "Wilma"), 149 ] 150 var offsets: [Offset] = [] 151 let start1 = Monster.startMonster(&fbb) 152 Monster.add(name: names[0], &fbb) 153 offsets.append(Monster.endMonster(&fbb, start: start1)) 154 let start2 = Monster.startMonster(&fbb) 155 Monster.add(name: names[1], &fbb) 156 offsets.append(Monster.endMonster(&fbb, start: start2)) 157 let start3 = Monster.startMonster(&fbb) 158 Monster.add(name: names[2], &fbb) 159 offsets.append(Monster.endMonster(&fbb, start: start3)) 160 161 let sortedArray = Monster.sortVectorOfMonster(offsets: offsets, &fbb) 162 163 let str = fbb.create(string: "MyMonster") 164 let test1 = fbb.create(string: "test1") 165 let test2 = fbb.create(string: "test2") 166 let _inv: [Byte] = [0, 1, 2, 3, 4] 167 let inv = fbb.createVector(_inv) 168 169 let fred = fbb.create(string: "Fred") 170 let mon1Start = Monster.startMonster(&fbb) 171 Monster.add(name: fred, &fbb) 172 let mon2 = Monster.endMonster(&fbb, start: mon1Start) 173 174 let test4 = fbb.createVector(ofStructs: [ 175 MyGame_Example_Test(a: 30, b: 40), 176 MyGame_Example_Test(a: 10, b: 20), 177 ]) 178 179 let stringTestVector = fbb.createVector(ofOffsets: [test1, test2]) 180 let mStart = Monster.startMonster(&fbb) 181 Monster.add( 182 pos: MyGame_Example_Vec3( 183 x: 1, 184 y: 2, 185 z: 3, 186 test1: 3, 187 test2: .green, 188 test3: .init(a: 5, b: 6)), 189 &fbb) 190 Monster.add(hp: 80, &fbb) 191 Monster.add(name: str, &fbb) 192 Monster.addVectorOf(inventory: inv, &fbb) 193 Monster.add(testType: .monster, &fbb) 194 Monster.add(test: mon2, &fbb) 195 Monster.addVectorOf(test4: test4, &fbb) 196 Monster.addVectorOf(testarrayofstring: stringTestVector, &fbb) 197 Monster.add(testbool: true, &fbb) 198 Monster.addVectorOf(testarrayoftables: sortedArray, &fbb) 199 let end = Monster.endMonster(&fbb, start: mStart) 200 Monster.finish(&fbb, end: end, prefix: prefix) 201 return fbb 202 } 203 mutateMonsternull204 func mutateMonster(fb: ByteBuffer) { 205 var fb = fb 206 207 let monster: Monster = getRoot(byteBuffer: &fb) 208 XCTAssertFalse(monster.mutate(mana: 10)) 209 XCTAssertEqual(monster.testarrayoftables(at: 0)?.name, "Barney") 210 XCTAssertEqual(monster.testarrayoftables(at: 1)?.name, "Frodo") 211 XCTAssertEqual(monster.testarrayoftables(at: 2)?.name, "Wilma") 212 213 // Example of searching for a table by the key 214 XCTAssertNotNil(monster.testarrayoftablesBy(key: "Frodo")) 215 XCTAssertNotNil(monster.testarrayoftablesBy(key: "Barney")) 216 XCTAssertNotNil(monster.testarrayoftablesBy(key: "Wilma")) 217 218 XCTAssertEqual(monster.testType, .monster) 219 220 XCTAssertTrue(monster.mutate(testbool: false)) 221 XCTAssertEqual(monster.testbool, false) 222 XCTAssertTrue(monster.mutate(testbool: true)) 223 224 XCTAssertEqual(monster.mutate(inventory: 1, at: 0), true) 225 XCTAssertEqual(monster.mutate(inventory: 2, at: 1), true) 226 XCTAssertEqual(monster.mutate(inventory: 3, at: 2), true) 227 XCTAssertEqual(monster.mutate(inventory: 4, at: 3), true) 228 XCTAssertEqual(monster.mutate(inventory: 5, at: 4), true) 229 230 for i in 0..<monster.inventoryCount { 231 XCTAssertEqual(monster.inventory(at: i), Byte(i + 1)) 232 } 233 234 XCTAssertEqual(monster.mutate(inventory: 0, at: 0), true) 235 XCTAssertEqual(monster.mutate(inventory: 1, at: 1), true) 236 XCTAssertEqual(monster.mutate(inventory: 2, at: 2), true) 237 XCTAssertEqual(monster.mutate(inventory: 3, at: 3), true) 238 XCTAssertEqual(monster.mutate(inventory: 4, at: 4), true) 239 240 let vec = monster.mutablePos 241 XCTAssertEqual(vec?.x, 1) 242 XCTAssertTrue(vec?.mutate(x: 55.0) ?? false) 243 XCTAssertTrue(vec?.mutate(test1: 55) ?? false) 244 XCTAssertEqual(vec?.x, 55.0) 245 XCTAssertEqual(vec?.test1, 55.0) 246 XCTAssertTrue(vec?.mutate(x: 1) ?? false) 247 XCTAssertEqual(vec?.x, 1) 248 XCTAssertTrue(vec?.mutate(test1: 3) ?? false) 249 } 250 readFlatbufferMonsternull251 func readFlatbufferMonster(monster: inout MyGame_Example_Monster) { 252 XCTAssertEqual(monster.hp, 80) 253 XCTAssertEqual(monster.mana, 150) 254 XCTAssertEqual(monster.name, "MyMonster") 255 let pos = monster.pos 256 XCTAssertEqual(pos?.x, 1) 257 XCTAssertEqual(pos?.y, 2) 258 XCTAssertEqual(pos?.z, 3) 259 XCTAssertEqual(pos?.test1, 3) 260 XCTAssertEqual(pos?.test2, .green) 261 let test = pos?.test3 262 XCTAssertEqual(test?.a, 5) 263 XCTAssertEqual(test?.b, 6) 264 XCTAssertEqual(monster.testType, .monster) 265 let monster2 = monster.test(type: Monster.self) 266 XCTAssertEqual(monster2?.name, "Fred") 267 268 XCTAssertEqual(monster.mutate(mana: 10), false) 269 270 XCTAssertEqual(monster.mana, 150) 271 XCTAssertEqual(monster.inventoryCount, 5) 272 var sum: Byte = 0 273 for i in 0...monster.inventoryCount { 274 sum += monster.inventory(at: i) 275 } 276 XCTAssertEqual(sum, 10) 277 XCTAssertEqual(monster.test4Count, 2) 278 279 let test0 = monster.test4(at: 0) 280 let test1 = monster.test4(at: 1) 281 var sum0 = 0 282 var sum1 = 0 283 if let a = test0?.a, let b = test0?.b { 284 sum0 = Int(a) + Int(b) 285 } 286 if let a = test1?.a, let b = test1?.b { 287 sum1 = Int(a) + Int(b) 288 } 289 XCTAssertEqual(sum0 + sum1, 100) 290 291 let mutableTest0 = monster.mutableTest4(at: 0) 292 let mutableTest1 = monster.mutableTest4(at: 1) 293 var sum2 = 0 294 var sum3 = 0 295 if let a = mutableTest0?.a, let b = mutableTest0?.b { 296 sum2 = Int(a) + Int(b) 297 } 298 if let a = mutableTest1?.a, let b = mutableTest1?.b { 299 sum3 = Int(a) + Int(b) 300 } 301 XCTAssertEqual(sum2 + sum3, 100) 302 303 XCTAssertEqual(monster.testarrayofstringCount, 2) 304 XCTAssertEqual(monster.testarrayofstring(at: 0), "test1") 305 XCTAssertEqual(monster.testarrayofstring(at: 1), "test2") 306 XCTAssertEqual(monster.testbool, true) 307 308 let array = monster.nameSegmentArray 309 XCTAssertEqual(String(bytes: array ?? [], encoding: .utf8), "MyMonster") 310 311 if 0 == monster.testarrayofboolsCount { 312 XCTAssertEqual(monster.testarrayofbools.isEmpty, true) 313 } else { 314 XCTAssertEqual(monster.testarrayofbools.isEmpty, false) 315 } 316 } 317 readObjectApinull318 func readObjectApi(monster: MyGame_Example_MonsterT) { 319 XCTAssertEqual(monster.hp, 80) 320 XCTAssertEqual(monster.mana, 150) 321 XCTAssertEqual(monster.name, "MyMonster") 322 let pos = monster.pos 323 XCTAssertEqual(pos?.x, 1) 324 XCTAssertEqual(pos?.y, 2) 325 XCTAssertEqual(pos?.z, 3) 326 XCTAssertEqual(pos?.test1, 3) 327 XCTAssertEqual(pos?.test2, .green) 328 let test = pos?.test3 329 XCTAssertEqual(test?.a, 5) 330 XCTAssertEqual(test?.b, 6) 331 let monster2 = monster.test?.value as? MyGame_Example_MonsterT 332 XCTAssertEqual(monster2?.name, "Fred") 333 XCTAssertEqual(monster.mana, 150) 334 monster.mana = 10 335 XCTAssertEqual(monster.mana, 10) 336 monster.mana = 150 337 XCTAssertEqual(monster.mana, 150) 338 339 XCTAssertEqual(monster.inventory.count, 5) 340 var sum: Byte = 0 341 for i in monster.inventory { 342 sum += i 343 } 344 XCTAssertEqual(sum, 10) 345 XCTAssertEqual(monster.test4.count, 2) 346 let test0 = monster.test4[0] 347 let test1 = monster.test4[1] 348 var sum0 = 0 349 var sum1 = 0 350 if let a = test0?.a, let b = test0?.b { 351 sum0 = Int(a) + Int(b) 352 } 353 if let a = test1?.a, let b = test1?.b { 354 sum1 = Int(a) + Int(b) 355 } 356 XCTAssertEqual(sum0 + sum1, 100) 357 XCTAssertEqual(monster.testbool, true) 358 } 359 360 var jsonData: String { 361 """ 362 {\"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\"} 363 """ 364 } 365 } 366