2 Feature: Rank assignment
 
   3     Tests for assignment of search and address ranks.
 
   5     Scenario: Ranks for place nodes are assigned according to their type
 
   7           | osm  | class     | type      | geometry |
 
   8           | N1   | foo       | bar       | 0 0 |
 
   9           | N11  | place     | Continent | 0 0 |
 
  10           | N12  | place     | continent | 0 0 |
 
  11           | N13  | place     | sea       | 0 0 |
 
  12           | N14  | place     | country   | 0 0 |
 
  13           | N15  | place     | state     | 0 0 |
 
  14           | N16  | place     | region    | 0 0 |
 
  15           | N17  | place     | county    | 0 0 |
 
  16           | N18  | place     | city      | 0 0 |
 
  17           | N19  | place     | island    | 0 0 |
 
  18           | N36  | place     | house     | 0 0 |
 
  20           | osm  | class     | type      | extra+capital | geometry |
 
  21           | N101 | place     | city      | yes           | 0 0 |
 
  24           | object | rank_search | rank_address |
 
  38     Scenario: Ranks for boundaries are assigned according to admin level
 
  39         Given the named places
 
  40           | osm | class    | type           | admin | geometry |
 
  41           | R20 | boundary | administrative | 2     | (1 1, 2 2, 1 2, 1 1) |
 
  42           | R21 | boundary | administrative | 32    | (3 3, 4 4, 3 4, 3 3) |
 
  43           | R22 | boundary | administrative | 6     | (0 0, 1 0, 0 1, 0 0) |
 
  44           | R23 | boundary | administrative | 10    | (0 0, 1 1, 1 0, 0 0) |
 
  47           | object | rank_search | rank_address |
 
  53     Scenario: Ranks for addressable boundaries with place assignment go with place address ranks if available
 
  54         Given the named places
 
  55           | osm | class    | type           | admin | extra+place | geometry |
 
  56           | R20 | boundary | administrative | 3     | state       | (1 1, 2 2, 1 2, 1 1) |
 
  57           | R21 | boundary | administrative | 32    | suburb      | (3 3, 4 4, 3 4, 3 3) |
 
  58           | R22 | boundary | administrative | 6     | town        | (0 0, 1 0, 0 1, 0 0) |
 
  59           | R23 | boundary | administrative | 10    | village     | (0 0, 1 1, 1 0, 0 0) |
 
  62           | object | rank_search | rank_address |
 
  68     Scenario: Place address ranks cannot overtake a parent address rank
 
  69         Given the named places
 
  70           | osm | class    | type           | admin | extra+place  | geometry |
 
  71           | R20 | boundary | administrative | 8     | town         | (0 0, 0 2, 2 2, 2 0, 0 0) |
 
  72           | R21 | boundary | administrative | 9     | municipality | (0 0, 0 1, 1 1, 1 0, 0 0) |
 
  73           | R22 | boundary | administrative | 9     | suburb       | (0 0, 0 1, 1 1, 1 0, 0 0) |
 
  76           | object | rank_search | rank_address |
 
  80         Then place_addressline contains
 
  81             | object | address | cached_rank_address |
 
  85     Scenario: Admin levels cannot overtake each other due to place address ranks
 
  86         Given the named places
 
  87           | osm | class    | type           | admin | extra+place  | geometry |
 
  88           | R20 | boundary | administrative | 6     | town         | (0 0, 0 2, 2 2, 2 0, 0 0) |
 
  89           | R21 | boundary | administrative | 8     |              | (0 0, 0 1, 1 1, 1 0, 0 0) |
 
  90           | R22 | boundary | administrative | 8     | suburb       | (0 0, 0 1, 1 1, 1 0, 0 0) |
 
  93           | object | rank_search | rank_address |
 
  97         Then place_addressline contains
 
  98             | object | address | cached_rank_address |
 
 102     Scenario: Admin levels cannot overtake each other due to place address ranks even when slightly misaligned
 
 103         Given the named places
 
 104           | osm | class    | type           | admin | extra+place  | geometry |
 
 105           | R20 | boundary | administrative | 6     | town         | (0 0, 0 2, 2 2, 2 0, 0 0) |
 
 106           | R21 | boundary | administrative | 8     |              | (0 0, -0.0001 1, 1 1, 1 0, 0 0) |
 
 109           | object | rank_search | rank_address |
 
 112         Then place_addressline contains
 
 113             | object | address | cached_rank_address |
 
 116     Scenario: Admin levels must not be larger than 25
 
 117         Given the named places
 
 118           | osm | class    | type           | admin | extra+place   | geometry |
 
 119           | R20 | boundary | administrative | 6     | neighbourhood | (0 0, 0 2, 2 2, 2 0, 0 0) |
 
 120           | R21 | boundary | administrative | 7     |               | (0 0, 0 1, 1 1, 1 0, 0 0) |
 
 121           | R22 | boundary | administrative | 8     |               | (0 0, 0 0.5, 0.5 0.5, 0.5 0, 0 0) |
 
 124           | object | rank_search | rank_address |
 
 129     Scenario: admin levels contained in a place area must not overtake address ranks
 
 130         Given the named places
 
 131             | osm | class    | type           | admin | geometry |
 
 132             | R10 | place    | city           | 15    | (0 0, 0 2, 2 0, 0 0) |
 
 133             | R20 | boundary | administrative | 6     | (0 0, 0 1, 1 0, 0 0) |
 
 136             | object | rank_search | rank_address |
 
 140     Scenario: admin levels overlapping a place area are not demoted
 
 141         Given the named places
 
 142             | osm | class    | type           | admin | geometry |
 
 143             | R10 | place    | city           | 15    | (0 0, 0 2, 2 0, 0 0) |
 
 144             | R20 | boundary | administrative | 6     | (-1 0, 0 1, 1 0, -1 0) |
 
 147             | object | rank_search | rank_address |
 
 151     Scenario: admin levels with equal area as a place area are not demoted
 
 152         Given the named places
 
 153             | osm | class    | type           | admin | geometry |
 
 154             | R10 | place    | city           | 15    | (0 0, 0 2, 2 0, 0 0) |
 
 155             | R20 | boundary | administrative | 6     | (0 0, 0 2, 2 0, 0 0) |
 
 158             | object | rank_search | rank_address |
 
 163     Scenario: adjacent admin_levels are considered the same object when they have the same wikidata
 
 164         Given the named places
 
 165           | osm | class    | type           | admin | extra+wikidata | geometry |
 
 166           | N20 | place    | square         | 15    | Q123           | 0.1 0.1  |
 
 167           | R23 | boundary | administrative | 10    | Q444           | (0 0, 0 1, 1 1, 1 0, 0 0) |
 
 168           | R21 | boundary | administrative | 9     | Q444           | (0 0, 0 1, 1 1, 1 0, 0 0) |
 
 169           | R22 | boundary | administrative | 8     | Q444           | (0 0, 0 1, 1 1, 1 0, 0 0) |
 
 172           | object | rank_search | rank_address |
 
 176         Then place_addressline contains
 
 177             | object | address | cached_rank_address |
 
 179         Then place_addressline doesn't contain
 
 184     Scenario: adjacent admin_levels are considered different objects when they have different wikidata
 
 185         Given the named places
 
 186           | osm | class    | type           | admin | extra+wikidata | geometry |
 
 187           | N20 | place    | square         | 15    | Q123           | 0.1 0.1  |
 
 188           | R21 | boundary | administrative | 9     | Q4441          | (0 0, 0 1, 1 1, 1 0, 0 0) |
 
 189           | R22 | boundary | administrative | 8     | Q444           | (0 0, 0 1, 1 1, 1 0, 0 0) |
 
 192           | object | rank_search | rank_address |
 
 195         Then place_addressline contains
 
 196             | object | address | cached_rank_address |
 
 200     Scenario: Mixes of admin boundaries and place areas I
 
 207           | osm | class    | type           | admin | name           | geometry      |
 
 208           | R1  | boundary | administrative | 5     | Greater London | (1,2,3,4,1)   |
 
 209           | R2  | boundary | administrative | 8     | Kensington     | (1,10,11,4,1) |
 
 211           | osm | class    | type           | name           | geometry    |
 
 212           | R10 | place    | city           | London         | (1,2,3,4,1) |
 
 213           | N9  | place    | town           | Fulham         | 9           |
 
 214           | W1  | highway  | residential    | Lots Grove     | 20,21       |
 
 217          | object | rank_search | rank_address |
 
 222         And place_addressline contains
 
 223          | object | address | isaddress | cached_rank_address |
 
 224          | W1     | R1      | True      | 10                  |
 
 225          | W1     | R10     | True      | 16                  |
 
 226          | W1     | R2      | True      | 18                  |
 
 227          | W1     | N9      | False     | 18                  |
 
 230     Scenario: Mixes of admin boundaries and place areas II
 
 232           | 1 |   | 10 |  | 5 | 2 |
 
 235           | 4 |   | 11 |  | 6 | 3 |
 
 237           | osm | class    | type           | admin | name           | geometry    |
 
 238           | R1  | boundary | administrative | 5     | Greater London | (1,2,3,4,1) |
 
 239           | R2  | boundary | administrative | 8     | London         | (1,5,6,4,1) |
 
 241           | osm | class    | type           | name           | geometry      |
 
 242           | R10 | place    | city           | Westminster    | (1,10,11,4,1) |
 
 243           | N9  | place    | town           | Fulham         | 9             |
 
 244           | W1  | highway  | residential    | Lots Grove     | 20,21         |
 
 247          | object | rank_search | rank_address |
 
 252         And place_addressline contains
 
 253          | object | address | isaddress | cached_rank_address |
 
 254          | W1     | R1      | True      | 10                  |
 
 255          | W1     | R10     | True      | 18                  |
 
 256          | W1     | R2      | True      | 16                  |
 
 257          | W1     | N9      | False     | 18                  |
 
 260     Scenario: POI nodes with place tags
 
 262           | osm | class   | type       | name | extratags       |
 
 263           | N23 | amenity | playground | AB   | "place": "city" |
 
 264           | N23 | place   | city       | AB   | "amenity": "playground" |
 
 266         Then placex contains exactly
 
 267           | object      | rank_search | rank_address |
 
 268           | N23:amenity | 30          | 30           |
 
 269           | N23:place   | 16          | 16           |