Project

General

Profile

Download (18.6 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

    
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.INonViralName;
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.TaxonNameFactory;
33
//import eu.etaxonomy.cdm.model.reference.Book;
34
import eu.etaxonomy.cdm.model.reference.Reference;
35
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
36

    
37
/**
38
 * @author a.mueller
39
 * @created 04.03.2016
40
 */
41
public class HomotypicGroupTaxonComparatorTest {
42
    @SuppressWarnings("unused")
43
    private static final Logger logger = Logger.getLogger(HomotypicGroupTaxonComparatorTest.class);
44

    
45
    private Reference sec;
46
    private Reference ref1;
47
    private Reference ref2;
48
    private Reference ref3;
49
    private Calendar cal1;
50
    private Calendar cal2;
51
    private Calendar cal3;
52
    private BotanicalName botName1;
53
    private BotanicalName botName2;
54
    private BotanicalName botName3;
55
    private BotanicalName botName4;
56
    private BotanicalName botName5;
57

    
58
    private List<TaxonBase<?>> list;
59

    
60
    private Taxon taxon1;
61
    private Synonym synonym2;
62
    private Synonym synonym3;
63

    
64
    @BeforeClass
65
    public static void setUpBeforeClass() {
66
        DefaultTermInitializer vocabularyStore = new DefaultTermInitializer();
67
        vocabularyStore.initialize();
68
    }
69

    
70
    /**
71
     * @throws java.lang.Exception
72
     */
73
    @Before
74
    public void setUp() throws Exception {
75
        sec = ReferenceFactory.newBook();
76

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

    
87
        ref1.setDatePublished(TimePeriod.NewInstance(cal1));
88
        ref2.setDatePublished(TimePeriod.NewInstance(cal2));
89
        ref3.setDatePublished(TimePeriod.NewInstance(cal3));
90

    
91
        botName1 =  TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
92
        botName2 =  TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
93
        botName3 =  TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
94
        botName4 =  TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
95
        botName5 =  TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
96

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

    
103
//        zooName1.setPublicationYear(1823);
104

    
105
        list = new ArrayList<TaxonBase<?>>();
106

    
107
        taxon1 = Taxon.NewInstance(botName1, sec);
108

    
109

    
110
    }
111

    
112
    private void setNameParts(INonViralName name, String genus, String speciesEpi) {
113
        name.setGenusOrUninomial(genus);
114
        name.setSpecificEpithet(speciesEpi);
115
        name.getTitleCache();
116
    }
117

    
118

    
119
/******************** TESTS *****************************************************/
120

    
121
    @Test
122
    public void testCompare_BasionymGroupsTogether() {
123
        //2 basionym groups
124

    
125
        HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
126
        taxon1.addHeterotypicSynonymName(botName3);
127
        taxon1.addHeterotypicSynonymName(botName5, null, null, homotypicalGroup);
128
        botName3.addBasionym(botName5);
129

    
130
        synonym2 = taxon1.addHeterotypicSynonymName(botName2);
131
        taxon1.addHeterotypicSynonymName(botName4, null, null, homotypicalGroup);
132
        botName2.addBasionym(botName4);
133

    
134

    
135
        list.addAll(taxon1.getSynonyms());
136
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
137

    
138
        Assert.assertEquals("basionym for first group should come first", botName4, list.get(0).getName());
139
        Assert.assertEquals(botName2, list.get(1).getName());
140
        Assert.assertEquals(botName5, list.get(2).getName());
141
        Assert.assertEquals(botName3, list.get(3).getName());
142

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

    
153
        //set a name as first name
154
        Collections.sort(list, new HomotypicGroupTaxonComparator(synonym2));
155

    
156
        Assert.assertEquals("name2 should come first now",
157
                            botName2, list.get(0).getName());
158
        Assert.assertEquals("name2 should be followed by its basionym", botName4, list.get(1).getName());
159
        Assert.assertEquals("other basionym group should come later but with basionym first",
160
                            botName5, list.get(2).getName());
161
        Assert.assertEquals(botName3, list.get(3).getName());
162

    
163

    
164
    }
165

    
166
    @Test
167
    public void testCompare_BasionymGroupsSeparated() {
168

    
169
        //2 basionym groups in 2 homotypic groups
170
        synonym3 = taxon1.addHeterotypicSynonymName(botName3);
171
        taxon1.addHeterotypicSynonymName(botName5);
172
        botName3.addBasionym(botName5);  //also merges homotypic groups
173

    
174
        taxon1.addHeterotypicSynonymName(botName2);
175
        taxon1.addHeterotypicSynonymName(botName4);
176
        botName2.addBasionym(botName4);
177

    
178
        list.addAll(taxon1.getSynonyms());
179

    
180
        UUID uuidFirst = UUID.fromString("000000972-d164-4cb5-9a1e-d6216cc858f6");
181
        UUID uuidSecond = UUID.fromString("ffffff972-d164-4cb5-9a1e-d6216cc858f6");
182
        Assert.assertTrue(uuidFirst.toString().compareTo(uuidSecond.toString())<-1);
183

    
184
        botName4.getHomotypicalGroup().setUuid(uuidFirst);
185
        botName5.getHomotypicalGroup().setUuid(uuidSecond);
186

    
187

    
188
        //start test
189
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
190

    
191
        Assert.assertEquals("basionym for first group should come first", botName4, list.get(0).getName());
192
        Assert.assertEquals(botName2, list.get(1).getName());
193
        Assert.assertEquals(botName5, list.get(2).getName());
194
        Assert.assertEquals(botName3, list.get(3).getName());
195

    
196
        //set a name as first name
197
        //TODO
198
        //first taxon in group should have an impact only for the homotypic group to which it belongs
199
        //but this is still under discussion and may change in future
200
        Collections.sort(list, new HomotypicGroupTaxonComparator(synonym3));
201

    
202
        Assert.assertEquals(botName4, list.get(0).getName());
203
        Assert.assertEquals(botName2, list.get(1).getName());
204
        Assert.assertEquals(botName3, list.get(2).getName());
205
        Assert.assertEquals(botName5, list.get(3).getName());
206
    }
207

    
208
    @Test
209
    public void testCompare_BasionymGroupsSomeWithYears() {
210

    
211
        //2 basionym groups, 1 new combination with year (botName2) and 1 basionym with year (botName5)
212
        //The later should come first according to the rules, though alphabetically being
213
        //basionym botName4
214

    
215
        botName2.setNomenclaturalReference(ref2);
216
        botName5.setNomenclaturalReference(ref3);
217

    
218
        HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
219
        taxon1.addHeterotypicSynonymName(botName3);
220
        taxon1.addHeterotypicSynonymName(botName5, null, null, homotypicalGroup);
221
        botName3.addBasionym(botName5);
222

    
223
        synonym2 = taxon1.addHeterotypicSynonymName(botName2);
224
        taxon1.addHeterotypicSynonymName(botName4, null, null, homotypicalGroup);
225
        botName2.addBasionym(botName4);
226

    
227

    
228
        list.addAll(taxon1.getSynonyms());
229
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
230

    
231
        Assert.assertEquals("basionym with date should comes first", botName5, list.get(0).getName());
232
        Assert.assertEquals(botName3, list.get(1).getName());
233
        Assert.assertEquals(botName4, list.get(2).getName());
234
        Assert.assertEquals(botName2, list.get(3).getName());
235

    
236
        //even with nom. illeg. the name with date should come first
237
        NomenclaturalStatus illegStatus = NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ILLEGITIMATE());
238
        botName5.addStatus(illegStatus);
239

    
240
        Assert.assertEquals("basionym with date should comes first", botName5, list.get(0).getName());
241
        Assert.assertEquals(botName3, list.get(1).getName());
242
        Assert.assertEquals(botName4, list.get(2).getName());
243
        Assert.assertEquals(botName2, list.get(3).getName());
244

    
245

    
246
        //add replaced synonym relation between basionyms
247
        botName5.addReplacedSynonym(botName4, null, null, null);
248
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
249
        Assert.assertEquals("basionym of second group should come first now as it is the replaced synonym",
250
                            botName4, list.get(0).getName());
251
        Assert.assertEquals(botName2, list.get(1).getName());
252
        Assert.assertEquals("replacement name should come after replaced synonym but first in basionym group",
253
                            botName5, list.get(2).getName());
254
        Assert.assertEquals(botName3, list.get(3).getName());
255
    }
256

    
257
    @Test
258
    public void testCompare_BasionymGroupsWithRanks1() {
259

    
260
        botName2.setRank(Rank.VARIETY());
261
        botName2.setInfraSpecificEpithet("varbbbb");
262

    
263
        botName3.setRank(Rank.VARIETY());
264
        botName3.setInfraSpecificEpithet("subspccc");
265

    
266
        botName4.setRank(Rank.SUBSPECIES());
267
        botName4.setInfraSpecificEpithet("subspddd");
268

    
269

    
270
        HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
271
        taxon1.addHeterotypicSynonymName(botName3);
272
        taxon1.addHeterotypicSynonymName(botName5, null, null, homotypicalGroup);
273
        botName3.addBasionym(botName5);
274

    
275
        synonym2 = taxon1.addHeterotypicSynonymName(botName2);
276
        taxon1.addHeterotypicSynonymName(botName4, null, null, homotypicalGroup);
277
        botName2.addBasionym(botName4);
278

    
279

    
280
        list.addAll(taxon1.getSynonyms());
281
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
282

    
283
        Assert.assertEquals("basionym with rank species should comes first", botName5, list.get(0).getName());
284
        Assert.assertEquals(botName3, list.get(1).getName());
285
        Assert.assertEquals(botName4, list.get(2).getName());
286
        Assert.assertEquals(botName2, list.get(3).getName());
287

    
288
        //add replaced synonym relation between basionyms
289
        botName5.addReplacedSynonym(botName4, null, null, null);
290
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
291
        Assert.assertEquals("basionym of second group should come first now as it is the replaced synonym",
292
                            botName4, list.get(0).getName());
293
        Assert.assertEquals(botName2, list.get(1).getName());
294
        Assert.assertEquals("replacement name should come after replaced synonym but first in basionym group",
295
                            botName5, list.get(2).getName());
296
        Assert.assertEquals(botName3, list.get(3).getName());
297
    }
298

    
299
    @Test
300
    public void testCompare_BasionymGroupsWithRanks2() {
301

    
302

    
303
        botName2.setRank(Rank.VARIETY());
304
        botName2.setInfraSpecificEpithet("varbbbb");
305

    
306
        botName3.setRank(Rank.VARIETY());
307
        botName3.setInfraSpecificEpithet("subspccc");
308

    
309
        botName4.setRank(Rank.SUBSPECIES());
310
        botName4.setInfraSpecificEpithet("subspddd");
311

    
312
        botName5.setRank(Rank.VARIETY());
313
        botName5.setInfraSpecificEpithet("vareee");
314

    
315

    
316
        HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
317
        taxon1.addHeterotypicSynonymName(botName3);
318
        taxon1.addHeterotypicSynonymName(botName5, null, null, homotypicalGroup);
319
        botName3.addBasionym(botName5);
320

    
321
        synonym2 = taxon1.addHeterotypicSynonymName(botName2);
322
        taxon1.addHeterotypicSynonymName(botName4, null, null, homotypicalGroup);
323
        botName2.addBasionym(botName5);
324
        botName4.addBasionym(botName5);
325

    
326

    
327
        list.addAll(taxon1.getSynonyms());
328
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
329

    
330
        Assert.assertEquals("basionym should comes first", botName5, list.get(0).getName());
331
        Assert.assertEquals("subspecies should come next", botName4, list.get(1).getName());
332
        Assert.assertEquals("variety with b should come next", botName2, list.get(2).getName());
333
        Assert.assertEquals("variety with c should come last", botName3, list.get(3).getName());
334

    
335
    }
336

    
337
    @Test
338
    public void testCompare_BasionymGroupsWithNomIlleg() {
339
        NomenclaturalStatus illegStatus = NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ILLEGITIMATE());
340
        botName4.addStatus(illegStatus);
341

    
342
        //2 basionym groups
343

    
344
        HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
345
        taxon1.addHeterotypicSynonymName(botName3);
346
        taxon1.addHeterotypicSynonymName(botName5, null, null, homotypicalGroup);
347
        botName3.addBasionym(botName5);
348

    
349
        synonym2 = taxon1.addHeterotypicSynonymName(botName2);
350
        taxon1.addHeterotypicSynonymName(botName4, null, null, homotypicalGroup);
351
//        botName2.addBasionym(botName4);
352

    
353

    
354
        list.addAll(taxon1.getSynonyms());
355
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
356

    
357
        Assert.assertEquals("basionym for non nom. illeg. group should come first", botName2, list.get(0).getName());
358
        Assert.assertEquals(botName5, list.get(1).getName());
359
        Assert.assertEquals(botName3, list.get(2).getName());
360
        Assert.assertEquals("Nom illeg should come last", botName4, list.get(3).getName());
361

    
362
        //name having a nom. illeg. as basionym should stay in its basionym group
363
        //NOTE: this is dirty data as nom. illeg. is not allowed as basionym by the code
364
        botName2.addBasionym(botName4);
365
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
366

    
367
        Assert.assertEquals("basionym for non nom. illeg. group should come first", botName5, list.get(0).getName());
368
        Assert.assertEquals(botName3, list.get(1).getName());
369
        Assert.assertEquals("Nom illeg basionym group should come last", botName4, list.get(2).getName());
370
        Assert.assertEquals("Names with nom. illeg. as basionym should stay in basionym group", botName2, list.get(3).getName());
371

    
372
        //non basionym nom. illeg. should not change the order
373
        botName4.removeStatus(illegStatus);
374
        botName2.addStatus(illegStatus);
375
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
376

    
377
        Assert.assertEquals("basionym for non nom. illeg. group should come first", botName4, list.get(0).getName());
378
        Assert.assertEquals(botName2, list.get(1).getName());
379
        Assert.assertEquals("Nom illeg basionym group should come last", botName5, list.get(2).getName());
380
        Assert.assertEquals("Names with nom. illeg. as basionym should stay in basionym group", botName3, list.get(3).getName());
381

    
382
    }
383

    
384
    @Test  //failing selenium test
385
    public void testCompare_NomIllegWithDate() {
386
        NomenclaturalStatus illegStatus = NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ILLEGITIMATE());
387
        botName3.addStatus(illegStatus);
388
        botName3.setNomenclaturalReference(ref1);
389
        botName2.setNomenclaturalReference(ref2);
390

    
391
        taxon1.addHomotypicSynonymName(botName3);
392
        taxon1.addHomotypicSynonymName(botName2);
393

    
394
        list.addAll(taxon1.getSynonyms());
395
        Collections.sort(list, new HomotypicGroupTaxonComparator(taxon1));
396

    
397
        Assert.assertEquals("Earlier nom. illeg. should come next", botName3, list.get(0).getName());
398
        Assert.assertEquals("Later name should come last", botName2, list.get(1).getName());
399

    
400
    }
401

    
402
    @Test
403
    public void testCompare_NoCircularProblemsWithBasionyms() {
404

    
405
        taxon1.addHomotypicSynonymName(botName3);
406
        taxon1.addHomotypicSynonymName(botName5);
407
        botName3.addBasionym(botName5);
408

    
409
        Assert.assertEquals(botName1.getHomotypicalGroup(), botName5.getHomotypicalGroup());
410
        botName5.addBasionym(botName1);
411
        botName1.addBasionym(botName3);
412

    
413
        list.addAll(taxon1.getSynonyms());
414
        list.add(taxon1);
415
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
416

    
417
        Assert.assertEquals(botName1, list.get(0).getName());
418
        Assert.assertEquals(botName3, list.get(1).getName());
419
        Assert.assertEquals(botName5, list.get(2).getName());
420

    
421
        //additional basionym for botName3
422
        taxon1.addHomotypicSynonymName(botName2);
423
        Assert.assertEquals(botName1.getHomotypicalGroup(), botName2.getHomotypicalGroup());
424
        botName3.addBasionym(botName2);
425
        list.clear();
426
        list.addAll(taxon1.getSynonyms());
427
        list.add(taxon1);
428
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
429

    
430
        Assert.assertEquals(botName1, list.get(0).getName());
431
        Assert.assertEquals(botName2, list.get(1).getName());
432
        Assert.assertEquals(botName3, list.get(2).getName());
433
        Assert.assertEquals(botName5, list.get(3).getName());
434

    
435
    }
436

    
437
    @Test
438
    public void testCompare_NoCircularProblemsWithReplacedSynonyms() {
439

    
440
        taxon1.addHomotypicSynonymName(botName3);
441
        taxon1.addHomotypicSynonymName(botName5);
442
        botName3.addReplacedSynonym(botName5, null, null, null);
443

    
444
        Assert.assertEquals(botName1.getHomotypicalGroup(), botName5.getHomotypicalGroup());
445
        botName5.addReplacedSynonym(botName1, null, null, null);
446
        botName1.addReplacedSynonym(botName3, null, null, null);
447

    
448
        list.addAll(taxon1.getSynonyms());
449
        list.add(taxon1);
450
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
451

    
452
        Assert.assertEquals(botName1, list.get(0).getName());
453
        Assert.assertEquals(botName3, list.get(1).getName());
454
        Assert.assertEquals(botName5, list.get(2).getName());
455

    
456

    
457
    }
458

    
459
}
(2-2/7)