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
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.spring.annotation.SpringBeanByType;
25

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

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

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

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

    
66
	@Before
67
	public void setUp() throws Exception {
68
		//service = new TaxonServiceImpl();
69
		//nameService = new NameServiceImpl();
70

    
71
		t1n = TaxonNameFactory.NewNonViralInstance(null);
72
		t1 = Taxon.NewInstance(t1n, reference);
73

    
74
		t2n = TaxonNameFactory.NewNonViralInstance(null);
75
		t2 = Taxon.NewInstance(t2n, reference);
76

    
77
		s1n = TaxonNameFactory.NewNonViralInstance(null);
78
		s1 = Synonym.NewInstance(s1n, reference);
79

    
80
		s2n = TaxonNameFactory.NewNonViralInstance(null);
81
		s2 = Synonym.NewInstance(s2n, reference);
82

    
83
		// referencing
84
		homoTypicSynonymType = SynonymType.HOMOTYPIC_SYNONYM_OF();
85
		heteroTypicSynonymType = SynonymType.HETEROTYPIC_SYNONYM_OF();
86
		reference = ReferenceFactory.newGeneric();
87
		referenceDetail = "test";
88
	}
89

    
90
	/**
91
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#swapSynonymAndAcceptedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon)}.
92
	 */
93
	@Test
94
	public final void testSwapSynonymAndAcceptedTaxon() {
95
		t1.addSynonym(s1, homoTypicSynonymType);
96

    
97
		UpdateResult result = service.swapSynonymAndAcceptedTaxon(s1, t1, true);
98
		Synonym syn = (Synonym)service.load(s1.getUuid());
99
		Assert.assertNull(syn);
100
		TaxonName name = nameService.load(s1n.getUuid());
101
		Assert.assertNotNull(name);
102

    
103
		//The name of the new accepted taxon should be the same as from the former synonym
104
		Assert.assertEquals(((Taxon)result.getCdmEntity()).getName(), name);
105
	}
106

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

    
113
		t1.addSynonym(s1, homoTypicSynonymType);
114
		HomotypicalGroup oldGroup = s1.getName().getHomotypicalGroup();
115
		Assert.assertEquals("Homotypical group of new accepted taxon should contain exactly 2 names", 2, oldGroup.getTypifiedNames().size());
116
		boolean deleteSynonym = false;
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
	 * 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)}.
209
	 */
210
	@Test
211
	public final void testChangeSynonymToRelatedTaxon() {
212
		t1.addSynonym(s1, homoTypicSynonymType);
213
		t1.addSynonym(s2, homoTypicSynonymType);
214
		Set<TaxonBase> newInstances = new HashSet<>();
215
		newInstances.add(s1);
216
		newInstances.add(t1);
217
		newInstances.add(t2);
218
		service.save(newInstances);
219
		TaxonName synonymName = s1.getName();
220
		UUID synNameUUID = synonymName.getUuid();
221

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

    
227

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

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

    
241
        s2 =(Synonym)service.find(s2.getUuid());
242
        newTaxon = (Taxon)service.find(newTaxonUUID);
243
        assertNull(s2);
244

    
245
        assertFalse(synonymName.getTaxonBases().contains(s2));
246
        assertTrue(synonymName.getTaxonBases().contains(newTaxon));
247
	}
248

    
249
	@Test
250
	public void changeHomotypicalGroupOfSynonym(){
251

    
252
		//s1 - Heterotypic
253
		t1.addSynonym(s1, heteroTypicSynonymType);
254

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

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

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

    
277
		//do it
278
		service.changeHomotypicalGroupOfSynonym(s2, s1.getHomotypicGroup(), t1, true);
279

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

    
286

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

    
292

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

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

    
308

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

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

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

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

    
335
	}
336

    
337

    
338
    @Override
339
    public void createTestDataSet() throws FileNotFoundException {}
340

    
341
}
(30-30/40)