/* {0} on a node */
node[oneway],
node[bridge?],
node[landuse],
node[source:outline] {
  throwWarning: tr("{0} on a node", "{0.key}");
  assertMatch: "node oneway=-1";
  assertNoMatch: "way oneway=-1";
  assertMatch: "node bridge=yes";
  assertNoMatch: "node bridge=13";
}

node[natural=wood] {
  throwOther: tr("{0} on a node. Should be drawn as an area", "{0.tag}");
}

/* see ticket:#10125 */
node[source:geometry] {
  throwWarning: tr("{0} on a node", "{0.key}");
  fixChangeKey: "source:geometry => source:position";
}

/* Building inside building (spatial test) */
*[building][building!~/no|entrance/][any(tag("layer"),"0") = any(parent_tag("layer"),"0")] ∈
*[building][building!~/no|entrance/] {
  throwWarning: tr("Building inside building");
}

/* Overlapping areas (spatial test) */
area[natural =~ /^(water|wetland|coastline)$/], area[landuse=reservoir] {
  set water_area;
}

/* area:closed:areaStyle.water_area ⧉ area:closed:areaStyle.water_area -- does not work for now -- see ticket#10215 */
area:closed:areaStyle[natural =~ /^(water|wetland|coastline)$/] ⧉ area:closed:areaStyle.water_area,
area:closed:areaStyle[landuse=reservoir]                        ⧉ area:closed:areaStyle.water_area {
  throwWarning: tr("Overlapping Water Areas");
}

area:closed:areaStyle ⧉ area:closed:areaStyle {
  throwOther: tr("Overlapping Areas");
}

/* see ticket #9311 */
node[amenity=parking]["capacity:disabled" !~ /^(yes|[0-9]+)$/] ∈ *[amenity=parking] {
  throwWarning: tr("{0} inside {1}", "amenity=parking", "amenity=parking");
}

/* see ticket #9556 */
area:closed:areaStyle[tag("natural") = parent_tag("natural")] ⧉ area:closed:areaStyle[natural] {
  throwWarning: tr("Overlapping Identical Natural Areas");
}

area:closed:areaStyle[tag("landuse") = parent_tag("landuse")] ⧉ area:closed:areaStyle[landuse] {
  throwWarning: tr("Overlapping Identical Landuses");
}

/* see ticket:#9522 */
node[tag("amenity") = parent_tag("amenity")] ∈ *[amenity][amenity != parking] {
  throwWarning: tr("{0} inside {1}", concat("amenity=", tag("amenity")), concat("amenity=", tag("amenity")));
}
node[tag("leisure") = parent_tag("leisure")] ∈ *[leisure] {
  throwWarning: tr("{0} inside {1}", concat("leisure=", tag("leisure")), concat("leisure=", tag("leisure")));
}
node[tag("tourism") = parent_tag("tourism")] ∈ *[tourism] {
  throwWarning: tr("{0} inside {1}", concat("tourism=", tag("tourism")), concat("tourism=", tag("tourism")));
}
node[tag("shop") = parent_tag("shop")] ∈ *[shop] {
  throwWarning: tr("{0} inside {1}", concat("shop=", tag("shop")), concat("shop=", tag("shop")));
}
node[tag("power") = parent_tag("power")] ∈ *[power] {
  throwWarning: tr("{0} inside {1}", concat("power=", tag("power")), concat("power=", tag("power")));
}

/* see #10252 */
way[route=bus] {
  throwWarning: tr("{0} on a way. Should be used in a relation", "{0.tag}"); 
}
node[route] {
  throwWarning: tr("{0}=* on a node. Should be used in a relation", "{0.key}"); 
}