Files
lua/bin/lua-zap-test
zeekay 91103511be Finish capnp->ZAP rebrand; vendor lunitx; decouple cjson; bump rockspec
Rename the Cap'n Proto Lua port to ZAP, brand-neutral throughout:
- capnp.lua -> zap.lua, capnp/ -> zap/, *.capnp -> *.zap, compiler bins
  capnpc-* -> zapc-*, schema/handwritten modules -> *_zap.lua. Zero
  capnp/Cap'n Proto leftovers in zap-native source/build (upstream-fork
  Kenton Varda copyright headers in proto/c++.zap and bin/schema.zap stay).
  Generated-code header and doc links point at github.com/zap-proto/lua and
  zap-proto.io.

Tests now run with no extra install:
- Vendor the lunitx test framework (Michael Roth / Doug Currie, MIT) under
  vendor/ (lunit, lunit.console, lunitx, lunitx.atexit). Its __gc atexit hook
  drives each test file under LuaJIT and exits nonzero on any failure.
- tests/run_tests.sh and test.sh are self-contained (set LUA_PATH incl
  vendor/), generate proto/example_zap.lua via the `zap` compiler when present,
  and skip 01/10 with a clear note (never a false pass) when it is absent.
  02-util and 03-compile are pure-Lua and always run.
- Verified under LuaJIT 2.1: 01(20) + 02(7) + 03(1) + 10(31) = 59 tests pass,
  0 failed; runner returns nonzero on an injected failure.

Decouple optional cjson so the runtime/compiler load under a bare LuaJIT:
- zap/compile.lua loads cjson lazily and only for debug logging (guarded by
  the debug flag); bin/zapc-llua makes the schema JSON dump optional.

Rockspec: bump lua-zap to 0.1.3-4, declare lua-cjson >= 2.1.0, and install the
vendored lunitx modules. .gitignore: scope the rockspec-pack ignore to repo
root so rockspec/ specs are tracked; ignore the `dump` test artifact.

TODO trimmed to the genuinely remaining items (AnyPointer set/decode, packed
serialization, schema_zap regeneration, multi-file compile, perf).
2026-06-20 00:12:16 -07:00

70 lines
1.8 KiB
Lua
Executable File

#!/usr/bin/env luajit
local test = require("test_zap")
local cjson = require("cjson")
local util = require("zap.util")
local insert = table.insert
local concat = table.concat
-- print(arg[1], arg[2])
local action = arg[1]
local test_case = arg[2]
-- print(action, test_case)
function pprint(val, T)
print(util.to_text(val, T))
end
local type_map = {
simpleTest = "SimpleTestStruct",
textListTypeTest = "ListTest",
uInt8DefaultValueTest = "TestDefaults",
constTest = "SimpleTestStruct",
}
local proto_file = "test.zap"
local proto
function get_input(test_case)
if not proto then
proto = util.read_file(proto_file)
end
local start, stop, _1 = string.find(proto, "const ".. test_case .. " :%w+ = ([^\n]*);")
local str = _1
for s in string.gmatch(str, "%.[0-9a-zA-Z_]+") do
local const = string.sub(s, 2)
local pattern = "const ".. const .. " :%w+ = ([^\n]*);"
local start, stop, _2 = string.find(proto, pattern)
str = string.gsub(str, s, _2)
--print(start, stop, const, _2, str)
end
local lua_str = util.parse_zap_txt(str)
--util.write_file(lua_str)
return assert(loadstring(lua_str)())
end
local typ = assert(type_map[test_case])
if action == "decode" then
local content = io.stdin:read("*a")
--util.write_file("decode_" .. test_case, content)
local r = test[typ].parse(content)
pprint(r, test[typ])
if test_case == "uInt8DefaultValueTest" then
os.exit(127)
end
elseif action == "encode" then
local input = get_input(test_case)
local r = test[typ].serialize(input)
util.write_file("encode_" .. test_case, r)
io.stdout:write(r)
--[[
if test_case == "constTest" then
os.exit(127)
end
]]
end