a1955bf555154acbdf0f36b73ff556a9ccc69717
[cdmlib.git] / cdmlib-model / src / test / java / eu / etaxonomy / cdm / model / taxon / HomotypicGroupTaxonComparatorTest.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.cdm.model.taxon;
11
12 import java.util.ArrayList;
13 import java.util.Calendar;
14 import java.util.Collections;
15 import java.util.List;
16 import java.util.UUID;
17
18 import org.apache.log4j.Logger;
19 import org.junit.Assert;
20 import org.junit.Before;
21 import org.junit.BeforeClass;
22 import org.junit.Test;
23
24 import eu.etaxonomy.cdm.model.common.DefaultTermInitializer;
25 import eu.etaxonomy.cdm.model.common.TimePeriod;
26 import eu.etaxonomy.cdm.model.name.BotanicalName;
27 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
28 import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
29 import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
30 import eu.etaxonomy.cdm.model.name.NonViralName;
31 import eu.etaxonomy.cdm.model.name.Rank;
32 //import eu.etaxonomy.cdm.model.reference.Book;
33 import eu.etaxonomy.cdm.model.reference.Reference;
34 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
35
36 /**
37 * @author a.mueller
38 * @created 04.03.2016
39 */
40 public class HomotypicGroupTaxonComparatorTest {
41 @SuppressWarnings("unused")
42 private static final Logger logger = Logger.getLogger(HomotypicGroupTaxonComparatorTest.class);
43
44 private Reference<?> sec;
45 private Reference<?> ref1;
46 private Reference<?> ref2;
47 private Reference<?> ref3;
48 private Calendar cal1;
49 private Calendar cal2;
50 private Calendar cal3;
51 private BotanicalName botName1;
52 private BotanicalName botName2;
53 private BotanicalName botName3;
54 private BotanicalName botName4;
55 private BotanicalName botName5;
56
57 private List<TaxonBase<?>> list;
58
59 private Taxon taxon1;
60 private Synonym synonym2;
61 private Synonym synonym3;
62
63 @BeforeClass
64 public static void setUpBeforeClass() {
65 DefaultTermInitializer vocabularyStore = new DefaultTermInitializer();
66 vocabularyStore.initialize();
67 }
68
69 /**
70 * @throws java.lang.Exception
71 */
72 @Before
73 public void setUp() throws Exception {
74 sec = ReferenceFactory.newBook();
75
76 ref1 = ReferenceFactory.newBook();
77 ref2 = ReferenceFactory.newBook();
78 ref3 = ReferenceFactory.newBook();
79 cal1 = Calendar.getInstance();
80 cal2 = Calendar.getInstance();
81 cal3 = Calendar.getInstance();
82 cal1.set(1856, 3, 2);
83 cal2.set(1943, 3, 2);
84 cal3.set(1945, 3, 2);
85
86 ref1.setDatePublished(TimePeriod.NewInstance(cal1));
87 ref2.setDatePublished(TimePeriod.NewInstance(cal2));
88 ref3.setDatePublished(TimePeriod.NewInstance(cal3));
89
90 botName1 = BotanicalName.NewInstance(Rank.SPECIES());
91 botName2 = BotanicalName.NewInstance(Rank.SPECIES());
92 botName3 = BotanicalName.NewInstance(Rank.SPECIES());
93 botName4 = BotanicalName.NewInstance(Rank.SPECIES());
94 botName5 = BotanicalName.NewInstance(Rank.SPECIES());
95
96 setNameParts(botName1, "Aaa", "aaa");
97 setNameParts(botName2, "Bbb", "bbb");
98 setNameParts(botName3, "Ccc", "ccc");
99 setNameParts(botName4, "Ddd", "ddd");
100 setNameParts(botName5, "Eee", "eee");
101
102 // zooName1.setPublicationYear(1823);
103
104 list = new ArrayList<TaxonBase<?>>();
105
106 taxon1 = Taxon.NewInstance(botName1, sec);
107
108
109 }
110
111 private void setNameParts(NonViralName<?> name, String genus, String speciesEpi) {
112 name.setGenusOrUninomial(genus);
113 name.setSpecificEpithet(speciesEpi);
114 name.getTitleCache();
115 }
116
117
118 /******************** TESTS *****************************************************/
119
120 @Test
121 public void testCompare_BasionymGroupsTogether() {
122 //2 basionym groups
123
124 HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
125 taxon1.addHeterotypicSynonymName(botName3);
126 taxon1.addHeterotypicSynonymName(botName5, homotypicalGroup, null, null);
127 botName3.addBasionym(botName5);
128
129 synonym2 = taxon1.addHeterotypicSynonymName(botName2).getSynonym();
130 taxon1.addHeterotypicSynonymName(botName4, homotypicalGroup, null, null);
131 botName2.addBasionym(botName4);
132
133
134 list.addAll(taxon1.getSynonyms());
135 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
136
137 Assert.assertEquals("basionym for first group should come first", botName4, list.get(0).getName());
138 Assert.assertEquals(botName2, list.get(1).getName());
139 Assert.assertEquals(botName5, list.get(2).getName());
140 Assert.assertEquals(botName3, list.get(3).getName());
141
142 //add replaced synonym relation between basionyms
143 botName4.addReplacedSynonym(botName5, null, null, null);
144 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
145 Assert.assertEquals("basionym of second group should come first now as it is the replaced synonym",
146 botName5, list.get(0).getName());
147 Assert.assertEquals(botName3, list.get(1).getName());
148 Assert.assertEquals("replacement name should come after replaced synonym but first in basionym group",
149 botName4, list.get(2).getName());
150 Assert.assertEquals(botName2, list.get(3).getName());
151
152 //set a name as first name
153 Collections.sort(list, new HomotypicGroupTaxonComparator(synonym2));
154
155 Assert.assertEquals("name2 should come first now",
156 botName2, list.get(0).getName());
157 Assert.assertEquals("name2 should be followed by its basionym", botName4, list.get(1).getName());
158 Assert.assertEquals("other basionym group should come later but with basionym first",
159 botName5, list.get(2).getName());
160 Assert.assertEquals(botName3, list.get(3).getName());
161
162
163 }
164
165 @Test
166 public void testCompare_BasionymGroupsSeparated() {
167
168 //2 basionym groups in 2 homotypic groups
169 synonym3 = taxon1.addHeterotypicSynonymName(botName3).getSynonym();
170 taxon1.addHeterotypicSynonymName(botName5);
171 botName3.addBasionym(botName5); //also merges homotypic groups
172
173 taxon1.addHeterotypicSynonymName(botName2).getSynonym();
174 taxon1.addHeterotypicSynonymName(botName4);
175 botName2.addBasionym(botName4);
176
177 list.addAll(taxon1.getSynonyms());
178
179 UUID uuidFirst = UUID.fromString("000000972-d164-4cb5-9a1e-d6216cc858f6");
180 UUID uuidSecond = UUID.fromString("ffffff972-d164-4cb5-9a1e-d6216cc858f6");
181 Assert.assertTrue(uuidFirst.toString().compareTo(uuidSecond.toString())<-1);
182
183 botName4.getHomotypicalGroup().setUuid(uuidFirst);
184 botName5.getHomotypicalGroup().setUuid(uuidSecond);
185
186
187 //start test
188 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
189
190 Assert.assertEquals("basionym for first group should come first", botName4, list.get(0).getName());
191 Assert.assertEquals(botName2, list.get(1).getName());
192 Assert.assertEquals(botName5, list.get(2).getName());
193 Assert.assertEquals(botName3, list.get(3).getName());
194
195 //set a name as first name
196 //TODO
197 //first taxon in group should have an impact only for the homotypic group to which it belongs
198 //but this is still under discussion and may change in future
199 Collections.sort(list, new HomotypicGroupTaxonComparator(synonym3));
200
201 Assert.assertEquals(botName4, list.get(0).getName());
202 Assert.assertEquals(botName2, list.get(1).getName());
203 Assert.assertEquals(botName3, list.get(2).getName());
204 Assert.assertEquals(botName5, list.get(3).getName());
205 }
206
207 @Test
208 public void testCompare_BasionymGroupsSomeWithYears() {
209
210 //2 basionym groups, 1 new combination with year (botName2) and 1 basionym with year (botName5)
211 //The later should come first according to the rules, though alphabetically being
212 //basionym botName4
213
214 botName2.setNomenclaturalReference(ref2);
215 botName5.setNomenclaturalReference(ref3);
216
217 HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
218 taxon1.addHeterotypicSynonymName(botName3);
219 taxon1.addHeterotypicSynonymName(botName5, homotypicalGroup, null, null);
220 botName3.addBasionym(botName5);
221
222 synonym2 = taxon1.addHeterotypicSynonymName(botName2).getSynonym();
223 taxon1.addHeterotypicSynonymName(botName4, homotypicalGroup, null, null);
224 botName2.addBasionym(botName4);
225
226
227 list.addAll(taxon1.getSynonyms());
228 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
229
230 Assert.assertEquals("basionym with date should comes first", botName5, list.get(0).getName());
231 Assert.assertEquals(botName3, list.get(1).getName());
232 Assert.assertEquals(botName4, list.get(2).getName());
233 Assert.assertEquals(botName2, list.get(3).getName());
234
235 //even with nom. illeg. the name with date should come first
236 NomenclaturalStatus illegStatus = NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ILLEGITIMATE());
237 botName5.addStatus(illegStatus);
238
239 Assert.assertEquals("basionym with date should comes first", botName5, list.get(0).getName());
240 Assert.assertEquals(botName3, list.get(1).getName());
241 Assert.assertEquals(botName4, list.get(2).getName());
242 Assert.assertEquals(botName2, list.get(3).getName());
243
244
245 //add replaced synonym relation between basionyms
246 botName5.addReplacedSynonym(botName4, null, null, null);
247 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
248 Assert.assertEquals("basionym of second group should come first now as it is the replaced synonym",
249 botName4, list.get(0).getName());
250 Assert.assertEquals(botName2, list.get(1).getName());
251 Assert.assertEquals("replacement name should come after replaced synonym but first in basionym group",
252 botName5, list.get(2).getName());
253 Assert.assertEquals(botName3, list.get(3).getName());
254 }
255
256 @Test
257 public void testCompare_BasionymGroupsWithRanks1() {
258
259 botName2.setRank(Rank.VARIETY());
260 botName2.setInfraSpecificEpithet("varbbbb");
261
262 botName3.setRank(Rank.VARIETY());
263 botName3.setInfraSpecificEpithet("subspccc");
264
265 botName4.setRank(Rank.SUBSPECIES());
266 botName4.setInfraSpecificEpithet("subspddd");
267
268
269 HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
270 taxon1.addHeterotypicSynonymName(botName3);
271 taxon1.addHeterotypicSynonymName(botName5, homotypicalGroup, null, null);
272 botName3.addBasionym(botName5);
273
274 synonym2 = taxon1.addHeterotypicSynonymName(botName2).getSynonym();
275 taxon1.addHeterotypicSynonymName(botName4, homotypicalGroup, null, null);
276 botName2.addBasionym(botName4);
277
278
279 list.addAll(taxon1.getSynonyms());
280 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
281
282 Assert.assertEquals("basionym with rank species should comes first", botName5, list.get(0).getName());
283 Assert.assertEquals(botName3, list.get(1).getName());
284 Assert.assertEquals(botName4, list.get(2).getName());
285 Assert.assertEquals(botName2, list.get(3).getName());
286
287 //add replaced synonym relation between basionyms
288 botName5.addReplacedSynonym(botName4, null, null, null);
289 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
290 Assert.assertEquals("basionym of second group should come first now as it is the replaced synonym",
291 botName4, list.get(0).getName());
292 Assert.assertEquals(botName2, list.get(1).getName());
293 Assert.assertEquals("replacement name should come after replaced synonym but first in basionym group",
294 botName5, list.get(2).getName());
295 Assert.assertEquals(botName3, list.get(3).getName());
296 }
297
298 @Test
299 public void testCompare_BasionymGroupsWithRanks2() {
300
301
302 botName2.setRank(Rank.VARIETY());
303 botName2.setInfraSpecificEpithet("varbbbb");
304
305 botName3.setRank(Rank.VARIETY());
306 botName3.setInfraSpecificEpithet("subspccc");
307
308 botName4.setRank(Rank.SUBSPECIES());
309 botName4.setInfraSpecificEpithet("subspddd");
310
311 botName5.setRank(Rank.VARIETY());
312 botName5.setInfraSpecificEpithet("vareee");
313
314
315 HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
316 taxon1.addHeterotypicSynonymName(botName3);
317 taxon1.addHeterotypicSynonymName(botName5, homotypicalGroup, null, null);
318 botName3.addBasionym(botName5);
319
320 synonym2 = taxon1.addHeterotypicSynonymName(botName2).getSynonym();
321 taxon1.addHeterotypicSynonymName(botName4, homotypicalGroup, null, null);
322 botName2.addBasionym(botName5);
323 botName4.addBasionym(botName5);
324
325
326 list.addAll(taxon1.getSynonyms());
327 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
328
329 Assert.assertEquals("basionym should comes first", botName5, list.get(0).getName());
330 Assert.assertEquals("subspecies should come next", botName4, list.get(1).getName());
331 Assert.assertEquals("variety with b should come next", botName2, list.get(2).getName());
332 Assert.assertEquals("variety with c should come last", botName3, list.get(3).getName());
333
334 }
335
336 @Test
337 public void testCompare_BasionymGroupsWithNomIlleg() {
338 NomenclaturalStatus illegStatus = NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ILLEGITIMATE());
339 botName4.addStatus(illegStatus);
340
341 //2 basionym groups
342
343 HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
344 taxon1.addHeterotypicSynonymName(botName3);
345 taxon1.addHeterotypicSynonymName(botName5, homotypicalGroup, null, null);
346 botName3.addBasionym(botName5);
347
348 synonym2 = taxon1.addHeterotypicSynonymName(botName2).getSynonym();
349 taxon1.addHeterotypicSynonymName(botName4, homotypicalGroup, null, null);
350 // botName2.addBasionym(botName4);
351
352
353 list.addAll(taxon1.getSynonyms());
354 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
355
356 Assert.assertEquals("basionym for non nom. illeg. group should come first", botName2, list.get(0).getName());
357 Assert.assertEquals(botName5, list.get(1).getName());
358 Assert.assertEquals(botName3, list.get(2).getName());
359 Assert.assertEquals("Nom illeg should come last", botName4, list.get(3).getName());
360
361 //name having a nom. illeg. as basionym should stay in its basionym group
362 //NOTE: this is dirty data as nom. illeg. is not allowed as basionym by the code
363 botName2.addBasionym(botName4);
364 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
365
366 Assert.assertEquals("basionym for non nom. illeg. group should come first", botName5, list.get(0).getName());
367 Assert.assertEquals(botName3, list.get(1).getName());
368 Assert.assertEquals("Nom illeg basionym group should come last", botName4, list.get(2).getName());
369 Assert.assertEquals("Names with nom. illeg. as basionym should stay in basionym group", botName2, list.get(3).getName());
370
371 //non basionym nom. illeg. should not change the order
372 botName4.removeStatus(illegStatus);
373 botName2.addStatus(illegStatus);
374 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
375
376 Assert.assertEquals("basionym for non nom. illeg. group should come first", botName4, list.get(0).getName());
377 Assert.assertEquals(botName2, list.get(1).getName());
378 Assert.assertEquals("Nom illeg basionym group should come last", botName5, list.get(2).getName());
379 Assert.assertEquals("Names with nom. illeg. as basionym should stay in basionym group", botName3, list.get(3).getName());
380
381 }
382
383 @Test
384 public void testCompare_NoCircularProblemsWithBasionyms() {
385
386 taxon1.addHomotypicSynonymName(botName3, null, null);
387 taxon1.addHomotypicSynonymName(botName5, null, null);
388 botName3.addBasionym(botName5);
389
390 Assert.assertEquals(botName1.getHomotypicalGroup(), botName5.getHomotypicalGroup());
391 botName5.addBasionym(botName1);
392 botName1.addBasionym(botName3);
393
394 list.addAll(taxon1.getSynonyms());
395 list.add(taxon1);
396 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
397
398 Assert.assertEquals(botName1, list.get(0).getName());
399 Assert.assertEquals(botName3, list.get(1).getName());
400 Assert.assertEquals(botName5, list.get(2).getName());
401
402 //additional basionym for botName3
403 taxon1.addHomotypicSynonymName(botName2, null, null);
404 Assert.assertEquals(botName1.getHomotypicalGroup(), botName2.getHomotypicalGroup());
405 botName3.addBasionym(botName2);
406 list.clear();
407 list.addAll(taxon1.getSynonyms());
408 list.add(taxon1);
409 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
410
411 Assert.assertEquals(botName1, list.get(0).getName());
412 Assert.assertEquals(botName2, list.get(1).getName());
413 Assert.assertEquals(botName3, list.get(2).getName());
414 Assert.assertEquals(botName5, list.get(3).getName());
415
416 }
417
418 @Test
419 public void testCompare_NoCircularProblemsWithReplacedSynonyms() {
420
421 taxon1.addHomotypicSynonymName(botName3, null, null);
422 taxon1.addHomotypicSynonymName(botName5, null, null);
423 botName3.addReplacedSynonym(botName5, null, null, null);
424
425 Assert.assertEquals(botName1.getHomotypicalGroup(), botName5.getHomotypicalGroup());
426 botName5.addReplacedSynonym(botName1, null, null, null);
427 botName1.addReplacedSynonym(botName3, null, null, null);
428
429 list.addAll(taxon1.getSynonyms());
430 list.add(taxon1);
431 Collections.sort(list, new HomotypicGroupTaxonComparator(null));
432
433 Assert.assertEquals(botName1, list.get(0).getName());
434 Assert.assertEquals(botName3, list.get(1).getName());
435 Assert.assertEquals(botName5, list.get(2).getName());
436
437
438 }
439
440 }