
-- fake "osm2pgsql" table for test, usually created by the main C++ program
osm2pgsql = { Geometry = {} }

-- load the init.lua script that is normally run by the main C++ program
package.path = '../src/?.lua'
require('init')

print("Running Lua tests...")

local o = osm2pgsql

-- ---------------------------------------------------------------------------

-- has_prefix()

assert(o.has_prefix('addr:city', 'addr:'))
assert(not o.has_prefix('addr:city', 'foo'))
assert(o.has_prefix('addr:city', ''))
assert(not o.has_prefix('name', 'addr:'))
assert(o.has_prefix('a', 'a'))
assert(not o.has_prefix('a', 'ab'))
assert(o.has_prefix(nil, 'a') == nil)

-- has_suffix()

assert(o.has_suffix('tiger:source', ':source'))
assert(not o.has_suffix('tiger:source', 'foo'))
assert(o.has_suffix('tiger:source', ''))
assert(not o.has_suffix('name', ':source'))
assert(o.has_suffix('a', 'a'))
assert(not o.has_suffix('a', 'ba'))
assert(o.has_suffix(nil, 'a') == nil)

-- ---------------------------------------------------------------------------

-- clamp
do
    assert(o.clamp(1, 2, 3) == 2)
    assert(o.clamp(3, 1, 4) == 3)
    assert(o.clamp(3, -1, 1) == 1)
    assert(o.clamp(-3, -1, 1) == -1)
    assert(o.clamp(2.718, 0, 3.141) == 2.718)
    assert(o.clamp(nil, -1, 1) == nil)
end

-- make_check_values_func without default
do
    local if_known_highway_value = o.make_check_values_func{
        'motorway', 'trunk', 'primary', 'secondary', 'tertiary'
    }

    assert(if_known_highway_value('motorway') == 'motorway')
    assert(if_known_highway_value('primary') == 'primary')
    assert(if_known_highway_value('residential') == nil)
end

-- make_check_values_func with default
do
    local highway_value = o.make_check_values_func({
        'motorway', 'trunk', 'primary', 'secondary', 'tertiary'
    }, 'road')

    assert(highway_value('motorway') == 'motorway')
    assert(highway_value('primary') == 'primary')
    assert(highway_value('residential') == 'road')
end

-- make_clean_tags_func
do
    local clean_tags = o.make_clean_tags_func{'source',
                                              'source:*',
                                              '*:source',
                                              'note'}

    local tags = {
        source = 'foo',
        highway = 'residential',
        ['source:url'] = 'bar',
        ['tiger:source'] = 'value',
        ['source:vs:source'] = 'removeme',
        ['with:source:infix'] = 'keepme',
        NOTE = 'x'
    }

    assert(clean_tags(tags) == false)

    assert(tags.highway == 'residential')
    assert(tags.NOTE == 'x')
    assert(tags.source == nil)
    assert(tags['source:url'] == nil)
    assert(tags['tiger:source'] == nil)
    assert(tags['source:vs:source'] == nil)
    assert(tags['with:source:infix'] == 'keepme')

    local num = 0
    for k, v in pairs(tags) do
        num = num + 1
    end

    assert(num == 3)
end

-- trim
assert(osm2pgsql.trim('') == '')
assert(osm2pgsql.trim(' ') == '')
assert(osm2pgsql.trim('  ') == '')
assert(osm2pgsql.trim('a') == 'a')
assert(osm2pgsql.trim(' a') == 'a')
assert(osm2pgsql.trim('a ') == 'a')
assert(osm2pgsql.trim(' a ') == 'a')
assert(osm2pgsql.trim('  a  ') == 'a')
assert(osm2pgsql.trim('  ab cd  ') == 'ab cd')
assert(osm2pgsql.trim(' \t\r\n\f\va\000b \r\t\n\f\v') == 'a\000b')
assert(osm2pgsql.trim(nil) == nil)

-- split_unit

local v, u = o.split_unit('20m', '')
assert(v == 20 and u == 'm')

v, u = o.split_unit('20 m')
assert(v == 20 and u == 'm')

v, u = o.split_unit('20ft', '')
assert(v == 20 and u == 'ft')

v, u = o.split_unit('23.4 ft', '')
assert(v == 23.4 and u == 'ft')

v, u = o.split_unit('20 ft', 'm')
assert(v == 20 and u == 'ft')

v, u = o.split_unit('20km', 'm')
assert(v == 20 and u == 'km')

v, u = o.split_unit('20')
assert(v == 20 and u == nil)

v, u = o.split_unit('20', 'm')
assert(v == 20 and u == 'm')

v, u = o.split_unit('0', 'm')
assert(v == 0 and u == 'm')

v, u = o.split_unit('-20000', 'leagues')
assert(v == -20000 and u == 'leagues')

v, u = o.split_unit('20xx20', '')
assert(v == nil and u == nil)

v, u = o.split_unit('20-20', '')
assert(v == nil and u == nil)

v, u = o.split_unit('20xx20', 'foo')
assert(v == nil and u == nil)

v, u = o.split_unit('abc', 'def')
assert(v == nil and u == nil)

v, u = o.split_unit(nil)
assert(v == nil and u == nil)

v, u = o.split_unit(nil, 'foo')
assert(v == nil and u == nil)

-- split_string

local r = o.split_string('ab c;d;e f;ghi')
assert(#r == 4)
assert(r[1] == 'ab c')
assert(r[2] == 'd')
assert(r[3] == 'e f')
assert(r[4] == 'ghi')

r = o.split_string('ab c;d  ;  e f; ghi')
assert(#r == 4)
assert(r[1] == 'ab c')
assert(r[2] == 'd')
assert(r[3] == 'e f')
assert(r[4] == 'ghi')

r = o.split_string('ab c ')
assert(#r == 1)
assert(r[1] == 'ab c')

r = o.split_string('')
assert(#r == 0)

r = o.split_string('ab c;d  ,  e f, ghi', ',')
assert(#r == 3)
assert(r[1] == 'ab c;d')
assert(r[2] == 'e f')
assert(r[3] == 'ghi')

r = o.split_string(nil)
assert(#r == 0)

-- ---------------------------------------------------------------------------

print("All tests successful")

