Project

General

Profile

« Previous | Next » 

Revision 724c27d8

Added by Andreas Müller about 8 years ago

Improve sort order within a homotypic group (new Comparator) #3338

View differences:

cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/taxon/HomotypicGroupTaxonComparatorTest.java
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 synonym1;
59
    private Synonym synonym2;
60
    private Synonym synonym3;
61

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

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

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

  
85
        ref1.setDatePublished(TimePeriod.NewInstance(cal1));
86
        ref2.setDatePublished(TimePeriod.NewInstance(cal2));
87
        ref3.setDatePublished(TimePeriod.NewInstance(cal3));
88

  
89
        botName1 =  BotanicalName.NewInstance(Rank.SPECIES());
90
        botName2 =  BotanicalName.NewInstance(Rank.SPECIES());
91
        botName3 =  BotanicalName.NewInstance(Rank.SPECIES());
92
        botName4 =  BotanicalName.NewInstance(Rank.SPECIES());
93
        botName5 =  BotanicalName.NewInstance(Rank.SPECIES());
94

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

  
101
//        zooName1.setPublicationYear(1823);
102

  
103
        list = new ArrayList<TaxonBase<?>>();
104

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

  
107

  
108
    }
109

  
110

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

  
120

  
121
/******************** TESTS *****************************************************/
122

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

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

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

  
136

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

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

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

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

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

  
165

  
166
    }
167

  
168
    @Test
169
    public void testCompare_BasionymGroupsSeparated() {
170

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

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

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

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

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

  
189

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

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

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

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

  
210
    @Test
211
    public void testCompare_BasionymGroupsSomeWithYears() {
212

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

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

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

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

  
229

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

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

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

  
249
    @Test
250
    public void testCompare_NoCircularProblems() {
251

  
252
        taxon1.addHomotypicSynonymName(botName3, null, null);
253
        taxon1.addHomotypicSynonymName(botName5, null, null);
254
        botName3.addBasionym(botName5);
255

  
256
//        taxon1.addHomotypicSynonymName(botName2, null, null);
257
//        taxon1.addHomotypicSynonymName(botName4, null, null);
258
//        botName2.addBasionym(botName4);
259

  
260
        Assert.assertEquals(botName1.getHomotypicalGroup(), botName5.getHomotypicalGroup());
261
        botName5.addBasionym(botName1);
262
        botName1.addBasionym(botName3);
263

  
264
        Collections.sort(list, new HomotypicGroupTaxonComparator(null));
265

  
266
    }
267

  
268
}

Also available in: Unified diff