Feature: Import with custom styles by osm2pgsql
    Tests for the example customizations given in the documentation.

    Scenario: Custom main tags (set new ones)
        Given the lua style file
            """
            local flex = require('import-full')

            flex.set_main_tags{
                boundary = {administrative = 'named'},
                highway = {'always', street_lamp = 'named'},
                landuse = 'fallback'
            }
            """
        When loading osm data
            """
            n10 Tboundary=administrative x0 y0
            n11 Tboundary=administrative,name=Foo x0 y0
            n12 Tboundary=electoral x0 y0
            n13 Thighway=primary x0 y0
            n14 Thighway=street_lamp x0 y0
            n15 Thighway=primary,landuse=street x0 y0
            """
        Then place contains exactly
            | object | class    | type           |
            | N11    | boundary | administrative |
            | N13    | highway  | primary        |
            | N15    | highway  | primary        |

    Scenario: Custom main tags (modify existing)
        Given the lua style file
            """
            local flex = require('import-full')

            flex.modify_main_tags{
                amenity = {prison = 'delete'},
                highway = {stop = 'named'},
                aeroway = 'named'
            }
            """
        When loading osm data
            """
            n10 Tamenity=hotel x0 y0
            n11 Tamenity=prison x0 y0
            n12 Thighway=stop x0 y0
            n13 Thighway=stop,name=BigStop x0 y0
            n14 Thighway=give_way x0 y0
            n15 Thighway=bus_stop x0 y0
            n16 Taeroway=no,name=foo x0 y0
            n17 Taeroway=taxiway,name=D15 x0 y0
            """
        Then place contains exactly
            | object | class   | type     |
            | N10    | amenity | hotel    |
            | N13    | highway | stop     |
            | N15    | highway | bus_stop |
            | N17    | aeroway | taxiway  |

    Scenario: Prefiltering tags
        Given the lua style file
            """
            local flex = require('import-full')

            flex.set_prefilters{
                delete_keys = {'source', 'source:*'},
                extra_tags = {amenity = {'yes', 'no'}}
            }
            flex.set_main_tags{
                amenity = 'always',
                tourism = 'always'
            }
            """
        When loading osm data
            """
            n1 Tamenity=yes x0 y6
            n2 Tamenity=hospital,source=survey x3 y6
            n3 Ttourism=hotel,amenity=yes x0 y0
            n4 Ttourism=hotel,amenity=telephone x0 y0
            """
        Then place contains exactly
            | object | class   | extratags!dict   |
            | N2     | amenity | -                |
            | N3     | tourism | 'amenity': 'yes' |
            | N4     | tourism | -                |
            | N4     | amenity | -                |

    Scenario: Ignore some tags
        Given the lua style file
            """
            local flex = require('import-extratags')

            flex.ignore_keys{'ref:*', 'surface'}
            """
        When loading osm data
            """
            n100 Thighway=residential,ref=34,ref:bodo=34,surface=gray,extra=1 x0 y0
            """
        Then place contains exactly
            | object | name!dict    | extratags!dict |
            | N100   | 'ref' : '34' | 'extra': '1'   |


    Scenario: Add for extratags
        Given the lua style file
            """
            local flex = require('import-full')

            flex.add_for_extratags{'ref:*', 'surface'}
            """
        When loading osm data
            """
            n100 Thighway=residential,ref=34,ref:bodo=34,surface=gray,extra=1 x0 y0
            """
        Then place contains exactly
            | object | name!dict    | extratags!dict  |
            | N100   | 'ref' : '34' | 'ref:bodo': '34', 'surface': 'gray' |


    Scenario: Name tags
        Given the lua style file
            """
            local flex = require('flex-base')

            flex.set_main_tags{highway = {traffic_light = 'named'}}
            flex.set_name_tags{main = {'name', 'name:*'},
                               extra = {'ref'}
                              }
            """
        When loading osm data
            """
            n1 Thighway=stop,name=Something x0 y0
            n2 Thighway=traffic_light,ref=453-4 x0 y0
            n3 Thighway=traffic_light,name=Greens x0 y0
            n4 Thighway=traffic_light,name=Red,ref=45 x0 y0
            """
        Then place contains exactly
            | object | class   | name!dict                  |
            | N3     | highway | 'name': 'Greens'           |
            | N4     | highway | 'name': 'Red', 'ref': '45' |

    Scenario: Modify name tags
        Given the lua style file
            """
            local flex = require('import-full')

            flex.modify_name_tags{house = {}, extra = {'o'}}
            """
        When loading osm data
            """
            n1 Ttourism=hotel,ref=45,o=good
            n2 Taddr:housename=Old,addr:street=Away
            """
        Then place contains exactly
            | object | class   | name!dict   |
            | N1     | tourism | 'o': 'good' |

    Scenario: Address tags
        Given the lua style file
            """
            local flex = require('import-full')

            flex.set_address_tags{
                main = {'addr:housenumber'},
                extra = {'addr:*'},
                postcode = {'postal_code', 'postcode', 'addr:postcode'},
                country = {'country-code', 'ISO3166-1'}
            }
            """
        When loading osm data
            """
            n1 Ttourism=hotel,addr:street=Foo x0 y0
            n2 Taddr:housenumber=23,addr:street=Budd,postal_code=5567 x0 y0
            n3 Taddr:street=None,addr:city=Where x0 y0
            """
        Then place contains exactly
            | object | class   | type  | address!dict |
            | N1     | tourism | hotel | 'street': 'Foo' |
            | N2     | place   | house | 'housenumber': '23', 'street': 'Budd', 'postcode': '5567' |

    Scenario: Modify address tags
        Given the lua style file
            """
            local flex = require('import-full')

            flex.set_address_tags{
                extra = {'addr:*'},
            }
            """
        When loading osm data
            """
            n2 Taddr:housenumber=23,addr:street=Budd,is_in:city=Faraway,postal_code=5567 x0 y0
            """
        Then place contains exactly
            | object | class | type  | address!dict |
            | N2     | place | house | 'housenumber': '23', 'street': 'Budd', 'postcode': '5567' |

    Scenario: Unused handling (delete)
        Given the lua style file
            """
            local flex = require('import-full')

            flex.set_address_tags{
                main = {'addr:housenumber'},
                extra = {'addr:*', 'tiger:county'}
            }
            flex.set_unused_handling{delete_keys = {'tiger:*'}}
            """
        When loading osm data
            """
            n1 Ttourism=hotel,tiger:county=Fargo x0 y0
            n2 Ttourism=hotel,tiger:xxd=56,else=other x0 y0
            """
        Then place contains exactly
            | object | class   | type  | address!dict            | extratags!dict   |
            | N1     | tourism | hotel | 'tiger:county': 'Fargo' | -                |
            | N2     | tourism | hotel | -                       | 'else': 'other'  |

    Scenario: Unused handling (extra)
        Given the lua style file
            """
            local flex = require('flex-base')
            flex.set_main_tags{highway = 'always',
                               wikipedia = 'extra'}
            flex.add_for_extratags{'wikipedia:*', 'wikidata'}
            flex.set_unused_handling{extra_keys = {'surface'}}
            """
        When loading osm data
            """
            n100 Thighway=path,foo=bar,wikipedia=en:Path x0 y0
            n234 Thighway=path,surface=rough x0 y0
            n445 Thighway=path,name=something x0 y0
            n446 Thighway=path,wikipedia:en=Path,wikidata=Q23 x0 y0
            n567 Thighway=path,surface=dirt,wikipedia:en=Path x0 y0
            """
        Then place contains exactly
            | object | class   | type  | extratags!dict         |
            | N100   | highway | path  | 'wikipedia': 'en:Path' |
            | N234   | highway | path  | 'surface': 'rough' |
            | N445   | highway | path  | - |
            | N446   | highway | path  | 'wikipedia:en': 'Path', 'wikidata': 'Q23' |
            | N567   | highway | path  | 'surface': 'dirt', 'wikipedia:en': 'Path' |

    Scenario: Additional relation types
        Given the lua style file
            """
            local flex = require('import-full')

            flex.RELATION_TYPES['site'] = flex.relation_as_multipolygon
            """
        And the grid
            | 1 | 2 |
            | 4 | 3 |
        When loading osm data
            """
            n1
            n2
            n3
            n4
            w1 Nn1,n2,n3,n4,n1
            r1 Ttype=multipolygon,amenity=school Mw1@
            r2 Ttype=site,amenity=school Mw1@
            """
        Then place contains exactly
            | object | class   | type   |
            | R1     | amenity | school |
            | R2     | amenity | school |

    Scenario: Exclude country relations
        Given the lua style file
            """
            local flex = require('import-full')

            function osm2pgsql.process_relation(object)
                if object.tags.boundary ~= 'administrative' or object.tags.admin_level ~= '2' then
                  flex.process_relation(object)
                end
            end
            """
       And the grid
            | 1 | 2 |
            | 4 | 3 |
       When loading osm data
            """
            n1
            n2
            n3
            n4
            w1 Nn1,n2,n3,n4,n1
            r1 Ttype=multipolygon,boundary=administrative,admin_level=4,name=Small Mw1@
            r2 Ttype=multipolygon,boundary=administrative,admin_level=2,name=Big Mw1@
            """
        Then place contains exactly
            | object | class    | type           |
            | R1     | boundary | administrative |

    Scenario: Customize processing functions
        Given the lua style file
            """
            local flex = require('import-full')

            local original_process_tags = flex.process_tags

            function flex.process_tags(o)
                if o.object.tags.highway ~= nil and o.object.tags.access == 'no' then
                    return
                end

                original_process_tags(o)
            end
            """
        When loading osm data
            """
            n1 Thighway=residential x0 y0
            n2 Thighway=residential,access=no x0 y0
            """
        Then place contains exactly
            | object | class   | type        |
            | N1     | highway | residential |
