Project

General

Profile

Download (16 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
 * @created Dec 16, 2010
46
 * @version 1.0
47
 */
48
public class TaxonServiceImplBusinessTest extends CdmIntegrationTest {
49

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

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

    
68
	/**
69
	 * @throws java.lang.Exception
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
	/**
97
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#swapSynonymAndAcceptedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon)}.
98
	 */
99
	@Test
100
	public final void testSwapSynonymAndAcceptedTaxon() {
101
		t1.addSynonym(s1, homoTypicSynonymType);
102

    
103
		service.swapSynonymAndAcceptedTaxon(s1, t1);
104
	}
105

    
106
	/**
107
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#changeSynonymToAcceptedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon)}.
108
	 */
109
	@Test
110
	public final void testChangeSynonymToAcceptedTaxon() {
111

    
112
		t1.addSynonym(s1, homoTypicSynonymType);
113
		HomotypicalGroup oldGroup = s1.getName().getHomotypicalGroup();
114
		Assert.assertEquals("Homotypical group of new accepted taxon should contain exactly 2 names", 2, oldGroup.getTypifiedNames().size());
115
		boolean deleteSynonym = false;
116
		boolean copyCitationInfo = true;
117
		Taxon taxon = null;
118

    
119
		UpdateResult result;
120
        try {
121
            result = service.changeSynonymToAcceptedTaxon(s1, t1, deleteSynonym);
122
            Assert.assertTrue("Change must fail for synonym and taxon in same homotypical group",result.isAbort());
123
        } catch (HomotypicalGroupChangeException e1) {
124
            // TODO Auto-generated catch block
125
            e1.printStackTrace();
126
        }
127

    
128

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

    
138
		Assert.assertTrue("Former accepted taxon should still have 1 synonym", t1.getSynonyms().size() == 1);
139
		Assert.assertNotNull(taxon);
140
		Assert.assertEquals(s2n, taxon.getName());
141
		HomotypicalGroup newGroup = taxon.getName().getHomotypicalGroup();
142
		Assert.assertEquals("Homotypical group of new accepted taxon should contain exactly one name", 1, newGroup.getTypifiedNames().size());
143
	}
144

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

    
157
		HomotypicalGroup group = s1.getHomotypicGroup();
158
		Reference citation1 = ReferenceFactory.newBook();
159
		String microReference1 = "p. 55";
160
		Synonym s2 = t1.addHeterotypicSynonymName(s2n, citation1, microReference1, group);
161
		HomotypicalGroup homoGroup2 = s1.getHomotypicGroup();
162
		Assert.assertEquals("Homotypical group must be the same group as for the old synonym", group, homoGroup2);
163

    
164
		//run
165
		Taxon newTaxon = null;
166
		try {
167
			newTaxon = (Taxon)service.changeSynonymToAcceptedTaxon(s1, t1, false).getCdmEntity();
168
		} catch (HomotypicalGroupChangeException e1) {
169
			Assert.fail("Invocation of change method should not throw an exception");
170
		}
171

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

    
181
		List<Synonym> synonymsInNewTaxonsGroup = newTaxon.getSynonymsInGroup(homoGroup);
182
		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";
183
		Assert.assertEquals(message, 1, synonymsInNewTaxonsGroup.size());
184
		Assert.assertTrue("The old synonym's homotypic 'partner' must be a synonym of the new accepted taxon, too.", synonymsInNewTaxonsGroup.contains(s2));
185
		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()));
186

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

    
196
		try {
197
			UpdateResult result = service.changeSynonymToAcceptedTaxon(homotypicSynonym, t1, false);
198

    
199
			Assert.assertTrue("The method should throw an exception when invoked on taxa in the same homotypical group", !result.getExceptions().isEmpty());
200
		} catch (HomotypicalGroupChangeException e) {
201
			//OK
202
		}
203

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

    
206

    
207
	}
208

    
209
	/**
210
	 * 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)}.
211
	 */
212
	@Test
213
	public final void testChangeSynonymToRelatedTaxon() {
214
		t1.addSynonym(s1, homoTypicSynonymType);
215
		t1.addSynonym(s2, homoTypicSynonymType);
216
		Set<TaxonBase> newInstances = new HashSet<>();
217
		newInstances.add(s1);
218
		newInstances.add(t1);
219
		newInstances.add(t2);
220
		service.save(newInstances);
221
		TaxonName synonymName = s1.getName();
222
		UUID synNameUUID = synonymName.getUuid();
223

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

    
229

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

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

    
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

    
253
	@Test
254
	public void changeHomotypicalGroupOfSynonym(){
255

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

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

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

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

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

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

    
290

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

    
296

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

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

    
312

    
313
		//do it
314
		service.changeHomotypicalGroupOfSynonym(s2, t2.getHomotypicGroup(), t2, false);
315

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

    
328
		//do it
329
		service.changeHomotypicalGroupOfSynonym(s2, s1.getHomotypicGroup(), t1, false);
330

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

    
339
	}
340

    
341

    
342
    @Override
343
    public void createTestDataSet() throws FileNotFoundException {}
344

    
345
}
(25-25/34)