--[[ Tests for dump_cinit.lua. Runs first in a mode that generates some C code for an extension. The C code is compiled and then loaded by a second invocation of the test which checks that the generated defs are as expected. --]] local dump_cinit = require "dump_cinit" local upb = require "upb" -- Once APIs for loading descriptors are fleshed out, we should replace this -- with a descriptor for a meaty protobuf like descriptor.proto. local symtab = upb.SymbolTable{ upb.EnumDef{full_name = "MyEnum", values = { {"FOO", 1}, {"BAR", 77} } }, upb.MessageDef{full_name = "MyMessage", fields = { upb.FieldDef{label = upb.LABEL_REQUIRED, name = "field1", number = 1, type = upb.TYPE_INT32}, upb.FieldDef{label = upb.LABEL_REPEATED, name = "field2", number = 2, type = upb.TYPE_ENUM, subdef_name = ".MyEnum"}, upb.FieldDef{name = "field3", number = 3, type = upb.TYPE_MESSAGE, subdef_name = ".MyMessage"} } } } if arg[1] == "generate" then local f = assert(io.open(arg[2], "w")) local f_h = assert(io.open(arg[2] .. ".h", "w")) local appendc = dump_cinit.file_appender(f) local appendh = dump_cinit.file_appender(f_h) f:write('#include "lua.h"\n') f:write('#include "upb/bindings/lua/upb.h"\n') dump_cinit.dump_defs(symtab, "testdefs", appendh, appendc) f:write([[int luaopen_staticdefs(lua_State *L) { const upb_symtab *s = upbdefs_testdefs(&s); lupb_symtab_pushwrapper(L, s, &s); return 1; }]]) f_h:close() f:close() elseif arg[1] == "test" then local symtab = require "staticdefs" local msg = assert(symtab:lookup("MyMessage")) local enum = assert(symtab:lookup("MyEnum")) local f2 = assert(msg:field("field2")) assert(msg:def_type() == upb.DEF_MSG) assert(msg:full_name() == "MyMessage") assert(enum:def_type() == upb.DEF_ENUM) assert(enum:full_name() == "MyEnum") assert(enum:value("FOO") == 1) assert(f2:name() == "field2") assert(f2:containing_type() == msg) assert(f2:subdef() == enum) else error("Unknown operation " .. arg[1]) end