--[[ upb - a minimalist implementation of protocol buffers. Copyright (c) 2012 Google Inc. See LICENSE for details. Author: Josh Haberman 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('#define ELEMENTS(array) (sizeof(array)/sizeof(*array))\n') f:write('#include "upb/bindings/lua/upb.h"\n') dump_cinit.dump_defs(symtab, "test", appendh, appendc) f:write([[int luaopen_staticdefs(lua_State *L) { lua_newtable(L); for (int i = 0; i < ELEMENTS(test_msgs); i++) { lupb_def_pushnewrapper(L, UPB_UPCAST(&test_msgs[i]), NULL); lua_rawseti(L, -2, i + 1); } for (int i = 0; i < ELEMENTS(test_enums); i++) { lupb_def_pushnewrapper(L, UPB_UPCAST(&test_enums[i]), NULL); lua_rawseti(L, -2, ELEMENTS(test_msgs) + i + 1); } return 1; }]]) f_h:close() f:close() elseif arg[1] == "test" then local staticdefs = require "staticdefs" local msg = assert(staticdefs[1]) local enum = assert(staticdefs[2]) 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