Project

General

Profile

Download (16.5 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.api.service;
10

    
11
import static org.junit.Assert.assertFalse;
12
import static org.junit.Assert.assertNull;
13
import static org.junit.Assert.assertTrue;
14

    
15
import java.io.FileNotFoundException;
16
import java.util.HashSet;
17
import java.util.List;
18
import java.util.Set;
19
import java.util.UUID;
20

    
21
import org.junit.Assert;
22
import org.junit.Before;
23
import org.junit.Test;
24
import org.unitils.dbunit.annotation.DataSet;
25
import org.unitils.spring.annotation.SpringBeanByType;
26

    
27
import eu.etaxonomy.cdm.api.service.exception.HomotypicalGroupChangeException;
28
import eu.etaxonomy.cdm.model.metadata.SecReferenceHandlingEnum;
29
import eu.etaxonomy.cdm.model.metadata.SecReferenceHandlingSwapEnum;
30
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
31
import eu.etaxonomy.cdm.model.name.INonViralName;
32
import eu.etaxonomy.cdm.model.name.TaxonName;
33
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
34
import eu.etaxonomy.cdm.model.reference.Reference;
35
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
36
import eu.etaxonomy.cdm.model.taxon.Synonym;
37
import eu.etaxonomy.cdm.model.taxon.SynonymType;
38
import eu.etaxonomy.cdm.model.taxon.Taxon;
39
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
40
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
41
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
42
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
43

    
44
/**
45
 * This test checks of all the business logic methods do what they are expected to do.
46
 *
47
 * @author n.hoffmann
48
 * @since Dec 16, 2010
49
 */
50
public class TaxonServiceImplBusinessTest extends CdmTransactionalIntegrationTest {
51

    
52
    @SpringBeanByType
53
    private ITaxonService service;
54

    
55
    @SpringBeanByType
56
    private INameService nameService;
57

    
58
	private Synonym s1;
59
	private Synonym s2;
60
	private Taxon t2;
61
	private Taxon t1;
62
	private String referenceDetail;
63
	private Reference reference;
64
	private SynonymType homoTypicSynonymType;
65
	private SynonymType heteroTypicSynonymType;
66
	private INonViralName s1n;
67
	private INonViralName t2n;
68
	private INonViralName t1n;
69
	private TaxonName s2n;
70

    
71
	@Before
72
	public void setUp() throws Exception {
73
		//service = new TaxonServiceImpl();
74
		//nameService = new NameServiceImpl();
75

    
76
		t1n = TaxonNameFactory.NewNonViralInstance(null);
77
		t1 = Taxon.NewInstance(t1n, reference);
78

    
79
		t2n = TaxonNameFactory.NewNonViralInstance(null);
80
		t2 = Taxon.NewInstance(t2n, reference);
81

    
82
		s1n = TaxonNameFactory.NewNonViralInstance(null);
83
		s1 = Synonym.NewInstance(s1n, reference);
84

    
85
		s2n = TaxonNameFactory.NewNonViralInstance(null);
86
		s2 = Synonym.NewInstance(s2n, reference);
87

    
88
		// referencing
89
		homoTypicSynonymType = SynonymType.HOMOTYPIC_SYNONYM_OF();
90
		heteroTypicSynonymType = SynonymType.HETEROTYPIC_SYNONYM_OF();
91
		reference = ReferenceFactory.newGeneric();
92
		referenceDetail = "test";
93
	}
94

    
95
	/**
96
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#swapSynonymAndAcceptedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon)}.
97
	 */
98
	@Test
99
	public final void testSwapSynonymAndAcceptedTaxon() {
100
		t1.addSynonym(s1, homoTypicSynonymType);
101

    
102
		UpdateResult result = service.swapSynonymAndAcceptedTaxon(s1, t1, true, false, SecReferenceHandlingSwapEnum.KeepOrWarn, null, null);
103
		Synonym syn = (Synonym)service.load(s1.getUuid());
104
		//only the name has changed
105
		Assert.assertNotNull(syn);
106
		TaxonName name = nameService.load(s1n.getUuid());
107
		Assert.assertNotNull(name);
108

    
109
		//The name of the new accepted taxon should be the same as from the former synonym
110
		Assert.assertEquals(((Taxon)result.getCdmEntity()).getName(), name);
111
	}
112

    
113
	/**
114
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#changeSynonymToAcceptedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon)}.
115
	 */
116
	@Test
117
	public final void testChangeSynonymToAcceptedTaxon() {
118

    
119
		t1.addSynonym(s1, homoTypicSynonymType);
120
		HomotypicalGroup oldGroup = s1.getName().getHomotypicalGroup();
121
		Assert.assertEquals("Homotypical group of new accepted taxon should contain exactly 2 names", 2, oldGroup.getTypifiedNames().size());
122
		boolean deleteSynonym = false;
123
		Taxon taxon = null;
124

    
125
		UpdateResult result;
126
        try {
127
            result = service.changeSynonymToAcceptedTaxon(s1, t1, null, null, null,deleteSynonym);
128
            Assert.assertTrue("Change must fail for synonym and taxon in same homotypical group",result.isAbort());
129
        } catch (HomotypicalGroupChangeException e1) {
130
            // TODO Auto-generated catch block
131
            e1.printStackTrace();
132
        }
133

    
134

    
135
		t1.addSynonym(s2, heteroTypicSynonymType);
136
		Assert.assertEquals("Homotypical group of old accepted taxon should still contain exactly 2 names", 2, oldGroup.getTypifiedNames().size());
137
		Assert.assertTrue("Old accepted taxon should now have 2 synonyms", t1.getSynonyms().size() == 2);
138
		try {
139
			taxon = (Taxon)service.changeSynonymToAcceptedTaxon(s2, t1, null, null, null,deleteSynonym).getCdmEntity();
140
		} catch (HomotypicalGroupChangeException e) {
141
			Assert.fail("Change must not throw exception for heterotypic synonym change");
142
		}
143

    
144
		Assert.assertTrue("Former accepted taxon should still have 1 synonym", t1.getSynonyms().size() == 1);
145
		Assert.assertNotNull(taxon);
146
		Assert.assertEquals(s2n, taxon.getName());
147
		HomotypicalGroup newGroup = taxon.getName().getHomotypicalGroup();
148
		Assert.assertEquals("Homotypical group of new accepted taxon should contain exactly one name", 1, newGroup.getTypifiedNames().size());
149
	}
150

    
151
	/**
152
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#changeSynonymToAcceptedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon)}.
153
	 */
154
	@Test
155
	public final void testChangeSynonymWithMultipleSynonymsInHomotypicalGroupToAcceptedTaxon() {
156
		t1.addSynonym(s1, heteroTypicSynonymType);
157
		TaxonName otherHeteroSynonymName = TaxonNameFactory.NewNonViralInstance(null);
158
		t1.addHeterotypicSynonymName(otherHeteroSynonymName);
159
		TaxonName homotypicSynonymName = TaxonNameFactory.NewNonViralInstance(null);
160
		Synonym homotypicSynonym = Synonym.NewInstance(homotypicSynonymName, t1.getSec());
161
		t1.addHomotypicSynonym(homotypicSynonym);
162

    
163
		HomotypicalGroup group = s1.getHomotypicGroup();
164
		Reference citation1 = ReferenceFactory.newBook();
165
		String microReference1 = "p. 55";
166
		Synonym s2 = t1.addHeterotypicSynonymName(s2n, citation1, microReference1, group);
167
		HomotypicalGroup homoGroup2 = s1.getHomotypicGroup();
168
		Assert.assertEquals("Homotypical group must be the same group as for the old synonym", group, homoGroup2);
169

    
170
		//run
171
		Taxon newTaxon = null;
172
		try {
173
			newTaxon = (Taxon)service.changeSynonymToAcceptedTaxon(s1, t1, null, null, SecReferenceHandlingEnum.KeepOrWarn, false).getCdmEntity();
174
		} catch (HomotypicalGroupChangeException e1) {
175
			Assert.fail("Invocation of change method should not throw an exception");
176
		}
177

    
178
		Assert.assertEquals("Former accepted taxon should now have 2 synonyms left", 2, t1.getSynonyms().size());
179
		Assert.assertEquals("Former accepted taxon should now have 1 heterotypic synonym group left", 1, t1.getHeterotypicSynonymyGroups().size());
180
		Assert.assertNotNull(newTaxon);
181
		Assert.assertEquals(s1n, newTaxon.getName());
182
		Assert.assertEquals("New accepted taxon should have 1 synonym", 1, newTaxon.getSynonyms().size());
183
		Assert.assertEquals("The new synonym must be the homotypic synonym of the old synonym", s2, newTaxon.getSynonyms().iterator().next());
184
		HomotypicalGroup homoGroup = newTaxon.getHomotypicGroup();
185
		Assert.assertEquals("Homotypical group must be the same group as for the old synonym", group, homoGroup);
186

    
187
		List<Synonym> synonymsInNewTaxonsGroup = newTaxon.getSynonymsInGroup(homoGroup);
188
		String message = "New accepted taxon should have 1 synonym in its homotypic group: s2. The old synonym may still exist (or not) but not as a synonym of the new taxon";
189
		Assert.assertEquals(message, 1, synonymsInNewTaxonsGroup.size());
190
		Assert.assertTrue("The old synonym's homotypic 'partner' must be a synonym of the new accepted taxon, too.", synonymsInNewTaxonsGroup.contains(s2));
191
		Assert.assertTrue("The old synonym must be in the new accepted taxons homotypic group as it has not been deleted ", newTaxon.getName().getHomotypicalGroup().equals(s2.getName().getHomotypicalGroup()));
192

    
193
		boolean iWasHere = false;
194
		for (Synonym syn : synonymsInNewTaxonsGroup){
195
			if (syn.equals(s2) ){
196
				Assert.assertEquals("s2 relationship needs to have the same citation as the former relation to the given accepted taxon.", citation1, s2.getSec());
197
				iWasHere = true;
198
			}
199
		}
200
		Assert.assertTrue("Relationship to s2 must have been concidered in 'for'-loop", iWasHere);
201

    
202
		try {
203
			UpdateResult result = service.changeSynonymToAcceptedTaxon(homotypicSynonym, t1, null, null, null,false);
204

    
205
			Assert.assertTrue("The method should throw an exception when invoked on taxa in the same homotypical group", !result.getExceptions().isEmpty());
206
		} catch (HomotypicalGroupChangeException e) {
207
			//OK
208
		}
209

    
210
//		Assert.assertNull("Synonym should not be used in a name anymore", s1.getName());
211
	}
212

    
213
	@Test
214
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="../../database/ClearDBDataSet.xml")
215
	public final void testChangeSynonymToRelatedTaxon() {
216
		t1.addSynonym(s1, homoTypicSynonymType);
217
		t1.addSynonym(s2, homoTypicSynonymType);
218
		Set<TaxonBase> newInstances = new HashSet<>();
219
		newInstances.add(s1);
220
		newInstances.add(t1);
221
		newInstances.add(t2);
222
		service.save(newInstances);
223
		TaxonName synonymName = s1.getName();
224
		UUID synNameUUID = synonymName.getUuid();
225

    
226
		Taxon newTaxon = (Taxon) service.changeSynonymToRelatedTaxon(s1, t2, TaxonRelationshipType.CONGRUENT_OR_EXCLUDES(), reference, referenceDetail).getCdmEntity();
227
		//check removeTaxonBase()
228
		//UUID s1UUID = service.update(s1);
229
		UUID newTaxonUUID = service.save(newTaxon).getUuid();
230

    
231
		s1 =(Synonym)service.find(s1.getUuid());
232
		newTaxon = (Taxon)service.find(newTaxonUUID);
233
		assertNull(s1);
234
		synonymName = nameService.find(synNameUUID);
235
		assertFalse(synonymName.getTaxonBases().contains(s1));
236
		assertTrue(synonymName.getTaxonBases().contains(newTaxon));
237

    
238
		synonymName = s2.getName();
239
        newTaxon = (Taxon)service.changeSynonymToRelatedTaxon(s2, t1, TaxonRelationshipType.MISAPPLIED_NAME_FOR(), reference, referenceDetail).getCdmEntity();
240
        //check removeTaxonBase()
241
        //UUID s1UUID = service.update(s1);
242
        newTaxonUUID = service.save(newTaxon).getUuid();
243

    
244
        s2 =(Synonym)service.find(s2.getUuid());
245
        newTaxon = (Taxon)service.find(newTaxonUUID);
246
        assertNull(s2);
247

    
248
        assertFalse(synonymName.getTaxonBases().contains(s2));
249
        assertTrue(synonymName.getTaxonBases().contains(newTaxon));
250
	}
251

    
252
	@Test
253
	public void changeHomotypicalGroupOfSynonym(){
254

    
255
		//s1 - Heterotypic
256
		t1.addSynonym(s1, heteroTypicSynonymType);
257

    
258
		//s2 - heterotypic
259
		TaxonName otherHeteroSynonymName = TaxonNameFactory.NewNonViralInstance(null);
260
		Synonym s2 = Synonym.NewInstance(otherHeteroSynonymName, t1.getSec());
261
		t1.addSynonym(s2, heteroTypicSynonymType);
262
		TaxonName otherHeteroSynonymNameB = TaxonNameFactory.NewNonViralInstance(null);
263
		otherHeteroSynonymName.addBasionym(otherHeteroSynonymNameB);
264
		Synonym s2b = Synonym.NewInstance(otherHeteroSynonymNameB, t1.getSec());
265
		t1.addSynonym(s2b, heteroTypicSynonymType);
266

    
267
		//homotypic
268
		TaxonName homotypicSynonymName = TaxonNameFactory.NewNonViralInstance(null);
269
		Synonym homotypicSynonym = Synonym.NewInstance(homotypicSynonymName, t1.getSec());
270
		t1.addHomotypicSynonym(homotypicSynonym);
271
		t1.getName().addBasionym(homotypicSynonymName);
272

    
273
		//Preconditions test
274
		Assert.assertFalse("s2 must not be in s1 homotypic group", s2.getHomotypicGroup().equals(s1.getHomotypicGroup()));
275
		Assert.assertFalse("s2 must not be in t1 homotypic group", s2.getHomotypicGroup().equals(t1.getHomotypicGroup()));
276
		Assert.assertNotNull("s2 must have exactly 1 synonym relationship/ must have accepted taxon", s2.getAcceptedTaxon());
277
		Assert.assertEquals("s2 must have heterotypic relationship type", heteroTypicSynonymType, s2.getType());
278
		Assert.assertEquals("s2 must have exactly 1 basionym relationships", 1, s2.getName().getBasionyms().size());
279

    
280
		//do it
281
		service.changeHomotypicalGroupOfSynonym(s2, s1.getHomotypicGroup(), t1, true);
282

    
283
		//postconditions
284
		Assert.assertEquals("s2 must be in s1 homotypic group", s2.getHomotypicGroup(), s1.getHomotypicGroup());
285
		Assert.assertNotNull("s2 must have exactly 1 synonym relationship/accepted taxon", s2.getAcceptedTaxon());
286
		Assert.assertEquals("s2 must have heterotypic relationship", heteroTypicSynonymType, s2.getType());
287
		Assert.assertEquals("s2 must have exactly 0 basionym relationships", 0, s2.getName().getBasionyms().size());
288

    
289

    
290
		//Preconditions test
291
		Assert.assertEquals("'homotypicSynonym' must have exactly 1 basionym relationships", 1, homotypicSynonym.getName().getNameRelations().size());
292
		Assert.assertEquals("'t1' must have exactly 1 basionym relationships", 1, t1.getName().getBasionyms().size());
293
		Assert.assertFalse("s2 must not be in t1 homotypic group", s2.getHomotypicGroup().equals(t1.getHomotypicGroup()));
294

    
295
		//do it
296
		service.changeHomotypicalGroupOfSynonym(s2, homotypicSynonym.getHomotypicGroup(), null, true);
297

    
298
		//postconditions
299
		Assert.assertEquals("s2 must be in 'homotypicSynonym' homotypic group", s2.getHomotypicGroup(), homotypicSynonym.getHomotypicGroup());
300
		Assert.assertEquals("s2 must be in 't1' homotypic group", s2.getHomotypicGroup(), t1.getHomotypicGroup());
301
		Assert.assertNotNull("s2 must have exactly 1 synonym relationship/accepted taxon", s2.getAcceptedTaxon());
302
		Assert.assertEquals("s2 must have homotypic relationship", this.homoTypicSynonymType, s2.getType());
303
		Assert.assertEquals("s2 must have exactly 1 basionym relationships", 1, s2.getName().getBasionyms().size());
304
		Assert.assertEquals("'homotypicSynonym' must have exactly 2 basionym relationships", 2, homotypicSynonym.getName().getNameRelations().size());
305
		Assert.assertEquals("'t1' must have exactly 1 basionym relationships", 1, t1.getName().getBasionyms().size());
306
		Assert.assertEquals("'t1' must have exactly 2 homotypic synonyms", 2, t1.getHomotypicSynonymsByHomotypicSynonymType().size());
307
		Assert.assertEquals("'t1' must have exactly 2 names in homotypic group", 2, t1.getHomotypicSynonymsByHomotypicGroup(null).size());
308
		Assert.assertEquals("'t1' homotypic group must include 3 names (t1, s2, homotypicSynonym)", 3, t1.getHomotypicGroup().getTypifiedNames().size());
309

    
310
		//do it
311
		service.changeHomotypicalGroupOfSynonym(s2, t2.getHomotypicGroup(), t2, false);
312

    
313
		//postconditions
314
		Assert.assertEquals("s2 must be in 't2' homotypic group", t2.getHomotypicGroup(), s2.getHomotypicGroup());
315
		Assert.assertFalse("s2 must not be in 't1' homotypic group", s2.getHomotypicGroup().equals(t1.getHomotypicGroup()));
316
		Assert.assertNotNull("s2 must have exactly 1 synonym relationship/accepted taxon", s2.getAcceptedTaxon());
317
		Assert.assertEquals("s2 must have homotypic relationship", this.homoTypicSynonymType, s2.getType());
318
		Assert.assertEquals("s2 must have exactly 0 basionym relationships", 0, s2.getName().getBasionyms().size());
319
		Assert.assertEquals("'homotypicSynonym' must have exactly 1 basionym relationships", 1, homotypicSynonym.getName().getNameRelations().size());
320
		Assert.assertEquals("'t1' must have exactly 1 basionym relationships", 1, t1.getName().getBasionyms().size());
321
		Assert.assertEquals("'t1' must have exactly 1 homotypic synonyms", 1, t1.getHomotypicSynonymsByHomotypicSynonymType().size());
322
		Assert.assertEquals("'t1' must have exactly 1 names in homotypic group", 1, t1.getHomotypicSynonymsByHomotypicGroup().size());
323
		Assert.assertEquals("'t1' homotypic group must include 2 names (t1, homotypicSynonym)", 2, t1.getHomotypicGroup().getTypifiedNames().size());
324

    
325
		//do it
326
		service.changeHomotypicalGroupOfSynonym(s2, s1.getHomotypicGroup(), t1, false);
327

    
328
		//postconditions
329
		Assert.assertEquals("s2 must be in s1 homotypic group", s2.getHomotypicGroup(), s1.getHomotypicGroup());
330
		Assert.assertFalse("s2 must not be in 't2' homotypic group", t2.getHomotypicGroup().equals(s2.getHomotypicGroup()));
331
		//had 2 accepted taxa when synonym relationships still existed
332
		Assert.assertNotNull("s2 must have accepted taxon", s2.getAcceptedTaxon());
333
		Assert.assertEquals("Both relationships of s2 must be heterotypic", heteroTypicSynonymType, s2.getType());
334
		Assert.assertEquals("s2 must have exactly 0 basionym relationships", 0, s2.getName().getBasionyms().size());
335

    
336
	}
337

    
338
    @Override
339
    public void createTestDataSet() throws FileNotFoundException {}
340
}
(29-29/37)