diff --git a/tests/ts/reflection/enum.js b/tests/ts/reflection/enum.js
new file mode 100644
index 0000000..4939307
--- /dev/null
+++ b/tests/ts/reflection/enum.js
@@ -0,0 +1,175 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+import * as flatbuffers from 'flatbuffers';
+import { EnumVal } from '../reflection/enum-val.js';
+import { KeyValue } from '../reflection/key-value.js';
+import { Type } from '../reflection/type.js';
+export class Enum {
+    constructor() {
+        this.bb = null;
+        this.bb_pos = 0;
+    }
+    __init(i, bb) {
+        this.bb_pos = i;
+        this.bb = bb;
+        return this;
+    }
+    static getRootAsEnum(bb, obj) {
+        return (obj || new Enum()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+    }
+    static getSizePrefixedRootAsEnum(bb, obj) {
+        bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+        return (obj || new Enum()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+    }
+    name(optionalEncoding) {
+        const offset = this.bb.__offset(this.bb_pos, 4);
+        return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;
+    }
+    values(index, obj) {
+        const offset = this.bb.__offset(this.bb_pos, 6);
+        return offset ? (obj || new EnumVal()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;
+    }
+    valuesLength() {
+        const offset = this.bb.__offset(this.bb_pos, 6);
+        return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;
+    }
+    isUnion() {
+        const offset = this.bb.__offset(this.bb_pos, 8);
+        return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;
+    }
+    mutate_is_union(value) {
+        const offset = this.bb.__offset(this.bb_pos, 8);
+        if (offset === 0) {
+            return false;
+        }
+        this.bb.writeInt8(this.bb_pos + offset, +value);
+        return true;
+    }
+    underlyingType(obj) {
+        const offset = this.bb.__offset(this.bb_pos, 10);
+        return offset ? (obj || new Type()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;
+    }
+    attributes(index, obj) {
+        const offset = this.bb.__offset(this.bb_pos, 12);
+        return offset ? (obj || new KeyValue()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null;
+    }
+    attributesLength() {
+        const offset = this.bb.__offset(this.bb_pos, 12);
+        return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;
+    }
+    documentation(index, optionalEncoding) {
+        const offset = this.bb.__offset(this.bb_pos, 14);
+        return offset ? this.bb.__string(this.bb.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;
+    }
+    documentationLength() {
+        const offset = this.bb.__offset(this.bb_pos, 14);
+        return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;
+    }
+    declarationFile(optionalEncoding) {
+        const offset = this.bb.__offset(this.bb_pos, 16);
+        return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;
+    }
+    static getFullyQualifiedName() {
+        return 'reflection_Enum';
+    }
+    static startEnum(builder) {
+        builder.startObject(7);
+    }
+    static addName(builder, nameOffset) {
+        builder.addFieldOffset(0, nameOffset, 0);
+    }
+    static addValues(builder, valuesOffset) {
+        builder.addFieldOffset(1, valuesOffset, 0);
+    }
+    static createValuesVector(builder, data) {
+        builder.startVector(4, data.length, 4);
+        for (let i = data.length - 1; i >= 0; i--) {
+            builder.addOffset(data[i]);
+        }
+        return builder.endVector();
+    }
+    static startValuesVector(builder, numElems) {
+        builder.startVector(4, numElems, 4);
+    }
+    static addIsUnion(builder, isUnion) {
+        builder.addFieldInt8(2, +isUnion, +false);
+    }
+    static addUnderlyingType(builder, underlyingTypeOffset) {
+        builder.addFieldOffset(3, underlyingTypeOffset, 0);
+    }
+    static addAttributes(builder, attributesOffset) {
+        builder.addFieldOffset(4, attributesOffset, 0);
+    }
+    static createAttributesVector(builder, data) {
+        builder.startVector(4, data.length, 4);
+        for (let i = data.length - 1; i >= 0; i--) {
+            builder.addOffset(data[i]);
+        }
+        return builder.endVector();
+    }
+    static startAttributesVector(builder, numElems) {
+        builder.startVector(4, numElems, 4);
+    }
+    static addDocumentation(builder, documentationOffset) {
+        builder.addFieldOffset(5, documentationOffset, 0);
+    }
+    static createDocumentationVector(builder, data) {
+        builder.startVector(4, data.length, 4);
+        for (let i = data.length - 1; i >= 0; i--) {
+            builder.addOffset(data[i]);
+        }
+        return builder.endVector();
+    }
+    static startDocumentationVector(builder, numElems) {
+        builder.startVector(4, numElems, 4);
+    }
+    static addDeclarationFile(builder, declarationFileOffset) {
+        builder.addFieldOffset(6, declarationFileOffset, 0);
+    }
+    static endEnum(builder) {
+        const offset = builder.endObject();
+        builder.requiredField(offset, 4); // name
+        builder.requiredField(offset, 6); // values
+        builder.requiredField(offset, 10); // underlying_type
+        return offset;
+    }
+    unpack() {
+        return new EnumT(this.name(), this.bb.createObjList(this.values.bind(this), this.valuesLength()), this.isUnion(), (this.underlyingType() !== null ? this.underlyingType().unpack() : null), this.bb.createObjList(this.attributes.bind(this), this.attributesLength()), this.bb.createScalarList(this.documentation.bind(this), this.documentationLength()), this.declarationFile());
+    }
+    unpackTo(_o) {
+        _o.name = this.name();
+        _o.values = this.bb.createObjList(this.values.bind(this), this.valuesLength());
+        _o.isUnion = this.isUnion();
+        _o.underlyingType = (this.underlyingType() !== null ? this.underlyingType().unpack() : null);
+        _o.attributes = this.bb.createObjList(this.attributes.bind(this), this.attributesLength());
+        _o.documentation = this.bb.createScalarList(this.documentation.bind(this), this.documentationLength());
+        _o.declarationFile = this.declarationFile();
+    }
+}
+export class EnumT {
+    constructor(name = null, values = [], isUnion = false, underlyingType = null, attributes = [], documentation = [], declarationFile = null) {
+        this.name = name;
+        this.values = values;
+        this.isUnion = isUnion;
+        this.underlyingType = underlyingType;
+        this.attributes = attributes;
+        this.documentation = documentation;
+        this.declarationFile = declarationFile;
+    }
+    pack(builder) {
+        const name = (this.name !== null ? builder.createString(this.name) : 0);
+        const values = Enum.createValuesVector(builder, builder.createObjectOffsetList(this.values));
+        const underlyingType = (this.underlyingType !== null ? this.underlyingType.pack(builder) : 0);
+        const attributes = Enum.createAttributesVector(builder, builder.createObjectOffsetList(this.attributes));
+        const documentation = Enum.createDocumentationVector(builder, builder.createObjectOffsetList(this.documentation));
+        const declarationFile = (this.declarationFile !== null ? builder.createString(this.declarationFile) : 0);
+        Enum.startEnum(builder);
+        Enum.addName(builder, name);
+        Enum.addValues(builder, values);
+        Enum.addIsUnion(builder, this.isUnion);
+        Enum.addUnderlyingType(builder, underlyingType);
+        Enum.addAttributes(builder, attributes);
+        Enum.addDocumentation(builder, documentation);
+        Enum.addDeclarationFile(builder, declarationFile);
+        return Enum.endEnum(builder);
+    }
+}
