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