diff --git a/tests/optional_scalars/ScalarStuff.kt b/tests/optional_scalars/ScalarStuff.kt
new file mode 100644
index 0000000..5728384
--- /dev/null
+++ b/tests/optional_scalars/ScalarStuff.kt
@@ -0,0 +1,292 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package optional_scalars
+
+import java.nio.*
+import kotlin.math.sign
+import com.google.flatbuffers.*
+
+@Suppress("unused")
+@ExperimentalUnsignedTypes
+class ScalarStuff : Table() {
+
+    fun __init(_i: Int, _bb: ByteBuffer)  {
+        __reset(_i, _bb)
+    }
+    fun __assign(_i: Int, _bb: ByteBuffer) : ScalarStuff {
+        __init(_i, _bb)
+        return this
+    }
+    val justI8 : Byte
+        get() {
+            val o = __offset(4)
+            return if(o != 0) bb.get(o + bb_pos) else 0
+        }
+    val maybeI8 : Byte?
+        get() {
+            val o = __offset(6)
+            return if(o != 0) bb.get(o + bb_pos) else null
+        }
+    val defaultI8 : Byte
+        get() {
+            val o = __offset(8)
+            return if(o != 0) bb.get(o + bb_pos) else 42
+        }
+    val justU8 : UByte
+        get() {
+            val o = __offset(10)
+            return if(o != 0) bb.get(o + bb_pos).toUByte() else 0u
+        }
+    val maybeU8 : UByte?
+        get() {
+            val o = __offset(12)
+            return if(o != 0) bb.get(o + bb_pos).toUByte() else null
+        }
+    val defaultU8 : UByte
+        get() {
+            val o = __offset(14)
+            return if(o != 0) bb.get(o + bb_pos).toUByte() else 42u
+        }
+    val justI16 : Short
+        get() {
+            val o = __offset(16)
+            return if(o != 0) bb.getShort(o + bb_pos) else 0
+        }
+    val maybeI16 : Short?
+        get() {
+            val o = __offset(18)
+            return if(o != 0) bb.getShort(o + bb_pos) else null
+        }
+    val defaultI16 : Short
+        get() {
+            val o = __offset(20)
+            return if(o != 0) bb.getShort(o + bb_pos) else 42
+        }
+    val justU16 : UShort
+        get() {
+            val o = __offset(22)
+            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 0u
+        }
+    val maybeU16 : UShort?
+        get() {
+            val o = __offset(24)
+            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else null
+        }
+    val defaultU16 : UShort
+        get() {
+            val o = __offset(26)
+            return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 42u
+        }
+    val justI32 : Int
+        get() {
+            val o = __offset(28)
+            return if(o != 0) bb.getInt(o + bb_pos) else 0
+        }
+    val maybeI32 : Int?
+        get() {
+            val o = __offset(30)
+            return if(o != 0) bb.getInt(o + bb_pos) else null
+        }
+    val defaultI32 : Int
+        get() {
+            val o = __offset(32)
+            return if(o != 0) bb.getInt(o + bb_pos) else 42
+        }
+    val justU32 : UInt
+        get() {
+            val o = __offset(34)
+            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 0u
+        }
+    val maybeU32 : UInt?
+        get() {
+            val o = __offset(36)
+            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else null
+        }
+    val defaultU32 : UInt
+        get() {
+            val o = __offset(38)
+            return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 42u
+        }
+    val justI64 : Long
+        get() {
+            val o = __offset(40)
+            return if(o != 0) bb.getLong(o + bb_pos) else 0L
+        }
+    val maybeI64 : Long?
+        get() {
+            val o = __offset(42)
+            return if(o != 0) bb.getLong(o + bb_pos) else null
+        }
+    val defaultI64 : Long
+        get() {
+            val o = __offset(44)
+            return if(o != 0) bb.getLong(o + bb_pos) else 42L
+        }
+    val justU64 : ULong
+        get() {
+            val o = __offset(46)
+            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL
+        }
+    val maybeU64 : ULong?
+        get() {
+            val o = __offset(48)
+            return if(o != 0) bb.getLong(o + bb_pos).toULong() else null
+        }
+    val defaultU64 : ULong
+        get() {
+            val o = __offset(50)
+            return if(o != 0) bb.getLong(o + bb_pos).toULong() else 42UL
+        }
+    val justF32 : Float
+        get() {
+            val o = __offset(52)
+            return if(o != 0) bb.getFloat(o + bb_pos) else 0.0f
+        }
+    val maybeF32 : Float?
+        get() {
+            val o = __offset(54)
+            return if(o != 0) bb.getFloat(o + bb_pos) else null
+        }
+    val defaultF32 : Float
+        get() {
+            val o = __offset(56)
+            return if(o != 0) bb.getFloat(o + bb_pos) else 42.0f
+        }
+    val justF64 : Double
+        get() {
+            val o = __offset(58)
+            return if(o != 0) bb.getDouble(o + bb_pos) else 0.0
+        }
+    val maybeF64 : Double?
+        get() {
+            val o = __offset(60)
+            return if(o != 0) bb.getDouble(o + bb_pos) else null
+        }
+    val defaultF64 : Double
+        get() {
+            val o = __offset(62)
+            return if(o != 0) bb.getDouble(o + bb_pos) else 42.0
+        }
+    val justBool : Boolean
+        get() {
+            val o = __offset(64)
+            return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else false
+        }
+    val maybeBool : Boolean?
+        get() {
+            val o = __offset(66)
+            return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else null
+        }
+    val defaultBool : Boolean
+        get() {
+            val o = __offset(68)
+            return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else true
+        }
+    val justEnum : Byte
+        get() {
+            val o = __offset(70)
+            return if(o != 0) bb.get(o + bb_pos) else 0
+        }
+    val maybeEnum : Byte?
+        get() {
+            val o = __offset(72)
+            return if(o != 0) bb.get(o + bb_pos) else null
+        }
+    val defaultEnum : Byte
+        get() {
+            val o = __offset(74)
+            return if(o != 0) bb.get(o + bb_pos) else 1
+        }
+    companion object {
+        fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
+        fun getRootAsScalarStuff(_bb: ByteBuffer): ScalarStuff = getRootAsScalarStuff(_bb, ScalarStuff())
+        fun getRootAsScalarStuff(_bb: ByteBuffer, obj: ScalarStuff): ScalarStuff {
+            _bb.order(ByteOrder.LITTLE_ENDIAN)
+            return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))
+        }
+        fun ScalarStuffBufferHasIdentifier(_bb: ByteBuffer) : Boolean = __has_identifier(_bb, "NULL")
+        fun createScalarStuff(builder: FlatBufferBuilder, justI8: Byte, maybeI8: Byte?, defaultI8: Byte, justU8: UByte, maybeU8: UByte?, defaultU8: UByte, justI16: Short, maybeI16: Short?, defaultI16: Short, justU16: UShort, maybeU16: UShort?, defaultU16: UShort, justI32: Int, maybeI32: Int?, defaultI32: Int, justU32: UInt, maybeU32: UInt?, defaultU32: UInt, justI64: Long, maybeI64: Long?, defaultI64: Long, justU64: ULong, maybeU64: ULong?, defaultU64: ULong, justF32: Float, maybeF32: Float?, defaultF32: Float, justF64: Double, maybeF64: Double?, defaultF64: Double, justBool: Boolean, maybeBool: Boolean?, defaultBool: Boolean, justEnum: Byte, maybeEnum: Byte?, defaultEnum: Byte) : Int {
+            builder.startTable(36)
+            addDefaultF64(builder, defaultF64)
+            maybeF64?.run { addMaybeF64(builder, maybeF64) }
+            addJustF64(builder, justF64)
+            addDefaultU64(builder, defaultU64)
+            maybeU64?.run { addMaybeU64(builder, maybeU64) }
+            addJustU64(builder, justU64)
+            addDefaultI64(builder, defaultI64)
+            maybeI64?.run { addMaybeI64(builder, maybeI64) }
+            addJustI64(builder, justI64)
+            addDefaultF32(builder, defaultF32)
+            maybeF32?.run { addMaybeF32(builder, maybeF32) }
+            addJustF32(builder, justF32)
+            addDefaultU32(builder, defaultU32)
+            maybeU32?.run { addMaybeU32(builder, maybeU32) }
+            addJustU32(builder, justU32)
+            addDefaultI32(builder, defaultI32)
+            maybeI32?.run { addMaybeI32(builder, maybeI32) }
+            addJustI32(builder, justI32)
+            addDefaultU16(builder, defaultU16)
+            maybeU16?.run { addMaybeU16(builder, maybeU16) }
+            addJustU16(builder, justU16)
+            addDefaultI16(builder, defaultI16)
+            maybeI16?.run { addMaybeI16(builder, maybeI16) }
+            addJustI16(builder, justI16)
+            addDefaultEnum(builder, defaultEnum)
+            maybeEnum?.run { addMaybeEnum(builder, maybeEnum) }
+            addJustEnum(builder, justEnum)
+            addDefaultBool(builder, defaultBool)
+            maybeBool?.run { addMaybeBool(builder, maybeBool) }
+            addJustBool(builder, justBool)
+            addDefaultU8(builder, defaultU8)
+            maybeU8?.run { addMaybeU8(builder, maybeU8) }
+            addJustU8(builder, justU8)
+            addDefaultI8(builder, defaultI8)
+            maybeI8?.run { addMaybeI8(builder, maybeI8) }
+            addJustI8(builder, justI8)
+            return endScalarStuff(builder)
+        }
+        fun startScalarStuff(builder: FlatBufferBuilder) = builder.startTable(36)
+        fun addJustI8(builder: FlatBufferBuilder, justI8: Byte) = builder.addByte(0, justI8, 0)
+        fun addMaybeI8(builder: FlatBufferBuilder, maybeI8: Byte) = builder.addByte(1, maybeI8, 0)
+        fun addDefaultI8(builder: FlatBufferBuilder, defaultI8: Byte) = builder.addByte(2, defaultI8, 42)
+        fun addJustU8(builder: FlatBufferBuilder, justU8: UByte) = builder.addByte(3, justU8.toByte(), 0)
+        fun addMaybeU8(builder: FlatBufferBuilder, maybeU8: UByte) = builder.addByte(4, maybeU8.toByte(), 0)
+        fun addDefaultU8(builder: FlatBufferBuilder, defaultU8: UByte) = builder.addByte(5, defaultU8.toByte(), 42)
+        fun addJustI16(builder: FlatBufferBuilder, justI16: Short) = builder.addShort(6, justI16, 0)
+        fun addMaybeI16(builder: FlatBufferBuilder, maybeI16: Short) = builder.addShort(7, maybeI16, 0)
+        fun addDefaultI16(builder: FlatBufferBuilder, defaultI16: Short) = builder.addShort(8, defaultI16, 42)
+        fun addJustU16(builder: FlatBufferBuilder, justU16: UShort) = builder.addShort(9, justU16.toShort(), 0)
+        fun addMaybeU16(builder: FlatBufferBuilder, maybeU16: UShort) = builder.addShort(10, maybeU16.toShort(), 0)
+        fun addDefaultU16(builder: FlatBufferBuilder, defaultU16: UShort) = builder.addShort(11, defaultU16.toShort(), 42)
+        fun addJustI32(builder: FlatBufferBuilder, justI32: Int) = builder.addInt(12, justI32, 0)
+        fun addMaybeI32(builder: FlatBufferBuilder, maybeI32: Int) = builder.addInt(13, maybeI32, 0)
+        fun addDefaultI32(builder: FlatBufferBuilder, defaultI32: Int) = builder.addInt(14, defaultI32, 42)
+        fun addJustU32(builder: FlatBufferBuilder, justU32: UInt) = builder.addInt(15, justU32.toInt(), 0)
+        fun addMaybeU32(builder: FlatBufferBuilder, maybeU32: UInt) = builder.addInt(16, maybeU32.toInt(), 0)
+        fun addDefaultU32(builder: FlatBufferBuilder, defaultU32: UInt) = builder.addInt(17, defaultU32.toInt(), 42)
+        fun addJustI64(builder: FlatBufferBuilder, justI64: Long) = builder.addLong(18, justI64, 0L)
+        fun addMaybeI64(builder: FlatBufferBuilder, maybeI64: Long) = builder.addLong(19, maybeI64, 0)
+        fun addDefaultI64(builder: FlatBufferBuilder, defaultI64: Long) = builder.addLong(20, defaultI64, 42L)
+        fun addJustU64(builder: FlatBufferBuilder, justU64: ULong) = builder.addLong(21, justU64.toLong(), 0)
+        fun addMaybeU64(builder: FlatBufferBuilder, maybeU64: ULong) = builder.addLong(22, maybeU64.toLong(), 0)
+        fun addDefaultU64(builder: FlatBufferBuilder, defaultU64: ULong) = builder.addLong(23, defaultU64.toLong(), 42)
+        fun addJustF32(builder: FlatBufferBuilder, justF32: Float) = builder.addFloat(24, justF32, 0.0)
+        fun addMaybeF32(builder: FlatBufferBuilder, maybeF32: Float) = builder.addFloat(25, maybeF32, 0.0)
+        fun addDefaultF32(builder: FlatBufferBuilder, defaultF32: Float) = builder.addFloat(26, defaultF32, 42.0)
+        fun addJustF64(builder: FlatBufferBuilder, justF64: Double) = builder.addDouble(27, justF64, 0.0)
+        fun addMaybeF64(builder: FlatBufferBuilder, maybeF64: Double) = builder.addDouble(28, maybeF64, 0.0)
+        fun addDefaultF64(builder: FlatBufferBuilder, defaultF64: Double) = builder.addDouble(29, defaultF64, 42.0)
+        fun addJustBool(builder: FlatBufferBuilder, justBool: Boolean) = builder.addBoolean(30, justBool, false)
+        fun addMaybeBool(builder: FlatBufferBuilder, maybeBool: Boolean) = builder.addBoolean(31, maybeBool, false)
+        fun addDefaultBool(builder: FlatBufferBuilder, defaultBool: Boolean) = builder.addBoolean(32, defaultBool, true)
+        fun addJustEnum(builder: FlatBufferBuilder, justEnum: Byte) = builder.addByte(33, justEnum, 0)
+        fun addMaybeEnum(builder: FlatBufferBuilder, maybeEnum: Byte) = builder.addByte(34, maybeEnum, 0)
+        fun addDefaultEnum(builder: FlatBufferBuilder, defaultEnum: Byte) = builder.addByte(35, defaultEnum, 1)
+        fun endScalarStuff(builder: FlatBufferBuilder) : Int {
+            val o = builder.endTable()
+            return o
+        }
+        fun finishScalarStuffBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset, "NULL")
+        fun finishSizePrefixedScalarStuffBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finishSizePrefixed(offset, "NULL")
+    }
+}
