svn-gvsig-desktop / trunk / libraries / libTopology / src-test / org / gvsig / topology / TopologyTest.java @ 16396
History | View | Annotate | Download (11.2 KB)
1 | 14153 | azabala | /*
|
---|---|---|---|
2 | * Created on 24-sep-2007
|
||
3 | *
|
||
4 | * gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
||
5 | *
|
||
6 | * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
|
||
7 | *
|
||
8 | * This program is free software; you can redistribute it and/or
|
||
9 | * modify it under the terms of the GNU General Public License
|
||
10 | * as published by the Free Software Foundation; either version 2
|
||
11 | * of the License, or (at your option) any later version.
|
||
12 | *
|
||
13 | * This program is distributed in the hope that it will be useful,
|
||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
16 | * GNU General Public License for more details.
|
||
17 | *
|
||
18 | * You should have received a copy of the GNU General Public License
|
||
19 | * along with this program; if not, write to the Free Software
|
||
20 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
||
21 | *
|
||
22 | * For more information, contact:
|
||
23 | *
|
||
24 | * Generalitat Valenciana
|
||
25 | * Conselleria d'Infraestructures i Transport
|
||
26 | * Av. Blasco Ib??ez, 50
|
||
27 | * 46010 VALENCIA
|
||
28 | * SPAIN
|
||
29 | *
|
||
30 | * +34 963862235
|
||
31 | * gvsig@gva.es
|
||
32 | * www.gvsig.gva.es
|
||
33 | *
|
||
34 | * or
|
||
35 | *
|
||
36 | * IVER T.I. S.A
|
||
37 | * Salamanca 50
|
||
38 | * 46005 Valencia
|
||
39 | * Spain
|
||
40 | *
|
||
41 | * +34 963163400
|
||
42 | * dac@iver.es
|
||
43 | */
|
||
44 | /* CVS MESSAGES:
|
||
45 | *
|
||
46 | * $Id$
|
||
47 | * $Log$
|
||
48 | *
|
||
49 | */
|
||
50 | package org.gvsig.topology; |
||
51 | |||
52 | 16396 | azabala | import java.io.File; |
53 | import java.net.URL; |
||
54 | import java.util.HashMap; |
||
55 | 16320 | azabala | import java.util.List; |
56 | 16396 | azabala | import java.util.Map; |
57 | 16320 | azabala | |
58 | import junit.framework.TestCase; |
||
59 | |||
60 | 14153 | azabala | import org.cresques.cts.IProjection; |
61 | 14228 | azabala | import org.gvsig.topology.topologyrules.MustBeLargerThanClusterTolerance; |
62 | import org.gvsig.topology.topologyrules.MustNotHaveRepeatedPoints; |
||
63 | 16396 | azabala | import org.gvsig.topology.topologyrules.jtsisvalidrules.GeometryMustHaveValidCoordinates; |
64 | 14153 | azabala | import org.gvsig.topology.util.LayerFactory; |
65 | |||
66 | 16396 | azabala | import com.iver.cit.gvsig.exceptions.layers.LoadLayerException; |
67 | 14153 | azabala | import com.iver.cit.gvsig.fmap.MapContext; |
68 | import com.iver.cit.gvsig.fmap.ViewPort; |
||
69 | 16320 | azabala | import com.iver.cit.gvsig.fmap.core.FShape; |
70 | 14153 | azabala | import com.iver.cit.gvsig.fmap.crs.CRSFactory; |
71 | 16396 | azabala | import com.iver.cit.gvsig.fmap.layers.FLayer; |
72 | 14153 | azabala | import com.iver.cit.gvsig.fmap.layers.FLayers; |
73 | import com.iver.cit.gvsig.fmap.layers.FLyrVect; |
||
74 | |||
75 | /**
|
||
76 | * Unit tests for Topology class.
|
||
77 | *
|
||
78 | * @author azabala
|
||
79 | *
|
||
80 | */
|
||
81 | public class TopologyTest extends TestCase { |
||
82 | 16396 | azabala | File baseDataPath;
|
83 | |||
84 | File baseDriversPath;
|
||
85 | |||
86 | IProjection PROJECTION_DEFAULT; |
||
87 | |||
88 | ViewPort VIEWPORT; |
||
89 | |||
90 | FLayers ROOT; |
||
91 | |||
92 | SimpleTopologyErrorContainer errorContainer; |
||
93 | |||
94 | 14153 | azabala | Topology topology = null;
|
95 | |||
96 | Topology topology2 = null;
|
||
97 | |||
98 | 14228 | azabala | FLyrVect multiPointLayer; |
99 | 14153 | azabala | |
100 | 14228 | azabala | FLyrVect lineLyrWithCollapsedCoords; |
101 | |||
102 | 16396 | azabala | FLyrVect shapeBasedLinearLyr; |
103 | 14228 | azabala | |
104 | 16396 | azabala | MapContext mapContext; |
105 | |||
106 | |||
107 | 14153 | azabala | public void setUp() throws Exception{ |
108 | super.setUp();
|
||
109 | 16396 | azabala | URL url = TopologyTest.class.getResource("testdata"); |
110 | if (url == null) |
||
111 | throw new Exception("No se encuentra el directorio con datos de prueba"); |
||
112 | |||
113 | baseDataPath = new File(url.getFile()); |
||
114 | if (!baseDataPath.exists())
|
||
115 | throw new Exception("No se encuentra el directorio con datos de prueba"); |
||
116 | |||
117 | baseDriversPath = new File("../_fwAndami/gvSIG/extensiones/com.iver.cit.gvsig/drivers"); |
||
118 | if (!baseDriversPath.exists())
|
||
119 | throw new Exception("Can't find drivers path " ); |
||
120 | |||
121 | com.iver.cit.gvsig.fmap.layers.LayerFactory.setDriversPath(baseDriversPath.getAbsolutePath()); |
||
122 | 16320 | azabala | |
123 | |||
124 | 16396 | azabala | PROJECTION_DEFAULT = CRSFactory.getCRS("EPSG:23030");
|
125 | VIEWPORT = new ViewPort(PROJECTION_DEFAULT);
|
||
126 | mapContext = new MapContext(VIEWPORT);
|
||
127 | ROOT = mapContext.getLayers(); |
||
128 | errorContainer = new SimpleTopologyErrorContainer();
|
||
129 | 16320 | azabala | |
130 | 16396 | azabala | topology = new Topology(mapContext, ROOT, 0.01, 1000, errorContainer ); |
131 | topology2 = new Topology(mapContext, ROOT, 0.01, 1000, errorContainer); |
||
132 | |||
133 | |||
134 | 14228 | azabala | multiPointLayer = LayerFactory.getLyrWithRepeatedCoords(); |
135 | lineLyrWithCollapsedCoords = LayerFactory.getLineLayerWithCollapsedCoords(); |
||
136 | 16396 | azabala | shapeBasedLinearLyr = (FLyrVect) newLayer("vc1-1500.shp", "gvSIG shp driver"); |
137 | 14153 | azabala | } |
138 | |||
139 | public void tearDown() throws Exception{ |
||
140 | super.tearDown();
|
||
141 | topology = null;
|
||
142 | 14228 | azabala | topology2 = null;
|
143 | multiPointLayer = null;
|
||
144 | lineLyrWithCollapsedCoords = null;
|
||
145 | 14153 | azabala | } |
146 | |||
147 | 16396 | azabala | public FLayer newLayer(String fileName, |
148 | String driverName)
|
||
149 | throws LoadLayerException {
|
||
150 | FLayer solution = null;
|
||
151 | File file = new File(baseDataPath, fileName); |
||
152 | solution = com.iver.cit.gvsig.fmap.layers.LayerFactory.createLayer(fileName, |
||
153 | driverName, |
||
154 | file, PROJECTION_DEFAULT); |
||
155 | solution.setAvailable(true);
|
||
156 | return solution;
|
||
157 | |||
158 | } |
||
159 | |||
160 | 14228 | azabala | /*
|
161 | * To test in a Topology:
|
||
162 | *
|
||
163 | * 1. If we change cluster tolerance, status must be reset:
|
||
164 | * -NON_VALIDATED.
|
||
165 | * -Dirty zones clear.
|
||
166 | * -Topology error clear.
|
||
167 | * -Cluster tolerance rules updated with new cluster tolerance
|
||
168 | *
|
||
169 | *
|
||
170 | 16320 | azabala | *
|
171 | 14228 | azabala | * 2. If number of errors is greater than max number of errors during
|
172 | * a topology validation, process will be interrupted.
|
||
173 | *
|
||
174 | * 3. We cant add rules with layers not referenced by the topology.
|
||
175 | *
|
||
176 | * 4. deleted.
|
||
177 | *
|
||
178 | * 5. If we add a new layer to a topology with status VALIDATED, new status
|
||
179 | * will be VALIDATED_WITH_DIRTY_ZONES, and a new dirty zone for the layer
|
||
180 | * full extent will be created. If layer shape type is POINT or MULTIPOINT,
|
||
181 | * status will be VALIDATED, because this kind of layer dont have MustBeGreaterThanClusterTolerance
|
||
182 | * rule associated.
|
||
183 | *
|
||
184 | 16320 | azabala | |
185 | TEST 6 NOT IMPLEMENTED YET
|
||
186 | 14228 | azabala | * 6. If a feature's geometry of a topology's layer is edited, a new dirty
|
187 | * zone will be create for its bounds:
|
||
188 | * -with the exception if topology status would be NON_VALIDATED.
|
||
189 | 16320 | azabala | |
190 | |||
191 | 14228 | azabala | * 7. If we validate a topology with status NON_VALIDATED, and it finds errors,
|
192 | * new status will be VALIDATED_WITH_ERRORS.
|
||
193 | * If it doesnt find errors, status wll be VALIDATED.
|
||
194 | *
|
||
195 | * 8. If two errors are in the same dirty zone, they dont add new dirty
|
||
196 | * zones.
|
||
197 | 16320 | azabala | |
198 | |||
199 | 14228 | azabala | * 9. If a topology error is added to a topology, dirty zones will be
|
200 | * updated (with the exception if topology error'geometry bounds is in an existent dirty zone)
|
||
201 | *
|
||
202 | * 10. If we mark a topology exception as an exception, it will be removed
|
||
203 | * from dirty zones. If the number of exceptions is equal to the number of
|
||
204 | * errors, new status will be VALIDATED.
|
||
205 | *
|
||
206 | * 11. If we demote a error from exception to error, it will be added to
|
||
207 | * dirty zones. If number of errors is superior to number of exceptions,
|
||
208 | * new status will be VALIDATED_WITH_ERRORS.
|
||
209 | *
|
||
210 | 16320 | azabala | * TEST 12 NOT IMPLEMENTED YET
|
211 | 14228 | azabala | * 12. We must filter topology errors by rule, layer, geometry type, etc.
|
212 | *
|
||
213 | * */
|
||
214 | public void testStatusAndCoherence() throws Exception{ |
||
215 | |||
216 | //first test: cluster tolerance 0.1d, not collapsed geometries
|
||
217 | topology.addLayer(lineLyrWithCollapsedCoords); |
||
218 | topology.validate(); |
||
219 | int status = topology.getStatus();
|
||
220 | assertTrue(status == Topology.VALIDATED); |
||
221 | int numberOfErrors = topology.getNumberOfErrors();
|
||
222 | assertTrue(numberOfErrors == 0);
|
||
223 | |||
224 | //second test: cluster tolerance 12d, one topology error
|
||
225 | topology.setClusterTolerance(12d);
|
||
226 | topology.validate(); |
||
227 | status = topology.getStatus(); |
||
228 | assertTrue(status == Topology.VALIDATED_WITH_ERRORS); |
||
229 | numberOfErrors = topology.getNumberOfErrors(); |
||
230 | assertTrue(numberOfErrors == 1);
|
||
231 | TopologyError error = topology.getTopologyError(0);
|
||
232 | assertTrue(error.getViolatedRule().getClass().equals(MustBeLargerThanClusterTolerance.class)); |
||
233 | |||
234 | |||
235 | //third test: we add a point layer with repeated points
|
||
236 | topology.addLayer(multiPointLayer); |
||
237 | MustNotHaveRepeatedPoints rule1 = |
||
238 | new MustNotHaveRepeatedPoints(multiPointLayer);
|
||
239 | topology.addRule(rule1); |
||
240 | status = topology.getStatus(); |
||
241 | assertTrue(status == Topology.NOT_VALIDATED); |
||
242 | int numberOfDirtyZones = topology.getNumberOfDirtyZones();
|
||
243 | assertTrue(numberOfDirtyZones == 0);
|
||
244 | |||
245 | topology.validate(); |
||
246 | status = topology.getStatus(); |
||
247 | assertTrue(status == Topology.VALIDATED_WITH_ERRORS); |
||
248 | numberOfErrors = topology.getNumberOfErrors(); |
||
249 | assertTrue(numberOfErrors == 2);
|
||
250 | |||
251 | topology.resetStatus(); |
||
252 | topology.setMaxNumberOfErrors(1);
|
||
253 | topology.validate(); |
||
254 | assertTrue(topology.getNumberOfErrors() == 1);
|
||
255 | topology.resetStatus(); |
||
256 | topology.setMaxNumberOfErrors(1000);
|
||
257 | topology.validate(); |
||
258 | assertTrue(topology.getNumberOfErrors() == 2);
|
||
259 | |||
260 | //mark as exception
|
||
261 | for(int i = 0; i < numberOfErrors; i++){ |
||
262 | error = topology.getTopologyError(i); |
||
263 | topology.markAsTopologyException(error); |
||
264 | } |
||
265 | assertTrue(topology.getStatus() == Topology.VALIDATED); |
||
266 | |||
267 | } |
||
268 | 14153 | azabala | |
269 | 14228 | azabala | |
270 | public void testAddRuleWithLayersNotReferenced(){ |
||
271 | MustNotHaveRepeatedPoints rule = |
||
272 | new MustNotHaveRepeatedPoints(multiPointLayer);
|
||
273 | boolean ok = false; |
||
274 | try {
|
||
275 | topology2.addRule(rule); |
||
276 | ok = true;
|
||
277 | } catch (RuleNotAllowedException e) {
|
||
278 | // TODO Auto-generated catch block
|
||
279 | e.printStackTrace(); |
||
280 | } catch (TopologyRuleDefinitionException e) {
|
||
281 | // TODO Auto-generated catch block
|
||
282 | e.printStackTrace(); |
||
283 | } |
||
284 | assertTrue(!ok); |
||
285 | 14153 | azabala | } |
286 | |||
287 | 14228 | azabala | public void testDemoteExceptionsToErrors() throws RuleNotAllowedException, TopologyRuleDefinitionException{ |
288 | topology2.setClusterTolerance(12d);
|
||
289 | topology2.addLayer(multiPointLayer); |
||
290 | topology2.addLayer(this.lineLyrWithCollapsedCoords);
|
||
291 | topology2.addRule(new MustNotHaveRepeatedPoints(multiPointLayer));
|
||
292 | |||
293 | topology2.validate(); |
||
294 | int numberOfErrors = topology2.getNumberOfErrors();
|
||
295 | assertTrue(numberOfErrors == 2);
|
||
296 | for(int i = 0; i < numberOfErrors; i++){ |
||
297 | TopologyError error = topology2.getTopologyError(i); |
||
298 | topology2.markAsTopologyException(error); |
||
299 | } |
||
300 | assertTrue(topology2.getStatus() == Topology.VALIDATED); |
||
301 | for(int i = 0; i < numberOfErrors; i++){ |
||
302 | TopologyError error = topology2.getTopologyError(i); |
||
303 | topology2.demoteToError(error); |
||
304 | } |
||
305 | assertTrue(topology2.getStatus() == Topology.VALIDATED_WITH_ERRORS); |
||
306 | |||
307 | 16320 | azabala | //At this point, topology have two topologyerrors (MustNotHaveRepeatedPoints and MustBeGreaterThanClusterTolerance
|
308 | //shape types are LINE (FPolyline2D) and Point (FMultiPoint2D).
|
||
309 | List<TopologyError> errorList = topology2.getTopologyErrorsByLyr(lineLyrWithCollapsedCoords, null, true); |
||
310 | assertTrue(errorList.size() == 1);
|
||
311 | |||
312 | errorList = topology.getTopologyErrorsByShapeType(FShape.LINE, null, true); |
||
313 | assertTrue(errorList.size() == 1);
|
||
314 | |||
315 | 16396 | azabala | |
316 | 14228 | azabala | } |
317 | 14153 | azabala | |
318 | 16396 | azabala | public void testTopologyPersistence() throws RuleNotAllowedException, TopologyRuleDefinitionException{ |
319 | topology2 = new Topology(mapContext, ROOT, 0.01, 1000, errorContainer); |
||
320 | topology2.addLayer(this.shapeBasedLinearLyr);
|
||
321 | MustNotHaveRepeatedPoints ruleA = new MustNotHaveRepeatedPoints(topology2, shapeBasedLinearLyr);
|
||
322 | topology2.addRule(ruleA); |
||
323 | GeometryMustHaveValidCoordinates ruleB = new
|
||
324 | GeometryMustHaveValidCoordinates(topology2, shapeBasedLinearLyr); |
||
325 | topology2.addRule(ruleB); |
||
326 | 16322 | azabala | |
327 | 16396 | azabala | String fileToSave1 = "/testTopology.xml"; |
328 | Map<String, Object> storageParams = new HashMap<String, Object>(); |
||
329 | storageParams.put(TopologyPersister.FILE_PARAM_NAME, fileToSave1); |
||
330 | TopologyPersister.persist(topology2, storageParams); |
||
331 | Topology topologyA = TopologyPersister.load(mapContext, storageParams); |
||
332 | |||
333 | assertTrue(topology2.getRuleCount() == topologyA.getRuleCount()); |
||
334 | assertTrue(topology2.getLayerCount() == topologyA.getLayerCount()); |
||
335 | 16322 | azabala | } |
336 | |||
337 | 14153 | azabala | } |