2 * Copyright (C) 2014 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.cdm
.api
.utility
;
11 import java
.io
.FileNotFoundException
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Collection
;
14 import java
.util
.HashSet
;
17 import org
.junit
.Assert
;
18 import org
.junit
.Before
;
19 import org
.junit
.Test
;
20 import org
.unitils
.spring
.annotation
.SpringBeanByType
;
22 import eu
.etaxonomy
.cdm
.api
.service
.ITermService
;
23 import eu
.etaxonomy
.cdm
.model
.common
.Marker
;
24 import eu
.etaxonomy
.cdm
.model
.common
.MarkerType
;
25 import eu
.etaxonomy
.cdm
.model
.description
.Distribution
;
26 import eu
.etaxonomy
.cdm
.model
.description
.PresenceAbsenceTerm
;
27 import eu
.etaxonomy
.cdm
.model
.location
.Country
;
28 import eu
.etaxonomy
.cdm
.model
.location
.NamedArea
;
29 import eu
.etaxonomy
.cdm
.test
.integration
.CdmTransactionalIntegrationTest
;
32 * @author a.kohlbecker
36 public class DescriptionUtilityTest
extends CdmTransactionalIntegrationTest
{
40 private ITermService termService
;
42 Collection
<Distribution
> distributions
= null;
43 Collection
<Distribution
> filteredDistributions
= null;
44 boolean subAreaPreference
= false;
45 boolean statusOrderPreference
= false;
46 Set
<MarkerType
> hideMarkedAreas
= null;
47 MarkerType fallbackAreaMarkerType
= null;
48 NamedArea berlin
= null;
52 distributions
= new ArrayList
<Distribution
>();
54 berlin
= NamedArea
.NewInstance("Berlin", "Berlin", "BER");
55 berlin
.setPartOf(Country
.GERMANY());
56 termService
.saveOrUpdate(berlin
);
60 public void testFilterDistributions_computed(){
63 * Computed elements are preferred over entered or imported elements.
64 * (Computed description elements are identified by the
65 * MarkerType.COMPUTED()). This means if a entered or imported status
66 * information exist for the same area for which computed data is
67 * available, the computed data has to be given preference over other
70 distributions
.add(Distribution
.NewInstance(Country
.GERMANY(), PresenceAbsenceTerm
.NATIVE()));
72 Distribution computedDistribution
= Distribution
.NewInstance(Country
.GERMANY(), PresenceAbsenceTerm
.INTRODUCED());
73 computedDistribution
.addMarker(Marker
.NewInstance(MarkerType
.COMPUTED(), true));
74 distributions
.add(computedDistribution
);
76 statusOrderPreference
= true;
77 filteredDistributions
= DescriptionUtility
.filterDistributions(distributions
, subAreaPreference
, statusOrderPreference
, hideMarkedAreas
, fallbackAreaMarkerType
);
78 Assert
.assertEquals(1, filteredDistributions
.size());
79 Assert
.assertEquals("expecting to see computed status INTRODUCED even it has lower preference than NATIVE", PresenceAbsenceTerm
.INTRODUCED(), filteredDistributions
.iterator().next().getStatus());
81 /* distributions for parent areas are only
82 * removed if direct sub areas have the same status and if subAreaPreference=TRUE which is not the case here
84 Distribution parentComputedDistribution
= Distribution
.NewInstance(berlin
, PresenceAbsenceTerm
.INTRODUCED());
85 parentComputedDistribution
.addMarker(Marker
.NewInstance(MarkerType
.COMPUTED(), true));
86 distributions
.add(parentComputedDistribution
);
88 filteredDistributions
= DescriptionUtility
.filterDistributions(distributions
, subAreaPreference
, statusOrderPreference
, hideMarkedAreas
, fallbackAreaMarkerType
);
89 Assert
.assertEquals(2, filteredDistributions
.size());
94 public void testFilterDistributions_statusOrderPreference(){
95 statusOrderPreference
= true;
98 * Status order preference rule: In case of multiple distribution status
99 * (PresenceAbsenceTermBase) for the same area the status with the
100 * highest order is preferred, see
101 * OrderedTermBase.compareTo(OrderedTermBase)
103 distributions
.add(Distribution
.NewInstance(Country
.GERMANY(), PresenceAbsenceTerm
.NATIVE()));
104 distributions
.add(Distribution
.NewInstance(Country
.GERMANY(), PresenceAbsenceTerm
.INTRODUCED()));
105 filteredDistributions
= DescriptionUtility
.filterDistributions(distributions
, subAreaPreference
, statusOrderPreference
, hideMarkedAreas
, fallbackAreaMarkerType
);
106 Assert
.assertEquals(1, filteredDistributions
.size());
107 Assert
.assertEquals(PresenceAbsenceTerm
.NATIVE(), filteredDistributions
.iterator().next().getStatus());
112 public void testFilterDistributions_subAreaPreference(){
113 subAreaPreference
= true;
116 * Sub area preference rule: If there is an area with a direct sub area
117 * and both areas have the same status only the information on
118 * the sub area should be reported, whereas the super area should be
121 Distribution distGermany
= Distribution
.NewInstance(Country
.GERMANY(), PresenceAbsenceTerm
.NATIVE());
122 Distribution distBerlin
= Distribution
.NewInstance(berlin
, PresenceAbsenceTerm
.NATIVE());
125 distributions
.add(distGermany
);
126 distributions
.add(distBerlin
);
127 filteredDistributions
= DescriptionUtility
.filterDistributions(distributions
, subAreaPreference
, statusOrderPreference
, hideMarkedAreas
, fallbackAreaMarkerType
);
128 Assert
.assertEquals(1, filteredDistributions
.size());
129 Assert
.assertEquals(berlin
, filteredDistributions
.iterator().next().getArea());
132 distGermany
.addMarker(Marker
.NewInstance(MarkerType
.COMPUTED(), true));
133 filteredDistributions
= DescriptionUtility
.filterDistributions(distributions
, subAreaPreference
, statusOrderPreference
, hideMarkedAreas
, fallbackAreaMarkerType
);
134 Assert
.assertEquals(1, filteredDistributions
.size());
135 Assert
.assertEquals(berlin
, filteredDistributions
.iterator().next().getArea());
138 distBerlin
.addMarker(Marker
.NewInstance(MarkerType
.COMPUTED(), true));
139 filteredDistributions
= DescriptionUtility
.filterDistributions(distributions
, subAreaPreference
, statusOrderPreference
, hideMarkedAreas
, fallbackAreaMarkerType
);
140 Assert
.assertEquals(1, filteredDistributions
.size());
141 Assert
.assertEquals(berlin
, filteredDistributions
.iterator().next().getArea());
145 public void testFilterDistributions_markedAreaFilter(){
147 * Marked area filter: Skip distributions where the area has a Marker
148 * with one of the specified MarkerTypes
150 Distribution distGermany
= Distribution
.NewInstance(Country
.GERMANY(), PresenceAbsenceTerm
.NATIVE());
151 Distribution distFrance
= Distribution
.NewInstance(Country
.FRANCEFRENCHREPUBLIC(), PresenceAbsenceTerm
.NATIVE());
152 Distribution distBelgium
= Distribution
.NewInstance(Country
.BELGIUMKINGDOMOF(), PresenceAbsenceTerm
.NATIVE());
153 distributions
.add(distGermany
);
154 distributions
.add(distFrance
);
155 distributions
.add(distBelgium
);
157 Country
.BELGIUMKINGDOMOF().addMarker(Marker
.NewInstance(MarkerType
.TO_BE_CHECKED(), true));
158 Country
.FRANCEFRENCHREPUBLIC().addMarker(Marker
.NewInstance(MarkerType
.IMPORTED(), true));
160 hideMarkedAreas
= new HashSet
<MarkerType
>();
161 hideMarkedAreas
.add(MarkerType
.TO_BE_CHECKED());
162 hideMarkedAreas
.add(MarkerType
.IMPORTED());
164 filteredDistributions
= DescriptionUtility
.filterDistributions(distributions
, subAreaPreference
, statusOrderPreference
, hideMarkedAreas
, fallbackAreaMarkerType
);
165 Assert
.assertEquals(1, filteredDistributions
.size());
166 Assert
.assertEquals(Country
.GERMANY(), filteredDistributions
.iterator().next().getArea());
170 public void testFilterDistributions_fallbackAreaFilter(){
172 NamedArea jugoslavia
= NamedArea
.NewInstance("Former Yugoslavia ", "", "Ju");
173 jugoslavia
.setIdInVocabulary("Ju");
174 NamedArea serbia
= NamedArea
.NewInstance("Serbia", "", "Sr");
175 serbia
.setIdInVocabulary("Sr");
176 serbia
.setPartOf(jugoslavia
);
178 Distribution distJugoslavia
= Distribution
.NewInstance(jugoslavia
, PresenceAbsenceTerm
.NATIVE());
179 Distribution distSerbia
= Distribution
.NewInstance(serbia
, PresenceAbsenceTerm
.NATIVE());
181 distributions
.add(distSerbia
);
182 distributions
.add(distJugoslavia
);
184 // using TO_BE_CHECKED to mark Ju as fallback area
185 jugoslavia
.addMarker(Marker
.NewInstance(MarkerType
.TO_BE_CHECKED(), true));
187 filteredDistributions
= DescriptionUtility
.filterDistributions(distributions
,
189 statusOrderPreference
,
191 MarkerType
.TO_BE_CHECKED());
193 Assert
.assertEquals(1, filteredDistributions
.size());
194 Assert
.assertEquals(serbia
, filteredDistributions
.iterator().next().getArea());
200 * @see eu.etaxonomy.cdm.test.integration.CdmIntegrationTest#createTestData()
203 public void createTestDataSet() throws FileNotFoundException
{
204 // TODO Auto-generated method stub