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.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  //failing selenium test
384
    public void testCompare_NomIllegWithDate() {
385
        NomenclaturalStatus illegStatus = NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ILLEGITIMATE());
386
        botName3.addStatus(illegStatus);
387
        botName3.setNomenclaturalReference(ref1);
388
        botName2.setNomenclaturalReference(ref2);
389

    
390
        taxon1.addHomotypicSynonymName(botName3, null, null);
391
        taxon1.addHomotypicSynonymName(botName2, null, null);
392

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

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

    
399
    }
400

    
401
    @Test
402
    public void testCompare_NoCircularProblemsWithBasionyms() {
403

    
404
        taxon1.addHomotypicSynonymName(botName3, null, null);
405
        taxon1.addHomotypicSynonymName(botName5, null, null);
406
        botName3.addBasionym(botName5);
407

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

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

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

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

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

    
434
    }
435

    
436
    @Test
437
    public void testCompare_NoCircularProblemsWithReplacedSynonyms() {
438

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

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

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

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

    
455

    
456
    }
457

    
458
}
(2-2/7)