author | Kim Alvefur <zash@zash.se> |
Thu, 28 Mar 2024 15:39:59 +0100 | |
changeset 13473 | f9171624fd03 |
parent 13434 | 1a5e3cf037f6 |
permissions | -rw-r--r-- |
11172
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 |
local strbitop = require "util.strbitop"; |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 |
describe("util.strbitop", function () |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 |
describe("sand()", function () |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 |
it("works", function () |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 |
assert.equal(string.rep("Aa", 100), strbitop.sand(string.rep("a", 200), "Aa")); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 |
end); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 |
it("returns empty string if first argument is empty", function () |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 |
assert.equal("", strbitop.sand("", "")); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 |
assert.equal("", strbitop.sand("", "key")); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 |
end); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 |
it("returns initial string if key is empty", function () |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 |
assert.equal("hello", strbitop.sand("hello", "")); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 |
end); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 |
end); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 |
|
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 |
describe("sor()", function () |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 |
it("works", function () |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 |
assert.equal(string.rep("a", 200), strbitop.sor(string.rep("Aa", 100), "a")); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 |
end); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 |
it("returns empty string if first argument is empty", function () |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 |
assert.equal("", strbitop.sor("", "")); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 |
assert.equal("", strbitop.sor("", "key")); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 |
end); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 |
it("returns initial string if key is empty", function () |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 |
assert.equal("hello", strbitop.sor("hello", "")); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 |
end); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 |
end); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 |
|
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 |
describe("sxor()", function () |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 |
it("works", function () |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 |
assert.equal(string.rep("Aa", 100), strbitop.sxor(string.rep("a", 200), " \0")); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 |
end); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 |
it("returns empty string if first argument is empty", function () |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 |
assert.equal("", strbitop.sxor("", "")); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 |
assert.equal("", strbitop.sxor("", "key")); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 |
end); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 |
it("returns initial string if key is empty", function () |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 |
assert.equal("hello", strbitop.sxor("hello", "")); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 |
end); |
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 |
end); |
13433
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
41 |
|
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
42 |
describe("common_prefix_bits()", function () |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
43 |
local function B(s) |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
44 |
assert(#s%8==0, "Invalid test input: B(s): s should be a multiple of 8 bits in length"); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
45 |
local byte = 0; |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
46 |
local out_str = {}; |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
47 |
for i = 1, #s do |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
48 |
local bit_ascii = s:byte(i); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
49 |
if bit_ascii == 49 then -- '1' |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
50 |
byte = byte + 2^((7-(i-1))%8); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
51 |
elseif bit_ascii ~= 48 then |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
52 |
error("Invalid test input: B(s): s should contain only '0' or '1' characters"); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
53 |
end |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
54 |
if (i-1)%8 == 7 then |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
55 |
table.insert(out_str, string.char(byte)); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
56 |
byte = 0; |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
57 |
end |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
58 |
end |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
59 |
return table.concat(out_str); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
60 |
end |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
61 |
|
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
62 |
local _cpb = strbitop.common_prefix_bits; |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
63 |
local function test(a, b) |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
64 |
local Ba, Bb = B(a), B(b); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
65 |
local ret1 = _cpb(Ba, Bb); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
66 |
local ret2 = _cpb(Bb, Ba); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
67 |
assert(ret1 == ret2, ("parameter order should not make a difference to the result (%s, %s) = %d, reversed = %d"):format(a, b, ret1, ret2)); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
68 |
return ret1; |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
69 |
end |
13434
1a5e3cf037f6
util.strbitop: Remove unused import in tests
Matthew Wild <mwild1@gmail.com>
parents:
13433
diff
changeset
|
70 |
|
13433
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
71 |
it("works on single bytes", function () |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
72 |
assert.equal(0, test("00000000", "11111111")); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
73 |
assert.equal(1, test("10000000", "11111111")); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
74 |
assert.equal(0, test("01000000", "11111111")); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
75 |
assert.equal(0, test("01000000", "11111111")); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
76 |
assert.equal(8, test("11111111", "11111111")); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
77 |
end); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
78 |
|
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
79 |
it("works on multiple bytes", function () |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
80 |
for i = 0, 16 do |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
81 |
assert.equal(i, test(string.rep("1", i)..string.rep("0", 16-i), "1111111111111111")); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
82 |
end |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
83 |
end); |
6cdc6923d65a
util.strbitop: Add common_prefix_bits() method
Matthew Wild <mwild1@gmail.com>
parents:
13431
diff
changeset
|
84 |
end); |
11172
cde600e2fdf9
util.strbitop: Add tests covering basics
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 |
end); |