xref: /aosp_15_r20/external/flatbuffers/tests/KotlinTest.kt (revision 890232f25432b36107d06881e0a25aaa6b473652)
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 
17 import DictionaryLookup.*;
18 import MyGame.Example.*
19 import optional_scalars.*
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
mainnull40     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 
81         TestSharedStringPool()
82         TestScalarOptional()
83         TestDictionaryLookup()
84         println("FlatBuffers test: completed successfully")
85     }
86 
TestDictionaryLookupnull87     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 
TestEnumsnull106     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 
TestBuffernull113     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
TestExtendedBuffernull168     fun TestExtendedBuffer(bb: ByteBuffer) {
169         TestBuffer(bb)
170 
171         val monster = Monster.getRootAsMonster(bb)
172 
173         assert(monster.testhashu32Fnv1 == (Integer.MAX_VALUE + 1L).toUInt())
174     }
175 
TestNamespaceNestingnull176     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 
TestNestedFlatBuffernull188     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 
TestCreateByteVectornull223     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 
TestCreateUninitializedVectornull240     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 
TestByteBufferFactorynull261     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 
TestSizedInputStreamnull285     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 
TestBuilderBasicsnull310     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)
358         Monster.addTesthashu32Fnv1(fbb, (Integer.MAX_VALUE + 1L).toUInt())
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 
TestVectorOfUnionsnull454     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     }
483 
TestSharedStringPoolnull484     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 
TestScalarOptionalnull493     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     }
621   }
622 }
623