1
0

Added shortness info-gathering to analyze_structure

This commit is contained in:
Jon Michael Aanes 2017-01-19 14:23:34 +01:00
parent e2570ee780
commit c75ee00f88
2 changed files with 79 additions and 0 deletions

View File

@ -24,6 +24,14 @@ local RESERVED_LUA_WORDS = {
['goto'] = true, ['goto'] = true,
} }
local SIMPLE_VALUE_TYPES = {
['nil'] = true,
['boolean'] = true,
['number'] = true,
}
local SHORT_STRING_MAX_LEN = 7
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
local function is_identifier(str) local function is_identifier(str)
@ -131,6 +139,34 @@ local function is_tabular (t)
return true return true
end end
local is_short_table, is_simple_value
function is_short_table (value)
-- Predicate: value is either an empty table, or one with a single simple
-- non-function element.
assert( type(value) == 'table', '[analyze_structure]: Only tables allowed!' )
local first_key = next(value, nil)
if not first_key then
return true
elseif not next(value, first_key) == nil then
return false
end
return type(value[first_key]) ~= 'table'
and is_simple_value( value[first_key] )
end
function is_simple_value (value)
-- Predicate: value is either nil, a boolean, a number, a short string or a
-- short table.
return SIMPLE_VALUE_TYPES[ type(value) ]
or type(value) == 'string' and #value <= SHORT_STRING_MAX_LEN
or type(value) == 'table' and is_short_table(value)
end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
local function get_table_info (t) local function get_table_info (t)
@ -141,6 +177,7 @@ local function get_table_info (t)
info.has_map = key_types.nr_types > (key_types.number and 1 or 0) info.has_map = key_types.nr_types > (key_types.number and 1 or 0)
info.is_set = is_set(t) info.is_set = is_set(t)
info.is_tabular = is_tabular(t) info.is_tabular = is_tabular(t)
info.is_short = is_short_table(t)
-- Determine type of table -- Determine type of table
if not info.has_seq and not info.has_map then info.type = 'empty' if not info.has_seq and not info.has_map then info.type = 'empty'

View File

@ -84,6 +84,48 @@ SUITE:addTest('Not Tabular, due to varying lengths', function ()
assert(table_info.is_tabular == false) assert(table_info.is_tabular == false)
end) end)
SUITE:addTest('Very short/empty table', function ()
local input = { }
local table_info = analyze_structure(input)[input]
assert(table_info.is_short == true)
end)
SUITE:addTest('Very short table', function ()
local input = { 1 }
local table_info = analyze_structure(input)[input]
assert(table_info.is_short == true)
end)
SUITE:addTest('Recursive tables are not simple', function ()
local input = { {} }
local table_info = analyze_structure(input)[input]
assert(table_info.is_short == false)
end)
SUITE:addTest('Short strings are simple', function ()
local input = { 'hello' }
local table_info = analyze_structure(input)[input]
assert(table_info.is_short == true)
end)
SUITE:addTest('Long strings are not', function ()
local input = { 'hello world' }
local table_info = analyze_structure(input)[input]
assert(table_info.is_short == false)
end)
SUITE:addTest('Even maps can be simple!', function ()
local input = { a = 4 }
local table_info = analyze_structure(input)[input]
assert(table_info.is_short == true)
end)
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- Corner cases. -- Corner cases.