Project

General

Profile

Download (13.3 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.NonViralName;
29
import eu.etaxonomy.cdm.model.name.Rank;
30
//import eu.etaxonomy.cdm.model.reference.Book;
31
import eu.etaxonomy.cdm.model.reference.Reference;
32
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
33

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

    
42
    private Reference<?> sec;
43
    private Reference<?> ref1;
44
    private Reference<?> ref2;
45
    private Reference<?> ref3;
46
    private Calendar cal1;
47
    private Calendar cal2;
48
    private Calendar cal3;
49
    private BotanicalName botName1;
50
    private BotanicalName botName2;
51
    private BotanicalName botName3;
52
    private BotanicalName botName4;
53
    private BotanicalName botName5;
54

    
55
    private List<TaxonBase<?>> list;
56

    
57
    private Taxon taxon1;
58
    private Synonym synonym2;
59
    private Synonym synonym3;
60

    
61
    @BeforeClass
62
    public static void setUpBeforeClass() {
63
        DefaultTermInitializer vocabularyStore = new DefaultTermInitializer();
64
        vocabularyStore.initialize();
65
    }
66

    
67
    /**
68
     * @throws java.lang.Exception
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(TimePeriod.NewInstance(cal1));
85
        ref2.setDatePublished(TimePeriod.NewInstance(cal2));
86
        ref3.setDatePublished(TimePeriod.NewInstance(cal3));
87

    
88
        botName1 =  BotanicalName.NewInstance(Rank.SPECIES());
89
        botName2 =  BotanicalName.NewInstance(Rank.SPECIES());
90
        botName3 =  BotanicalName.NewInstance(Rank.SPECIES());
91
        botName4 =  BotanicalName.NewInstance(Rank.SPECIES());
92
        botName5 =  BotanicalName.NewInstance(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<TaxonBase<?>>();
103

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

    
106

    
107
    }
108

    
109

    
110
    /**
111
     *
112
     */
113
    private void setNameParts(NonViralName<?> name, String genus, String speciesEpi) {
114
        name.setGenusOrUninomial(genus);
115
        name.setSpecificEpithet(speciesEpi);
116
        name.getTitleCache();
117
    }
118

    
119

    
120
/******************** TESTS *****************************************************/
121

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

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

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

    
135

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

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

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

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

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

    
164

    
165
    }
166

    
167
    @Test
168
    public void testCompare_BasionymGroupsSeparated() {
169

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

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

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

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

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

    
188

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

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

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

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

    
209
    @Test
210
    public void testCompare_BasionymGroupsSomeWithYears() {
211

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

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

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

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

    
228

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

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

    
237
        //add replaced synonym relation between basionyms
238
        botName5.addReplacedSynonym(botName4, null, null, null);
239
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
240
        Assert.assertEquals("basionym of second group should come first now as it is the replaced synonym",
241
                            botName4, list.get(0).getName());
242
        Assert.assertEquals(botName2, list.get(1).getName());
243
        Assert.assertEquals("replacement name should come after replaced synonym but first in basionym group",
244
                            botName5, list.get(2).getName());
245
        Assert.assertEquals(botName3, list.get(3).getName());
246
    }
247

    
248
    @Test
249
    public void testCompare_BasionymGroupsWithRanks1() {
250

    
251
        botName2.setRank(Rank.VARIETY());
252
        botName2.setInfraSpecificEpithet("varbbbb");
253

    
254
        botName3.setRank(Rank.VARIETY());
255
        botName3.setInfraSpecificEpithet("subspccc");
256

    
257
        botName4.setRank(Rank.SUBSPECIES());
258
        botName4.setInfraSpecificEpithet("subspddd");
259

    
260

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

    
266
        synonym2 = taxon1.addHeterotypicSynonymName(botName2).getSynonym();
267
        taxon1.addHeterotypicSynonymName(botName4, homotypicalGroup, null, null);
268
        botName2.addBasionym(botName4);
269

    
270

    
271
        list.addAll(taxon1.getSynonyms());
272
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
273

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

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

    
290
    @Test
291
    public void testCompare_BasionymGroupsWithRanks2() {
292

    
293

    
294
        botName2.setRank(Rank.VARIETY());
295
        botName2.setInfraSpecificEpithet("varbbbb");
296

    
297
        botName3.setRank(Rank.VARIETY());
298
        botName3.setInfraSpecificEpithet("subspccc");
299

    
300
        botName4.setRank(Rank.SUBSPECIES());
301
        botName4.setInfraSpecificEpithet("subspddd");
302

    
303
        botName5.setRank(Rank.VARIETY());
304
        botName5.setInfraSpecificEpithet("vareee");
305

    
306

    
307
        HomotypicalGroup homotypicalGroup = botName2.getHomotypicalGroup();
308
        taxon1.addHeterotypicSynonymName(botName3);
309
        taxon1.addHeterotypicSynonymName(botName5, homotypicalGroup, null, null);
310
        botName3.addBasionym(botName5);
311

    
312
        synonym2 = taxon1.addHeterotypicSynonymName(botName2).getSynonym();
313
        taxon1.addHeterotypicSynonymName(botName4, homotypicalGroup, null, null);
314
        botName2.addBasionym(botName5);
315
        botName4.addBasionym(botName5);
316

    
317

    
318
        list.addAll(taxon1.getSynonyms());
319
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
320

    
321
        Assert.assertEquals("basionym should comes first", botName5, list.get(0).getName());
322
        Assert.assertEquals("subspecies should come next", botName4, list.get(1).getName());
323
        Assert.assertEquals("variety with b should come next", botName2, list.get(2).getName());
324
        Assert.assertEquals("variety with c should come last", botName3, list.get(3).getName());
325

    
326
    }
327

    
328
    @Test
329
    public void testCompare_NoCircularProblems() {
330

    
331
        taxon1.addHomotypicSynonymName(botName3, null, null);
332
        taxon1.addHomotypicSynonymName(botName5, null, null);
333
        botName3.addBasionym(botName5);
334

    
335
//        taxon1.addHomotypicSynonymName(botName2, null, null);
336
//        taxon1.addHomotypicSynonymName(botName4, null, null);
337
//        botName2.addBasionym(botName4);
338

    
339
        Assert.assertEquals(botName1.getHomotypicalGroup(), botName5.getHomotypicalGroup());
340
        botName5.addBasionym(botName1);
341
        botName1.addBasionym(botName3);
342

    
343
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
344

    
345
    }
346

    
347
}
(2-2/7)