3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
11 package eu
.etaxonomy
.cdm
.api
.service
;
13 import java
.util
.List
;
16 import junit
.framework
.Assert
;
18 import org
.junit
.Before
;
19 import org
.junit
.BeforeClass
;
20 import org
.junit
.Test
;
22 import eu
.etaxonomy
.cdm
.model
.common
.DefaultTermInitializer
;
23 import eu
.etaxonomy
.cdm
.model
.name
.HomotypicalGroup
;
24 import eu
.etaxonomy
.cdm
.model
.name
.NonViralName
;
25 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
26 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
27 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceFactory
;
28 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
29 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationship
;
30 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationshipType
;
31 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
32 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationshipType
;
35 * This test checks of all the business logic methods do what they are expected to do.
38 * @created Dec 16, 2010
41 public class TaxonServiceImplBusinessTest
{
46 private TaxonServiceImpl service
;
47 private String referenceDetail
;
48 private Reference reference
;
49 private SynonymRelationshipType homoTypicSynonymRelationshipType
;
50 private SynonymRelationshipType heteroTypicSynonymRelationshipType
;
51 private NonViralName s1n
;
52 private NonViralName t2n
;
53 private NonViralName t1n
;
54 private NonViralName s2n
;
57 public static void setUpClass() throws Exception
{
58 new DefaultTermInitializer().initialize();
62 * @throws java.lang.Exception
65 public void setUp() throws Exception
{
66 service
= new TaxonServiceImpl();
68 t1n
= NonViralName
.NewInstance(null);
69 t1
= Taxon
.NewInstance(t1n
, reference
);
71 t2n
= NonViralName
.NewInstance(null);
72 t2
= Taxon
.NewInstance(t2n
, reference
);
74 s1n
= NonViralName
.NewInstance(null);
75 s1
= Synonym
.NewInstance(s1n
, reference
);
77 s2n
= NonViralName
.NewInstance(null);
80 homoTypicSynonymRelationshipType
= SynonymRelationshipType
.HOMOTYPIC_SYNONYM_OF();
81 heteroTypicSynonymRelationshipType
= SynonymRelationshipType
.HETEROTYPIC_SYNONYM_OF();
82 reference
= ReferenceFactory
.newGeneric();
83 referenceDetail
= "test";
88 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#swapSynonymAndAcceptedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon)}.
91 public final void testSwapSynonymAndAcceptedTaxon() {
92 t1
.addSynonym(s1
, homoTypicSynonymRelationshipType
);
94 service
.swapSynonymAndAcceptedTaxon(s1
, t1
);
98 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#changeSynonymToAcceptedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon)}.
101 public final void testChangeSynonymToAcceptedTaxon() {
103 t1
.addSynonym(s1
, homoTypicSynonymRelationshipType
);
104 HomotypicalGroup oldGroup
= s1
.getName().getHomotypicalGroup();
105 Assert
.assertEquals("Homotypical group of new accepted taxon should contain exactly one name", 1, oldGroup
.getTypifiedNames().size());
106 Taxon taxon
= service
.changeSynonymToAcceptedTaxon(s1
, t1
,false, true, null, null);
109 Assert
.assertTrue("Former accepted taxon should not have synonyms anymore", t1
.getSynonyms().isEmpty());
110 Assert
.assertNotNull(taxon
);
111 Assert
.assertEquals(s1n
, taxon
.getName());
112 HomotypicalGroup newGroup
= taxon
.getName().getHomotypicalGroup();
113 Assert
.assertEquals("Homotypical group of new accepted taxon should contain exactly one name", 1, newGroup
.getTypifiedNames().size());
117 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#changeSynonymToAcceptedTaxon(eu.etaxonomy.cdm.model.taxon.Synonym, eu.etaxonomy.cdm.model.taxon.Taxon)}.
120 public final void testChangeSynonymWithMultipleSynonymsInHomotypicalGroupToAcceptedTaxon() {
121 t1
.addSynonym(s1
, heteroTypicSynonymRelationshipType
);
122 TaxonNameBase
<?
,?
> otherHeteroSynonymName
= NonViralName
.NewInstance(null);
123 t1
.addHeterotypicSynonymName(otherHeteroSynonymName
);
124 TaxonNameBase
<?
,?
> homotypicSynonymName
= NonViralName
.NewInstance(null);
125 Synonym homotypicSynonym
= Synonym
.NewInstance(homotypicSynonymName
, t1
.getSec());
126 t1
.addHomotypicSynonym(homotypicSynonym
, null, null);
128 HomotypicalGroup group
= s1
.getHomotypicGroup();
129 Reference
<?
> citation1
= ReferenceFactory
.newBook();
130 String microReference1
= "p. 55";
131 SynonymRelationship s2rel
= t1
.addHeterotypicSynonymName(s2n
, group
, citation1
, microReference1
);
132 Synonym s2
= s2rel
.getSynonym();
133 HomotypicalGroup homoGroup2
= s1
.getHomotypicGroup();
134 Assert
.assertEquals("Homotypical group must be the same group as for the old synonym", group
, homoGroup2
);
137 Taxon newTaxon
= service
.changeSynonymToAcceptedTaxon(s1
, t1
, false, true, null, null);
139 Assert
.assertEquals("Former accepted taxon should now have 2 synonyms left", 2, t1
.getSynonyms().size());
140 Assert
.assertEquals("Former accepted taxon should now have 1 heterotypic synonym group left", 1, t1
.getHeterotypicSynonymyGroups().size());
141 Assert
.assertNotNull(newTaxon
);
142 Assert
.assertEquals(s1n
, newTaxon
.getName());
143 Assert
.assertEquals("New accepted taxon should have 1 synonym", 1, newTaxon
.getSynonyms().size());
144 Assert
.assertEquals("The new synonym must be the homotypic synonym of the old synonym", s2
, newTaxon
.getSynonyms().iterator().next());
145 HomotypicalGroup homoGroup
= newTaxon
.getHomotypicGroup();
146 Assert
.assertEquals("Homotypical group must be the same group as for the old synonym", group
, homoGroup
);
148 List
<Synonym
> synonymsInNewTaxonsGroup
= newTaxon
.getSynonymsInGroup(homoGroup
);
149 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";
150 Assert
.assertEquals(message
, 1, synonymsInNewTaxonsGroup
.size());
151 Assert
.assertTrue("The old synonym's homotypic 'partner' must be a synonym of the new accepted taxon, too.", synonymsInNewTaxonsGroup
.contains(s2
));
152 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()));
154 boolean iWasHere
= false;
155 for (Synonym syn
: synonymsInNewTaxonsGroup
){
156 if (syn
.equals(s2
) ){
157 SynonymRelationship rel
= s2
.getSynonymRelations().iterator().next();
158 Assert
.assertEquals("s2 relationship needs to have the same citation as the former relation to the given accepted taxon.", citation1
, rel
.getCitation());
162 Assert
.assertTrue("Relationship to s2 must have been concidered in 'for'-loop", iWasHere
);
165 service
.changeSynonymToAcceptedTaxon(homotypicSynonym
, t1
, false, true, null, null);
166 Assert
.fail("The method should throw an exception when invoked on taxa in the same homotypical group");
167 } catch (IllegalArgumentException e
) {
171 // Assert.assertNull("Synonym should not be used in a name anymore", s1.getName());
177 * 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)}.
180 public final void testChangeSynonymToRelatedTaxon() {
181 t1
.addSynonym(s1
, homoTypicSynonymRelationshipType
);
182 service
.changeSynonymToRelatedTaxon(s1
, t2
, TaxonRelationshipType
.CONGRUENT_OR_EXCLUDES(), reference
, referenceDetail
);
186 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#moveSynonymToAnotherTaxon(eu.etaxonomy.cdm.model.taxon.SynonymRelationship, eu.etaxonomy.cdm.model.taxon.Taxon, eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType, eu.etaxonomy.cdm.model.reference.Reference, java.lang.String)}.
189 public final void testMoveSynonymToAnotherTaxon() {
190 t1
.addSynonym(s1
, homoTypicSynonymRelationshipType
);
192 SynonymRelationship synonymRelation
= t1
.getSynonymRelations().iterator().next();
194 service
.moveSynonymToAnotherTaxon(synonymRelation
, t2
, homoTypicSynonymRelationshipType
, reference
, referenceDetail
);
196 Assert
.assertTrue("t1 should have no synonym relationships", t1
.getSynonymRelations().isEmpty());
198 Set
<SynonymRelationship
> synonymRelations
= t2
.getSynonymRelations();
199 Assert
.assertTrue("t2 should have exactly one synonym relationship", synonymRelations
.size() == 1);
201 synonymRelation
= synonymRelations
.iterator().next();
203 Assert
.assertEquals(t2
, synonymRelation
.getAcceptedTaxon());
204 Assert
.assertEquals(homoTypicSynonymRelationshipType
, synonymRelation
.getType());
205 Assert
.assertEquals(reference
, synonymRelation
.getCitation());
206 Assert
.assertEquals(referenceDetail
, synonymRelation
.getCitationMicroReference());
210 public void changeHomotypicalGroupOfSynonym(){
213 t1
.addSynonym(s1
, heteroTypicSynonymRelationshipType
);
216 TaxonNameBase otherHeteroSynonymName
= NonViralName
.NewInstance(null);
217 Synonym s2
= Synonym
.NewInstance(otherHeteroSynonymName
, t1
.getSec());
218 t1
.addSynonym(s2
, heteroTypicSynonymRelationshipType
, null, null);
219 TaxonNameBase otherHeteroSynonymNameB
= NonViralName
.NewInstance(null);
220 otherHeteroSynonymName
.addBasionym(otherHeteroSynonymNameB
);
221 Synonym s2b
= Synonym
.NewInstance(otherHeteroSynonymNameB
, t1
.getSec());
222 t1
.addSynonym(s2b
, heteroTypicSynonymRelationshipType
, null, null);
225 TaxonNameBase homotypicSynonymName
= NonViralName
.NewInstance(null);
226 Synonym homotypicSynonym
= Synonym
.NewInstance(homotypicSynonymName
, t1
.getSec());
227 t1
.addHomotypicSynonym(homotypicSynonym
, null, null);
228 t1
.getName().addBasionym(homotypicSynonymName
);
231 Assert
.assertFalse("s2 must not be in s1 homotypic group", s2
.getHomotypicGroup().equals(s1
.getHomotypicGroup()));
232 Assert
.assertFalse("s2 must not be in t1 homotypic group", s2
.getHomotypicGroup().equals(t1
.getHomotypicGroup()));
233 Assert
.assertEquals("s2 must have exactly 1 synonym relationship", 1, s2
.getSynonymRelations().size());
234 Assert
.assertEquals("s2 must have heterotypic relationship", heteroTypicSynonymRelationshipType
, s2
.getSynonymRelations().iterator().next().getType());
235 Assert
.assertEquals("s2 must have exactly 1 basionym relationships", 1, s2
.getName().getBasionyms().size());
238 service
.changeHomotypicalGroupOfSynonym(s2
, s1
.getHomotypicGroup(), t1
, false, true);
241 Assert
.assertEquals("s2 must be in s1 homotypic group", s2
.getHomotypicGroup(), s1
.getHomotypicGroup());
242 Assert
.assertEquals("s2 must have exactly 1 synonym relationship", 1, s2
.getSynonymRelations().size());
243 Assert
.assertEquals("s2 must have heterotypic relationship", heteroTypicSynonymRelationshipType
, s2
.getSynonymRelations().iterator().next().getType());
244 Assert
.assertEquals("s2 must have exactly 0 basionym relationships", 0, s2
.getName().getBasionyms().size());
248 Assert
.assertEquals("'homotypicSynonym' must have exactly 1 basionym relationships", 1, homotypicSynonym
.getName().getNameRelations().size());
249 Assert
.assertEquals("'t1' must have exactly 1 basionym relationships", 1, t1
.getName().getBasionyms().size());
250 Assert
.assertFalse("s2 must not be in t1 homotypic group", s2
.getHomotypicGroup().equals(t1
.getHomotypicGroup()));
254 service
.changeHomotypicalGroupOfSynonym(s2
, homotypicSynonym
.getHomotypicGroup(), null, false, true);
257 Assert
.assertEquals("s2 must be in 'homotypicSynonym' homotypic group", s2
.getHomotypicGroup(), homotypicSynonym
.getHomotypicGroup());
258 Assert
.assertEquals("s2 must be in 't1' homotypic group", s2
.getHomotypicGroup(), t1
.getHomotypicGroup());
259 Assert
.assertEquals("s2 must have exactly 1 synonym relationship", 1, s2
.getSynonymRelations().size());
260 Assert
.assertEquals("s2 must have homotypic relationship", this.homoTypicSynonymRelationshipType
, s2
.getSynonymRelations().iterator().next().getType());
261 Assert
.assertEquals("s2 must have exactly 1 basionym relationships", 1, s2
.getName().getBasionyms().size());
262 Assert
.assertEquals("'homotypicSynonym' must have exactly 2 basionym relationships", 2, homotypicSynonym
.getName().getNameRelations().size());
263 Assert
.assertEquals("'t1' must have exactly 1 basionym relationships", 1, t1
.getName().getBasionyms().size());
264 Assert
.assertEquals("'t1' must have exactly 2 homotypic synonyms", 2, t1
.getHomotypicSynonymsByHomotypicRelationship().size());
265 Assert
.assertEquals("'t1' must have exactly 2 names in homotypic group", 2, t1
.getHomotypicSynonymsByHomotypicGroup().size());
266 Assert
.assertEquals("'t1' homotypic group must include 3 names (t1, s2, homotypicSynonym)", 3, t1
.getHomotypicGroup().getTypifiedNames().size());
270 service
.changeHomotypicalGroupOfSynonym(s2
, t2
.getHomotypicGroup(), t2
, true, false);
273 Assert
.assertEquals("s2 must be in 't2' homotypic group", t2
.getHomotypicGroup(), s2
.getHomotypicGroup());
274 Assert
.assertFalse("s2 must not be in 't1' homotypic group", s2
.getHomotypicGroup().equals(t1
.getHomotypicGroup()));
275 Assert
.assertEquals("s2 must have exactly 1 synonym relationship", 1, s2
.getSynonymRelations().size());
276 Assert
.assertEquals("s2 must have homotypic relationship", this.homoTypicSynonymRelationshipType
, s2
.getSynonymRelations().iterator().next().getType());
277 Assert
.assertEquals("s2 must have exactly 0 basionym relationships", 0, s2
.getName().getBasionyms().size());
278 Assert
.assertEquals("'homotypicSynonym' must have exactly 1 basionym relationships", 1, homotypicSynonym
.getName().getNameRelations().size());
279 Assert
.assertEquals("'t1' must have exactly 1 basionym relationships", 1, t1
.getName().getBasionyms().size());
280 Assert
.assertEquals("'t1' must have exactly 1 homotypic synonyms", 1, t1
.getHomotypicSynonymsByHomotypicRelationship().size());
281 Assert
.assertEquals("'t1' must have exactly 1 names in homotypic group", 1, t1
.getHomotypicSynonymsByHomotypicGroup().size());
282 Assert
.assertEquals("'t1' homotypic group must include 2 names (t1, homotypicSynonym)", 2, t1
.getHomotypicGroup().getTypifiedNames().size());
285 service
.changeHomotypicalGroupOfSynonym(s2
, s1
.getHomotypicGroup(), t1
, false, false);
288 Assert
.assertEquals("s2 must be in s1 homotypic group", s2
.getHomotypicGroup(), s1
.getHomotypicGroup());
289 Assert
.assertFalse("s2 must not be in 't2' homotypic group", t2
.getHomotypicGroup().equals(s2
.getHomotypicGroup()));
290 Assert
.assertEquals("s2 must have exactly 2 synonym relationships", 2, s2
.getSynonymRelations().size());
291 for (SynonymRelationship rel
: s2
.getSynonymRelations()){
292 Assert
.assertEquals("Both relationships of s2 must be heterotypic", heteroTypicSynonymRelationshipType
, rel
.getType());
294 Assert
.assertEquals("s2 must have exactly 0 basionym relationships", 0, s2
.getName().getBasionyms().size());