diff --git a/CHANGELOG.md b/CHANGELOG.md index 621ced9da..da0c2a49c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ _Breaking developer changes, which may affect downstream projects or sites that #### :camera: Street-Level #### :white_check_mark: Validation #### :bug: Bugfixes +* Fix unsolvable validator error triggered by regional presets ([#10459]) #### :earth_asia: Localization * Update Sinitic languages in the Multilingual Names field ([#10488], thanks [@winstonsung]) * Update the list of languages in the Wikipedia field ([#10489]) @@ -54,6 +55,7 @@ _Breaking developer changes, which may affect downstream projects or sites that * Migrate unit tests from karma to vitest ([#10452]) [#10452]: https://github.com/openstreetmap/iD/pull/10452 +[#10459]: https://github.com/openstreetmap/iD/pull/10459 [#10488]: https://github.com/openstreetmap/iD/pull/10488 [#10489]: https://github.com/openstreetmap/iD/pull/10489 [@winstonsung]: https://github.com/winstonsung/ diff --git a/modules/presets/index.js b/modules/presets/index.js index b84601b10..697a024fa 100644 --- a/modules/presets/index.js +++ b/modules/presets/index.js @@ -56,8 +56,9 @@ export function presetIndex() { let _loadPromise; - _this.ensureLoaded = () => { - if (_loadPromise) return _loadPromise; + /** @param {boolean=} bypassCache - used by unit tests */ + _this.ensureLoaded = (bypassCache) => { + if (_loadPromise && !bypassCache) return _loadPromise; return _loadPromise = Promise.all([ fileFetcher.get('preset_categories'), diff --git a/modules/validations/mismatched_geometry.js b/modules/validations/mismatched_geometry.js index ddde20e23..d1efa41fa 100644 --- a/modules/validations/mismatched_geometry.js +++ b/modules/validations/mismatched_geometry.js @@ -244,7 +244,11 @@ export function validationMismatchedGeometry() { var asSource = presetManager.match(entity, graph); var targetGeom = targetGeoms.find(nodeGeom => { - var asTarget = presetManager.matchTags(entity.tags, nodeGeom); + const asTarget = presetManager.matchTags( + entity.tags, + nodeGeom, + entity.extent(graph).center(), + ); if (!asSource || !asTarget || asSource === asTarget || // sometimes there are two presets with the same tags for different geometries diff --git a/test/spec/validations/mismatched_geometry.js b/test/spec/validations/mismatched_geometry.js index 16a907122..691d9ed51 100644 --- a/test/spec/validations/mismatched_geometry.js +++ b/test/spec/validations/mismatched_geometry.js @@ -4,6 +4,17 @@ describe('iD.validations.mismatched_geometry', function () { beforeEach(function() { _savedAreaKeys = iD.osmAreaKeys; context = iD.coreContext().init(); + iD.fileFetcher.cache().preset_presets = { + library: { + tags: { amenity: 'library' }, + geometry: ['point', 'vertex', 'line', 'area'], + locationSet: { include: ['NU'] } + }, + generic_amenity: { + tags: { amenity: '*' }, + geometry: ['point', 'vertex', 'line', 'area'] + }, + }; }); afterEach(function() { @@ -112,4 +123,11 @@ describe('iD.validations.mismatched_geometry', function () { expect(issue.entityIds[0]).to.eql('w-1'); }); + it('does not error if the best preset is limited to certain regions', async () => { + await iD.presetManager.ensureLoaded(true); + + createClosedWay({ amenity: 'library' }); + const issues = validate(); + expect(issues).to.have.lengthOf(0); + }); });