Statistics
| Revision:

root / branches / v2_0_0_prep / extensions / org.gvsig.symbology / src / test / java / org / gvsig / symbology / fmap / mapcontext / rendering / TestCartographicSupportForSymbol.java @ 30754

History | View | Annotate | Download (21.7 KB)

1
/* gvSIG. Sistema de Informaci�n Geogr�fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib��ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package org.gvsig.symbology.fmap.mapcontext.rendering;
42

    
43
import java.awt.Dimension;
44
import java.awt.geom.Rectangle2D;
45
import java.util.ArrayList;
46
import java.util.Random;
47

    
48
import junit.framework.TestCase;
49

    
50
import org.gvsig.compat.CompatLocator;
51
import org.gvsig.fmap.geom.GeometryLocator;
52
import org.gvsig.fmap.geom.GeometryManager;
53
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
54
import org.gvsig.fmap.geom.exception.CreateGeometryException;
55
import org.gvsig.fmap.geom.primitive.Envelope;
56
import org.gvsig.fmap.geom.primitive.Point;
57
import org.gvsig.fmap.mapcontext.MapContext;
58
import org.gvsig.fmap.mapcontext.MapContextLocator;
59
import org.gvsig.fmap.mapcontext.ViewPort;
60
import org.gvsig.fmap.mapcontext.rendering.symbols.CartographicSupport;
61
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
62
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.AbstractSymbolTestCase;
63
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.SimpleFillSymbolTest;
64
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.SimpleLineSymbolTest;
65
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.SimpleMarkerSymbolTest;
66
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.IFillSymbol;
67
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line.ILineSymbol;
68
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.IMarkerSymbol;
69
import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
70
import org.gvsig.utils.IPersistence;
71
import org.gvsig.utils.NotExistInXMLEntity;
72
import org.gvsig.utils.XMLEntity;
73
import org.gvsig.utils.XMLException;
74
import org.slf4j.Logger;
75
import org.slf4j.LoggerFactory;
76

    
77

    
78
/**
79
 *
80
 * @author jaume dominguez faus - jaume.dominguez@iver.es
81
 */
82
public class TestCartographicSupportForSymbol extends AbstractLibraryAutoInitTestCase {
83
        private static GeometryManager geomManager;        
84
        private static final Logger logger = LoggerFactory.getLogger(TestCartographicSupportForSymbol.class);
85
        
86
        /**
87
         * Geodesic vertex of the Micalet in Valencia (Spain) in <b>EPSG:23030</b>
88
         */
89
        public static Point valenciaUTM30 = null;
90

    
91
        /**
92
         * Geodesic vertex of the Micalet in Valencia (Spain) in <b>EPSG:4326</b>
93
         */
94
        public static Point valenciaGeo = null;
95
        /**
96
         * Extent that covers the whole Comunitat Valenciana in  <b>EPSG:23030</b>
97
         */
98
        public static final Rectangle2D TEST_UTM30_EXTENT = new Rectangle2D.Double();
99
        {
100
                TEST_UTM30_EXTENT.setFrameFromDiagonal(
101
                                4191037.369934333,
102
                                626674.7454557443,
103

    
104
                                4519266.460824658,
105
                                797903.2656794232
106
                );
107
        }
108
        /**
109
         * Extent that covers the whole Comunitat Valenciana in  <b>EPSG:4326</b>
110
         */
111

    
112
        public static final Rectangle2D TEST_GEO_EXTENT = new Rectangle2D.Double();
113
        {
114
                TEST_GEO_EXTENT.setFrameFromDiagonal(
115

    
116
                                -  (1 + (31/60) + (28.09/3600)),        // Western egde
117
                                37 + (50/60) + (48.05/3600),                // Southern edge
118

    
119
                                0 + (31/60) + (1.85/3600),                // Eastern edge
120
                                40 + (47/60) + (21.36/3600)                // Northern edge
121

    
122
                );
123
        }
124

    
125
        public static final Rectangle2D TEST_EXTENT = new Rectangle2D.Double(
126
                        4191037.369934333,
127
                        626674.7454557443,
128

    
129
                        4519266.460824658 - 4191037.369934333,
130
                        797903.2656794232 -  626674.7454557443
131
        );
132
        private static ArrayList symbolsToTest; //<AbstractSymbolTestCase>
133
        private ArrayList csSymbols; //<CartographicSupport>
134

    
135
        /**
136
         * Acceptable pixel tolerance error. 1 pixel of error is accetable since it is probably due to
137
         * the java.awt.Graphics
138
         */
139
        private static final double TOL = 1;
140

    
141
        double zooms[] = new double[] {
142
                        1,
143
                        2,
144
                        1.2,
145
                        10,
146
                        0.5
147
        };
148

    
149
        protected void doSetUp() throws Exception {        
150
                geomManager = GeometryLocator.getGeometryManager();
151
                try {
152
                        valenciaUTM30 = geomManager.createPoint(725846.080, 4373022.720, SUBTYPES.GEOM2D);
153
                        valenciaGeo = geomManager.createPoint(- (0+ 22/60 +  27.919/3600), 39 + 28/60 + 35.4276/3600, SUBTYPES.GEOM2D);
154
                } catch (CreateGeometryException e) {
155
                        // TODO Auto-generated catch block
156
                        e.printStackTrace();
157
                }                
158
        
159
                addSymbolTest(new SimpleFillSymbolTest());
160
                addSymbolTest(new SimpleLineSymbolTest());
161
                addSymbolTest(new SimpleMarkerSymbolTest());
162

    
163
                init();
164
        }
165

    
166
        protected void init() {
167

    
168
                // take the symbols added to the TestISymbol test
169
                ISymbol[] symbols = getNewSymbolInstances();
170

    
171
                csSymbols = new ArrayList(); //<CartographicSupport>
172
                for (int i = 0; i < symbols.length; i++) {
173
                        if (symbols[i] instanceof CartographicSupport) {
174
                                csSymbols.add((CartographicSupport) symbols[i]);
175
                        }
176
                }
177
        }
178

    
179
        public static void addSymbolTest(AbstractSymbolTestCase symbolTestClass) {
180
                if (symbolsToTest == null) symbolsToTest = new ArrayList(); //<AbstractSymbolTestCase>
181
                symbolsToTest.add(symbolTestClass);
182
        }
183

    
184
        public static ISymbol[] getNewSymbolInstances() {
185
                ISymbol[] symbols = new ISymbol[symbolsToTest.size()];
186
                for (int i = 0; i < symbols.length; i++) {
187
                        symbols[i] = (ISymbol)((AbstractSymbolTestCase)symbolsToTest.get(i)).newInstance();
188
                }
189
                return symbols;
190
        }
191

    
192

    
193
        public void testSymbolUnitDefinition() {
194
                for (int i = 0; i < csSymbols.size(); i++) {
195
                        CartographicSupport symbol = (CartographicSupport)csSymbols.get(i);
196

    
197
                        int aRandomUnit = new Random().nextInt(7);
198

    
199

    
200
                        symbol.setUnit(aRandomUnit);
201
                        XMLEntity xml=null;
202
                        try {
203
                                xml = ((IPersistence) symbol).getXMLEntity();
204
                        } catch (XMLException e) {
205
                                // TODO Auto-generated catch block
206
                                e.printStackTrace();
207
                        }
208
                        String name = symbol.getClass().getName().substring(
209
                                        symbol.getClass().getName().lastIndexOf('.')+1,
210
                                        symbol.getClass().getName().length());
211

    
212
                        try {
213
                                assertTrue( ((ISymbol) symbol).getClass().getName()+" does not declare units correctly",
214
                                                symbol.getUnit() == xml.getIntProperty("unit"));
215
                        } catch (NotExistInXMLEntity neiXMLEx) {
216
                                fail(((ISymbol) symbol).getClass().getName()+ " does not declare field attribute in its XMLEntity");
217
                        }
218
                        symbol.setUnit(5);
219
                        try {
220
                                assertTrue( ((ISymbol) symbol).getClass().getName()+" does not apply changes to symbol",symbol.getUnit()== 5);
221
                                assertTrue( ((ISymbol) symbol).getClass().getName()+" does not declare units correctly",
222
                                                5 == ((IPersistence) symbol).getXMLEntity().getIntProperty("unit"));
223
                        } catch (NotExistInXMLEntity neiXMLEx) {
224
                                fail(((ISymbol) symbol).getClass().getName()+ " does not declare field attribute in its XMLEntity");
225
                        } catch (XMLException e) {
226
                                fail(((ISymbol) symbol).getClass().getName()+ " does not declare field attribute in its XMLEntity");
227
                        }
228

    
229
//                        xml.putProperty("unit", 3);
230
//                        ISymbol ts = SymbologyFactory.createSymbolFromXML(xml, xml.getStringProperty("desc"));
231
//                        assertTrue("The application of the UNIT value to the XMLEntity didn't have any effect ("+name+")", ((CartographicSupport) ts).getUnit() == 3);
232
                }
233

    
234
        }
235

    
236

    
237
        public void testSymbolReferenceSystemDefinition() {
238
                for (int i = 0; i < csSymbols.size(); i++) {
239
                        CartographicSupport symbol = (CartographicSupport)csSymbols.get(i);
240
                        XMLEntity xml=null;
241
                        try {
242
                                xml = ((IPersistence) symbol).getXMLEntity();
243
                        } catch (XMLException e) {
244
                                // TODO Auto-generated catch block
245
                                e.printStackTrace();
246
                        }
247
                        String name = symbol.getClass().getName().substring(
248
                                        symbol.getClass().getName().lastIndexOf('.')+1,
249
                                        symbol.getClass().getName().length());
250
                        try {
251
                                assertTrue( ((ISymbol) symbol).getClass().getName()+" does not declare units correctly",
252
                                                symbol.getReferenceSystem() == xml.getIntProperty("referenceSystem"));
253
                        } catch (NotExistInXMLEntity neiXMLEx) {
254
                                fail(((ISymbol) symbol).getClass().getName()+ " does not declare referenceSystem field attribute in its XMLEntity");
255
                        }
256
                        symbol.setReferenceSystem(CartographicSupport.PAPER);
257
                        try {
258
                                assertTrue( ((ISymbol) symbol).getClass().getName()+" does not apply changes to symbol",symbol.getReferenceSystem()== CartographicSupport.PAPER);
259
                                assertTrue( ((ISymbol) symbol).getClass().getName()+" does not declare referenceSystem correctly",
260
                                                CartographicSupport.PAPER == ((IPersistence) symbol).getXMLEntity().getIntProperty("referenceSystem"));
261
                        } catch (NotExistInXMLEntity neiXMLEx) {
262
                                fail(((ISymbol) symbol).getClass().getName()+ " does not declare referenceSystem field attribute in its XMLEntity ("+name+")");
263
                        } catch (XMLException e) {
264
                                fail(((ISymbol) symbol).getClass().getName()+ " does not declare referenceSystem field attribute in its XMLEntity ("+name+")");
265
                        }
266

    
267
                        symbol.setReferenceSystem(CartographicSupport.WORLD);
268
                        try {
269
                                assertTrue( ((ISymbol) symbol).getClass().getName()+" does not apply changes to symbol",symbol.getReferenceSystem()== CartographicSupport.WORLD);
270
                                assertTrue( ((ISymbol) symbol).getClass().getName()+" does not declare referenceSystem correctly",
271
                                                CartographicSupport.WORLD == ((IPersistence) symbol).getXMLEntity().getIntProperty("referenceSystem"));
272
                        } catch (NotExistInXMLEntity neiXMLEx) {
273
                                fail(((ISymbol) symbol).getClass().getName()+ " does not declare referenceSystem field attribute in its XMLEntity");
274
                        } catch (XMLException e) {
275
                                fail(((ISymbol) symbol).getClass().getName()+ " does not declare referenceSystem field attribute in its XMLEntity");
276
                        }
277

    
278
//                        xml.putProperty("referenceSystem", CartographicSupport.PAPER);
279
//                        ISymbol ts = SymbologyFactory.createSymbolFromXML(xml, xml.getStringProperty("desc"));
280
//                        assertTrue("The application of the REFERENCE SYSTEM value to the XMLEntity didn't have any effect ("+name+")", ((CartographicSupport) ts).getReferenceSystem() == CartographicSupport.PAPER);
281
                }
282
        }
283

    
284

    
285
        public void testDegreesUnits_MapReferenceSystem() throws Exception {
286
                for (int j = 0; j < csSymbols.size(); j++) {
287
                        CartographicSupport symbol = (CartographicSupport)csSymbols.get(j);
288

    
289
                        MapContext mc = AllTests.newMapContext(AllTests.TEST_DEFAULT_PROJECTION);
290
                        ViewPort viewPort = mc.getViewPort();
291

    
292
                        int unit = 8;
293
                        Dimension dim = new Dimension(600, 600);
294
                        viewPort.setImageSize(dim);
295

    
296

    
297
                        /*
298
                         * will test with several extents but in the same map image size, so
299
                         * the scale issue is exercised as well.
300
                         */
301
                        for (int i = 0; i < zooms.length; i++) {
302
                                Envelope extent = geomManager.createEnvelope(-30, -30,dim.getWidth()/zooms[i]-30, dim.getHeight()/zooms[i]-30, SUBTYPES.GEOM2D);
303

    
304
                                viewPort.setMapUnits(unit);
305
                                viewPort.setEnvelope(extent);
306

    
307

    
308
                                String name = ((IPersistence) symbol).getClassName().substring(
309
                                                ((IPersistence) symbol).getClassName().lastIndexOf('.')+1,
310
                                                ((IPersistence) symbol).getClassName().length());
311

    
312
                                CartographicSupport csSym = (CartographicSupport) symbol;
313
                                csSym.setReferenceSystem(CartographicSupport.WORLD);
314
                                double size = 30;
315

    
316
                                csSym.setUnit(unit);
317

    
318

    
319

    
320
                                if (symbol instanceof IMarkerSymbol) {
321

    
322
                                        IMarkerSymbol markerSym = (IMarkerSymbol) symbol;
323
                                        markerSym.setSize(size);
324
                                        csSym.toCartographicSize(
325
                                                        viewPort,
326
                                                        CompatLocator.getGraphicsUtils().getScreenDPI(),
327
                                                        geomManager.createPoint(
328
                                                                        viewPort.getAdjustedExtent().getCenter(0),
329
                                                                        viewPort.getAdjustedExtent().getCenter(1),
330
                                                                        SUBTYPES.GEOM2D
331
                                                        )
332
                                        );
333
                                        double mySize = markerSym.getSize();
334
                                        assertTrue("The Symbol '"+name+"' failed computing cartographic size. " +
335
                                                        "It returned "+markerSym.getSize()+" when expecting "+
336
                                                        size+"*"+zooms[i]+"="+size*zooms[i],  Math.abs(mySize-size*zooms[i]) <= TOL );
337
                                }
338

    
339
                                if (symbol instanceof ILineSymbol) {
340

    
341
                                        ILineSymbol lineSym = (ILineSymbol) symbol;
342
                                        lineSym.setLineWidth(size);
343
                                        csSym.toCartographicSize(
344
                                                        viewPort,
345
                                                        CompatLocator.getGraphicsUtils().getScreenDPI(),
346
                                                        geomManager.createPoint(
347
                                                                        viewPort.getAdjustedExtent().getCenter(0),
348
                                                                        viewPort.getAdjustedExtent().getCenter(1),
349
                                                                        SUBTYPES.GEOM2D
350
                                                        )
351
                                        );
352
                                        double mySize = lineSym.getLineStyle().getLineWidth();
353
                                        assertTrue("The Symbol '"+name+"' failed computing cartographic size. " +
354
                                                        "It returned "+mySize+" when expecting "+
355
                                                        size+"*"+zooms[i]+"="+size*zooms[i], Math.abs(mySize-size*zooms[i]) <= TOL );
356
                                }
357

    
358
                                if (symbol instanceof IFillSymbol) {
359
                                        // this tests if symbol applies the cartographic support to its
360
                                        // outline, since is the only thing that may be resized
361
                                        IFillSymbol fillSym = (IFillSymbol) symbol;
362
                                        if (fillSym.getOutline() == null) {
363
                                                fillSym.setOutline((ILineSymbol) MapContextLocator
364
                                                                .getMapContextManager().createSymbol(
365
                                                                                ILineSymbol.SYMBOL_NAME));
366
                                        }
367

    
368
                                        fillSym.getOutline().setLineWidth(size);
369

    
370
                                        csSym.toCartographicSize(
371
                                                        viewPort,
372
                                                        CompatLocator.getGraphicsUtils().getScreenDPI(),
373
                                                        geomManager.createPoint(
374
                                                                        viewPort.getAdjustedExtent().getCenter(0),
375
                                                                        viewPort.getAdjustedExtent().getCenter(1),
376
                                                                        SUBTYPES.GEOM2D
377
                                                        )
378
                                        );
379
                                        double mySize = fillSym.getOutline().getLineStyle().getLineWidth();
380
                                        assertTrue("The Symbol '"+name+"' failed computing cartographic size. " +
381
                                                        "It returned "+fillSym.getOutline().getLineWidth()+" when expecting "+
382
                                                        size+"*"+zooms[i]+"="+size*zooms[i], Math.abs(mySize-size*zooms[i]) <= TOL );
383
                                }
384

    
385
                        }
386
                }
387
        }
388

    
389

    
390
        public void testKilometersUnits_MapReferenceSystem() throws Exception {
391
                for (int j = 0; j < csSymbols.size(); j++) {
392
                        CartographicSupport symbol = (CartographicSupport)csSymbols.get(j);
393
                        MapContext mc = AllTests.newMapContext(AllTests.TEST_DEFAULT_MERCATOR_PROJECTION);
394
                        ViewPort viewPort = mc.getViewPort();
395

    
396
                        int unit = 0;
397
                        Dimension dim = new Dimension(60, 60);
398
                        viewPort.setImageSize(dim);
399

    
400

    
401
                        /*
402
                         * will test with several extents but in the same map image size, so
403
                         * the scale issue is exercised as well.
404
                         */
405
                        for (int i = 0; i < zooms.length; i++) {
406
                                Envelope extent = geomManager.createEnvelope(-30, -30, dim.getWidth()/zooms[i]-30, dim.getHeight()/zooms[i]-30, SUBTYPES.GEOM2D);
407

    
408
                                viewPort.setMapUnits(unit);
409
                                viewPort.setEnvelope(extent);
410

    
411

    
412
                                String name = ((IPersistence) symbol).getClassName().substring(
413
                                                ((IPersistence) symbol).getClassName().lastIndexOf('.')+1,
414
                                                ((IPersistence) symbol).getClassName().length());
415

    
416
                                CartographicSupport csSym = (CartographicSupport) symbol;
417
                                csSym.setReferenceSystem(CartographicSupport.WORLD);
418
                                double size = 30;
419

    
420
                                csSym.setUnit(unit);
421

    
422

    
423

    
424

    
425
                                if (symbol instanceof IMarkerSymbol) {
426

    
427
                                        IMarkerSymbol markerSym = (IMarkerSymbol) symbol;
428
                                        markerSym.setSize(size);
429
                                        csSym.toCartographicSize(
430
                                                        viewPort,
431
                                                        CompatLocator.getGraphicsUtils().getScreenDPI(),
432
                                                        geomManager.createPoint(
433
                                                                        viewPort.getAdjustedExtent().getCenter(0),
434
                                                                        viewPort.getAdjustedExtent().getCenter(1),
435
                                                                        SUBTYPES.GEOM2D
436
                                                        )
437
                                        );
438
                                        double mySize = markerSym.getSize();
439
                                        assertTrue("The Symbol '"+name+"' failed computing cartographic size. " +
440
                                                        "It returned "+markerSym.getSize()+" when expecting "+
441
                                                        size+"*"+zooms[i]+"="+size*zooms[i],  Math.abs(mySize-size*zooms[i]) <= TOL );
442
                                }
443

    
444
                                if (symbol instanceof ILineSymbol) {
445

    
446
                                        ILineSymbol lineSym = (ILineSymbol) symbol;
447
                                        lineSym.setLineWidth(size);
448
                                        csSym.toCartographicSize(
449
                                                        viewPort,
450
                                                        CompatLocator.getGraphicsUtils().getScreenDPI(),
451
                                                        geomManager.createPoint(
452
                                                                        viewPort.getAdjustedExtent().getCenter(0),
453
                                                                        viewPort.getAdjustedExtent().getCenter(1),
454
                                                                        SUBTYPES.GEOM2D                                                                
455
                                                        )
456
                                        );
457
                                        double mySize = lineSym.getLineStyle().getLineWidth();
458
                                        assertTrue("The Symbol '"+name+"' failed computing cartographic size. " +
459
                                                        "It returned "+lineSym.getLineWidth()+" when expecting "+
460
                                                        size+"*"+zooms[i]+"="+size*zooms[i], Math.abs(mySize-size*zooms[i]) <= TOL );
461
                                }
462

    
463
                                if (symbol instanceof IFillSymbol) {
464
                                        // this tests if symbol applies the cartographic support to its
465
                                        // outline, since is the only thing that may be resized
466
                                        IFillSymbol fillSym = (IFillSymbol) symbol;
467
                                        if (fillSym.getOutline() == null) {
468
                                                fillSym.setOutline((ILineSymbol) MapContextLocator
469
                                                                .getMapContextManager().createSymbol(
470
                                                                                ILineSymbol.SYMBOL_NAME));
471
                                        }
472

    
473
                                        fillSym.getOutline().setLineWidth(size);
474

    
475
                                        csSym.toCartographicSize(
476
                                                        viewPort,
477
                                                        CompatLocator.getGraphicsUtils().getScreenDPI(),
478
                                                        geomManager.createPoint(
479
                                                                        viewPort.getAdjustedExtent().getCenter(0),
480
                                                                        viewPort.getAdjustedExtent().getCenter(1),
481
                                                                        SUBTYPES.GEOM2D
482
                                                        )
483
                                        );
484
                                        double mySize = fillSym.getOutline().getLineStyle().getLineWidth();
485
                                        assertTrue("The Symbol '"+name+"' failed computing cartographic size. " +
486
                                                        "It returned "+fillSym.getOutline().getLineWidth()+" when expecting "+
487
                                                        size+"*"+zooms[i]+"="+size*zooms[i], Math.abs(mySize-size*zooms[i]) <= TOL );
488
                                }
489

    
490
                        }
491
                }
492

    
493
        }
494

    
495
        public void testMapInKilometersSymbolInMeters_MapReferenceSystem() throws Exception {
496
                for (int j = 0; j < csSymbols.size(); j++) {
497
                        CartographicSupport symbol = (CartographicSupport)csSymbols.get(j);
498

    
499
                        MapContext mc = AllTests.newMapContext(AllTests.TEST_DEFAULT_MERCATOR_PROJECTION);
500
                        ViewPort viewPort = mc.getViewPort();
501

    
502
                        int mapUnit = 0;
503
                        int symbolUnit = 1;
504
                        Dimension dim = new Dimension(60, 60);
505
                        viewPort.setImageSize(dim);
506

    
507

    
508
                        /*
509
                         * will test with several extents but in the same map image size, so
510
                         * the scale issue is exercised as well.
511
                         */
512
                        for (int i = 0; i < zooms.length; i++) {
513
                                Envelope extent = geomManager.createEnvelope(-30, -30, dim.getWidth()/zooms[i]-30, dim.getHeight()/zooms[i]-30, SUBTYPES.GEOM2D);
514
                                viewPort.setMapUnits(mapUnit);
515
                                viewPort.setEnvelope(extent);
516
                                double size = 30;
517

    
518

    
519
                                String name = ((IPersistence) symbol).getClassName().substring(
520
                                                ((IPersistence) symbol).getClassName().lastIndexOf('.')+1,
521
                                                ((IPersistence) symbol).getClassName().length());
522

    
523

    
524
                                CartographicSupport csSym = (CartographicSupport) symbol;
525
                                csSym.setReferenceSystem(CartographicSupport.WORLD);
526

    
527
                                csSym.setUnit(symbolUnit);
528

    
529
                                if (symbol instanceof IMarkerSymbol) {
530

    
531
                                        IMarkerSymbol markerSym = (IMarkerSymbol) symbol;
532
                                        markerSym.setSize(size*MapContext.CHANGEM[mapUnit]); // 30m*1000 = 30 km
533
                                        csSym.toCartographicSize(
534
                                                        viewPort,
535
                                                        CompatLocator.getGraphicsUtils().getScreenDPI(),
536
                                                        geomManager.createPoint(
537
                                                                        viewPort.getAdjustedExtent().getCenter(0),
538
                                                                        viewPort.getAdjustedExtent().getCenter(1),
539
                                                                        SUBTYPES.GEOM2D
540
                                                        )
541
                                        );
542
                                        double mySize = markerSym.getSize();
543
                                        assertTrue("The Symbol '"+name+"' failed computing cartographic size. " +
544
                                                        "It returned "+markerSym.getSize()+" when expecting "+
545
                                                        size+"*"+zooms[i]+"="+size*zooms[i],  Math.abs(mySize-size*zooms[i]) <= TOL );
546
                                }
547

    
548
                                if (symbol instanceof ILineSymbol) {
549

    
550
                                        ILineSymbol lineSym = (ILineSymbol) symbol;
551
                                        lineSym.setLineWidth(size*MapContext.CHANGEM[mapUnit]); // 30m*1000 = 30 km
552
                                        csSym.toCartographicSize(
553
                                                        viewPort,
554
                                                        CompatLocator.getGraphicsUtils().getScreenDPI(),
555
                                                        geomManager.createPoint(
556
                                                                        viewPort.getAdjustedExtent().getCenter(0),
557
                                                                        viewPort.getAdjustedExtent().getCenter(1),
558
                                                                        SUBTYPES.GEOM2D
559
                                                        )
560
                                        );
561
                                        double mySize = lineSym.getLineStyle().getLineWidth();
562
                                        assertTrue("The Symbol '"+name+"' failed computing cartographic size. " +
563
                                                        "It returned "+lineSym.getLineWidth()+" when expecting "+
564
                                                        size+"*"+zooms[i]+"="+size*zooms[i], Math.abs(mySize-size*zooms[i]) <= TOL );
565
                                }
566

    
567
                                if (symbol instanceof IFillSymbol) {
568
                                        // this tests if symbol applies the cartographic support to its
569
                                        // outline, since is the only thing that may be resized
570
                                        IFillSymbol fillSym = (IFillSymbol) symbol;
571
                                        if (fillSym.getOutline() == null) {
572
                                                fillSym.setOutline((ILineSymbol) MapContextLocator
573
                                                                .getMapContextManager().createSymbol(
574
                                                                                ILineSymbol.SYMBOL_NAME));
575
                                        }
576

    
577
                                        fillSym.getOutline().setLineWidth(size*MapContext.CHANGEM[mapUnit]);
578

    
579
                                        csSym.toCartographicSize(
580
                                                        viewPort,
581
                                                        CompatLocator.getGraphicsUtils().getScreenDPI(),
582
                                                        geomManager.createPoint(
583
                                                                        viewPort.getAdjustedExtent().getCenter(0),
584
                                                                        viewPort.getAdjustedExtent().getCenter(1),
585
                                                                        SUBTYPES.GEOM2D
586
                                                        )
587
                                        );
588
                                        double mySize = fillSym.getOutline().getLineStyle().getLineWidth();
589
                                        assertTrue("The Symbol '"+name+"' failed computing cartographic size. " +
590
                                                        "It returned "+fillSym.getOutline().getLineWidth()+" when expecting "+
591
                                                        size+"*"+zooms[i]+"="+size*zooms[i], Math.abs(mySize-size*zooms[i]) <= TOL );
592
                                }
593

    
594
                        }
595
                }
596
        }
597

    
598
}