local function assertEquals(a, b, msg) if a ~= b then error((msg or "assertEquals") .. ": expected " .. tostring(b) .. " got " .. tostring(a)) end end local function assertError(fn, msg) local ok, err = pcall(fn) if ok then error(msg or "expected error") end end -- packsize: fixed formats do assertEquals(string.packsize("b"), 1, "packsize b") assertEquals(string.packsize("B"), 1, "packsize B") assertEquals(string.packsize("h"), 2, "packsize h") assertEquals(string.packsize("H"), 2, "packsize H") assertEquals(string.packsize("i4"), 4, "packsize i4") assertEquals(string.packsize("I4"), 4, "packsize I4") assertEquals(string.packsize("i8"), 8, "packsize i8") assertEquals(string.packsize("f"), 4, "packsize f") assertEquals(string.packsize("d"), 8, "packsize d") assertEquals(string.packsize("c10"), 10, "packsize c10") assertEquals(string.packsize("i4i4"), 8, "packsize i4i4") -- variable-length formats must error assertError(function() string.packsize("s4") end, "packsize s4 must error") assertError(function() string.packsize("z") end, "packsize z must error") end -- little-endian integers do local s = string.pack("i2", 256) assertEquals(s:byte(1), 1, "pack >i2(256) byte 1") assertEquals(s:byte(2), 0, "pack >i2(256) byte 2") local v = string.unpack(">i2", s) assertEquals(v, 256, "unpack >i2") local s2 = string.pack(">I2", 0xABCD) local v2 = string.unpack(">I2", s2) assertEquals(v2, 0xABCD, "unpack >I2") end -- byte / unsigned byte do local s = string.pack("BB", 65, 66) assertEquals(#s, 2, "pack BB length") local a, b, _ = string.unpack("BB", s) assertEquals(a, 65, "unpack B first") assertEquals(b, 66, "unpack B second") -- signed byte: -1 round-trips local s2 = string.pack("b", -1) local v2 = string.unpack("b", s2) assertEquals(v2, -1, "unpack b -1") end -- float (f) and double (d) do local s = string.pack("I2", 0x0102, 0x0304) -- little: 02 01; big: 03 04 assertEquals(s:byte(1), 0x02, "LE low byte") assertEquals(s:byte(2), 0x01, "LE high byte") assertEquals(s:byte(3), 0x03, "BE high byte") assertEquals(s:byte(4), 0x04, "BE low byte") end