@@ -98,13 +98,19 @@ public void shouldHandleUnmatchedLiteralsAndEntitiesInElseFlattenedSource() {
9898 private void testElseData (final String elseKeyword ) {
9999 assertMorph (receiver ,
100100 "<rules>" +
101+ " <entity name='Germany'>" +
102+ " <data source='Germany.Sylt' name='Hawaii' />" +
103+ " <data source='Germany.Borkum' />" +
104+ " </entity>" +
101105 " <data source='" + elseKeyword + "'/>" +
102106 "</rules>" ,
103107 i -> {
104108 i .startRecord ("1" );
105109 i .literal ("Shikotan" , "Aekap" );
106110 i .startEntity ("Germany" );
107111 i .literal ("Langeoog" , "Moin" );
112+ i .literal ("Sylt" , "Aloha" );
113+ i .literal ("Borkum" , "Tach" );
108114 i .endEntity ();
109115 i .startEntity ("Germany" );
110116 i .literal ("Baltrum" , "Moin Moin" );
@@ -115,12 +121,97 @@ private void testElseData(final String elseKeyword) {
115121 o .get ().startRecord ("1" );
116122 o .get ().literal ("Shikotan" , "Aekap" );
117123 o .get ().literal ("Germany.Langeoog" , "Moin" );
124+ o .get ().startEntity ("Germany" );
125+ o .get ().literal ("Hawaii" , "Aloha" );
126+ o .get ().literal ("Germany.Borkum" , "Tach" );
127+ o .get ().endEntity ();
118128 o .get ().literal ("Germany.Baltrum" , "Moin Moin" );
119129 o .get ().endRecord ();
120130 }
121131 );
122132 }
123133
134+ @ Test
135+ public void issue338_shouldPreserveSameEntitiesInElseNestedSource () {
136+ assertMorph (receiver ,
137+ "<rules>" +
138+ " <data source='_elseNested' />" +
139+ "</rules>" ,
140+ i -> {
141+ i .startRecord ("1" );
142+ i .literal ("lit1" , "val1" );
143+ i .startEntity ("ent1" );
144+ i .literal ("lit2" , "val2" );
145+ i .literal ("lit3" , "val3" );
146+ i .endEntity ();
147+ i .literal ("lit4" , "val4" );
148+ i .startEntity ("ent2" );
149+ i .literal ("lit5" , "val5" );
150+ i .literal ("lit6" , "val6" );
151+ i .literal ("lit7" , "val7" );
152+ i .endEntity ();
153+ i .startEntity ("ent2" ); // sic!
154+ i .literal ("lit8" , "val8" );
155+ i .literal ("lit9" , "val9" );
156+ i .endEntity ();
157+ i .endRecord ();
158+ i .startRecord ("2" );
159+ i .startEntity ("ent1" );
160+ i .literal ("lit1" , "val1" );
161+ i .literal ("lit2" , "val2" );
162+ i .endEntity ();
163+ i .startEntity ("ent2" );
164+ i .literal ("lit3" , "val3" );
165+ i .literal ("lit4" , "val4" );
166+ i .literal ("lit5" , "val5" );
167+ i .literal ("lit6" , "val6" );
168+ i .endEntity ();
169+ i .startEntity ("ent3" );
170+ i .literal ("lit7" , "val7" );
171+ i .literal ("lit8" , "val8" );
172+ i .endEntity ();
173+ i .literal ("lit9" , "val9" );
174+ i .endRecord ();
175+ },
176+ o -> {
177+ o .get ().startRecord ("1" );
178+ o .get ().literal ("lit1" , "val1" );
179+ o .get ().startEntity ("ent1" );
180+ o .get ().literal ("lit2" , "val2" );
181+ o .get ().literal ("lit3" , "val3" );
182+ o .get ().endEntity ();
183+ o .get ().literal ("lit4" , "val4" );
184+ o .get ().startEntity ("ent2" );
185+ o .get ().literal ("lit5" , "val5" );
186+ o .get ().literal ("lit6" , "val6" );
187+ o .get ().literal ("lit7" , "val7" );
188+ o .get ().endEntity ();
189+ o .get ().startEntity ("ent2" );
190+ o .get ().literal ("lit8" , "val8" );
191+ o .get ().literal ("lit9" , "val9" );
192+ o .get ().endEntity ();
193+ o .get ().endRecord ();
194+ o .get ().startRecord ("2" );
195+ o .get ().startEntity ("ent1" );
196+ o .get ().literal ("lit1" , "val1" );
197+ o .get ().literal ("lit2" , "val2" );
198+ o .get ().endEntity ();
199+ o .get ().startEntity ("ent2" );
200+ o .get ().literal ("lit3" , "val3" );
201+ o .get ().literal ("lit4" , "val4" );
202+ o .get ().literal ("lit5" , "val5" );
203+ o .get ().literal ("lit6" , "val6" );
204+ o .get ().endEntity ();
205+ o .get ().startEntity ("ent3" );
206+ o .get ().literal ("lit7" , "val7" );
207+ o .get ().literal ("lit8" , "val8" );
208+ o .get ().endEntity ();
209+ o .get ().literal ("lit9" , "val9" );
210+ o .get ().endRecord ();
211+ }
212+ );
213+ }
214+
124215 @ Test
125216 public void shouldHandleUnmatchedLiteralsAndEntitiesInElseNestedSource () {
126217 assertMorph (receiver ,
@@ -147,13 +238,118 @@ public void shouldHandleUnmatchedLiteralsAndEntitiesInElseNestedSource() {
147238 o .get ().literal ("Shikotan" , "Aekap" );
148239 o .get ().startEntity ("Germany" );
149240 o .get ().literal ("Langeoog" , "Moin" );
241+ o .get ().literal ("Baltrum" , "Moin Moin" );
242+ o .get ().endEntity ();
243+ o .get ().startEntity ("USA" );
244+ o .get ().literal ("Hawaii" , "Aloha" );
150245 o .get ().endEntity ();
246+ o .get ().endRecord ();
247+ }
248+ );
249+ }
250+
251+ @ Test
252+ public void shouldHandlePartiallyUnmatchedLiteralsAndEntitiesInElseNestedSource () {
253+ assertMorph (receiver ,
254+ "<rules>" +
255+ " <entity name='USA1'>" +
256+ " <data source='USA1.Sylt' name='Hawaii' />" +
257+ " </entity>" +
258+ " <entity name='USA2'>" +
259+ " <data source='USA2.Sylt' name='Hawaii' />" +
260+ " </entity>" +
261+ " <entity name='USA3'>" +
262+ " <data source='USA3.Sylt' name='Hawaii' />" +
263+ " </entity>" +
264+ " <entity name='USA4'>" +
265+ " <data source='USA4.Sylt' name='Hawaii' />" +
266+ " </entity>" +
267+ " <data source='_elseNested' />" +
268+ "</rules>" ,
269+ i -> {
270+ i .startRecord ("1" );
271+ i .literal ("Shikotan" , "Aekap" );
272+ i .startEntity ("Germany" );
273+ i .literal ("Langeoog" , "Moin" );
274+ i .literal ("Baltrum" , "Moin Moin" );
275+ i .endEntity ();
276+ i .startEntity ("USA1" );
277+ i .literal ("Sylt" , "Aloha" );
278+ i .endEntity ();
279+ i .startEntity ("USA2" );
280+ i .literal ("Sylt" , "Aloha" );
281+ i .literal ("Langeoog" , "Moin" );
282+ i .literal ("Baltrum" , "Moin Moin" );
283+ i .endEntity ();
284+ i .startEntity ("USA3" );
285+ i .literal ("Langeoog" , "Moin" );
286+ i .literal ("Sylt" , "Aloha" );
287+ i .literal ("Baltrum" , "Moin Moin" );
288+ i .endEntity ();
289+ i .startEntity ("USA4" );
290+ i .literal ("Langeoog" , "Moin" );
291+ i .literal ("Baltrum" , "Moin Moin" );
292+ i .literal ("Sylt" , "Aloha" );
293+ i .endEntity ();
294+ i .endRecord ();
295+ },
296+ (o , f ) -> {
297+ final boolean coordinatesWithEntity = false ;
298+ final boolean separatesFromEntity = false ;
299+ o .get ().startRecord ("1" );
300+ o .get ().literal ("Shikotan" , "Aekap" );
151301 o .get ().startEntity ("Germany" );
302+ o .get ().literal ("Langeoog" , "Moin" );
152303 o .get ().literal ("Baltrum" , "Moin Moin" );
153304 o .get ().endEntity ();
154- o .get ().startEntity ("USA" );
305+ o .get ().startEntity ("USA1" );
306+ o .get ().literal ("Hawaii" , "Aloha" );
307+ o .get ().endEntity ();
308+ o .get ().startEntity ("USA2" );
309+ o .get ().literal ("Hawaii" , "Aloha" );
310+ if (!coordinatesWithEntity ) {
311+ o .get ().endEntity ();
312+ o .get ().startEntity ("USA2" );
313+ }
314+ o .get ().literal ("Langeoog" , "Moin" );
315+ o .get ().literal ("Baltrum" , "Moin Moin" );
316+ o .get ().endEntity ();
317+ o .get ().startEntity ("USA3" );
318+ o .get ().literal ("Langeoog" , "Moin" );
319+ if (!coordinatesWithEntity ) {
320+ o .get ().startEntity ("USA3" );
321+ }
322+ else if (separatesFromEntity ) {
323+ o .get ().endEntity ();
324+ o .get ().startEntity ("USA3" );
325+ }
326+ o .get ().literal ("Hawaii" , "Aloha" );
327+ if (!coordinatesWithEntity ) {
328+ o .get ().endEntity ();
329+ }
330+ else if (separatesFromEntity ) {
331+ o .get ().endEntity ();
332+ o .get ().startEntity ("USA3" );
333+ }
334+ o .get ().literal ("Baltrum" , "Moin Moin" );
335+ o .get ().endEntity ();
336+ o .get ().startEntity ("USA4" );
337+ o .get ().literal ("Langeoog" , "Moin" );
338+ o .get ().literal ("Baltrum" , "Moin Moin" );
339+ if (!coordinatesWithEntity ) {
340+ o .get ().startEntity ("USA4" );
341+ }
342+ else if (separatesFromEntity ) {
343+ o .get ().endEntity ();
344+ o .get ().startEntity ("USA4" );
345+ }
155346 o .get ().literal ("Hawaii" , "Aloha" );
347+ if (!coordinatesWithEntity ) {
348+ f .apply (2 ).endEntity ();
349+ }
350+ else {
156351 o .get ().endEntity ();
352+ }
157353 o .get ().endRecord ();
158354 }
159355 );
0 commit comments