Austin Schuh | e89fa2d | 2019-08-14 20:24:23 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2014 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 | |
Austin Schuh | 2dd86a9 | 2022-09-14 21:19:23 -0700 | [diff] [blame^] | 17 | import DictionaryLookup.*; |
Austin Schuh | e89fa2d | 2019-08-14 20:24:23 -0700 | [diff] [blame] | 18 | import MyGame.Example.* |
Austin Schuh | 272c613 | 2020-11-14 16:37:52 -0800 | [diff] [blame] | 19 | import optional_scalars.* |
Austin Schuh | e89fa2d | 2019-08-14 20:24:23 -0700 | [diff] [blame] | 20 | import com.google.flatbuffers.ByteBufferUtil |
| 21 | import com.google.flatbuffers.FlatBufferBuilder |
| 22 | import NamespaceA.* |
| 23 | import NamespaceA.NamespaceB.* |
| 24 | import NamespaceA.NamespaceB.TableInNestedNS |
| 25 | import java.io.File |
| 26 | import java.io.FileOutputStream |
| 27 | import java.io.InputStream |
| 28 | import java.io.RandomAccessFile |
| 29 | import java.nio.ByteBuffer |
| 30 | import java.nio.ByteOrder |
| 31 | import java.nio.channels.FileChannel |
| 32 | |
| 33 | import com.google.flatbuffers.Constants.SIZE_PREFIX_LENGTH |
| 34 | |
| 35 | @kotlin.ExperimentalUnsignedTypes |
| 36 | class KotlinTest { |
| 37 | |
| 38 | companion object { |
| 39 | @JvmStatic |
| 40 | fun main(args: Array<String>) { |
| 41 | |
| 42 | // First, let's test reading a FlatBuffer generated by C++ code: |
| 43 | // This file was generated from monsterdata_test.json |
| 44 | |
| 45 | val data = RandomAccessFile(File("monsterdata_test.mon"), "r").use { |
| 46 | val temp = ByteArray(it.length().toInt()) |
| 47 | it.readFully(temp) |
| 48 | temp |
| 49 | } |
| 50 | |
| 51 | // Now test it: |
| 52 | |
| 53 | val bb = ByteBuffer.wrap(data) |
| 54 | TestBuffer(bb) |
| 55 | |
| 56 | // Second, let's create a FlatBuffer from scratch in Java, and test it also. |
| 57 | // We use an initial size of 1 to exercise the reallocation algorithm, |
| 58 | // normally a size larger than the typical FlatBuffer you generate would be |
| 59 | // better for performance. |
| 60 | val fbb = FlatBufferBuilder(1) |
| 61 | |
| 62 | TestBuilderBasics(fbb, true) |
| 63 | TestBuilderBasics(fbb, false) |
| 64 | |
| 65 | TestExtendedBuffer(fbb.dataBuffer().asReadOnlyBuffer()) |
| 66 | |
| 67 | TestNamespaceNesting() |
| 68 | |
| 69 | TestNestedFlatBuffer() |
| 70 | |
| 71 | TestCreateByteVector() |
| 72 | |
| 73 | TestCreateUninitializedVector() |
| 74 | |
| 75 | TestByteBufferFactory() |
| 76 | |
| 77 | TestSizedInputStream() |
| 78 | |
| 79 | TestVectorOfUnions() |
| 80 | |
Austin Schuh | 272c613 | 2020-11-14 16:37:52 -0800 | [diff] [blame] | 81 | TestSharedStringPool() |
| 82 | TestScalarOptional() |
Austin Schuh | 2dd86a9 | 2022-09-14 21:19:23 -0700 | [diff] [blame^] | 83 | TestDictionaryLookup() |
Austin Schuh | e89fa2d | 2019-08-14 20:24:23 -0700 | [diff] [blame] | 84 | println("FlatBuffers test: completed successfully") |
| 85 | } |
| 86 | |
Austin Schuh | 2dd86a9 | 2022-09-14 21:19:23 -0700 | [diff] [blame^] | 87 | fun TestDictionaryLookup() { |
| 88 | val fbb = FlatBufferBuilder(16) |
| 89 | val lfIndex = LongFloatEntry.createLongFloatEntry(fbb, 0, 99.0f) |
| 90 | val vectorEntriesIdx = LongFloatMap.createEntriesVector(fbb, intArrayOf(lfIndex)) |
| 91 | val rootIdx = LongFloatMap.createLongFloatMap(fbb, vectorEntriesIdx) |
| 92 | |
| 93 | LongFloatMap.finishLongFloatMapBuffer(fbb, rootIdx) |
| 94 | val map = LongFloatMap.getRootAsLongFloatMap(fbb.dataBuffer()) |
| 95 | assert(map.entriesLength == 1) |
| 96 | |
| 97 | val e = map.entries(0)!! |
| 98 | assert(e.key == 0L) |
| 99 | assert(e.value == 99.0f) |
| 100 | |
| 101 | val e2 = map.entriesByKey(0)!! |
| 102 | assert(e2.key == 0L) |
| 103 | assert(e2.value == 99.0f) |
| 104 | } |
| 105 | |
Austin Schuh | e89fa2d | 2019-08-14 20:24:23 -0700 | [diff] [blame] | 106 | fun TestEnums() { |
| 107 | assert(Color.name(Color.Red.toInt()) == "Red") |
| 108 | assert(Color.name(Color.Blue.toInt()) == "Blue") |
| 109 | assert(Any_.name(Any_.NONE.toInt()) == "NONE") |
| 110 | assert(Any_.name(Any_.Monster.toInt()) == "Monster") |
| 111 | } |
| 112 | |
| 113 | fun TestBuffer(bb: ByteBuffer) { |
| 114 | assert(Monster.MonsterBufferHasIdentifier(bb) == true) |
| 115 | |
| 116 | val monster = Monster.getRootAsMonster(bb) |
| 117 | |
| 118 | assert(monster.hp == 80.toShort()) |
| 119 | assert(monster.mana == 150.toShort()) // default |
| 120 | |
| 121 | assert(monster.name == "MyMonster") |
| 122 | // monster.friendly() // can't access, deprecated |
| 123 | |
| 124 | val pos = monster.pos!! |
| 125 | assert(pos.x == 1.0f) |
| 126 | assert(pos.y == 2.0f) |
| 127 | assert(pos.z == 3.0f) |
| 128 | assert(pos.test1 == 3.0) |
| 129 | // issue: int != byte |
| 130 | assert(pos.test2 == Color.Green) |
| 131 | val t = pos.test3!! |
| 132 | assert(t.a == 5.toShort()) |
| 133 | assert(t.b == 6.toByte()) |
| 134 | |
| 135 | assert(monster.testType == Any_.Monster) |
| 136 | val monster2 = Monster() |
| 137 | assert(monster.test(monster2) != null == true) |
| 138 | assert(monster2.name == "Fred") |
| 139 | |
| 140 | assert(monster.inventoryLength == 5) |
| 141 | var invsum = 0u |
| 142 | for (i in 0 until monster.inventoryLength) |
| 143 | invsum += monster.inventory(i) |
| 144 | assert(invsum == 10u) |
| 145 | |
| 146 | // Alternative way of accessing a vector: |
| 147 | val ibb = monster.inventoryAsByteBuffer |
| 148 | invsum = 0u |
| 149 | while (ibb.position() < ibb.limit()) |
| 150 | invsum += ibb.get().toUInt() |
| 151 | assert(invsum == 10u) |
| 152 | |
| 153 | |
| 154 | val test_0 = monster.test4(0)!! |
| 155 | val test_1 = monster.test4(1)!! |
| 156 | assert(monster.test4Length == 2) |
| 157 | assert(test_0.a + test_0.b + test_1.a + test_1.b == 100) |
| 158 | |
| 159 | assert(monster.testarrayofstringLength == 2) |
| 160 | assert(monster.testarrayofstring(0) == "test1") |
| 161 | assert(monster.testarrayofstring(1) == "test2") |
| 162 | |
| 163 | assert(monster.testbool == true) |
| 164 | } |
| 165 | |
| 166 | // this method checks additional fields not present in the binary buffer read from file |
| 167 | // these new tests are performed on top of the regular tests |
| 168 | fun TestExtendedBuffer(bb: ByteBuffer) { |
| 169 | TestBuffer(bb) |
| 170 | |
| 171 | val monster = Monster.getRootAsMonster(bb) |
| 172 | |
Austin Schuh | 272c613 | 2020-11-14 16:37:52 -0800 | [diff] [blame] | 173 | assert(monster.testhashu32Fnv1 == (Integer.MAX_VALUE + 1L).toUInt()) |
Austin Schuh | e89fa2d | 2019-08-14 20:24:23 -0700 | [diff] [blame] | 174 | } |
| 175 | |
| 176 | fun TestNamespaceNesting() { |
| 177 | // reference / manipulate these to verify compilation |
| 178 | val fbb = FlatBufferBuilder(1) |
| 179 | |
| 180 | TableInNestedNS.startTableInNestedNS(fbb) |
| 181 | TableInNestedNS.addFoo(fbb, 1234) |
| 182 | val nestedTableOff = TableInNestedNS.endTableInNestedNS(fbb) |
| 183 | |
| 184 | TableInFirstNS.startTableInFirstNS(fbb) |
| 185 | TableInFirstNS.addFooTable(fbb, nestedTableOff) |
| 186 | } |
| 187 | |
| 188 | fun TestNestedFlatBuffer() { |
| 189 | val nestedMonsterName = "NestedMonsterName" |
| 190 | val nestedMonsterHp: Short = 600 |
| 191 | val nestedMonsterMana: Short = 1024 |
| 192 | |
| 193 | var fbb1: FlatBufferBuilder? = FlatBufferBuilder(16) |
| 194 | val str1 = fbb1!!.createString(nestedMonsterName) |
| 195 | Monster.startMonster(fbb1) |
| 196 | Monster.addName(fbb1, str1) |
| 197 | Monster.addHp(fbb1, nestedMonsterHp) |
| 198 | Monster.addMana(fbb1, nestedMonsterMana) |
| 199 | val monster1 = Monster.endMonster(fbb1) |
| 200 | Monster.finishMonsterBuffer(fbb1, monster1) |
| 201 | val fbb1Bytes = fbb1.sizedByteArray() |
| 202 | |
| 203 | val fbb2 = FlatBufferBuilder(16) |
| 204 | val str2 = fbb2.createString("My Monster") |
| 205 | val nestedBuffer = Monster.createTestnestedflatbufferVector(fbb2, fbb1Bytes.asUByteArray()) |
| 206 | Monster.startMonster(fbb2) |
| 207 | Monster.addName(fbb2, str2) |
| 208 | Monster.addHp(fbb2, 50.toShort()) |
| 209 | Monster.addMana(fbb2, 32.toShort()) |
| 210 | Monster.addTestnestedflatbuffer(fbb2, nestedBuffer) |
| 211 | val monster = Monster.endMonster(fbb2) |
| 212 | Monster.finishMonsterBuffer(fbb2, monster) |
| 213 | |
| 214 | // Now test the data extracted from the nested buffer |
| 215 | val mons = Monster.getRootAsMonster(fbb2.dataBuffer()) |
| 216 | val nestedMonster = mons.testnestedflatbufferAsMonster!! |
| 217 | |
| 218 | assert(nestedMonsterMana == nestedMonster.mana) |
| 219 | assert(nestedMonsterHp == nestedMonster.hp) |
| 220 | assert(nestedMonsterName == nestedMonster.name) |
| 221 | } |
| 222 | |
| 223 | fun TestCreateByteVector() { |
| 224 | val fbb = FlatBufferBuilder(16) |
| 225 | val str = fbb.createString("MyMonster") |
| 226 | val inventory = byteArrayOf(0, 1, 2, 3, 4) |
| 227 | val vec = fbb.createByteVector(inventory) |
| 228 | Monster.startMonster(fbb) |
| 229 | Monster.addInventory(fbb, vec) |
| 230 | Monster.addName(fbb, str) |
| 231 | val monster1 = Monster.endMonster(fbb) |
| 232 | Monster.finishMonsterBuffer(fbb, monster1) |
| 233 | val monsterObject = Monster.getRootAsMonster(fbb.dataBuffer()) |
| 234 | |
| 235 | assert(monsterObject.inventory(1) == inventory[1].toUByte()) |
| 236 | assert(monsterObject.inventoryLength == inventory.size) |
| 237 | assert(ByteBuffer.wrap(inventory) == monsterObject.inventoryAsByteBuffer) |
| 238 | } |
| 239 | |
| 240 | fun TestCreateUninitializedVector() { |
| 241 | val fbb = FlatBufferBuilder(16) |
| 242 | val str = fbb.createString("MyMonster") |
| 243 | val inventory = byteArrayOf(0, 1, 2, 3, 4) |
| 244 | val bb = fbb.createUnintializedVector(1, inventory.size, 1) |
| 245 | for (i in inventory) { |
| 246 | bb.put(i) |
| 247 | } |
| 248 | val vec = fbb.endVector() |
| 249 | Monster.startMonster(fbb) |
| 250 | Monster.addInventory(fbb, vec) |
| 251 | Monster.addName(fbb, str) |
| 252 | val monster1 = Monster.endMonster(fbb) |
| 253 | Monster.finishMonsterBuffer(fbb, monster1) |
| 254 | val monsterObject = Monster.getRootAsMonster(fbb.dataBuffer()) |
| 255 | |
| 256 | assert(monsterObject.inventory(1) == inventory[1].toUByte()) |
| 257 | assert(monsterObject.inventoryLength == inventory.size) |
| 258 | assert(ByteBuffer.wrap(inventory) == monsterObject.inventoryAsByteBuffer) |
| 259 | } |
| 260 | |
| 261 | fun TestByteBufferFactory() { |
| 262 | class MappedByteBufferFactory : FlatBufferBuilder.ByteBufferFactory() { |
| 263 | override fun newByteBuffer(capacity: Int): ByteBuffer? { |
| 264 | var bb: ByteBuffer? |
| 265 | try { |
| 266 | bb = RandomAccessFile("javatest.bin", "rw").channel.map( |
| 267 | FileChannel.MapMode.READ_WRITE, |
| 268 | 0, |
| 269 | capacity.toLong() |
| 270 | ).order(ByteOrder.LITTLE_ENDIAN) |
| 271 | } catch (e: Throwable) { |
| 272 | println("FlatBuffers test: couldn't map ByteBuffer to a file") |
| 273 | bb = null |
| 274 | } |
| 275 | |
| 276 | return bb |
| 277 | } |
| 278 | } |
| 279 | |
| 280 | val fbb = FlatBufferBuilder(1, MappedByteBufferFactory()) |
| 281 | |
| 282 | TestBuilderBasics(fbb, false) |
| 283 | } |
| 284 | |
| 285 | fun TestSizedInputStream() { |
| 286 | // Test on default FlatBufferBuilder that uses HeapByteBuffer |
| 287 | val fbb = FlatBufferBuilder(1) |
| 288 | |
| 289 | TestBuilderBasics(fbb, false) |
| 290 | |
| 291 | val `in` = fbb.sizedInputStream() |
| 292 | val array = fbb.sizedByteArray() |
| 293 | var count = 0 |
| 294 | var currentVal = 0 |
| 295 | |
| 296 | while (currentVal != -1 && count < array.size) { |
| 297 | try { |
| 298 | currentVal = `in`.read() |
| 299 | } catch (e: java.io.IOException) { |
| 300 | println("FlatBuffers test: couldn't read from InputStream") |
| 301 | return |
| 302 | } |
| 303 | |
| 304 | assert(currentVal.toByte() == array[count]) |
| 305 | count++ |
| 306 | } |
| 307 | assert(count == array.size) |
| 308 | } |
| 309 | |
| 310 | fun TestBuilderBasics(fbb: FlatBufferBuilder, sizePrefix: Boolean) { |
| 311 | val names = intArrayOf(fbb.createString("Frodo"), fbb.createString("Barney"), fbb.createString("Wilma")) |
| 312 | val off = IntArray(3) |
| 313 | Monster.startMonster(fbb) |
| 314 | Monster.addName(fbb, names[0]) |
| 315 | off[0] = Monster.endMonster(fbb) |
| 316 | Monster.startMonster(fbb) |
| 317 | Monster.addName(fbb, names[1]) |
| 318 | off[1] = Monster.endMonster(fbb) |
| 319 | Monster.startMonster(fbb) |
| 320 | Monster.addName(fbb, names[2]) |
| 321 | off[2] = Monster.endMonster(fbb) |
| 322 | val sortMons = fbb.createSortedVectorOfTables(Monster(), off) |
| 323 | |
| 324 | // We set up the same values as monsterdata.json: |
| 325 | |
| 326 | val str = fbb.createString("MyMonster") |
| 327 | |
| 328 | val inv = Monster.createInventoryVector(fbb, byteArrayOf(0, 1, 2, 3, 4).asUByteArray()) |
| 329 | |
| 330 | val fred = fbb.createString("Fred") |
| 331 | Monster.startMonster(fbb) |
| 332 | Monster.addName(fbb, fred) |
| 333 | val mon2 = Monster.endMonster(fbb) |
| 334 | |
| 335 | Monster.startTest4Vector(fbb, 2) |
| 336 | Test.createTest(fbb, 10.toShort(), 20.toByte()) |
| 337 | Test.createTest(fbb, 30.toShort(), 40.toByte()) |
| 338 | val test4 = fbb.endVector() |
| 339 | |
| 340 | val testArrayOfString = |
| 341 | Monster.createTestarrayofstringVector(fbb, intArrayOf(fbb.createString("test1"), fbb.createString("test2"))) |
| 342 | |
| 343 | Monster.startMonster(fbb) |
| 344 | Monster.addPos( |
| 345 | fbb, Vec3.createVec3( |
| 346 | fbb, 1.0f, 2.0f, 3.0f, 3.0, |
| 347 | Color.Green, 5.toShort(), 6.toByte() |
| 348 | ) |
| 349 | ) |
| 350 | Monster.addHp(fbb, 80.toShort()) |
| 351 | Monster.addName(fbb, str) |
| 352 | Monster.addInventory(fbb, inv) |
| 353 | Monster.addTestType(fbb, Any_.Monster) |
| 354 | Monster.addTest(fbb, mon2) |
| 355 | Monster.addTest4(fbb, test4) |
| 356 | Monster.addTestarrayofstring(fbb, testArrayOfString) |
| 357 | Monster.addTestbool(fbb, true) |
Austin Schuh | 272c613 | 2020-11-14 16:37:52 -0800 | [diff] [blame] | 358 | Monster.addTesthashu32Fnv1(fbb, (Integer.MAX_VALUE + 1L).toUInt()) |
Austin Schuh | e89fa2d | 2019-08-14 20:24:23 -0700 | [diff] [blame] | 359 | Monster.addTestarrayoftables(fbb, sortMons) |
| 360 | val mon = Monster.endMonster(fbb) |
| 361 | |
| 362 | if (sizePrefix) { |
| 363 | Monster.finishSizePrefixedMonsterBuffer(fbb, mon) |
| 364 | } else { |
| 365 | Monster.finishMonsterBuffer(fbb, mon) |
| 366 | } |
| 367 | |
| 368 | // Write the result to a file for debugging purposes: |
| 369 | // Note that the binaries are not necessarily identical, since the JSON |
| 370 | // parser may serialize in a slightly different order than the above |
| 371 | // Java code. They are functionally equivalent though. |
| 372 | |
| 373 | try { |
| 374 | val filename = "monsterdata_java_wire" + (if (sizePrefix) "_sp" else "") + ".mon" |
| 375 | val fc = FileOutputStream(filename).channel |
| 376 | fc.write(fbb.dataBuffer().duplicate()) |
| 377 | fc.close() |
| 378 | } catch (e: java.io.IOException) { |
| 379 | println("FlatBuffers test: couldn't write file") |
| 380 | return |
| 381 | } |
| 382 | |
| 383 | // Test it: |
| 384 | var dataBuffer = fbb.dataBuffer() |
| 385 | if (sizePrefix) { |
| 386 | assert( |
| 387 | ByteBufferUtil.getSizePrefix(dataBuffer) + SIZE_PREFIX_LENGTH == |
| 388 | dataBuffer.remaining() |
| 389 | ) |
| 390 | dataBuffer = ByteBufferUtil.removeSizePrefix(dataBuffer) |
| 391 | } |
| 392 | TestExtendedBuffer(dataBuffer) |
| 393 | |
| 394 | // Make sure it also works with read only ByteBuffers. This is slower, |
| 395 | // since creating strings incurs an additional copy |
| 396 | // (see Table.__string). |
| 397 | TestExtendedBuffer(dataBuffer.asReadOnlyBuffer()) |
| 398 | |
| 399 | TestEnums() |
| 400 | |
| 401 | //Attempt to mutate Monster fields and check whether the buffer has been mutated properly |
| 402 | // revert to original values after testing |
| 403 | val monster = Monster.getRootAsMonster(dataBuffer) |
| 404 | |
| 405 | // mana is optional and does not exist in the buffer so the mutation should fail |
| 406 | // the mana field should retain its default value |
| 407 | assert(monster.mutateMana(10.toShort()) == false) |
| 408 | assert(monster.mana == 150.toShort()) |
| 409 | |
| 410 | // Accessing a vector of sorted by the key tables |
| 411 | assert(monster.testarrayoftables(0)!!.name == "Barney") |
| 412 | assert(monster.testarrayoftables(1)!!.name == "Frodo") |
| 413 | assert(monster.testarrayoftables(2)!!.name == "Wilma") |
| 414 | |
| 415 | // Example of searching for a table by the key |
| 416 | assert(monster.testarrayoftablesByKey("Frodo")!!.name == "Frodo") |
| 417 | assert(monster.testarrayoftablesByKey("Barney")!!.name == "Barney") |
| 418 | assert(monster.testarrayoftablesByKey("Wilma")!!.name == "Wilma") |
| 419 | |
| 420 | // testType is an existing field and mutating it should succeed |
| 421 | assert(monster.testType == Any_.Monster) |
| 422 | assert(monster.mutateTestType(Any_.NONE) == true) |
| 423 | assert(monster.testType == Any_.NONE) |
| 424 | assert(monster.mutateTestType(Any_.Monster) == true) |
| 425 | assert(monster.testType == Any_.Monster) |
| 426 | |
| 427 | //mutate the inventory vector |
| 428 | assert(monster.mutateInventory(0, 1u) == true) |
| 429 | assert(monster.mutateInventory(1, 2u) == true) |
| 430 | assert(monster.mutateInventory(2, 3u) == true) |
| 431 | assert(monster.mutateInventory(3, 4u) == true) |
| 432 | assert(monster.mutateInventory(4, 5u) == true) |
| 433 | |
| 434 | for (i in 0 until monster.inventoryLength) { |
| 435 | assert(monster.inventory(i) == (i.toUByte() + 1u).toUByte()) |
| 436 | } |
| 437 | |
| 438 | //reverse mutation |
| 439 | assert(monster.mutateInventory(0, 0u) == true) |
| 440 | assert(monster.mutateInventory(1, 1u) == true) |
| 441 | assert(monster.mutateInventory(2, 2u) == true) |
| 442 | assert(monster.mutateInventory(3, 3u) == true) |
| 443 | assert(monster.mutateInventory(4, 4u) == true) |
| 444 | |
| 445 | // get a struct field and edit one of its fields |
| 446 | val pos = monster.pos!! |
| 447 | assert(pos.x == 1.0f) |
| 448 | pos.mutateX(55.0f) |
| 449 | assert(pos.x == 55.0f) |
| 450 | pos.mutateX(1.0f) |
| 451 | assert(pos.x == 1.0f) |
| 452 | } |
| 453 | |
| 454 | fun TestVectorOfUnions() { |
| 455 | val fbb = FlatBufferBuilder() |
| 456 | |
| 457 | val swordAttackDamage = 1 |
| 458 | |
| 459 | val characterVector = intArrayOf(Attacker.createAttacker(fbb, swordAttackDamage)) |
| 460 | |
| 461 | val characterTypeVector = ubyteArrayOf(Character_.MuLan) |
| 462 | |
| 463 | Movie.finishMovieBuffer( |
| 464 | fbb, |
| 465 | Movie.createMovie( |
| 466 | fbb, |
| 467 | 0u, |
| 468 | 0, |
| 469 | Movie.createCharactersTypeVector(fbb, characterTypeVector), |
| 470 | Movie.createCharactersVector(fbb, characterVector) |
| 471 | ) |
| 472 | ) |
| 473 | |
| 474 | val movie = Movie.getRootAsMovie(fbb.dataBuffer()) |
| 475 | |
| 476 | assert(movie.charactersTypeLength == characterTypeVector.size) |
| 477 | assert(movie.charactersLength == characterVector.size) |
| 478 | |
| 479 | assert(movie.charactersType(0) == characterTypeVector[0]) |
| 480 | |
| 481 | assert((movie.characters(Attacker(), 0) as Attacker).swordAttackDamage == swordAttackDamage) |
| 482 | } |
Austin Schuh | 272c613 | 2020-11-14 16:37:52 -0800 | [diff] [blame] | 483 | |
| 484 | fun TestSharedStringPool() { |
| 485 | val fb = FlatBufferBuilder(1); |
| 486 | val testString = "My string"; |
| 487 | val offset = fb.createSharedString(testString); |
| 488 | for (i in 0..10) { |
| 489 | assert(offset == fb.createSharedString(testString)); |
| 490 | } |
| 491 | } |
| 492 | |
| 493 | fun TestScalarOptional() { |
| 494 | val fbb = FlatBufferBuilder(1) |
| 495 | ScalarStuff.startScalarStuff(fbb) |
| 496 | var pos = ScalarStuff.endScalarStuff(fbb) |
| 497 | fbb.finish(pos) |
| 498 | |
| 499 | var scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer()) |
| 500 | |
| 501 | assert(scalarStuff.justI8 == 0.toByte()) |
| 502 | assert(scalarStuff.maybeI8 == null) |
| 503 | assert(scalarStuff.defaultI8 == 42.toByte()) |
| 504 | assert(scalarStuff.justU8 == 0.toUByte()) |
| 505 | assert(scalarStuff.maybeU8 == null) |
| 506 | assert(scalarStuff.defaultU8 == 42.toUByte()) |
| 507 | assert(scalarStuff.justI16 == 0.toShort()) |
| 508 | assert(scalarStuff.maybeI16 == null) |
| 509 | assert(scalarStuff.defaultI16 == 42.toShort()) |
| 510 | assert(scalarStuff.justU16 == 0.toUShort()) |
| 511 | assert(scalarStuff.maybeU16 == null) |
| 512 | assert(scalarStuff.defaultU16 == 42.toUShort()) |
| 513 | assert(scalarStuff.justI32 == 0) |
| 514 | assert(scalarStuff.maybeI32 == null) |
| 515 | assert(scalarStuff.defaultI32 == 42) |
| 516 | assert(scalarStuff.justU32 == 0.toUInt()) |
| 517 | assert(scalarStuff.maybeU32 == null) |
| 518 | assert(scalarStuff.defaultU32 == 42U) |
| 519 | assert(scalarStuff.justI64 == 0L) |
| 520 | assert(scalarStuff.maybeI64 == null) |
| 521 | assert(scalarStuff.defaultI64 == 42L) |
| 522 | assert(scalarStuff.justU64 == 0UL) |
| 523 | assert(scalarStuff.maybeU64 == null) |
| 524 | assert(scalarStuff.defaultU64 == 42UL) |
| 525 | assert(scalarStuff.justF32 == 0.0f) |
| 526 | assert(scalarStuff.maybeF32 == null) |
| 527 | assert(scalarStuff.defaultF32 == 42.0f) |
| 528 | assert(scalarStuff.justF64 == 0.0) |
| 529 | assert(scalarStuff.maybeF64 == null) |
| 530 | assert(scalarStuff.defaultF64 == 42.0) |
| 531 | assert(scalarStuff.justBool == false) |
| 532 | assert(scalarStuff.maybeBool == null) |
| 533 | assert(scalarStuff.defaultBool == true) |
| 534 | assert(scalarStuff.justEnum == OptionalByte.None) |
| 535 | assert(scalarStuff.maybeEnum == null) |
| 536 | assert(scalarStuff.defaultEnum == OptionalByte.One) |
| 537 | |
| 538 | fbb.clear() |
| 539 | |
| 540 | ScalarStuff.startScalarStuff(fbb) |
| 541 | ScalarStuff.addJustI8(fbb, 5.toByte()) |
| 542 | ScalarStuff.addMaybeI8(fbb, 5.toByte()) |
| 543 | ScalarStuff.addDefaultI8(fbb, 5.toByte()) |
| 544 | ScalarStuff.addJustU8(fbb, 6.toUByte()) |
| 545 | ScalarStuff.addMaybeU8(fbb, 6.toUByte()) |
| 546 | ScalarStuff.addDefaultU8(fbb, 6.toUByte()) |
| 547 | ScalarStuff.addJustI16(fbb, 7.toShort()) |
| 548 | ScalarStuff.addMaybeI16(fbb, 7.toShort()) |
| 549 | ScalarStuff.addDefaultI16(fbb, 7.toShort()) |
| 550 | ScalarStuff.addJustU16(fbb, 8.toUShort()) |
| 551 | ScalarStuff.addMaybeU16(fbb, 8.toUShort()) |
| 552 | ScalarStuff.addDefaultU16(fbb, 8.toUShort()) |
| 553 | ScalarStuff.addJustI32(fbb, 9) |
| 554 | ScalarStuff.addMaybeI32(fbb, 9) |
| 555 | ScalarStuff.addDefaultI32(fbb, 9) |
| 556 | ScalarStuff.addJustU32(fbb, 10.toUInt()) |
| 557 | ScalarStuff.addMaybeU32(fbb, 10.toUInt()) |
| 558 | ScalarStuff.addDefaultU32(fbb, 10.toUInt()) |
| 559 | ScalarStuff.addJustI64(fbb, 11L) |
| 560 | ScalarStuff.addMaybeI64(fbb, 11L) |
| 561 | ScalarStuff.addDefaultI64(fbb, 11L) |
| 562 | ScalarStuff.addJustU64(fbb, 12UL) |
| 563 | ScalarStuff.addMaybeU64(fbb, 12UL) |
| 564 | ScalarStuff.addDefaultU64(fbb, 12UL) |
| 565 | ScalarStuff.addJustF32(fbb, 13.0f) |
| 566 | ScalarStuff.addMaybeF32(fbb, 13.0f) |
| 567 | ScalarStuff.addDefaultF32(fbb, 13.0f) |
| 568 | ScalarStuff.addJustF64(fbb, 14.0) |
| 569 | ScalarStuff.addMaybeF64(fbb, 14.0) |
| 570 | ScalarStuff.addDefaultF64(fbb, 14.0) |
| 571 | ScalarStuff.addJustBool(fbb, true) |
| 572 | ScalarStuff.addMaybeBool(fbb, true) |
| 573 | ScalarStuff.addDefaultBool(fbb, true) |
| 574 | ScalarStuff.addJustEnum(fbb, OptionalByte.Two) |
| 575 | ScalarStuff.addMaybeEnum(fbb, OptionalByte.Two) |
| 576 | ScalarStuff.addDefaultEnum(fbb, OptionalByte.Two) |
| 577 | |
| 578 | pos = ScalarStuff.endScalarStuff(fbb) |
| 579 | |
| 580 | fbb.finish(pos) |
| 581 | |
| 582 | scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer()) |
| 583 | |
| 584 | assert(scalarStuff.justI8 == 5.toByte()) |
| 585 | assert(scalarStuff.maybeI8 == 5.toByte()) |
| 586 | assert(scalarStuff.defaultI8 == 5.toByte()) |
| 587 | assert(scalarStuff.justU8 == 6.toUByte()) |
| 588 | assert(scalarStuff.maybeU8 == 6.toUByte()) |
| 589 | assert(scalarStuff.defaultU8 == 6.toUByte()) |
| 590 | assert(scalarStuff.justI16 == 7.toShort()) |
| 591 | assert(scalarStuff.maybeI16 == 7.toShort()) |
| 592 | assert(scalarStuff.defaultI16 == 7.toShort()) |
| 593 | assert(scalarStuff.justU16 == 8.toUShort()) |
| 594 | assert(scalarStuff.maybeU16 == 8.toUShort()) |
| 595 | assert(scalarStuff.defaultU16 == 8.toUShort()) |
| 596 | assert(scalarStuff.justI32 == 9) |
| 597 | assert(scalarStuff.maybeI32 == 9) |
| 598 | assert(scalarStuff.defaultI32 == 9) |
| 599 | assert(scalarStuff.justU32 == 10u) |
| 600 | assert(scalarStuff.maybeU32 == 10u) |
| 601 | assert(scalarStuff.defaultU32 == 10u) |
| 602 | assert(scalarStuff.justI64 == 11L) |
| 603 | assert(scalarStuff.maybeI64 == 11L) |
| 604 | assert(scalarStuff.defaultI64 == 11L) |
| 605 | assert(scalarStuff.justU64 == 12UL) |
| 606 | assert(scalarStuff.maybeU64 == 12UL) |
| 607 | assert(scalarStuff.defaultU64 == 12UL) |
| 608 | assert(scalarStuff.justF32 == 13.0f) |
| 609 | assert(scalarStuff.maybeF32 == 13.0f) |
| 610 | assert(scalarStuff.defaultF32 == 13.0f) |
| 611 | assert(scalarStuff.justF64 == 14.0) |
| 612 | assert(scalarStuff.maybeF64 == 14.0) |
| 613 | assert(scalarStuff.defaultF64 == 14.0) |
| 614 | assert(scalarStuff.justBool == true) |
| 615 | assert(scalarStuff.maybeBool == true) |
| 616 | assert(scalarStuff.defaultBool == true) |
| 617 | assert(scalarStuff.justEnum == OptionalByte.Two) |
| 618 | assert(scalarStuff.maybeEnum == OptionalByte.Two) |
| 619 | assert(scalarStuff.defaultEnum == OptionalByte.Two) |
| 620 | } |
Austin Schuh | e89fa2d | 2019-08-14 20:24:23 -0700 | [diff] [blame] | 621 | } |
Austin Schuh | 272c613 | 2020-11-14 16:37:52 -0800 | [diff] [blame] | 622 | } |