Project

General

Profile

Download (16.2 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.api.service;
11

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

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

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

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

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

    
49
	private Synonym s1;
50
	private Synonym s2;
51
	private Taxon t2;
52
	private Taxon t1;
53
	@SpringBeanByType
54
	private ITaxonService service;
55

    
56
	@SpringBeanByType
57
	private INameService nameService;
58
	private String referenceDetail;
59
	private Reference reference;
60
	private SynonymType homoTypicSynonymType;
61
	private SynonymType heteroTypicSynonymType;
62
	private INonViralName s1n;
63
	private INonViralName t2n;
64
	private INonViralName t1n;
65
	private TaxonName s2n;
66

    
67
	/**
68
	 * @throws java.lang.Exception
69
	 */
70
	@Before
71
	public void setUp() throws Exception {
72
		//service = new TaxonServiceImpl();
73
		//nameService = new NameServiceImpl();
74

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

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

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

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

    
87
		// referencing
88
		homoTypicSynonymType = SynonymType.HOMOTYPIC_SYNONYM_OF();
89
		heteroTypicSynonymType = SynonymType.HETEROTYPIC_SYNONYM_OF();
90
		reference = ReferenceFactory.newGeneric();
91
		referenceDetail = "test";
92
	}
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);
103
		Synonym syn = (Synonym)service.load(s1.getUuid());
104
		Assert.assertNull(syn);
105
		TaxonName name = nameService.load(s1n.getUuid());
106
		Assert.assertNotNull(name);
107

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

    
111

    
112

    
113

    
114
	}
115

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

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

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

    
137

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

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

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

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

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

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

    
190
		List<Synonym> synonymsInNewTaxonsGroup = newTaxon.getSynonymsInGroup(homoGroup);
191
		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";
192
		Assert.assertEquals(message, 1, synonymsInNewTaxonsGroup.size());
193
		Assert.assertTrue("The old synonym's homotypic 'partner' must be a synonym of the new accepted taxon, too.", synonymsInNewTaxonsGroup.contains(s2));
194
		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()));
195

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

    
205
		try {
206
			UpdateResult result = service.changeSynonymToAcceptedTaxon(homotypicSynonym, t1, false);
207

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

    
213
//		Assert.assertNull("Synonym should not be used in a name anymore", s1.getName());
214

    
215

    
216
	}
217

    
218
	/**
219
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#changeSynonymToRelatedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon, eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType, eu.etaxonomy.cdm.model.reference.Reference, java.lang.String)}.
220
	 */
221
	@Test
222
	public final void testChangeSynonymToRelatedTaxon() {
223
		t1.addSynonym(s1, homoTypicSynonymType);
224
		t1.addSynonym(s2, homoTypicSynonymType);
225
		Set<TaxonBase> newInstances = new HashSet<>();
226
		newInstances.add(s1);
227
		newInstances.add(t1);
228
		newInstances.add(t2);
229
		service.save(newInstances);
230
		TaxonName synonymName = s1.getName();
231
		UUID synNameUUID = synonymName.getUuid();
232

    
233
		Taxon newTaxon = (Taxon) service.changeSynonymToRelatedTaxon(s1, t2, TaxonRelationshipType.CONGRUENT_OR_EXCLUDES(), reference, referenceDetail).getCdmEntity();
234
		//check removeTaxonBase()
235
		//UUID s1UUID = service.update(s1);
236
		UUID newTaxonUUID = service.save(newTaxon).getUuid();
237

    
238

    
239
		s1 =(Synonym)service.find(s1.getUuid());
240
		newTaxon = (Taxon)service.find(newTaxonUUID);
241
		assertNull(s1);
242
		synonymName = nameService.find(synNameUUID);
243
		assertFalse(synonymName.getTaxonBases().contains(s1));
244
		assertTrue(synonymName.getTaxonBases().contains(newTaxon));
245

    
246
		synonymName = s2.getName();
247
        newTaxon = (Taxon)service.changeSynonymToRelatedTaxon(s2, t1, TaxonRelationshipType.MISAPPLIED_NAME_FOR(), reference, referenceDetail).getCdmEntity();
248
        //check removeTaxonBase()
249
        //UUID s1UUID = service.update(s1);
250
        newTaxonUUID = service.save(newTaxon).getUuid();
251

    
252

    
253
        s2 =(Synonym)service.find(s2.getUuid());
254
        newTaxon = (Taxon)service.find(newTaxonUUID);
255
        assertNull(s2);
256

    
257
        assertFalse(synonymName.getTaxonBases().contains(s2));
258
        assertTrue(synonymName.getTaxonBases().contains(newTaxon));
259
	}
260

    
261

    
262
	@Test
263
	public void changeHomotypicalGroupOfSynonym(){
264

    
265
		//s1 - Heterotypic
266
		t1.addSynonym(s1, heteroTypicSynonymType);
267

    
268
		//s2 - heterotypic
269
		TaxonName otherHeteroSynonymName = TaxonNameFactory.NewNonViralInstance(null);
270
		Synonym s2 = Synonym.NewInstance(otherHeteroSynonymName, t1.getSec());
271
		t1.addSynonym(s2, heteroTypicSynonymType);
272
		TaxonName otherHeteroSynonymNameB = TaxonNameFactory.NewNonViralInstance(null);
273
		otherHeteroSynonymName.addBasionym(otherHeteroSynonymNameB);
274
		Synonym s2b = Synonym.NewInstance(otherHeteroSynonymNameB, t1.getSec());
275
		t1.addSynonym(s2b, heteroTypicSynonymType);
276

    
277
		//homotypic
278
		TaxonName homotypicSynonymName = TaxonNameFactory.NewNonViralInstance(null);
279
		Synonym homotypicSynonym = Synonym.NewInstance(homotypicSynonymName, t1.getSec());
280
		t1.addHomotypicSynonym(homotypicSynonym);
281
		t1.getName().addBasionym(homotypicSynonymName);
282

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

    
290
		//do it
291
		service.changeHomotypicalGroupOfSynonym(s2, s1.getHomotypicGroup(), t1, true);
292

    
293
		//postconditions
294
		Assert.assertEquals("s2 must be in s1 homotypic group", s2.getHomotypicGroup(), s1.getHomotypicGroup());
295
		Assert.assertNotNull("s2 must have exactly 1 synonym relationship/accepted taxon", s2.getAcceptedTaxon());
296
		Assert.assertEquals("s2 must have heterotypic relationship", heteroTypicSynonymType, s2.getType());
297
		Assert.assertEquals("s2 must have exactly 0 basionym relationships", 0, s2.getName().getBasionyms().size());
298

    
299

    
300
		//Preconditions test
301
		Assert.assertEquals("'homotypicSynonym' must have exactly 1 basionym relationships", 1, homotypicSynonym.getName().getNameRelations().size());
302
		Assert.assertEquals("'t1' must have exactly 1 basionym relationships", 1, t1.getName().getBasionyms().size());
303
		Assert.assertFalse("s2 must not be in t1 homotypic group", s2.getHomotypicGroup().equals(t1.getHomotypicGroup()));
304

    
305

    
306
		//do it
307
		service.changeHomotypicalGroupOfSynonym(s2, homotypicSynonym.getHomotypicGroup(), null, true);
308

    
309
		//postconditions
310
		Assert.assertEquals("s2 must be in 'homotypicSynonym' homotypic group", s2.getHomotypicGroup(), homotypicSynonym.getHomotypicGroup());
311
		Assert.assertEquals("s2 must be in 't1' homotypic group", s2.getHomotypicGroup(), t1.getHomotypicGroup());
312
		Assert.assertNotNull("s2 must have exactly 1 synonym relationship/accepted taxon", s2.getAcceptedTaxon());
313
		Assert.assertEquals("s2 must have homotypic relationship", this.homoTypicSynonymType, s2.getType());
314
		Assert.assertEquals("s2 must have exactly 1 basionym relationships", 1, s2.getName().getBasionyms().size());
315
		Assert.assertEquals("'homotypicSynonym' must have exactly 2 basionym relationships", 2, homotypicSynonym.getName().getNameRelations().size());
316
		Assert.assertEquals("'t1' must have exactly 1 basionym relationships", 1, t1.getName().getBasionyms().size());
317
		Assert.assertEquals("'t1' must have exactly 2 homotypic synonyms", 2, t1.getHomotypicSynonymsByHomotypicSynonymType().size());
318
		Assert.assertEquals("'t1' must have exactly 2 names in homotypic group", 2, t1.getHomotypicSynonymsByHomotypicGroup(null).size());
319
		Assert.assertEquals("'t1' homotypic group must include 3 names (t1, s2, homotypicSynonym)", 3, t1.getHomotypicGroup().getTypifiedNames().size());
320

    
321

    
322
		//do it
323
		service.changeHomotypicalGroupOfSynonym(s2, t2.getHomotypicGroup(), t2, false);
324

    
325
		//postconditions
326
		Assert.assertEquals("s2 must be in 't2' homotypic group", t2.getHomotypicGroup(), s2.getHomotypicGroup());
327
		Assert.assertFalse("s2 must not be in 't1' homotypic group", s2.getHomotypicGroup().equals(t1.getHomotypicGroup()));
328
		Assert.assertNotNull("s2 must have exactly 1 synonym relationship/accepted taxon", s2.getAcceptedTaxon());
329
		Assert.assertEquals("s2 must have homotypic relationship", this.homoTypicSynonymType, s2.getType());
330
		Assert.assertEquals("s2 must have exactly 0 basionym relationships", 0, s2.getName().getBasionyms().size());
331
		Assert.assertEquals("'homotypicSynonym' must have exactly 1 basionym relationships", 1, homotypicSynonym.getName().getNameRelations().size());
332
		Assert.assertEquals("'t1' must have exactly 1 basionym relationships", 1, t1.getName().getBasionyms().size());
333
		Assert.assertEquals("'t1' must have exactly 1 homotypic synonyms", 1, t1.getHomotypicSynonymsByHomotypicSynonymType().size());
334
		Assert.assertEquals("'t1' must have exactly 1 names in homotypic group", 1, t1.getHomotypicSynonymsByHomotypicGroup().size());
335
		Assert.assertEquals("'t1' homotypic group must include 2 names (t1, homotypicSynonym)", 2, t1.getHomotypicGroup().getTypifiedNames().size());
336

    
337
		//do it
338
		service.changeHomotypicalGroupOfSynonym(s2, s1.getHomotypicGroup(), t1, false);
339

    
340
		//postconditions
341
		Assert.assertEquals("s2 must be in s1 homotypic group", s2.getHomotypicGroup(), s1.getHomotypicGroup());
342
		Assert.assertFalse("s2 must not be in 't2' homotypic group", t2.getHomotypicGroup().equals(s2.getHomotypicGroup()));
343
		//had 2 accepted taxa when synonym relationships still existed
344
		Assert.assertNotNull("s2 must have accepted taxon", s2.getAcceptedTaxon());
345
		Assert.assertEquals("Both relationships of s2 must be heterotypic", heteroTypicSynonymType, s2.getType());
346
		Assert.assertEquals("s2 must have exactly 0 basionym relationships", 0, s2.getName().getBasionyms().size());
347

    
348
	}
349

    
350

    
351
    @Override
352
    public void createTestDataSet() throws FileNotFoundException {}
353

    
354
}
(30-30/39)