2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.cdm
.model
.taxon
;
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
;
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
;
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
;
40 public class HomotypicGroupTaxonComparatorTest
{
41 @SuppressWarnings("unused")
42 private static final Logger logger
= Logger
.getLogger(HomotypicGroupTaxonComparatorTest
.class);
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
;
57 private List
<TaxonBase
<?
>> list
;
60 private Synonym synonym2
;
61 private Synonym synonym3
;
64 public static void setUpBeforeClass() {
65 DefaultTermInitializer vocabularyStore
= new DefaultTermInitializer();
66 vocabularyStore
.initialize();
70 * @throws java.lang.Exception
73 public void setUp() throws Exception
{
74 sec
= ReferenceFactory
.newBook();
76 ref1
= ReferenceFactory
.newBook();
77 ref2
= ReferenceFactory
.newBook();
78 ref3
= ReferenceFactory
.newBook();
79 cal1
= Calendar
.getInstance();
80 cal2
= Calendar
.getInstance();
81 cal3
= Calendar
.getInstance();
86 ref1
.setDatePublished(TimePeriod
.NewInstance(cal1
));
87 ref2
.setDatePublished(TimePeriod
.NewInstance(cal2
));
88 ref3
.setDatePublished(TimePeriod
.NewInstance(cal3
));
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());
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");
102 // zooName1.setPublicationYear(1823);
104 list
= new ArrayList
<TaxonBase
<?
>>();
106 taxon1
= Taxon
.NewInstance(botName1
, sec
);
111 private void setNameParts(NonViralName
<?
> name
, String genus
, String speciesEpi
) {
112 name
.setGenusOrUninomial(genus
);
113 name
.setSpecificEpithet(speciesEpi
);
114 name
.getTitleCache();
118 /******************** TESTS *****************************************************/
121 public void testCompare_BasionymGroupsTogether() {
124 HomotypicalGroup homotypicalGroup
= botName2
.getHomotypicalGroup();
125 taxon1
.addHeterotypicSynonymName(botName3
);
126 taxon1
.addHeterotypicSynonymName(botName5
, homotypicalGroup
, null, null);
127 botName3
.addBasionym(botName5
);
129 synonym2
= taxon1
.addHeterotypicSynonymName(botName2
).getSynonym();
130 taxon1
.addHeterotypicSynonymName(botName4
, homotypicalGroup
, null, null);
131 botName2
.addBasionym(botName4
);
134 list
.addAll(taxon1
.getSynonyms());
135 Collections
.sort(list
, new HomotypicGroupTaxonComparator(null));
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());
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());
152 //set a name as first name
153 Collections
.sort(list
, new HomotypicGroupTaxonComparator(synonym2
));
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());
166 public void testCompare_BasionymGroupsSeparated() {
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
173 taxon1
.addHeterotypicSynonymName(botName2
).getSynonym();
174 taxon1
.addHeterotypicSynonymName(botName4
);
175 botName2
.addBasionym(botName4
);
177 list
.addAll(taxon1
.getSynonyms());
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);
183 botName4
.getHomotypicalGroup().setUuid(uuidFirst
);
184 botName5
.getHomotypicalGroup().setUuid(uuidSecond
);
188 Collections
.sort(list
, new HomotypicGroupTaxonComparator(null));
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());
195 //set a name as first name
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
));
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());
208 public void testCompare_BasionymGroupsSomeWithYears() {
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
214 botName2
.setNomenclaturalReference(ref2
);
215 botName5
.setNomenclaturalReference(ref3
);
217 HomotypicalGroup homotypicalGroup
= botName2
.getHomotypicalGroup();
218 taxon1
.addHeterotypicSynonymName(botName3
);
219 taxon1
.addHeterotypicSynonymName(botName5
, homotypicalGroup
, null, null);
220 botName3
.addBasionym(botName5
);
222 synonym2
= taxon1
.addHeterotypicSynonymName(botName2
).getSynonym();
223 taxon1
.addHeterotypicSynonymName(botName4
, homotypicalGroup
, null, null);
224 botName2
.addBasionym(botName4
);
227 list
.addAll(taxon1
.getSynonyms());
228 Collections
.sort(list
, new HomotypicGroupTaxonComparator(null));
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());
235 //even with nom. illeg. the name with date should come first
236 NomenclaturalStatus illegStatus
= NomenclaturalStatus
.NewInstance(NomenclaturalStatusType
.ILLEGITIMATE());
237 botName5
.addStatus(illegStatus
);
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());
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());
257 public void testCompare_BasionymGroupsWithRanks1() {
259 botName2
.setRank(Rank
.VARIETY());
260 botName2
.setInfraSpecificEpithet("varbbbb");
262 botName3
.setRank(Rank
.VARIETY());
263 botName3
.setInfraSpecificEpithet("subspccc");
265 botName4
.setRank(Rank
.SUBSPECIES());
266 botName4
.setInfraSpecificEpithet("subspddd");
269 HomotypicalGroup homotypicalGroup
= botName2
.getHomotypicalGroup();
270 taxon1
.addHeterotypicSynonymName(botName3
);
271 taxon1
.addHeterotypicSynonymName(botName5
, homotypicalGroup
, null, null);
272 botName3
.addBasionym(botName5
);
274 synonym2
= taxon1
.addHeterotypicSynonymName(botName2
).getSynonym();
275 taxon1
.addHeterotypicSynonymName(botName4
, homotypicalGroup
, null, null);
276 botName2
.addBasionym(botName4
);
279 list
.addAll(taxon1
.getSynonyms());
280 Collections
.sort(list
, new HomotypicGroupTaxonComparator(null));
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());
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());
299 public void testCompare_BasionymGroupsWithRanks2() {
302 botName2
.setRank(Rank
.VARIETY());
303 botName2
.setInfraSpecificEpithet("varbbbb");
305 botName3
.setRank(Rank
.VARIETY());
306 botName3
.setInfraSpecificEpithet("subspccc");
308 botName4
.setRank(Rank
.SUBSPECIES());
309 botName4
.setInfraSpecificEpithet("subspddd");
311 botName5
.setRank(Rank
.VARIETY());
312 botName5
.setInfraSpecificEpithet("vareee");
315 HomotypicalGroup homotypicalGroup
= botName2
.getHomotypicalGroup();
316 taxon1
.addHeterotypicSynonymName(botName3
);
317 taxon1
.addHeterotypicSynonymName(botName5
, homotypicalGroup
, null, null);
318 botName3
.addBasionym(botName5
);
320 synonym2
= taxon1
.addHeterotypicSynonymName(botName2
).getSynonym();
321 taxon1
.addHeterotypicSynonymName(botName4
, homotypicalGroup
, null, null);
322 botName2
.addBasionym(botName5
);
323 botName4
.addBasionym(botName5
);
326 list
.addAll(taxon1
.getSynonyms());
327 Collections
.sort(list
, new HomotypicGroupTaxonComparator(null));
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());
337 public void testCompare_BasionymGroupsWithNomIlleg() {
338 NomenclaturalStatus illegStatus
= NomenclaturalStatus
.NewInstance(NomenclaturalStatusType
.ILLEGITIMATE());
339 botName4
.addStatus(illegStatus
);
343 HomotypicalGroup homotypicalGroup
= botName2
.getHomotypicalGroup();
344 taxon1
.addHeterotypicSynonymName(botName3
);
345 taxon1
.addHeterotypicSynonymName(botName5
, homotypicalGroup
, null, null);
346 botName3
.addBasionym(botName5
);
348 synonym2
= taxon1
.addHeterotypicSynonymName(botName2
).getSynonym();
349 taxon1
.addHeterotypicSynonymName(botName4
, homotypicalGroup
, null, null);
350 // botName2.addBasionym(botName4);
353 list
.addAll(taxon1
.getSynonyms());
354 Collections
.sort(list
, new HomotypicGroupTaxonComparator(null));
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());
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));
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());
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));
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());
384 public void testCompare_NoCircularProblemsWithBasionyms() {
386 taxon1
.addHomotypicSynonymName(botName3
, null, null);
387 taxon1
.addHomotypicSynonymName(botName5
, null, null);
388 botName3
.addBasionym(botName5
);
390 Assert
.assertEquals(botName1
.getHomotypicalGroup(), botName5
.getHomotypicalGroup());
391 botName5
.addBasionym(botName1
);
392 botName1
.addBasionym(botName3
);
394 list
.addAll(taxon1
.getSynonyms());
396 Collections
.sort(list
, new HomotypicGroupTaxonComparator(null));
398 Assert
.assertEquals(botName1
, list
.get(0).getName());
399 Assert
.assertEquals(botName3
, list
.get(1).getName());
400 Assert
.assertEquals(botName5
, list
.get(2).getName());
402 //additional basionym for botName3
403 taxon1
.addHomotypicSynonymName(botName2
, null, null);
404 Assert
.assertEquals(botName1
.getHomotypicalGroup(), botName2
.getHomotypicalGroup());
405 botName3
.addBasionym(botName2
);
407 list
.addAll(taxon1
.getSynonyms());
409 Collections
.sort(list
, new HomotypicGroupTaxonComparator(null));
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());
419 public void testCompare_NoCircularProblemsWithReplacedSynonyms() {
421 taxon1
.addHomotypicSynonymName(botName3
, null, null);
422 taxon1
.addHomotypicSynonymName(botName5
, null, null);
423 botName3
.addReplacedSynonym(botName5
, null, null, null);
425 Assert
.assertEquals(botName1
.getHomotypicalGroup(), botName5
.getHomotypicalGroup());
426 botName5
.addReplacedSynonym(botName1
, null, null, null);
427 botName1
.addReplacedSynonym(botName3
, null, null, null);
429 list
.addAll(taxon1
.getSynonyms());
431 Collections
.sort(list
, new HomotypicGroupTaxonComparator(null));
433 Assert
.assertEquals(botName1
, list
.get(0).getName());
434 Assert
.assertEquals(botName3
, list
.get(1).getName());
435 Assert
.assertEquals(botName5
, list
.get(2).getName());