Moved cdata tests to own file, and began work on string analysis.
This commit is contained in:
parent
0a79a8a77a
commit
df232b144b
54
analyze_byte_string.lua
Normal file
54
analyze_byte_string.lua
Normal file
|
@ -0,0 +1,54 @@
|
|||
|
||||
require 'fun' ()
|
||||
local utf8 = require 'utf8'
|
||||
|
||||
local ASCII_CHAR_PATTERN = '[\32-\126\009\010\013]'
|
||||
local UNICODE_CHAR_PATTERN = '[\01-\127\192-\255][\128-\191]*'
|
||||
|
||||
local function ledgible_subsequences_in (str)
|
||||
return totable(str:gmatch(ASCII_CHAR_PATTERN..'+'))
|
||||
end
|
||||
|
||||
local function probability_of_ascii_string (str)
|
||||
local sub_seqs = ledgible_subsequences_in(str)
|
||||
local nr_characters = #str
|
||||
local nr_ledgible_characters = foldl(operator.add, map(operator.len, sub_seqs))
|
||||
local len_of_longest_subseq = foldl(math.max, map(operator.len, sub_seqs))
|
||||
return ((len_of_longest_subseq/nr_ledgible_characters) + (nr_ledgible_characters / nr_characters)) / 2
|
||||
end
|
||||
|
||||
local function probability_of_utf8_string (str)
|
||||
local valid_bytes = 0
|
||||
for char, valid in utf8.iterate(str) do
|
||||
if valid then valid_bytes = valid_bytes + #char end
|
||||
end
|
||||
return valid_bytes / #str
|
||||
end
|
||||
|
||||
local function probability_of_utf16_string (str)
|
||||
return 0
|
||||
end
|
||||
|
||||
local function probability_of_binary_data (str)
|
||||
return 2/3
|
||||
end
|
||||
|
||||
local str_representations = {
|
||||
ascii = probability_of_ascii_string,
|
||||
utf8 = probability_of_utf8_string ,
|
||||
utf16 = probability_of_utf16_string,
|
||||
binary = probability_of_binary_data,
|
||||
}
|
||||
|
||||
return function (str)
|
||||
local str_info, most_likely, most_likely_prob = {}, 'ascii', 0
|
||||
for repr_name, prob_func in pairs(str_representations) do
|
||||
local prob = prob_func(str)
|
||||
str_info[repr_name..'_prob'] = prob
|
||||
if prob >= most_likely_prob then
|
||||
most_likely, most_likely_prob = repr_name, prob
|
||||
end
|
||||
end
|
||||
str_info.most_likely = most_likely
|
||||
return str_info
|
||||
end
|
130
test/test_cdata.lua
Normal file
130
test/test_cdata.lua
Normal file
|
@ -0,0 +1,130 @@
|
|||
|
||||
-- Only relevant in LUAJIT.
|
||||
if type(jit) ~= 'table' then return end
|
||||
|
||||
local SUITE = require('TestSuite').new('cdata')
|
||||
SUITE:setEnviroment{
|
||||
format = require('pretty'),
|
||||
analyze_byte_string = require 'analyze_byte_string',
|
||||
}
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Test stuff.
|
||||
|
||||
local ffi = require('ffi')
|
||||
ffi.cdef[[
|
||||
typedef struct foo { int a, b; } foo_t;
|
||||
|
||||
void free(void *ptr);
|
||||
void *malloc(size_t size);
|
||||
int poll(struct pollfd *fds, unsigned long nfds, int timeout);
|
||||
]]
|
||||
|
||||
-- TODO: Add more advanced understanding of cdata.
|
||||
|
||||
|
||||
local function format_test (t)
|
||||
SUITE:addTest(t.expect, function ()
|
||||
assert_equal(t.expect, format(t.input, t.options))
|
||||
end)
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Understanding binary data
|
||||
|
||||
SUITE:addTest('Understand ascii', function ()
|
||||
local str = 'hello world'
|
||||
local info = analyze_byte_string(str)
|
||||
assert_equal('ascii', info.most_likely)
|
||||
end)
|
||||
|
||||
SUITE:addTest('Understand utf8', function ()
|
||||
local str = 'Æh? Hvø Tæler Då Om?'
|
||||
local info = analyze_byte_string(str)
|
||||
assert_equal('utf8', info.most_likely)
|
||||
end)
|
||||
|
||||
SUITE:addTest('Understand binary', function ()
|
||||
local str = '\190\098\140\097\255'
|
||||
local info = analyze_byte_string(str)
|
||||
print(format(info))
|
||||
assert_equal('binary', info.most_likely)
|
||||
end)
|
||||
|
||||
SUITE:addTest('More binary', function ()
|
||||
local str = '\098\140\097\140\100'
|
||||
local info = analyze_byte_string(str)
|
||||
assert_equal('binary', info.most_likely)
|
||||
end)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
format_test {
|
||||
input = ffi.C.poll,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
|
||||
do
|
||||
local list = ffi.new('char [17]')
|
||||
for i = 0, 16 do list[i] = i end
|
||||
format_test {
|
||||
input = list,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
end
|
||||
|
||||
do
|
||||
local list = ffi.new('int [17]')
|
||||
for i = 0, 16 do list[i] = i end
|
||||
format_test {
|
||||
input = list,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
end
|
||||
|
||||
do
|
||||
local list = ffi.new('char [10]')
|
||||
for i = 0, 10-1 do list[i] = i + 65 end
|
||||
format_test {
|
||||
input = list,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
end
|
||||
|
||||
do
|
||||
local mat = ffi.new('char [3][3]')
|
||||
for x = 0, 2 do for y = 0, 2 do mat[x][y] = x * 16 + y end end
|
||||
format_test {
|
||||
input = mat,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
end
|
||||
|
||||
do
|
||||
local p = ffi.gc(ffi.C.malloc(1), ffi.C.free)
|
||||
format_test {
|
||||
input = p,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
end
|
||||
|
||||
SUITE:addTest('a_very_small_part_of_math', function ()
|
||||
local p = ffi.new('char[1]')
|
||||
p[0] = 27
|
||||
local actual_result = format(p + 0, {})
|
||||
assert_equal('Derp', actual_result)
|
||||
end)
|
||||
|
||||
do
|
||||
local p = ffi.new('foo_t[1]')
|
||||
p[0].a = 27
|
||||
p[0].b = 27
|
||||
format_test {
|
||||
input = p + 0,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
return SUITE
|
|
@ -360,89 +360,6 @@ format_test {
|
|||
|
||||
-- TODO: Add more tests for sorting.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- CDATA
|
||||
|
||||
-- TODO: Add more advanced understanding of cdata.
|
||||
|
||||
if type(jit) == 'table' then
|
||||
|
||||
local ffi = require('ffi')
|
||||
ffi.cdef[[
|
||||
typedef struct foo { int a, b; } foo_t;
|
||||
|
||||
void free(void *ptr);
|
||||
void *malloc(size_t size);
|
||||
int poll(struct pollfd *fds, unsigned long nfds, int timeout);
|
||||
]]
|
||||
|
||||
format_test {
|
||||
input = ffi.C.poll,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
|
||||
do
|
||||
local list = ffi.new('char [17]')
|
||||
for i = 0, 16 do list[i] = i end
|
||||
format_test {
|
||||
input = list,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
end
|
||||
|
||||
do
|
||||
local list = ffi.new('int [17]')
|
||||
for i = 0, 16 do list[i] = i end
|
||||
format_test {
|
||||
input = list,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
end
|
||||
|
||||
do
|
||||
local list = ffi.new('char [10]')
|
||||
for i = 0, 10-1 do list[i] = i + 65 end
|
||||
format_test {
|
||||
input = list,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
end
|
||||
|
||||
do
|
||||
local mat = ffi.new('char [3][3]')
|
||||
for x = 0, 2 do for y = 0, 2 do mat[x][y] = x * 16 + y end end
|
||||
format_test {
|
||||
input = mat,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
end
|
||||
|
||||
do
|
||||
local p = ffi.gc(ffi.C.malloc(1), ffi.C.free)
|
||||
format_test {
|
||||
input = p,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
end
|
||||
|
||||
SUITE:addTest('a_very_small_part_of_math', function ()
|
||||
local p = ffi.new('char[1]')
|
||||
p[0] = 27
|
||||
local actual_result = format(p + 0, {})
|
||||
assert_equal('Derp', actual_result)
|
||||
end)
|
||||
|
||||
do
|
||||
local p = ffi.new('foo_t[1]')
|
||||
p[0].a = 27
|
||||
p[0].b = 27
|
||||
format_test {
|
||||
input = p + 0,
|
||||
expect = 'cdata<.+>: 0x%x+',
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
return SUITE
|
||||
|
|
Loading…
Reference in New Issue
Block a user