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