local mod = require 'std.dbg.encode' local encode = mod.encode local decode = mod.decode describe('std.dbg.encode', function() describe('encode()', function() it('should produce single-line JSON without trailing newline', function() local result = encode({ kind = 'DEBUG', date = 1234567890 }) assert.is_string(result) assert.is_not_nil(result:match '^%{') assert.is_nil(result:match '\n') assert.is_nil(result:match '\n$') end) it('should round-trip a simple event', function() local original = { kind = 'DEBUG', date = 1234567890 } local encoded = encode(original) local decoded = decode(encoded) assert.equal(original.kind, decoded.kind) assert.equal(original.date, decoded.date) end) it('should handle nested tables in data field', function() local original = { kind = 'ERROR', date = 1234567890, data = { { a = 1 }, { b = 2 } }, } local encoded = encode(original) local decoded = decode(encoded) assert.equal(original.kind, decoded.kind) assert.equal(original.data[1].a, decoded.data[1].a) assert.equal(original.data[2].b, decoded.data[2].b) end) it('should handle nil values in tables via luanil', function() local original = { kind = 'DEBUG', date = 1234567890, data = { nil, value = 'yes' }, } local encoded = encode(original) local decoded = decode(encoded) assert.is_nil(decoded.data[1]) assert.equal('yes', decoded.data.value) end) it('should escape forward slashes', function() local result = encode({ format = 'path/like/this' }) assert.is_string(result) assert.is_nil(result:match '([^\\])/[^/]') end) it('should handle all string types in kind, format, filename, fn', function() local original = { kind = 'TRACE', date = 1234567890, format = 'test message', data = {}, filename = '/path/to/file.lua', fn = 'my_function', line = 42, } local encoded = encode(original) local decoded = decode(encoded) assert.equal(original.kind, decoded.kind) assert.equal(original.format, decoded.format) assert.equal(original.filename, decoded.filename) assert.equal(original.fn, decoded.fn) assert.equal(original.line, decoded.line) end) end) describe('decode()', function() it('should decode a valid JSON line', function() local line = '{"kind":"DEBUG","date":1234567890}' local decoded = decode(line) assert.equal('DEBUG', decoded.kind) assert.equal(1234567890, decoded.date) end) it('should handle empty data arrays', function() local original = { kind = 'DEBUG', data = {} } local encoded = encode(original) local decoded = decode(encoded) assert.is_table(decoded.data) assert.equal(0, #decoded.data) end) it('should handle numeric fields correctly', function() local original = { kind = 'ERROR', date = 0, line = 0 } local encoded = encode(original) local decoded = decode(encoded) assert.equal(0, decoded.date) assert.equal(0, decoded.line) end) end) end)