@@ -174,6 +174,142 @@ test('Test with neighboring incomplete building:part relation', () => {
174174 expect ( new Building ( '42' , data ) . id ) . toBe ( '42' ) ;
175175} ) ;
176176
177+ const typeBuildingWithMultipolygonOutline = `<?xml version='1.0' encoding='UTF-8'?>
178+ <osm version="0.6">
179+ <node id="1" lat="59.938127" lon="30.4980057"/>
180+ <node id="2" lat="59.9380365" lon="30.4992843"/>
181+ <node id="3" lat="59.9384134" lon="30.4993839"/>
182+ <node id="4" lat="59.9385087" lon="30.4981066"/>
183+ <node id="5" lat="59.9381203" lon="30.4989364"/>
184+ <node id="6" lat="59.93838" lon="30.499005"/>
185+ <node id="7" lat="59.9384221" lon="30.498439"/>
186+ <node id="8" lat="59.9381551" lon="30.4983684"/>
187+ <way id="20">
188+ <nd ref="4"/>
189+ <nd ref="3"/>
190+ <nd ref="2"/>
191+ <nd ref="1"/>
192+ </way>
193+ <way id="21">
194+ <nd ref="1"/>
195+ <nd ref="4"/>
196+ </way>
197+ <way id="22">
198+ <nd ref="6"/>
199+ <nd ref="7"/>
200+ </way>
201+ <way id="23">
202+ <nd ref="5"/>
203+ <nd ref="6"/>
204+ </way>
205+ <way id="24">
206+ <nd ref="8"/>
207+ <nd ref="5"/>
208+ </way>
209+ <way id="25">
210+ <nd ref="7"/>
211+ <nd ref="8"/>
212+ </way>
213+ <relation id="40">
214+ <member type="way" ref="20" role="outer"/>
215+ <member type="way" ref="21" role="outer"/>
216+ <member type="way" ref="22" role="inner"/>
217+ <member type="way" ref="23" role="inner"/>
218+ <member type="way" ref="24" role="inner"/>
219+ <member type="way" ref="25" role="inner"/>
220+ <tag k="building" v="school"/>
221+ <tag k="building:levels" v="3"/>
222+ <tag k="roof:shape" v="flat"/>
223+ <tag k="type" v="multipolygon"/>
224+ </relation>
225+ <relation id="42">
226+ <member type="relation" ref="40" role="outline"/>
227+ <tag k="type" v="building"/>
228+ </relation>
229+ </osm>
230+ ` ;
231+ const typeBuildingRelationFullResponse = `<?xml version='1.0' encoding='UTF-8'?>
232+ <osm version="0.6">
233+ <relation id="40">
234+ <member type="way" ref="20" role="outer"/>
235+ <member type="way" ref="21" role="outer"/>
236+ <member type="way" ref="22" role="inner"/>
237+ <member type="way" ref="23" role="inner"/>
238+ <member type="way" ref="24" role="inner"/>
239+ <member type="way" ref="25" role="inner"/>
240+ <tag k="building" v="school"/>
241+ <tag k="building:levels" v="3"/>
242+ <tag k="roof:shape" v="flat"/>
243+ <tag k="type" v="multipolygon"/>
244+ </relation>
245+ <relation id="42">
246+ <member type="relation" ref="40" role="outline"/>
247+ <tag k="type" v="building"/>
248+ </relation>
249+ </osm>
250+ ` ;
251+ const outlineRelationFullResponse = `<?xml version='1.0' encoding='UTF-8'?>
252+ <osm version="0.6">
253+ <node id="1" lat="59.938127" lon="30.4980057"/>
254+ <node id="2" lat="59.9380365" lon="30.4992843"/>
255+ <node id="3" lat="59.9384134" lon="30.4993839"/>
256+ <node id="4" lat="59.9385087" lon="30.4981066"/>
257+ <node id="5" lat="59.9381203" lon="30.4989364"/>
258+ <node id="6" lat="59.93838" lon="30.499005"/>
259+ <node id="7" lat="59.9384221" lon="30.498439"/>
260+ <node id="8" lat="59.9381551" lon="30.4983684"/>
261+ <way id="20">
262+ <nd ref="4"/>
263+ <nd ref="3"/>
264+ <nd ref="2"/>
265+ <nd ref="1"/>
266+ </way>
267+ <way id="21">
268+ <nd ref="1"/>
269+ <nd ref="4"/>
270+ </way>
271+ <way id="22">
272+ <nd ref="6"/>
273+ <nd ref="7"/>
274+ </way>
275+ <way id="23">
276+ <nd ref="5"/>
277+ <nd ref="6"/>
278+ </way>
279+ <way id="24">
280+ <nd ref="8"/>
281+ <nd ref="5"/>
282+ </way>
283+ <way id="25">
284+ <nd ref="7"/>
285+ <nd ref="8"/>
286+ </way>
287+ <relation id="40">
288+ <member type="way" ref="20" role="outer"/>
289+ <member type="way" ref="21" role="outer"/>
290+ <member type="way" ref="22" role="inner"/>
291+ <member type="way" ref="23" role="inner"/>
292+ <member type="way" ref="24" role="inner"/>
293+ <member type="way" ref="25" role="inner"/>
294+ <tag k="building" v="school"/>
295+ <tag k="building:levels" v="3"/>
296+ <tag k="roof:shape" v="flat"/>
297+ <tag k="type" v="multipolygon"/>
298+ </relation>
299+ </osm>
300+ ` ;
301+
302+ test ( 'Test downloading type=building with multipolygon outline and multiple inner ways' , async ( ) => {
303+ fetch . mockResponses (
304+ [ typeBuildingRelationFullResponse ] , // /relation/42/full
305+ [ outlineRelationFullResponse ] , // /relation/40/full
306+ [ typeBuildingWithMultipolygonOutline ] , // /map call
307+ ) ;
308+ const innerData = await Building . downloadDataAroundBuilding ( 'relation' , '42' ) ;
309+ const building = new Building ( '42' , innerData ) ;
310+ expect ( building . id ) . toBe ( '42' ) ;
311+ expect ( building . outerElement . shape . holes . length ) . toBe ( 1 ) ;
312+ } ) ;
177313
178314window . printError = printError ;
179315
0 commit comments