Project

General

Profile

Download (21.2 KB) Statistics
| Branch: | Tag: | Revision:
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
package eu.etaxonomy.cdm.compare.taxon;
10

    
11
import java.util.ArrayList;
12
import java.util.Arrays;
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.commons.collections4.comparators.ReverseComparator;
19
import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;
20
import org.junit.Assert;
21
import org.junit.Before;
22
import org.junit.Test;
23

    
24
import eu.etaxonomy.cdm.common.UTF8;
25
import eu.etaxonomy.cdm.model.common.VerbatimTimePeriod;
26
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
27
import eu.etaxonomy.cdm.model.name.INonViralName;
28
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
29
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
30
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
31
import eu.etaxonomy.cdm.model.name.Rank;
32
import eu.etaxonomy.cdm.model.name.TaxonName;
33
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
34
//import eu.etaxonomy.cdm.model.reference.Book;
35
import eu.etaxonomy.cdm.model.reference.Reference;
36
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
37
import eu.etaxonomy.cdm.model.taxon.Synonym;
38
import eu.etaxonomy.cdm.model.taxon.Taxon;
39
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
40
import eu.etaxonomy.cdm.test.unit.EntityTestBase;
41

    
42
/**
43
 * @author a.mueller
44
 * @since 04.03.2016
45
 */
46
public class HomotypicGroupTaxonComparatorTest extends EntityTestBase {
47

    
48
    @SuppressWarnings("unused")
49
    private static final Logger logger = LogManager.getLogger(HomotypicGroupTaxonComparatorTest.class);
50

    
51
    private Reference sec;
52
    private Reference ref1;
53
    private Reference ref2;
54
    private Reference ref3;
55
    private Calendar cal1;
56
    private Calendar cal2;
57
    private Calendar cal3;
58
    private TaxonName botName1;
59
    private TaxonName botName2;
60
    private TaxonName botName3;
61
    private TaxonName botName4;
62
    private TaxonName botName5;
63

    
64
    private List<TaxonBase<?>> list;
65

    
66
    private Taxon taxon1;
67
    private Synonym synonym2;
68
    private Synonym synonym3;
69

    
70
    @Before
71
    public void setUp() throws Exception {
72
        sec = ReferenceFactory.newBook();
73

    
74
        ref1 = ReferenceFactory.newBook();
75
        ref2 = ReferenceFactory.newBook();
76
        ref3 = ReferenceFactory.newBook();
77
        cal1 = Calendar.getInstance();
78
        cal2 = Calendar.getInstance();
79
        cal3 = Calendar.getInstance();
80
        cal1.set(1856, 3, 2);
81
        cal2.set(1943, 3, 2);
82
        cal3.set(1945, 3, 2);
83

    
84
        ref1.setDatePublished(VerbatimTimePeriod.NewVerbatimInstance(cal1));
85
        ref2.setDatePublished(VerbatimTimePeriod.NewVerbatimInstance(cal2));
86
        ref3.setDatePublished(VerbatimTimePeriod.NewVerbatimInstance(cal3));
87

    
88
        botName1 =  TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
89
        botName2 =  TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
90
        botName3 =  TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
91
        botName4 =  TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
92
        botName5 =  TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
93

    
94
        setNameParts(botName1, "Aaa", "aaa");
95
        setNameParts(botName2, "Bbb", "bbb");
96
        setNameParts(botName3, "Ccc", "ccc");
97
        setNameParts(botName4, "Ddd", "ddd");
98
        setNameParts(botName5, "Eee", "eee");
99

    
100
//        zooName1.setPublicationYear(1823);
101

    
102
        list = new ArrayList<>();
103

    
104
        taxon1 = Taxon.NewInstance(botName1, sec);
105
    }
106

    
107
    private void setNameParts(INonViralName name, String genus, String speciesEpi) {
108
        name.setGenusOrUninomial(genus);
109
        name.setSpecificEpithet(speciesEpi);
110
        name.getTitleCache();
111
    }
112

    
113
/******************** TESTS *****************************************************/
114

    
115
    @Test
116
    public void testCompare_BasionymGroupsTogether() {
117
        //2 basionym groups
118

    
119
        HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
120
        taxon1.addHeterotypicSynonymName(botName3);
121
        taxon1.addHeterotypicSynonymName(botName5, null, null, homotypicalGroup);
122
        botName3.addBasionym(botName5);
123

    
124
        synonym2 = taxon1.addHeterotypicSynonymName(botName2);
125
        taxon1.addHeterotypicSynonymName(botName4, null, null, homotypicalGroup);
126
        botName2.addBasionym(botName4);
127

    
128

    
129
        list.addAll(taxon1.getSynonyms());
130
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
131

    
132
        Assert.assertEquals("basionym for first group should come first", botName4, list.get(0).getName());
133
        Assert.assertEquals(botName2, list.get(1).getName());
134
        Assert.assertEquals(botName5, list.get(2).getName());
135
        Assert.assertEquals(botName3, list.get(3).getName());
136

    
137
        //add replaced synonym relation between basionyms
138
        botName4.addReplacedSynonym(botName5, null, null, null, null);
139
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
140
        Assert.assertEquals("basionym of second group should come first now as it is the replaced synonym",
141
                            botName5, list.get(0).getName());
142
        Assert.assertEquals(botName3, list.get(1).getName());
143
        Assert.assertEquals("replacement name should come after replaced synonym but first in basionym group",
144
                            botName4, list.get(2).getName());
145
        Assert.assertEquals(botName2, list.get(3).getName());
146

    
147
        //set a name as first name
148
        Collections.sort(list, new HomotypicGroupTaxonComparator(synonym2));
149

    
150
        Assert.assertEquals("name2 should come first now",
151
                            botName2, list.get(0).getName());
152
        Assert.assertEquals("name2 should be followed by its basionym", botName4, list.get(1).getName());
153
        Assert.assertEquals("other basionym group should come later but with basionym first",
154
                            botName5, list.get(2).getName());
155
        Assert.assertEquals(botName3, list.get(3).getName());
156
    }
157

    
158
    @Test
159
    public void testCompare_BasionymGroupsSeparated() {
160

    
161
        //2 basionym groups in 2 homotypic groups
162
        synonym3 = taxon1.addHeterotypicSynonymName(botName3);
163
        taxon1.addHeterotypicSynonymName(botName5);
164
        botName3.addBasionym(botName5);  //also merges homotypic groups
165

    
166
        taxon1.addHeterotypicSynonymName(botName2);
167
        taxon1.addHeterotypicSynonymName(botName4);
168
        botName2.addBasionym(botName4);
169

    
170
        list.addAll(taxon1.getSynonyms());
171

    
172
        UUID uuidFirst = UUID.fromString("000000972-d164-4cb5-9a1e-d6216cc858f6");
173
        UUID uuidSecond = UUID.fromString("ffffff972-d164-4cb5-9a1e-d6216cc858f6");
174
        Assert.assertTrue(uuidFirst.toString().compareTo(uuidSecond.toString())<-1);
175

    
176
        botName4.getHomotypicalGroup().setUuid(uuidFirst);
177
        botName5.getHomotypicalGroup().setUuid(uuidSecond);
178

    
179
        //start test
180
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
181

    
182
        Assert.assertEquals("basionym for first group should come first", botName4, list.get(0).getName());
183
        Assert.assertEquals(botName2, list.get(1).getName());
184
        Assert.assertEquals(botName5, list.get(2).getName());
185
        Assert.assertEquals(botName3, list.get(3).getName());
186

    
187
        //set a name as first name
188
        //TODO
189
        //first taxon in group should have an impact only for the homotypic group to which it belongs
190
        //but this is still under discussion and may change in future
191
        Collections.sort(list, new HomotypicGroupTaxonComparator(synonym3));
192

    
193
        Assert.assertEquals(botName4, list.get(0).getName());
194
        Assert.assertEquals(botName2, list.get(1).getName());
195
        Assert.assertEquals(botName3, list.get(2).getName());
196
        Assert.assertEquals(botName5, list.get(3).getName());
197
    }
198

    
199
    @Test
200
    public void testCompare_BasionymGroupsSomeWithYears() {
201

    
202
        //2 basionym groups, 1 new combination with year (botName2) and 1 basionym with year (botName5)
203
        //The later should come first according to the rules, though alphabetically being
204
        //basionym botName4
205

    
206
        botName2.setNomenclaturalReference(ref2);
207
        botName5.setNomenclaturalReference(ref3);
208

    
209
        HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
210
        taxon1.addHeterotypicSynonymName(botName3);
211
        taxon1.addHeterotypicSynonymName(botName5, null, null, homotypicalGroup);
212
        botName3.addBasionym(botName5);
213

    
214
        synonym2 = taxon1.addHeterotypicSynonymName(botName2);
215
        taxon1.addHeterotypicSynonymName(botName4, null, null, homotypicalGroup);
216
        botName2.addBasionym(botName4);
217

    
218
        list.addAll(taxon1.getSynonyms());
219
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
220

    
221
        Assert.assertEquals("basionym with date should comes first", botName5, list.get(0).getName());
222
        Assert.assertEquals(botName3, list.get(1).getName());
223
        Assert.assertEquals(botName4, list.get(2).getName());
224
        Assert.assertEquals(botName2, list.get(3).getName());
225

    
226
        //even with nom. illeg. the name with date should come first
227
        NomenclaturalStatus illegStatus = NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ILLEGITIMATE());
228
        botName5.addStatus(illegStatus);
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
        //add replaced synonym relation between basionyms
236
        botName5.addReplacedSynonym(botName4, null, null, null, null);
237
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
238
        Assert.assertEquals("basionym of second group should come first now as it is the replaced synonym",
239
                            botName4, list.get(0).getName());
240
        Assert.assertEquals(botName2, list.get(1).getName());
241
        Assert.assertEquals("replacement name should come after replaced synonym but first in basionym group",
242
                            botName5, list.get(2).getName());
243
        Assert.assertEquals(botName3, list.get(3).getName());
244
    }
245

    
246
    @Test
247
    public void testCompare_BasionymGroupsWithRanks1() {
248

    
249
        botName2.setRank(Rank.VARIETY());
250
        botName2.setInfraSpecificEpithet("varbbbb");
251

    
252
        botName3.setRank(Rank.VARIETY());
253
        botName3.setInfraSpecificEpithet("subspccc");
254

    
255
        botName4.setRank(Rank.SUBSPECIES());
256
        botName4.setInfraSpecificEpithet("subspddd");
257

    
258

    
259
        HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
260
        taxon1.addHeterotypicSynonymName(botName3);
261
        taxon1.addHeterotypicSynonymName(botName5, null, null, homotypicalGroup);
262
        botName3.addBasionym(botName5);
263

    
264
        synonym2 = taxon1.addHeterotypicSynonymName(botName2);
265
        taxon1.addHeterotypicSynonymName(botName4, null, null, homotypicalGroup);
266
        botName2.addBasionym(botName4);
267

    
268
        list.addAll(taxon1.getSynonyms());
269
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
270

    
271
        Assert.assertEquals("basionym with rank species should comes first", botName5, list.get(0).getName());
272
        Assert.assertEquals(botName3, list.get(1).getName());
273
        Assert.assertEquals(botName4, list.get(2).getName());
274
        Assert.assertEquals(botName2, list.get(3).getName());
275

    
276
        //add replaced synonym relation between basionyms
277
        botName5.addReplacedSynonym(botName4, null, null, null, null);
278
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
279
        Assert.assertEquals("basionym of second group should come first now as it is the replaced synonym",
280
                            botName4, list.get(0).getName());
281
        Assert.assertEquals(botName2, list.get(1).getName());
282
        Assert.assertEquals("replacement name should come after replaced synonym but first in basionym group",
283
                            botName5, list.get(2).getName());
284
        Assert.assertEquals(botName3, list.get(3).getName());
285
    }
286

    
287
    @Test
288
    public void testCompare_BasionymGroupsWithRanks2() {
289

    
290
        botName2.setRank(Rank.VARIETY());
291
        botName2.setInfraSpecificEpithet("varbbbb");
292

    
293
        botName3.setRank(Rank.VARIETY());
294
        botName3.setInfraSpecificEpithet("subspccc");
295

    
296
        botName4.setRank(Rank.SUBSPECIES());
297
        botName4.setInfraSpecificEpithet("subspddd");
298

    
299
        botName5.setRank(Rank.VARIETY());
300
        botName5.setInfraSpecificEpithet("vareee");
301

    
302
        HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
303
        taxon1.addHeterotypicSynonymName(botName3);
304
        taxon1.addHeterotypicSynonymName(botName5, null, null, homotypicalGroup);
305
        botName3.addBasionym(botName5);
306

    
307
        synonym2 = taxon1.addHeterotypicSynonymName(botName2);
308
        taxon1.addHeterotypicSynonymName(botName4, null, null, homotypicalGroup);
309
        botName2.addBasionym(botName5);
310
        botName4.addBasionym(botName5);
311

    
312
        list.addAll(taxon1.getSynonyms());
313
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
314

    
315
        Assert.assertEquals("basionym should comes first", botName5, list.get(0).getName());
316
        Assert.assertEquals("subspecies should come next", botName4, list.get(1).getName());
317
        Assert.assertEquals("variety with b should come next", botName2, list.get(2).getName());
318
        Assert.assertEquals("variety with c should come last", botName3, list.get(3).getName());
319
    }
320

    
321
    @Test
322
    public void testCompare_BasionymGroupsWithNomIlleg() {
323
        NomenclaturalStatus illegStatus = NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ILLEGITIMATE());
324
        botName4.addStatus(illegStatus);
325

    
326
        //2 basionym groups
327

    
328
        HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
329
        taxon1.addHeterotypicSynonymName(botName3);
330
        taxon1.addHeterotypicSynonymName(botName5, null, null, homotypicalGroup);
331
        botName3.addBasionym(botName5);
332

    
333
        synonym2 = taxon1.addHeterotypicSynonymName(botName2);
334
        taxon1.addHeterotypicSynonymName(botName4, null, null, homotypicalGroup);
335
//        botName2.addBasionym(botName4);
336

    
337
        list.addAll(taxon1.getSynonyms());
338
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
339

    
340
        Assert.assertEquals("basionym for non nom. illeg. group should come first", botName2, list.get(0).getName());
341
        Assert.assertEquals(botName5, list.get(1).getName());
342
        Assert.assertEquals(botName3, list.get(2).getName());
343
        Assert.assertEquals("Nom illeg should come last", botName4, list.get(3).getName());
344

    
345
        //name having a nom. illeg. as basionym should stay in its basionym group
346
        //NOTE: this is dirty data as nom. illeg. is not allowed as basionym by the code
347
        botName2.addBasionym(botName4);
348
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
349

    
350
        Assert.assertEquals("basionym for non nom. illeg. group should come first", botName5, list.get(0).getName());
351
        Assert.assertEquals(botName3, list.get(1).getName());
352
        Assert.assertEquals("Nom illeg basionym group should come last", botName4, list.get(2).getName());
353
        Assert.assertEquals("Names with nom. illeg. as basionym should stay in basionym group", botName2, list.get(3).getName());
354

    
355
        //non basionym nom. illeg. should not change the order
356
        botName4.removeStatus(illegStatus);
357
        botName2.addStatus(illegStatus);
358
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
359

    
360
        Assert.assertEquals("basionym for non nom. illeg. group should come first", botName4, list.get(0).getName());
361
        Assert.assertEquals(botName2, list.get(1).getName());
362
        Assert.assertEquals("Nom illeg basionym group should come last", botName5, list.get(2).getName());
363
        Assert.assertEquals("Names with nom. illeg. as basionym should stay in basionym group", botName3, list.get(3).getName());
364
    }
365

    
366
    @Test  //failing selenium test
367
    public void testCompare_NomIllegWithDate() {
368
        NomenclaturalStatus illegStatus = NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ILLEGITIMATE());
369
        botName3.addStatus(illegStatus);
370
        botName3.setNomenclaturalReference(ref1);
371
        botName2.setNomenclaturalReference(ref2);
372

    
373
        taxon1.addHomotypicSynonymName(botName3);
374
        taxon1.addHomotypicSynonymName(botName2);
375

    
376
        list.addAll(taxon1.getSynonyms());
377
        Collections.sort(list, new HomotypicGroupTaxonComparator(taxon1));
378

    
379
        Assert.assertEquals("Earlier nom. illeg. should come next", botName3, list.get(0).getName());
380
        Assert.assertEquals("Later name should come last", botName2, list.get(1).getName());
381
    }
382

    
383
    @Test
384
    public void testCompare_NoCircularProblemsWithBasionyms() {
385

    
386
        taxon1.addHomotypicSynonymName(botName3);
387
        taxon1.addHomotypicSynonymName(botName5);
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);
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
    @Test
418
    public void testCompare_NoCircularProblemsWithReplacedSynonyms() {
419

    
420
        taxon1.addHomotypicSynonymName(botName3);
421
        taxon1.addHomotypicSynonymName(botName5);
422
        botName3.addReplacedSynonym(botName5, null, null, null, null);
423

    
424
        Assert.assertEquals(botName1.getHomotypicalGroup(), botName5.getHomotypicalGroup());
425
        botName5.addReplacedSynonym(botName1, null, null, null, null);
426
        botName1.addReplacedSynonym(botName3, null, null, null, null);
427

    
428
        list.addAll(taxon1.getSynonyms());
429
        list.add(taxon1);
430
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
431

    
432
        Assert.assertEquals(botName1, list.get(0).getName());
433
        Assert.assertEquals(botName3, list.get(1).getName());
434
        Assert.assertEquals(botName5, list.get(2).getName());
435
    }
436

    
437
    @Test
438
    public void testCompare_NomenclaturalStanding() {
439

    
440
        //default behavior without nomenclatural standing
441
        HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
442
        taxon1.addHeterotypicSynonymName(botName2);
443
        taxon1.addHeterotypicSynonymName(botName5, null, null, homotypicalGroup);
444
        list.addAll(taxon1.getSynonyms());
445
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
446

    
447
        Assert.assertEquals("Bbb should come before Eee in same homotypic group", botName2, list.get(0).getName());
448
        Assert.assertEquals("Bbb should come before Eee in same homotypic group", botName5, list.get(1).getName());
449

    
450
        //with nomenclatural standing
451
        botName2.addRelationshipToName(botName3, NameRelationshipType.MISSPELLING());
452
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
453

    
454
        Assert.assertEquals("Invalid designation should come after valid name", botName5, list.get(0).getName());
455
        Assert.assertEquals("Invalid designation should come after valid name", botName2, list.get(1).getName());
456

    
457
    }
458

    
459
    @Test
460
    public void testCompare_hybrids() {
461

    
462
        String name2 = "Opuntia "+UTF8.HYBRID+"rubiflora Davidson";
463
        String name3 = "Opuntia rubiflora Davidson";
464
        List<String> strList = Arrays.asList(new String[]{name2, name3});
465
        Collections.sort(strList);
466
        Assert.assertEquals("Non hybrid name should come first in alphabetical order", name3, strList.get(0));
467

    
468
        botName2 = TaxonNameFactory.PARSED_BOTANICAL(name2);
469
        botName3 = TaxonNameFactory.PARSED_BOTANICAL(name3);
470
        taxon1.addHeterotypicSynonymName(botName2);
471
        taxon1.addHeterotypicSynonymName(botName3, null, null, botName2.getHomotypicalGroup());
472
        list.addAll(taxon1.getSynonyms());
473
        HomotypicGroupTaxonComparator comparator = new HomotypicGroupTaxonComparator(null);
474
        Collections.sort(list, comparator);
475

    
476
        Assert.assertEquals("Hybrid should come after non-hybrid", botName3, list.get(0).getName());
477
        Assert.assertEquals("Hybrid should come after non-hybrid", botName2, list.get(1).getName());
478

    
479
        ReverseComparator<TaxonBase<?>> reverseComparator = new ReverseComparator<>(comparator);
480
        Collections.sort(list, reverseComparator);
481
        Assert.assertEquals("Hybrid should come before non-hybrid in reverse order", botName2, list.get(0).getName());
482
        Assert.assertEquals("Hybrid should come before non-hybrid in reverse order", botName3, list.get(1).getName());
483
    }
484
}
(1-1/4)