import CreateMultiPolygonWithPointReuseAction from "../../../src/Logic/Osm/Actions/CreateMultiPolygonWithPointReuseAction" import { Tag } from "../../../src/Logic/Tags/Tag" import { Changes } from "../../../src/Logic/Osm/Changes" import { describe, expect, it } from "vitest" import { OsmConnection } from "../../../src/Logic/Osm/OsmConnection" import { ImmutableStore } from "../../../src/Logic/UIEventSource" describe("CreateMultiPolygonWithPointReuseAction", () => { it("should produce a correct changeset", () => { ;async () => { const feature = { type: "Feature", properties: { osm_id: "41097039", size_grb_building: "1374.89", "addr:housenumber": "53", "addr:street": "Startelstraat", building: "house", "source:geometry:entity": "Gbg", "source:geometry:date": "2014-04-28", "source:geometry:oidn": "150044", "source:geometry:uidn": "5403181", H_DTM_MIN: "50.35", H_DTM_GEM: "50.97", H_DSM_MAX: "59.40", H_DSM_P99: "59.09", HN_MAX: "8.43", HN_P99: "8.12", detection_method: "derived from OSM landuse: farmyard", auto_target_landuse: "farmyard", size_source_landuse: "8246.28", auto_building: "farm", id: "41097039", _lat: "50.84633355000016", _lon: "5.262964150000011", _layer: "grb", _length: "185.06002152312757", "_length:km": "0.2", "_now:date": "2022-02-22", "_now:datetime": "2022-02-22 10:15:51", "_loaded:date": "2022-02-22", "_loaded:datetime": "2022-02-22 10:15:51", "_geometry:type": "Polygon", _intersects_with_other_features: "", _country: "be", _overlaps_with_buildings: "[]", _overlap_percentage: "null", _grb_date: "2014-04-28", _grb_ref: "Gbg/150044", "_building:min_level": "", _surface: "548.1242491529038", "_surface:ha": "0", _reverse_overlap_percentage: "null", _imported_osm_object_found: "false", _imported_osm_still_fresh: "false", _target_building_type: "house", }, geometry: { type: "Polygon", coordinates: <[number, number][][]>[ [ [5.262684300000043, 50.84624409999995], [5.262777500000024, 50.84620759999988], [5.262798899999998, 50.84621390000019], [5.262999799999994, 50.84619519999999], [5.263107500000007, 50.84618920000014], [5.263115, 50.84620990000026], [5.26310279999998, 50.84623050000014], [5.263117999999977, 50.846247400000166], [5.263174599999989, 50.84631019999971], [5.263166999999989, 50.84631459999995], [5.263243999999979, 50.84640239999989], [5.2631607000000065, 50.84643459999996], [5.26313309999997, 50.84640089999985], [5.262907499999996, 50.84647790000018], [5.2628939999999576, 50.846463699999774], [5.262872100000033, 50.846440700000294], [5.262784699999991, 50.846348899999924], [5.262684300000043, 50.84624409999995], ], [ [5.262801899999976, 50.84623269999982], [5.2629535000000285, 50.84638830000012], [5.263070700000018, 50.84634720000008], [5.262998000000025, 50.84626279999982], [5.263066799999966, 50.84623959999975], [5.263064000000004, 50.84623330000007], [5.263009599999997, 50.84623730000026], [5.263010199999956, 50.84621629999986], [5.262801899999976, 50.84623269999982], ], ], }, } const innerRings = [...feature.geometry.coordinates] innerRings.splice(0, 1) const action = new CreateMultiPolygonWithPointReuseAction( [new Tag("building", "yes")], feature.geometry.coordinates[0], innerRings, undefined, [], "import" ) const descriptions = await action.Perform( new Changes({ dryRun: new ImmutableStore(true), osmConnection: new OsmConnection(), }) ) const ways = descriptions.filter((d) => d.type === "way") // "unexpected id" expect(ways[0].id == -18).toBe(true) // "unexpected id" expect(ways[1].id == -27).toBe(true) const outer = ways[0].changes["coordinates"] expect(outer).toEqual(feature.geometry.coordinates[0]) const inner = ways[1].changes["coordinates"] expect(inner).toEqual(feature.geometry.coordinates[1]) const members = <{ type: string; role: string; ref: number }[]>( descriptions.find((d) => d.type === "relation").changes["members"] ) // "incorrect role" expect(members[0].role).toBe("outer") // "incorrect role" expect(members[1].role).toBe("inner") // "incorrect type" expect(members[0].type).toBe("way") // "incorrect type" expect(members[1].type).toBe("way") // "incorrect id" expect(members[0].ref).toBe(-18) // "incorrect id" expect(members[1].ref).toBe(-27) } }) })