Statistics
| Revision:

gvsig-vectorediting / org.gvsig.vectorediting / trunk / org.gvsig.vectorediting / org.gvsig.vectorediting.lib / org.gvsig.vectorediting.lib.prov / org.gvsig.vectorediting.lib.prov.circlecr / src / test / java / org / gvsig / vectorediting / lib / prov / circlecr / CircleCrTest.java @ 322

History | View | Annotate | Download (16 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright ? 2007-2014 gvSIG Association
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24

    
25
package org.gvsig.vectorediting.lib.prov.circlecr;
26

    
27
import java.io.File;
28
import java.net.URL;
29
import java.util.List;
30

    
31
import org.gvsig.fmap.crs.CRSFactory;
32
import org.gvsig.fmap.dal.DALLocator;
33
import org.gvsig.fmap.dal.DataManager;
34
import org.gvsig.fmap.dal.DataStoreParameters;
35
import org.gvsig.fmap.dal.feature.FeatureStore;
36
import org.gvsig.fmap.geom.Geometry;
37
import org.gvsig.fmap.geom.GeometryLocator;
38
import org.gvsig.fmap.geom.GeometryManager;
39
import org.gvsig.fmap.geom.aggregate.MultiSurface;
40
import org.gvsig.fmap.geom.primitive.Circle;
41
import org.gvsig.fmap.geom.primitive.Point;
42
import org.gvsig.fmap.geom.primitive.Surface;
43
import org.gvsig.fmap.mapcontext.MapContext;
44
import org.gvsig.fmap.mapcontext.ViewPort;
45
import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
46
import org.gvsig.vectorediting.lib.api.DrawingStatus;
47
import org.gvsig.vectorediting.lib.api.EditingManager;
48
import org.gvsig.vectorediting.lib.api.EditingService;
49
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
50
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
51
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
52
import org.gvsig.vectorediting.lib.api.exceptions.VectorEditingException;
53
import org.gvsig.vectorediting.lib.impl.DefaultEditingManager;
54
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
55

    
56
/**
57
 * Circle CR provider test.
58
 *
59
 * This test uses src/test/resources/cartography
60
 *
61
 * @author llmarques
62
 *
63
 */
64
public class CircleCrTest extends AbstractLibraryAutoInitTestCase {
65

    
66
    GeometryManager geoManager;
67
    DataManager dataManager;
68
    EditingManager editingManager;
69
    EditingService service;
70
    FeatureStore featureStoreTest;
71
    MapContext mapContextTest;
72

    
73
    @Override
74
    protected void doSetUp() throws Exception {
75

    
76
        editingManager = new DefaultEditingManager();
77

    
78
        geoManager = GeometryLocator.getGeometryManager();
79

    
80
        try {
81
            featureStoreTest = openFeatureStoretest("provincias_andalucia.shp");
82
        } catch (Exception e) {
83
            fail("Unexpected exception opening test feature store: "
84
                + e.getMessage());
85
        }
86

    
87
        mapContextTest =
88
            new MapContext(new ViewPort(featureStoreTest
89
                .getDefaultFeatureType().getDefaultSRS()));
90

    
91
        service =
92
            editingManager.getEditingService(
93
                CircleCREditingProviderFactory.PROVIDER_NAME, featureStoreTest,
94
                mapContextTest);
95

    
96
        service.start();
97

    
98
    }
99

    
100
    public void testFinish() {
101

    
102
        // Try to finish without values.
103
        try {
104

    
105
            service.finish();
106
            fail("No exception has been thrown");
107

    
108
        } catch (NullPointerException e) {
109
            // Test OK, got expected exception
110
        } catch (FinishServiceException e) {
111
            fail("Unexpected exception ending service: " + e.getMessage());
112
        }
113

    
114
        // Try to finish only with center value
115
        Point center = null;
116
        try {
117
            center = geoManager.createPoint(0, 0, Geometry.SUBTYPES.GEOM2D);
118

    
119
            service.setValue(center);
120

    
121
            service.finish();
122
            fail("No exception has been thrown");
123

    
124
        } catch (NullPointerException e) {
125
            // Test OK, got expected exception
126
        } catch (Exception e) {
127
            fail("Unexpected exception ending service: " + e.getMessage());
128
        }
129

    
130
        // Restart service
131
        try {
132
            service.stop();
133
            service.start();
134
        } catch (Exception e) {
135
            fail("Unexpected exception restarting service: " + e.getMessage());
136
        }
137

    
138
        // Try to finish with valid points
139
        Double radius;
140
        try {
141
            radius = 10.0;
142

    
143
            service.setValue(center);
144
            service.setValue(radius);
145

    
146
            Geometry geom = service.finish();
147

    
148
            assertNotNull("geometry is null", geom);
149
            assertEquals("geometry type != MULTISURFACE", geom.getType(),
150
                Geometry.TYPES.MULTISURFACE);
151

    
152
            Surface surface = ((MultiSurface) geom).getSurfaceAt(0);
153
            assertTrue(surface instanceof Circle);
154
            assertTrue(((Circle) surface).getCenter().getX() == 0);
155
            assertTrue(((Circle) surface).getCenter().getY() == 0);
156
            assertTrue(((Circle) surface).getRadious() == 10.0);
157

    
158
        } catch (Exception e) {
159
            fail("Unexpected exception ending service. " + e.getMessage());
160
        }
161

    
162
        // Try to finish with null featureStore
163
        try {
164

    
165
            service =
166
                editingManager.getEditingService(
167
                    CircleCREditingProviderFactory.PROVIDER_NAME, null,
168
                    mapContextTest);
169

    
170
            service.start();
171

    
172
            center = geoManager.createPoint(0, 0, Geometry.SUBTYPES.GEOM2D);
173
            radius = 10.0;
174

    
175
            service.setValue(center);
176
            service.setValue(radius);
177

    
178
            service.finish();
179
            fail("No exception has been thrown");
180
        } catch (FinishServiceException e) {
181
            // Test OK, got expected exception
182
        } catch (Exception e) {
183
            fail("Unexpected exception finishing with null feature store: "
184
                + e.getMessage());
185
        }
186

    
187
    }
188

    
189
    public void testfinishAndStore() {
190

    
191
        // Try to finish and store without values
192
        try {
193

    
194
            service.finishAndStore();
195
            fail("No exception has been thrown");
196

    
197
        } catch (NullPointerException e) {
198
            // Test OK, got expected exception
199
        } catch (FinishServiceException e) {
200
            fail("Unexpected exception ending and storing service: "
201
                + e.getMessage());
202
        }
203

    
204
        // Try to finish and store only with center value
205
        Point center = null;
206
        try {
207

    
208
            center = geoManager.createPoint(0, 0, Geometry.SUBTYPES.GEOM2D);
209

    
210
            service.finishAndStore();
211
            fail("No exception has been thrown");
212

    
213
        } catch (NullPointerException e) {
214
            // Test OK, got expected exception
215
        } catch (Exception e) {
216
            fail("Unexpected exception ending and storing service: "
217
                + e.getMessage());
218
        }
219

    
220
        // Try to finish and store with null featureStore
221
        Double radius;
222
        try {
223

    
224
            service =
225
                editingManager.getEditingService(
226
                    CircleCREditingProviderFactory.PROVIDER_NAME, null,
227
                    mapContextTest);
228

    
229
            service.start();
230

    
231
            center = geoManager.createPoint(0, 0, Geometry.SUBTYPES.GEOM2D);
232
            radius = 10.0;
233

    
234
            service.setValue(center);
235
            service.setValue(radius);
236

    
237
            service.finishAndStore();
238
            fail("No exception has been thrown");
239
        } catch (FinishServiceException e) {
240
            // Test OK, got expected exception
241
        } catch (Exception e) {
242
            fail("Unexpected exception ending and storing service: "
243
                + e.getMessage());
244
        }
245

    
246
        // Try to finish and store with valid values
247
        try {
248

    
249
            service =
250
                editingManager.getEditingService(
251
                    CircleCREditingProviderFactory.PROVIDER_NAME,
252
                    featureStoreTest, mapContextTest);
253

    
254
            service.start();
255

    
256
            center = geoManager.createPoint(0, 0, Geometry.SUBTYPES.GEOM2D);
257
            radius = 10.0;
258

    
259
            service.setValue(center);
260
            service.setValue(radius);
261

    
262
            featureStoreTest.edit();
263
            service.finishAndStore();
264
            featureStoreTest.finishEditing();
265

    
266
        } catch (Exception e) {
267
            fail("Unexpected exception ending service. " + e.getMessage());
268
        }
269

    
270
    }
271

    
272
    public void testgetDrawingStatus() {
273

    
274
        // Try to get drawing status without values
275
        Point mousePosition = null;
276
        DrawingStatus dws = new DefaultDrawingStatus();
277
        try {
278
            mousePosition =
279
                geoManager.createPoint(10, 10, Geometry.SUBTYPES.GEOM2D);
280
            dws = service.getDrawingStatus(mousePosition);
281
            assertNull(dws);
282
        } catch (Exception e) {
283
            fail("Unexpected exception get drawing status. " + e.getMessage());
284
        }
285

    
286
        // Try to get drawing status with valid center value
287
        Point center;
288
        try {
289
            center = geoManager.createPoint(0, 0, Geometry.SUBTYPES.GEOM2D);
290
            service.setValue(center);
291
            dws = service.getDrawingStatus(mousePosition);
292

    
293
            assertNotNull(dws);
294
            assertTrue(dws.getGeometries().size() == 3);
295
            assertNotNull(dws.getGeometries().get(0));
296
            assertNotNull(dws.getGeometries().get(1));
297
            assertNotNull(dws.getGeometries().get(2));
298

    
299
        } catch (Exception e) {
300
            fail("Unexpected exception get drawing status. " + e.getMessage());
301
        }
302

    
303
        // Try to get drawing status with valid center and radius values
304
        Double raidus = 10.0;
305
        try {
306
            service.setValue(raidus);
307
            dws = service.getDrawingStatus(mousePosition);
308

    
309
            assertNull(dws);
310
        } catch (Exception e) {
311
            fail("Unexpected exception get drawing status. " + e.getMessage());
312
        }
313

    
314
    }
315

    
316
    public void testgetName() {
317

    
318
        assertEquals(CircleCREditingProviderFactory.PROVIDER_NAME,
319
            service.getName());
320

    
321
    }
322

    
323
    public void testgetParameters() {
324
        List<EditingServiceParameter> parameters = service.getParameters();
325

    
326
        assertNotNull(parameters);
327
        assertTrue(parameters.size() == 2);
328

    
329
        EditingServiceParameter parameter = parameters.get(0);
330

    
331
        assertTrue(parameter.getTypes().size() == 1);
332
        assertTrue(parameter.getTypes().iterator().next() == EditingServiceParameter.TYPE.POSITION);
333

    
334
        parameter = parameters.get(1);
335
        assertTrue(parameter.getTypes().size() == 2);
336
        assertTrue(parameter.getTypes().contains(
337
            EditingServiceParameter.TYPE.POSITION));
338
        assertTrue(parameter.getTypes().contains(
339
            EditingServiceParameter.TYPE.VALUE));
340
    }
341

    
342
    public void testNext() {
343

    
344
        // Try to set values in correct order
345
        assertNotNull(service.next());
346

    
347
        List<EditingServiceParameter> parameters = service.getParameters();
348
        EditingServiceParameter centerParameter = parameters.get(0);
349
        EditingServiceParameter radiusParamenter = parameters.get(1);
350

    
351
        assertEquals(centerParameter, service.next());
352

    
353
        Point center;
354
        try {
355
            center = geoManager.createPoint(0, 0, Geometry.SUBTYPES.GEOM2D);
356
            service.setValue(center);
357
        } catch (Exception e) {
358
            fail("Unexpected exception getting next parameter: "
359
                + e.getMessage());
360
        }
361

    
362
        assertNotNull(service.next());
363

    
364
        assertEquals(radiusParamenter, service.next());
365

    
366
        Double radius = 10.0;
367
        try {
368
            service.setValue(radius);
369
        } catch (Exception e) {
370
            fail("Unexpected exception getting next parameter: "
371
                + e.getMessage());
372
        }
373

    
374
        assertNull(service.next());
375

    
376
        // Try to set first radius.
377
        try {
378
            service.stop();
379
            service.start();
380
        } catch (Exception e) {
381
            fail();
382
        }
383

    
384
        assertNotNull(service.next());
385
        assertEquals(centerParameter, service.next());
386

    
387
        try {
388
            service.setValue(radius);
389
        } catch (InvalidEntryException e) {
390
            // Got expected value when radius is instance of Double. If radius
391
            // is a string point, service will set that value like center.
392
        }
393

    
394
        // Check service.next() returns center
395
        assertEquals(centerParameter, service.next());
396

    
397
    }
398

    
399
    public void testsetValue() {
400

    
401
        // Try to set invalid center
402
        Point center = null;
403
        try {
404
            service.setValue(center);
405
        } catch (InvalidEntryException e1) {
406
            // Test ok, got expected exception
407
        }
408

    
409
        // Try to set radius = 0
410
        double radius = 0;
411
        try {
412
            service.setValue(radius);
413
        } catch (InvalidEntryException e1) {
414
            // Test ok, got expected exception
415
        } catch (Exception e) {
416
            fail("Unexpected exception setting radius = 0: " + e.getMessage());
417
        }
418

    
419
        // Try to set negative radius
420
        radius = -1;
421
        try {
422
            service.setValue(radius);
423
        } catch (InvalidEntryException e1) {
424
            // Test ok, got expected exception
425
        } catch (Exception e) {
426
            fail("Unexpected exception setting negative radius: "
427
                + e.getMessage());
428
        }
429

    
430
        // Try to set valid center
431
        try {
432
            center = geoManager.createPoint(0, 0, Geometry.SUBTYPES.GEOM2D);
433
            service.setValue(center);
434
        } catch (Exception e) {
435
            fail("Unexpected exception setting valid center: " + e.getMessage());
436
        }
437

    
438
        // Check center has been set
439
        assertTrue(service.next().getTypes().size() == 2);
440
        assertTrue(service.next().getTypes()
441
            .contains(EditingServiceParameter.TYPE.VALUE));
442
        assertTrue(service.next().getTypes()
443
            .contains(EditingServiceParameter.TYPE.POSITION));
444

    
445
        // Try to set valid radius value
446
        radius = 10.0;
447
        try {
448
            service.setValue(radius);
449
        } catch (InvalidEntryException e) {
450
            fail("Unexpected exception setting valid radius: " + e.getMessage());
451
        }
452

    
453
        assertNull(service.next());
454
    }
455

    
456
    public void testStart() {
457
        service =
458
            editingManager.getEditingService(
459
                CircleCREditingProviderFactory.PROVIDER_NAME, featureStoreTest,
460
                mapContextTest);
461

    
462
        try {
463
            service.start();
464
        } catch (VectorEditingException e) {
465
            fail("Unexpected exception starting service: " + e.getMessage());
466
        }
467
    }
468

    
469
    public void testStop() {
470
        service =
471
            editingManager.getEditingService(
472
                CircleCREditingProviderFactory.PROVIDER_NAME, featureStoreTest,
473
                mapContextTest);
474

    
475
        try {
476
            service.start();
477
            service.stop();
478
        } catch (VectorEditingException e) {
479
            fail("Unexpected exception starting or stopping service: "
480
                + e.getMessage());
481
        }
482
    }
483

    
484
    private FeatureStore openFeatureStoretest(String resourceName)
485
        throws Exception {
486

    
487
        URL shapeURL =
488
            this.getClass().getResource("/cartography/" + resourceName);
489
        if (shapeURL == null) {
490
            throw new IllegalStateException("Can't locate cartography resource");
491
        }
492
        File shapeFile = new File(shapeURL.getFile());
493
        if (!shapeFile.exists()) {
494
            throw new IllegalStateException("cartography resource not exists");
495
        }
496

    
497
        dataManager = DALLocator.getDataManager();
498

    
499
        DataStoreParameters params = dataManager.createStoreParameters("Shape");
500

    
501
        params.setDynValue("shpfile", shapeFile);
502
        params.setDynValue("CRS", CRSFactory.getCRS("EPSG:23030"));
503
        params.setDynValue("useNullGeometry", false);
504
        params.validate();
505

    
506
        return (FeatureStore) dataManager.openStore("Shape", params);
507

    
508
    }
509

    
510
}