Provide a framework for testing lua configuration files
Any complex lua transform should have tests to check expected behavior against actual behavior. For the pgsql backend an example is OpenStreetMap Carto's tests. For the multi-backend, an example is the extensive set of tests in the test-* files of cleartables.
Because flex includes complications like callbacks into osm2pgsql code, we should supply tests along with the examples.
Maybe we could enhance the test framework a bit to provide some very basic mock object for the osm2pgsql functionality provided by osm2pgsql. I believe this isn't supported by tests.lua as of now.
(file osm2pgsql-mock.lua)
local osm2pgsql = {}
-- osm2pgsql.version = '1.2'
-- osm2pgsql.srid =
-- osm2pgsql.mode = 'create'
-- osm2pgsql.stage = 1
local inspect = require('inspect')
result = {} -- todo needs a better place
function osm2pgsql.define_table(o)
local mock_table = {}
-- print(inspect(o))
mock_table.name = o.name
mock_table.ids = o.ids
mock_table.columns = o.columns
function mock_table.add_row(x, y)
-- print(inspect(x))
-- print(inspect(y))
result = y
end
function mock_table.mark_way(x, id)
end
function mock_table.mark_relation(x, id)
end
return mock_table
end
function osm2pgsql.get_mock_result()
return result
end
return osm2pgsql
File test.lua:
osm2pgsql = require 'osm2pgsql-mock'
-- require 'init' -- include src/init.lua for additional osm2pgsql functions
require 'openstreetmap-carto'
print("Running tests...")
x = {}
x.tags = {}
x.tags["highway"] = "bus_stop"
x.tags["layer"] = "1"
-- Simulate callback by osm2pgsql
osm2pgsql.process_node(x)
-- Fetch results in mock object
r = osm2pgsql.get_mock_result()
assert(r["highway"] == 'bus_stop')
print("Done...")
Executing test from command line:
lua test.lua
Running tests...
Done...
Even stuff like grab_tag can mocked (simplified version below doesn't remove tag yet):
osm2pgsql = require 'osm2pgsql-mock'
require 'init'
require 'data-types'
print("Running tests...")
x = {}
x.tags = {}
x.tags["odbl"] = "remove_me"
x.tags["highway"] = "motorway"
x.tags["name"] = "demo name"
x.tags["maxspeed"] = "60 mph"
x.tags["oneway"] = "yes"
x.nodes = { 10, 20, 30, 40, 50 }
x.grab_tag = function(x, y) return x.tags[y] end
osm2pgsql.process_way(x)
print("Done...")
{
maxspeed = 96,
name = "demo name",
nodes = "{10,20,30,40,50}",
oneway = "yes",
tags = {
highway = "motorway",
maxspeed = "60 mph",
name = "demo name",
oneway = "yes"
},
type = "motorway"
}