001/*
002 *    GeoAPI - Java interfaces for OGC/ISO standards
003 *    http://www.geoapi.org
004 *
005 *    Copyright (C) 2011-2019 Open Geospatial Consortium, Inc.
006 *    All Rights Reserved. http://www.opengeospatial.org/ogc/legal
007 *
008 *    Permission to use, copy, and modify this software and its documentation, with
009 *    or without modification, for any purpose and without fee or royalty is hereby
010 *    granted, provided that you include the following on ALL copies of the software
011 *    and documentation or portions thereof, including modifications, that you make:
012 *
013 *    1. The full text of this NOTICE in a location viewable to users of the
014 *       redistributed or derivative work.
015 *    2. Notice of any changes or modifications to the OGC files, including the
016 *       date changes were made.
017 *
018 *    THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
019 *    NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
020 *    TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
021 *    THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
022 *    PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
023 *
024 *    COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
025 *    CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
026 *
027 *    The name and trademarks of copyright holders may NOT be used in advertising or
028 *    publicity pertaining to the software without specific, written prior permission.
029 *    Title to copyright in this software and any associated documentation will at all
030 *    times remain with copyright holders.
031 */
032package org.opengis.test.referencing.gigs;
033
034import java.util.List;
035
036import org.opengis.util.Factory;
037import org.opengis.util.FactoryException;
038import org.opengis.util.NoSuchIdentifierException;
039import org.opengis.referencing.operation.Conversion;
040import org.opengis.referencing.operation.CoordinateOperation;
041import org.opengis.referencing.operation.CoordinateOperationAuthorityFactory;
042import org.opengis.test.Configuration;
043import org.opengis.test.FactoryFilter;
044
045import org.junit.Test;
046import org.junit.runner.RunWith;
047import org.junit.runners.Parameterized;
048
049import static org.junit.Assume.*;
050import static org.opengis.test.Assert.*;
051
052
053/**
054 * Verifies reference map projections bundled with the geoscience software.
055 *
056 * <table class="gigs" summary="Test description"><tr>
057 *   <th>Test method:</th>
058 *   <td>Compare map projection definitions included in the software against the EPSG Dataset.</td>
059 * </tr><tr>
060 *   <th>Test data:</th>
061 *   <td><a href="doc-files/GIGS_2005_libProjection.csv">{@code GIGS_2005_libProjection.csv}</a>
062 *       and EPSG Dataset.</td>
063 * </tr><tr>
064 *   <th>Tested API:</th>
065 *   <td>{@link CoordinateOperationAuthorityFactory#createCoordinateOperation(String)}.</td>
066 * </tr><tr>
067 *   <th>Expected result:</th>
068 *   <td>Map projection definitions bundled with the software should have the same name, method name,
069 *       defining parameters and parameter values as in the EPSG Dataset. The values of the parameters
070 *       should be correct to at least 10 significant figures. Map projections missing from the software
071 *       or at variance with those in the EPSG Dataset should be reported.</td>
072 * </tr></table>
073 *
074 *
075 * <div class="note"><b>Usage example:</b>
076 * in order to specify their factories and run the tests in a JUnit framework, implementors can
077 * define a subclass in their own test suite as in the example below:
078 *
079 * <blockquote><pre>import org.junit.runner.RunWith;
080 *import org.junit.runners.JUnit4;
081 *import org.opengis.test.referencing.gigs.GIGS2005;
082 *
083 *&#64;RunWith(JUnit4.class)
084 *public class MyTest extends GIGS2005 {
085 *    public MyTest() {
086 *        super(new MyCoordinateOperationAuthorityFactory());
087 *    }
088 *}</pre></blockquote>
089 * </div>
090 *
091 * @author  GIGS (IOGP)
092 * @author  Martin Desruisseaux (Geomatys)
093 * @author  Alexis Manin (Geomatys)
094 * @version 3.1
095 * @since   3.1
096 */
097@RunWith(Parameterized.class)
098public strictfp class GIGS2005 extends AuthorityFactoryTestCase<Conversion> {
099    /**
100     * The name of the expected operation method.
101     */
102    public String methodName;
103
104    /**
105     * The coordinate conversion created by the factory,
106     * or {@code null} if not yet created or if the conversion creation failed.
107     *
108     * @see #copAuthorityFactory
109     */
110    private Conversion conversion;
111
112    /**
113     * Factory to use for building {@link Conversion} instances, or {@code null} if none.
114     * This is the factory used by the {@link #getIdentifiedObject()} method.
115     */
116    protected final CoordinateOperationAuthorityFactory copAuthorityFactory;
117
118    /**
119     * Returns a default set of factories to use for running the tests. Those factories are given
120     * in arguments to the constructor when this test class is instantiated directly by JUnit (for
121     * example as a {@linkplain org.junit.runners.Suite.SuiteClasses suite} element), instead than
122     * subclassed by the implementor. The factories are fetched as documented in the
123     * {@link #factories(Class[])} javadoc.
124     *
125     * @return the default set of arguments to be given to the {@code GIGS2005} constructor.
126     */
127    @Parameterized.Parameters
128    @SuppressWarnings("unchecked")
129    public static List<Factory[]> factories() {
130        return factories(FactoryFilter.ByAuthority.EPSG, CoordinateOperationAuthorityFactory.class);
131    }
132
133    /**
134     * Creates a new test using the given factory. If a given factory is {@code null},
135     * then the tests which depend on it will be skipped.
136     *
137     * @param copFactory  factory for creating {@link CoordinateOperation} instances.
138     */
139    public GIGS2005(final CoordinateOperationAuthorityFactory copFactory) {
140        super(copFactory);
141        copAuthorityFactory = copFactory;
142    }
143
144    /**
145     * Returns information about the configuration of the test which has been run.
146     * This method returns a map containing:
147     *
148     * <ul>
149     *   <li>All the following values associated to the {@link org.opengis.test.Configuration.Key} of the same name:
150     *     <ul>
151     *       <li>{@link #isStandardNameSupported}</li>
152     *       <li>{@link #isStandardAliasSupported}</li>
153     *       <li>{@link #isDependencyIdentificationSupported}</li>
154     *       <li>{@link #copAuthorityFactory}</li>
155     *     </ul>
156     *   </li>
157     * </ul>
158     *
159     * @return the configuration of the test being run.
160     */
161    @Override
162    public Configuration configuration() {
163        final Configuration op = super.configuration();
164        assertNull(op.put(Configuration.Key.copAuthorityFactory, copAuthorityFactory));
165        return op;
166    }
167
168    /**
169     * Returns the coordinate operation instance to be tested. When this method is invoked for the first time, it creates
170     * the operation to test by invoking the {@link CoordinateOperationAuthorityFactory#createCoordinateOperation(String)}
171     * method with the current {@link #code} value in argument. The created object is then cached and returned in all
172     * subsequent invocations of this method.
173     *
174     * @return the coordinate operation instance to test.
175     * @throws FactoryException if an error occurred while creating the coordinate operation instance.
176     */
177    @Override
178    public Conversion getIdentifiedObject() throws FactoryException {
179        if (conversion == null) {
180            assumeNotNull(copAuthorityFactory);
181            final String codeAsString = String.valueOf(code);
182            final CoordinateOperation operation;
183            try {
184                operation = copAuthorityFactory.createCoordinateOperation(codeAsString);
185            } catch (NoSuchIdentifierException e) {
186                /*
187                 * Relaxed the exception type from NoSuchAuthorityCodeException because CoordinateOperation creation
188                 * will typically use MathTransformFactory under the hood, which throws NoSuchIdentifierException for
189                 * non-implemented operation methods (may be identified by their name rather than EPSG code).
190                 */
191                unsupportedCode(Conversion.class, code);
192                throw e;
193            }
194            if (operation != null) {  // For consistency with the behavior in other classes.
195                assertInstanceOf(codeAsString, Conversion.class, operation);
196                conversion = (Conversion) operation;
197            }
198        }
199        return conversion;
200    }
201
202    /**
203     * Verifies the properties of the conversion given by {@link #getIdentifiedObject()}.
204     */
205    private void createAndVerifyProjection(final int code) throws FactoryException {
206        this.code = code;
207        conversion = null;              // For forcing the fetch of a new operation.
208
209        final Conversion conversion = getIdentifiedObject();
210        assertNotNull("Conversion", conversion);
211        validators.validate(conversion);
212
213        // Map projection identifier.
214        assertContainsCode("Conversion.getIdentifiers()", "EPSG", code, conversion.getIdentifiers());
215
216        // Map projection name.
217        if (isStandardNameSupported) {
218            configurationTip = Configuration.Key.isStandardNameSupported;
219            assertEquals("Conversion.getMethod().getName()", methodName, getVerifiableName(conversion.getMethod()));
220            configurationTip = null;
221        }
222    }
223
224    /**
225     * Tests “UTM” coordinate operation creation from the factory.
226     *
227     * <ul>
228     *   <li>EPSG coordinate operation codes: <b>16001</b>, <b>16002</b>, <b>16003</b>, <b>16004</b>, <b>16005</b>,
229     *       <b>16006</b>, <b>16007</b>, <b>16008</b>, <b>16009</b>, <b>16010</b>, <i>…110 more</i></li>
230     *   <li>EPSG coordinate operation name: <b>UTM</b></li>
231     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
232     *   <li>Specific usage / Remarks: <b>All 120 zones</b></li>
233     *   <li>Particularly important to E&amp;P industry.</li>
234     * </ul>
235     *
236     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
237     */
238    @Test
239    public void testUTM() throws FactoryException {
240        important  = true;
241        name       = "UTM";
242        methodName = "Transverse Mercator";
243        for (int code = 16001; code <= 16060; code++) {    // Loop over 60 codes
244            createAndVerifyProjection(code);
245        }
246        for (int code = 16101; code <= 16160; code++) {    // Loop over 60 codes
247            createAndVerifyProjection(code);
248        }
249    }
250
251    /**
252     * Tests “6-degree Gauss-Kruger + zone prefix” coordinate operation creation from the factory.
253     *
254     * <ul>
255     *   <li>EPSG coordinate operation codes: <b>16201</b>, <b>16202</b>, <b>16203</b>, <b>16204</b>, <b>16205</b>,
256     *       <b>16206</b>, <b>16207</b>, <b>16208</b>, <b>16209</b>, <b>16210</b>, <i>…50 more</i></li>
257     *   <li>EPSG coordinate operation name: <b>6-degree Gauss-Kruger</b></li>
258     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
259     *   <li>Specific usage / Remarks: <b>With zone prefix in easting.</b></li>
260     *   <li>Particularly important to E&amp;P industry.</li>
261     * </ul>
262     *
263     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
264     */
265    @Test
266    public void test6DegreeGaussKrugerWithZonePrefix() throws FactoryException {
267        important  = true;
268        name       = "6-degree Gauss-Kruger";
269        methodName = "Transverse Mercator";
270        for (int code = 16201; code <= 16260; code++) {    // Loop over 60 codes
271            createAndVerifyProjection(code);
272        }
273    }
274
275    /**
276     * Tests “6-degree Gauss-Kruger” coordinate operation creation from the factory.
277     *
278     * <ul>
279     *   <li>EPSG coordinate operation codes: <b>16301</b>, <b>16302</b>, <b>16303</b>, <b>16304</b>, <b>16305</b>,
280     *       <b>16306</b>, <b>16307</b>, <b>16308</b>, <b>16309</b>, <b>16310</b>, <i>…50 more</i></li>
281     *   <li>EPSG coordinate operation name: <b>6-degree Gauss-Kruger</b></li>
282     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
283     *   <li>Specific usage / Remarks: <b>Without zone prefix in easting.</b></li>
284     *   <li>Particularly important to E&amp;P industry.</li>
285     * </ul>
286     *
287     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
288     */
289    @Test
290    public void test6DegreeGaussKruger() throws FactoryException {
291        important  = true;
292        name       = "6-degree Gauss-Kruger";
293        methodName = "Transverse Mercator";
294        for (int code = 16301; code <= 16360; code++) {    // Loop over 60 codes
295            createAndVerifyProjection(code);
296        }
297    }
298
299    /**
300     * Tests “3-degree Gauss-Kruger + zone prefix” coordinate operation creation from the factory.
301     *
302     * <ul>
303     *   <li>EPSG coordinate operation codes: <b>16261</b>, <b>16262</b>, <b>16263</b>, <b>16264</b>, <b>16265</b>,
304     *       <b>16266</b>, <b>16267</b>, <b>16268</b>, <b>16269</b>, <b>16270</b>, <i>…54 more</i></li>
305     *   <li>EPSG coordinate operation name: <b>3-degree Gauss-Kruger</b></li>
306     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
307     *   <li>Specific usage / Remarks: <b>With zone prefix in easting.</b></li>
308     *   <li>Particularly important to E&amp;P industry.</li>
309     * </ul>
310     *
311     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
312     */
313    @Test
314    public void test3DegreeGaussKrugerWithZonePrefix() throws FactoryException {
315        important  = true;
316        name       = "3-degree Gauss-Kruger";
317        methodName = "Transverse Mercator";
318        for (int code = 16261; code <= 16299; code++) {    // Loop over 39 codes
319            createAndVerifyProjection(code);
320        }
321        for (int code = 16070; code <= 16089; code++) {    // Loop over 20 codes
322            createAndVerifyProjection(code);
323        }
324        createAndVerifyProjection(16099);
325        for (int code = 16091; code <= 16094; code++) {    // Loop over 4 codes
326            createAndVerifyProjection(code);
327        }
328    }
329
330    /**
331     * Tests “3-degree Gauss-Kruger” coordinate operation creation from the factory.
332     *
333     * <ul>
334     *   <li>EPSG coordinate operation codes: <b>16362</b>, <b>16364</b>, <b>16366</b>, <b>16368</b>, <b>16370</b>,
335     *       <b>16372</b>, <b>16374</b>, <b>16376</b>, <b>16378</b>, <b>16380</b>, <i>…22 more</i></li>
336     *   <li>EPSG coordinate operation name: <b>3-degree Gauss-Kruger</b></li>
337     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
338     *   <li>Specific usage / Remarks: <b>Without zone prefix in easting.</b></li>
339     *   <li>Particularly important to E&amp;P industry.</li>
340     * </ul>
341     *
342     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
343     */
344    @Test
345    public void test3DegreeGaussKruger() throws FactoryException {
346        important  = true;
347        name       = "3-degree Gauss-Kruger";
348        methodName = "Transverse Mercator";
349        for (int code = 16362; code <= 16398; code += 2) {    // Loop over 19 codes
350            createAndVerifyProjection(code);
351        }
352        for (int code = 16170; code <= 16194; code += 2) {    // Loop over 13 codes
353            createAndVerifyProjection(code);
354        }
355    }
356
357    /**
358     * Tests “Aramco Lambert” coordinate operation creation from the factory.
359     *
360     * <ul>
361     *   <li>EPSG coordinate operation codes: <b>19977</b></li>
362     *   <li>EPSG coordinate operation name: <b>Aramco Lambert</b></li>
363     *   <li>Coordinate operation method: <b>Lambert Conic Conformal (2SP)</b></li>
364     *   <li>Particularly important to E&amp;P industry.</li>
365     * </ul>
366     *
367     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
368     */
369    @Test
370    public void testAramcoLambert() throws FactoryException {
371        important  = true;
372        name       = "Aramco Lambert";
373        methodName = "Lambert Conic Conformal (2SP)";
374        createAndVerifyProjection(19977);
375    }
376
377    /**
378     * Tests “Argentina zones” coordinate operation creation from the factory.
379     *
380     * <ul>
381     *   <li>EPSG coordinate operation codes: <b>18031</b>, <b>18032</b>, <b>18033</b>, <b>18034</b>, <b>18035</b>, <b>18036</b>, <b>18037</b></li>
382     *   <li>EPSG coordinate operation name: <b>Argentina zones</b></li>
383     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
384     *   <li>Particularly important to E&amp;P industry.</li>
385     * </ul>
386     *
387     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
388     */
389    @Test
390    public void testArgentinaZones() throws FactoryException {
391        important  = true;
392        name       = "Argentina zones";
393        methodName = "Transverse Mercator";
394        for (int code = 18031; code <= 18037; code++) {    // Loop over 7 codes
395            createAndVerifyProjection(code);
396        }
397    }
398
399    /**
400     * Tests “Australian Map Grid zones” coordinate operation creation from the factory.
401     *
402     * <ul>
403     *   <li>EPSG coordinate operation codes: <b>17448</b> (see note), <b>17449</b>, <b>17450</b>, <b>17451</b>, <b>17452</b>,
404     *       <b>17453</b>, <b>17454</b>, <b>17455</b>, <b>17456</b>, <b>17457</b>, <b>17458</b></li>
405     *   <li>EPSG coordinate operation name: <b>Australian Map Grid zones</b></li>
406     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
407     *   <li>Particularly important to E&amp;P industry.</li>
408     * </ul>
409     *
410     * <b>Note:</b> EPSG:17448 is tested only if {@link #isDeprecatedObjectCreationSupported} is {@code true}.
411     * Raison is: Falls outside EEZ area.
412     *
413     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
414     */
415    @Test
416    public void testAustralianMapGridZones() throws FactoryException {
417        important  = true;
418        name       = "Australian Map Grid zones";
419        methodName = "Transverse Mercator";
420        for (int code = 17449; code <= 17458; code++) {    // Loop over 10 codes
421            createAndVerifyProjection(code);
422        }
423        if (isDeprecatedObjectCreationSupported) {
424            createAndVerifyProjection(17448);
425        }
426    }
427
428    /**
429     * Tests “BLM zones” coordinate operation creation from the factory.
430     *
431     * <ul>
432     *   <li>EPSG coordinate operation codes: <b>15914</b>, <b>15915</b>, <b>15916</b>, <b>15917</b></li>
433     *   <li>EPSG coordinate operation name: <b>BLM zones</b></li>
434     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
435     *   <li>Specific usage / Remarks: <b>UTM in ftUS</b></li>
436     *   <li>Particularly important to E&amp;P industry.</li>
437     * </ul>
438     *
439     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
440     */
441    @Test
442    public void testBLMZones() throws FactoryException {
443        important  = true;
444        name       = "BLM zones";
445        methodName = "Transverse Mercator";
446        for (int code = 15914; code <= 15917; code++) {    // Loop over 4 codes
447            createAndVerifyProjection(code);
448        }
449    }
450
451    /**
452     * Tests “British National Grid” coordinate operation creation from the factory.
453     *
454     * <ul>
455     *   <li>EPSG coordinate operation codes: <b>19916</b></li>
456     *   <li>EPSG coordinate operation name: <b>British National Grid</b></li>
457     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
458     *   <li>Particularly important to E&amp;P industry.</li>
459     * </ul>
460     *
461     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
462     */
463    @Test
464    public void testBritishNationalGrid() throws FactoryException {
465        important  = true;
466        name       = "British National Grid";
467        methodName = "Transverse Mercator";
468        createAndVerifyProjection(19916);
469    }
470
471    /**
472     * Tests “Brazil Polyconic” coordinate operation creation from the factory.
473     *
474     * <ul>
475     *   <li>EPSG coordinate operation codes: <b>19941</b></li>
476     *   <li>EPSG coordinate operation name: <b>Brazil Polyconic</b></li>
477     *   <li>Coordinate operation method: <b>American Polyconic</b></li>
478     *   <li>Particularly important to E&amp;P industry.</li>
479     * </ul>
480     *
481     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
482     */
483    @Test
484    public void testBrazilPolyconic() throws FactoryException {
485        important  = true;
486        name       = "Brazil Polyconic";
487        methodName = "American Polyconic";
488        createAndVerifyProjection(19941);
489    }
490
491    /**
492     * Tests “Colombia zones” coordinate operation creation from the factory.
493     *
494     * <ul>
495     *   <li>EPSG coordinate operation codes: <b>18051</b>, <b>18052</b>, <b>18053</b>, <b>18054</b>, <b>18055</b>,
496     *       <b>18056</b>, <b>18057</b>, <b>18058</b>, <b>18059</b></li>
497     *   <li>EPSG coordinate operation name: <b>Colombia zones</b></li>
498     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
499     *   <li>Particularly important to E&amp;P industry.</li>
500     * </ul>
501     *
502     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
503     */
504    @Test
505    public void testColombiaZones() throws FactoryException {
506        important  = true;
507        name       = "Colombia zones";
508        methodName = "Transverse Mercator";
509        for (int code = 18051; code <= 18059; code++) {    // Loop over 9 codes
510            createAndVerifyProjection(code);
511        }
512    }
513
514    /**
515     * Tests “Egypt belts” coordinate operation creation from the factory.
516     *
517     * <ul>
518     *   <li>EPSG coordinate operation codes: <b>18071</b>, <b>18072</b>, <b>18073</b>, <b>18074</b></li>
519     *   <li>EPSG coordinate operation name: <b>Egypt belts</b></li>
520     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
521     *   <li>Particularly important to E&amp;P industry.</li>
522     * </ul>
523     *
524     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
525     */
526    @Test
527    public void testEgyptBelts() throws FactoryException {
528        important  = true;
529        name       = "Egypt belts";
530        methodName = "Transverse Mercator";
531        for (int code = 18071; code <= 18074; code++) {    // Loop over 4 codes
532            createAndVerifyProjection(code);
533        }
534    }
535
536    /**
537     * Tests “EOV” coordinate operation creation from the factory.
538     *
539     * <ul>
540     *   <li>EPSG coordinate operation codes: <b>19931</b></li>
541     *   <li>EPSG coordinate operation name: <b>EOV</b></li>
542     *   <li>Coordinate operation method: <b>Hotine Oblique Mercator (variant B)</b></li>
543     *   <li>Particularly important to E&amp;P industry.</li>
544     * </ul>
545     *
546     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
547     */
548    @Test
549    public void testEOV() throws FactoryException {
550        important  = true;
551        name       = "EOV";
552        methodName = "Hotine Oblique Mercator (variant B)";
553        createAndVerifyProjection(19931);
554    }
555
556    /**
557     * Tests “France mainland zones” coordinate operation creation from the factory.
558     *
559     * <ul>
560     *   <li>EPSG coordinate operation codes: <b>18081</b>, <b>18082</b>, <b>18083</b></li>
561     *   <li>EPSG coordinate operation name: <b>France mainland zones</b></li>
562     *   <li>Coordinate operation method: <b>Lambert Conic Conformal (1SP)</b></li>
563     *   <li>Specific usage / Remarks: <b>Use grads</b></li>
564     *   <li>Particularly important to E&amp;P industry.</li>
565     * </ul>
566     *
567     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
568     */
569    @Test
570    public void testFranceMainlandZones() throws FactoryException {
571        important  = true;
572        name       = "France mainland zones";
573        methodName = "Lambert Conic Conformal (1SP)";
574        createAndVerifyProjection(18081);
575        createAndVerifyProjection(18082);
576        createAndVerifyProjection(18083);
577    }
578
579    /**
580     * Tests “Lambert-93” coordinate operation creation from the factory.
581     *
582     * <ul>
583     *   <li>EPSG coordinate operation codes: <b>18085</b></li>
584     *   <li>EPSG coordinate operation name: <b>Lambert-93</b></li>
585     *   <li>Coordinate operation method: <b>Lambert Conic Conformal (2SP)</b></li>
586     *   <li>Specific usage / Remarks: <b>Use grads</b></li>
587     *   <li>Particularly important to E&amp;P industry.</li>
588     * </ul>
589     *
590     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
591     */
592    @Test
593    public void testLambert93() throws FactoryException {
594        important  = true;
595        name       = "Lambert-93";
596        methodName = "Lambert Conic Conformal (2SP)";
597        createAndVerifyProjection(18085);
598    }
599
600    /**
601     * Tests “Ghana National Grid” coordinate operation creation from the factory.
602     *
603     * <ul>
604     *   <li>EPSG coordinate operation codes: <b>19959</b></li>
605     *   <li>EPSG coordinate operation name: <b>Ghana National Grid</b></li>
606     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
607     *   <li>Particularly important to E&amp;P industry.</li>
608     * </ul>
609     *
610     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
611     */
612    @Test
613    public void testGhanaNationalGrid() throws FactoryException {
614        important  = true;
615        name       = "Ghana National Grid";
616        methodName = "Transverse Mercator";
617        createAndVerifyProjection(19959);
618    }
619
620    /**
621     * Tests “India zones” coordinate operation creation from the factory.
622     *
623     * <ul>
624     *   <li>EPSG coordinate operation codes: <b>18231</b>, <b>18232</b>, <b>18233</b>, <b>18234</b>, <b>18235</b>,
625     *       <b>18236</b>, <b>18237</b>, <b>18238</b></li>
626     *   <li>EPSG coordinate operation name: <b>India zones</b></li>
627     *   <li>Coordinate operation method: <b>Lambert Conic Conformal (1SP)</b></li>
628     *   <li>Particularly important to E&amp;P industry.</li>
629     * </ul>
630     *
631     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
632     */
633    @Test
634    public void testIndiaZones() throws FactoryException {
635        important  = true;
636        name       = "India zones";
637        methodName = "Lambert Conic Conformal (1SP)";
638        for (int code = 18231; code <= 18238; code++) {    // Loop over 8 codes
639            createAndVerifyProjection(code);
640        }
641    }
642
643    /**
644     * Tests “Iraq zone” coordinate operation creation from the factory.
645     *
646     * <ul>
647     *   <li>EPSG coordinate operation codes: <b>19906</b></li>
648     *   <li>EPSG coordinate operation name: <b>Iraq zone</b></li>
649     *   <li>Coordinate operation method: <b>Lambert Conic Conformal (1SP)</b></li>
650     *   <li>Particularly important to E&amp;P industry.</li>
651     * </ul>
652     *
653     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
654     */
655    @Test
656    public void testIraqZone() throws FactoryException {
657        important  = true;
658        name       = "Iraq zone";
659        methodName = "Lambert Conic Conformal (1SP)";
660        createAndVerifyProjection(19906);
661    }
662
663    /**
664     * Tests “Italy zones” coordinate operation creation from the factory.
665     *
666     * <ul>
667     *   <li>EPSG coordinate operation codes: <b>18121</b>, <b>18122</b></li>
668     *   <li>EPSG coordinate operation name: <b>Italy zones</b></li>
669     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
670     *   <li>Particularly important to E&amp;P industry.</li>
671     * </ul>
672     *
673     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
674     */
675    @Test
676    public void testItalyZones() throws FactoryException {
677        important  = true;
678        name       = "Italy zones";
679        methodName = "Transverse Mercator";
680        createAndVerifyProjection(18121);
681        createAndVerifyProjection(18122);
682    }
683
684    /**
685     * Tests “Laborde” coordinate operation creation from the factory.
686     *
687     * <ul>
688     *   <li>EPSG coordinate operation codes: <b>19911</b>, <b>19861</b></li>
689     *   <li>EPSG coordinate operation name: <b>Laborde Grid approximation</b>, <b>Laborde Grid</b></li>
690     *   <li>Coordinate operation method: <b>Hotine Oblique Mercator (variant B)</b>, <b>Laborde Oblique Mercator</b></li>
691     *   <li>Particularly important to E&amp;P industry.</li>
692     * </ul>
693     *
694     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
695     */
696    @Test
697    public void testLaborde() throws FactoryException {
698        important  = true;
699        name       = "Laborde Grid approximation";
700        methodName = "Hotine Oblique Mercator (variant B)";
701        createAndVerifyProjection(19911);
702
703        name       = "Laborde Grid";
704        methodName = "Laborde Oblique Mercator";
705        createAndVerifyProjection(19861);
706    }
707
708    /**
709     * Tests “Levant zone” coordinate operation creation from the factory.
710     *
711     * <ul>
712     *   <li>EPSG coordinate operation codes: <b>19940</b></li>
713     *   <li>EPSG coordinate operation name: <b>Levant zone</b></li>
714     *   <li>Coordinate operation method: <b>Lambert Conic Near-Conformal</b></li>
715     *   <li>Particularly important to E&amp;P industry.</li>
716     * </ul>
717     *
718     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
719     */
720    @Test
721    public void testLevantZone() throws FactoryException {
722        important  = true;
723        name       = "Levant zone";
724        methodName = "Lambert Conic Near-Conformal";
725        createAndVerifyProjection(19940);
726    }
727
728    /**
729     * Tests “Libya zones” coordinate operation creation from the factory.
730     *
731     * <ul>
732     *   <li>EPSG coordinate operation codes: <b>18240</b>, <b>18241</b>, <b>18242</b>, <b>18243</b>, <b>18244</b>,
733     *       <b>18245</b>, <b>18246</b>, <b>18247</b>, <b>18248</b>, <b>18310</b>, <i>…9 more</i></li>
734     *   <li>EPSG coordinate operation name: <b>Libya zones</b></li>
735     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
736     *   <li>Particularly important to E&amp;P industry.</li>
737     * </ul>
738     *
739     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
740     */
741    @Test
742    public void testLibyaZones() throws FactoryException {
743        important  = true;
744        name       = "Libya zones";
745        methodName = "Transverse Mercator";
746        for (int code = 18240; code <= 18248; code++) {    // Loop over 9 codes
747            createAndVerifyProjection(code);
748        }
749        for (int code = 18310; code <= 18319; code++) {    // Loop over 10 codes
750            createAndVerifyProjection(code);
751        }
752    }
753
754    /**
755     * Tests “SW Africa Survey Grid” coordinate operation creation from the factory.
756     *
757     * <ul>
758     *   <li>EPSG coordinate operation codes: <b>17611</b></li>
759     *   <li>EPSG coordinate operation name: <b>SW Africa Survey Grid</b></li>
760     *   <li>Coordinate operation method: <b>Transverse Mercator (South Orientated)</b></li>
761     *   <li>Particularly important to E&amp;P industry.</li>
762     * </ul>
763     *
764     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
765     */
766    @Test
767    public void testSWAfricaSurveyGrid() throws FactoryException {
768        important  = true;
769        name       = "SW Africa Survey Grid";
770        methodName = "Transverse Mercator (South Orientated)";
771        createAndVerifyProjection(17611);
772    }
773
774    /**
775     * Tests “NEIEZ” coordinate operation creation from the factory.
776     *
777     * <ul>
778     *   <li>EPSG coordinate operation codes: <b>19905</b></li>
779     *   <li>EPSG coordinate operation name: <b>NEIEZ</b></li>
780     *   <li>Coordinate operation method: <b>Mercator (variant A)</b></li>
781     *   <li>Particularly important to E&amp;P industry.</li>
782     * </ul>
783     *
784     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
785     */
786    @Test
787    public void testNEIEZ() throws FactoryException {
788        important  = true;
789        name       = "NEIEZ";
790        methodName = "Mercator (variant A)";
791        createAndVerifyProjection(19905);
792    }
793
794    /**
795     * Tests “Nigeria belts” coordinate operation creation from the factory.
796     *
797     * <ul>
798     *   <li>EPSG coordinate operation codes: <b>18151</b>, <b>18152</b>, <b>18153</b></li>
799     *   <li>EPSG coordinate operation name: <b>Nigeria belts</b></li>
800     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
801     *   <li>Particularly important to E&amp;P industry.</li>
802     * </ul>
803     *
804     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
805     */
806    @Test
807    public void testNigeriaBelts() throws FactoryException {
808        important  = true;
809        name       = "Nigeria belts";
810        methodName = "Transverse Mercator";
811        createAndVerifyProjection(18151);
812        createAndVerifyProjection(18152);
813        createAndVerifyProjection(18153);
814    }
815
816    /**
817     * Tests “NZ TM zones” coordinate operation creation from the factory.
818     *
819     * <ul>
820     *   <li>EPSG coordinate operation codes: <b>18141</b>, <b>18142</b>, <b>19971</b></li>
821     *   <li>EPSG coordinate operation name: <b>NZ TM zones</b></li>
822     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
823     *   <li>Particularly important to E&amp;P industry.</li>
824     * </ul>
825     *
826     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
827     */
828    @Test
829    public void testNZTMZones() throws FactoryException {
830        important  = true;
831        name       = "NZ TM zones";
832        methodName = "Transverse Mercator";
833        createAndVerifyProjection(18141);
834        createAndVerifyProjection(18142);
835        createAndVerifyProjection(19971);
836    }
837
838    /**
839     * Tests “NZMG” coordinate operation creation from the factory.
840     *
841     * <ul>
842     *   <li>EPSG coordinate operation codes: <b>19917</b></li>
843     *   <li>EPSG coordinate operation name: <b>NZMG</b></li>
844     *   <li>Coordinate operation method: <b>New Zealand Map Grid</b></li>
845     *   <li>Particularly important to E&amp;P industry.</li>
846     * </ul>
847     *
848     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
849     */
850    @Test
851    public void testNZMG() throws FactoryException {
852        important  = true;
853        name       = "NZMG";
854        methodName = "New Zealand Map Grid";
855        createAndVerifyProjection(19917);
856    }
857
858    /**
859     * Tests “Peru zones” coordinate operation creation from the factory.
860     *
861     * <ul>
862     *   <li>EPSG coordinate operation codes: <b>18161</b>, <b>18162</b>, <b>18163</b></li>
863     *   <li>EPSG coordinate operation name: <b>Peru zones</b></li>
864     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
865     *   <li>Particularly important to E&amp;P industry.</li>
866     * </ul>
867     *
868     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
869     */
870    @Test
871    public void testPeruZones() throws FactoryException {
872        important  = true;
873        name       = "Peru zones";
874        methodName = "Transverse Mercator";
875        createAndVerifyProjection(18161);
876        createAndVerifyProjection(18162);
877        createAndVerifyProjection(18163);
878    }
879
880    /**
881     * Tests “Philippine zones” coordinate operation creation from the factory.
882     *
883     * <ul>
884     *   <li>EPSG coordinate operation codes: <b>18171</b>, <b>18172</b>, <b>18173</b>, <b>18174</b>, <b>18175</b></li>
885     *   <li>EPSG coordinate operation name: <b>Philippine zones</b></li>
886     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
887     *   <li>Particularly important to E&amp;P industry.</li>
888     * </ul>
889     *
890     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
891     */
892    @Test
893    public void testPhilippineZones() throws FactoryException {
894        important  = true;
895        name       = "Philippine zones";
896        methodName = "Transverse Mercator";
897        for (int code = 18171; code <= 18175; code++) {    // Loop over 5 codes
898            createAndVerifyProjection(code);
899        }
900    }
901
902    /**
903     * Tests “Qatar Grid” coordinate operation creation from the factory.
904     *
905     * <ul>
906     *   <li>EPSG coordinate operation codes: <b>19953</b></li>
907     *   <li>EPSG coordinate operation name: <b>Qatar Grid</b></li>
908     *   <li>Coordinate operation method: <b>Cassini-Soldner</b></li>
909     *   <li>Particularly important to E&amp;P industry.</li>
910     * </ul>
911     *
912     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
913     */
914    @Test
915    public void testQatarGrid() throws FactoryException {
916        important  = true;
917        name       = "Qatar Grid";
918        methodName = "Cassini-Soldner";
919        createAndVerifyProjection(19953);
920    }
921
922    /**
923     * Tests “Qatar National Grid” coordinate operation creation from the factory.
924     *
925     * <ul>
926     *   <li>EPSG coordinate operation codes: <b>19919</b></li>
927     *   <li>EPSG coordinate operation name: <b>Qatar National Grid</b></li>
928     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
929     *   <li>Particularly important to E&amp;P industry.</li>
930     * </ul>
931     *
932     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
933     */
934    @Test
935    public void testQatarNationalGrid() throws FactoryException {
936        important  = true;
937        name       = "Qatar National Grid";
938        methodName = "Transverse Mercator";
939        createAndVerifyProjection(19919);
940    }
941
942    /**
943     * Tests “RD New” coordinate operation creation from the factory.
944     *
945     * <ul>
946     *   <li>EPSG coordinate operation codes: <b>19914</b></li>
947     *   <li>EPSG coordinate operation name: <b>RD New</b></li>
948     *   <li>Coordinate operation method: <b>Oblique Stereographic</b></li>
949     *   <li>Particularly important to E&amp;P industry.</li>
950     * </ul>
951     *
952     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
953     */
954    @Test
955    public void testRDNew() throws FactoryException {
956        important  = true;
957        name       = "RD New";
958        methodName = "Oblique Stereographic";
959        createAndVerifyProjection(19914);
960    }
961
962    /**
963     * Tests “Malaysia RSO grids” coordinate operation creation from the factory.
964     *
965     * <ul>
966     *   <li>EPSG coordinate operation codes: <b>19956</b>, <b>19957</b>, <b>19958</b></li>
967     *   <li>EPSG coordinate operation name: <b>Malaysia RSO grids</b></li>
968     *   <li>Coordinate operation method: <b>Hotine Oblique Mercator (variant B)</b></li>
969     *   <li>Particularly important to E&amp;P industry.</li>
970     * </ul>
971     *
972     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
973     */
974    @Test
975    public void testMalaysiaRSOGrids_VariantB() throws FactoryException {
976        important  = true;
977        name       = "Malaysia RSO grids";
978        methodName = "Hotine Oblique Mercator (variant B)";
979        createAndVerifyProjection(19956);
980        createAndVerifyProjection(19957);
981        createAndVerifyProjection(19958);
982    }
983
984    /**
985     * Tests “Malaysia RSO grids” coordinate operation creation from the factory.
986     *
987     * <ul>
988     *   <li>EPSG coordinate operation codes: <b>19871</b>, <b>19872</b>, <b>19894</b>, <b>19895</b></li>
989     *   <li>EPSG coordinate operation name: <b>Malaysia RSO grids</b></li>
990     *   <li>Coordinate operation method: <b>Hotine Oblique Mercator (variant A)</b></li>
991     *   <li>Particularly important to E&amp;P industry.</li>
992     * </ul>
993     *
994     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
995     */
996    @Test
997    public void testMalaysiaRSOGrids_VariantA() throws FactoryException {
998        important  = true;
999        name       = "Malaysia RSO grids";
1000        methodName = "Hotine Oblique Mercator (variant A)";
1001        createAndVerifyProjection(19871);
1002        createAndVerifyProjection(19872);
1003        createAndVerifyProjection(19894);
1004        createAndVerifyProjection(19895);
1005    }
1006
1007    /**
1008     * Tests “US State Plane zones” coordinate operation creation from the factory.
1009     *
1010     * <ul>
1011     *   <li>EPSG coordinate operation codes: <b>15002</b>, <b>15003</b>, <b>15004</b>, <b>15005</b>, <b>15006</b>,
1012     *       <b>15007</b>, <b>15008</b>, <b>15009</b>, <b>15032</b>, <b>15033</b>, <i>…12 more</i></li>
1013     *   <li>EPSG coordinate operation name: <b>US State Plane zones</b></li>
1014     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
1015     *   <li>Specific usage / Remarks: <b>SPCS27 and SPCS83. Check especially FE/FN units.
1016     *       Concentrate on states with E&amp;P interest: AK; CA; LA; MI; NM; OK; TX; WY</b></li>
1017     *   <li>Particularly important to E&amp;P industry.</li>
1018     * </ul>
1019     *
1020     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1021     */
1022    @Test
1023    public void testUSStatePlaneZones_TM() throws FactoryException {
1024        important  = true;
1025        name       = "US State Plane zones";
1026        methodName = "Transverse Mercator";
1027        for (int code = 15002; code <= 15009; code++) {    // Loop over 8 codes
1028            createAndVerifyProjection(code);
1029        }
1030        for (int code = 15032; code <= 15039; code++) {    // Loop over 8 codes
1031            createAndVerifyProjection(code);
1032        }
1033        createAndVerifyProjection(13001);
1034        createAndVerifyProjection(13031);
1035        createAndVerifyProjection(15339);
1036        createAndVerifyProjection(14903);
1037        createAndVerifyProjection(14933);
1038        createAndVerifyProjection(14937);
1039    }
1040
1041    /**
1042     * Tests “US State Plane zones” coordinate operation creation from the factory.
1043     *
1044     * <ul>
1045     *   <li>EPSG coordinate operation codes: <b>10404</b>, <b>10405</b>, <b>10406</b>, <b>10408</b>, <b>10434</b>,
1046     *       <b>10435</b>, <b>10436</b>, <b>15310</b>, <b>15311</b>, <b>15312</b>, <i>…33 more</i></li>
1047     *   <li>EPSG coordinate operation name: <b>US State Plane zones</b></li>
1048     *   <li>Coordinate operation method: <b>Lambert Conic Conformal (2SP)</b></li>
1049     *   <li>Specific usage / Remarks: <b>SPCS27 and SPCS83. Check especially FE/FN units.
1050     *       Concentrate on states with E&amp;P interest: AK; CA; LA; MI; NM; OK; TX; WY</b></li>
1051     *   <li>Particularly important to E&amp;P industry.</li>
1052     * </ul>
1053     *
1054     * <b>Note:</b> EPSG:12112 and 12113 are tested only if {@link #isDeprecatedObjectCreationSupported} is {@code true}.
1055     * Raison is: Method changed to accord with NGS practice.
1056     *
1057     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1058     */
1059    @Test
1060    public void testUSStatePlaneZones_LCC() throws FactoryException {
1061        important  = true;
1062        name       = "US State Plane zones";
1063        methodName = "Lambert Conic Conformal (2SP)";
1064        createAndVerifyProjection(10404);
1065        createAndVerifyProjection(10405);
1066        createAndVerifyProjection(10406);
1067        createAndVerifyProjection(10408);
1068        createAndVerifyProjection(10434);
1069        createAndVerifyProjection(10435);
1070        createAndVerifyProjection(10436);
1071        createAndVerifyProjection(15310);
1072        createAndVerifyProjection(15311);
1073        createAndVerifyProjection(15312);
1074        createAndVerifyProjection(11701);
1075        createAndVerifyProjection(11702);
1076        createAndVerifyProjection(11731);
1077        createAndVerifyProjection(11732);
1078        createAndVerifyProjection(15391);
1079        createAndVerifyProjection(15392);
1080        createAndVerifyProjection(12142);
1081        createAndVerifyProjection(12143);
1082        createAndVerifyProjection(15334);
1083        createAndVerifyProjection(15335);
1084        createAndVerifyProjection(13501);
1085        createAndVerifyProjection(13502);
1086        createAndVerifyProjection(13531);
1087        createAndVerifyProjection(13532);
1088        createAndVerifyProjection(15349);
1089        createAndVerifyProjection(15350);
1090        for (int code = 14201; code <= 14205; code++) {    // Loop over 5 codes
1091            createAndVerifyProjection(code);
1092        }
1093        for (int code = 14231; code <= 14235; code++) {    // Loop over 5 codes
1094            createAndVerifyProjection(code);
1095        }
1096        for (int code = 15357; code <= 15361; code++) {    // Loop over 5 codes
1097            createAndVerifyProjection(code);
1098        }
1099        if (isDeprecatedObjectCreationSupported) {
1100            createAndVerifyProjection(12112);
1101            createAndVerifyProjection(12113);
1102        }
1103    }
1104
1105    /**
1106     * Tests “Stereo33” coordinate operation creation from the factory.
1107     *
1108     * <ul>
1109     *   <li>EPSG coordinate operation codes: <b>19927</b></li>
1110     *   <li>EPSG coordinate operation name: <b>Stereo33</b></li>
1111     *   <li>Coordinate operation method: <b>Oblique Stereographic</b></li>
1112     *   <li>Particularly important to E&amp;P industry.</li>
1113     * </ul>
1114     *
1115     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1116     */
1117    @Test
1118    public void testStereo33() throws FactoryException {
1119        important  = true;
1120        name       = "Stereo33";
1121        methodName = "Oblique Stereographic";
1122        createAndVerifyProjection(19927);
1123    }
1124
1125    /**
1126     * Tests “Stereo70” coordinate operation creation from the factory.
1127     *
1128     * <ul>
1129     *   <li>EPSG coordinate operation codes: <b>19926</b></li>
1130     *   <li>EPSG coordinate operation name: <b>Stereo70</b></li>
1131     *   <li>Coordinate operation method: <b>Oblique Stereographic</b></li>
1132     *   <li>Particularly important to E&amp;P industry.</li>
1133     * </ul>
1134     *
1135     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1136     */
1137    @Test
1138    public void testStereo70() throws FactoryException {
1139        important  = true;
1140        name       = "Stereo70";
1141        methodName = "Oblique Stereographic";
1142        createAndVerifyProjection(19926);
1143    }
1144
1145    /**
1146     * Tests “Syria Lambert” coordinate operation creation from the factory.
1147     *
1148     * <ul>
1149     *   <li>EPSG coordinate operation codes: <b>19948</b></li>
1150     *   <li>EPSG coordinate operation name: <b>Syria Lambert</b></li>
1151     *   <li>Coordinate operation method: <b>Lambert Conic Conformal (1SP)</b></li>
1152     *   <li>Particularly important to E&amp;P industry.</li>
1153     * </ul>
1154     *
1155     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1156     */
1157    @Test
1158    public void testSyriaLambert() throws FactoryException {
1159        important  = true;
1160        name       = "Syria Lambert";
1161        methodName = "Lambert Conic Conformal (1SP)";
1162        createAndVerifyProjection(19948);
1163    }
1164
1165    /**
1166     * Tests “TM 0 N” coordinate operation creation from the factory.
1167     *
1168     * <ul>
1169     *   <li>EPSG coordinate operation codes: <b>16400</b></li>
1170     *   <li>EPSG coordinate operation name: <b>TM 0 N</b></li>
1171     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
1172     *   <li>Particularly important to E&amp;P industry.</li>
1173     * </ul>
1174     *
1175     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1176     */
1177    @Test
1178    public void testTM0N() throws FactoryException {
1179        important  = true;
1180        name       = "TM 0 N";
1181        methodName = "Transverse Mercator";
1182        createAndVerifyProjection(16400);
1183    }
1184
1185    /**
1186     * Tests “TM 1 NW” coordinate operation creation from the factory.
1187     *
1188     * <ul>
1189     *   <li>EPSG coordinate operation codes: <b>17001</b></li>
1190     *   <li>EPSG coordinate operation name: <b>TM 1 NW</b></li>
1191     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
1192     *   <li>Particularly important to E&amp;P industry.</li>
1193     * </ul>
1194     *
1195     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1196     */
1197    @Test
1198    public void testTM1NW() throws FactoryException {
1199        important  = true;
1200        name       = "TM 1 NW";
1201        methodName = "Transverse Mercator";
1202        createAndVerifyProjection(17001);
1203    }
1204
1205    /**
1206     * Tests “TM 109 SE” coordinate operation creation from the factory.
1207     *
1208     * <ul>
1209     *   <li>EPSG coordinate operation codes: <b>16709</b></li>
1210     *   <li>EPSG coordinate operation name: <b>TM 109 SE</b></li>
1211     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
1212     *   <li>Particularly important to E&amp;P industry.</li>
1213     * </ul>
1214     *
1215     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1216     */
1217    @Test
1218    public void testTM109SE() throws FactoryException {
1219        important  = true;
1220        name       = "TM 109 SE";
1221        methodName = "Transverse Mercator";
1222        createAndVerifyProjection(16709);
1223    }
1224
1225    /**
1226     * Tests “TM 11.30 SE” coordinate operation creation from the factory.
1227     *
1228     * <ul>
1229     *   <li>EPSG coordinate operation codes: <b>16611</b></li>
1230     *   <li>EPSG coordinate operation name: <b>TM 11.30 SE</b></li>
1231     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
1232     *   <li>Particularly important to E&amp;P industry.</li>
1233     * </ul>
1234     *
1235     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1236     */
1237    @Test
1238    public void testTM1130SE() throws FactoryException {
1239        important  = true;
1240        name       = "TM 11.30 SE";
1241        methodName = "Transverse Mercator";
1242        createAndVerifyProjection(16611);
1243    }
1244
1245    /**
1246     * Tests “TM 12 SE” coordinate operation creation from the factory.
1247     *
1248     * <ul>
1249     *   <li>EPSG coordinate operation codes: <b>16612</b></li>
1250     *   <li>EPSG coordinate operation name: <b>TM 12 SE</b></li>
1251     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
1252     *   <li>Particularly important to E&amp;P industry.</li>
1253     * </ul>
1254     *
1255     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1256     */
1257    @Test
1258    public void testTM12SE() throws FactoryException {
1259        important  = true;
1260        name       = "TM 12 SE";
1261        methodName = "Transverse Mercator";
1262        createAndVerifyProjection(16612);
1263    }
1264
1265    /**
1266     * Tests “TM 5 NE” coordinate operation creation from the factory.
1267     *
1268     * <ul>
1269     *   <li>EPSG coordinate operation codes: <b>16405</b></li>
1270     *   <li>EPSG coordinate operation name: <b>TM 5 NE</b></li>
1271     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
1272     *   <li>Particularly important to E&amp;P industry.</li>
1273     * </ul>
1274     *
1275     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1276     */
1277    @Test
1278    public void testTM5NE() throws FactoryException {
1279        important  = true;
1280        name       = "TM 5 NE";
1281        methodName = "Transverse Mercator";
1282        createAndVerifyProjection(16405);
1283    }
1284
1285    /**
1286     * Tests “TM 5 NW” coordinate operation creation from the factory.
1287     *
1288     * <ul>
1289     *   <li>EPSG coordinate operation codes: <b>17005</b></li>
1290     *   <li>EPSG coordinate operation name: <b>TM 5 NW</b></li>
1291     *   <li>Coordinate operation method: <b>Transverse Mercator</b></li>
1292     *   <li>Particularly important to E&amp;P industry.</li>
1293     * </ul>
1294     *
1295     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1296     */
1297    @Test
1298    public void testTM5NW() throws FactoryException {
1299        important  = true;
1300        name       = "TM 5 NW";
1301        methodName = "Transverse Mercator";
1302        createAndVerifyProjection(17005);
1303    }
1304
1305    /**
1306     * Tests “Trinidad grid” coordinate operation creation from the factory.
1307     *
1308     * <ul>
1309     *   <li>EPSG coordinate operation codes: <b>19925</b>, <b>19975</b></li>
1310     *   <li>EPSG coordinate operation name: <b>Trinidad grid</b></li>
1311     *   <li>Coordinate operation method: <b>Cassini-Soldner</b></li>
1312     *   <li>Particularly important to E&amp;P industry.</li>
1313     * </ul>
1314     *
1315     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1316     */
1317    @Test
1318    public void testTrinidadGrid() throws FactoryException {
1319        important  = true;
1320        name       = "Trinidad grid";
1321        methodName = "Cassini-Soldner";
1322        createAndVerifyProjection(19925);
1323        createAndVerifyProjection(19975);
1324    }
1325
1326    /**
1327     * Tests “Tunisia zones” coordinate operation creation from the factory.
1328     *
1329     * <ul>
1330     *   <li>EPSG coordinate operation codes: <b>18181</b>, <b>18182</b></li>
1331     *   <li>EPSG coordinate operation name: <b>Tunisia zones</b></li>
1332     *   <li>Coordinate operation method: <b>Lambert Conic Conformal (1SP)</b></li>
1333     *   <li>Particularly important to E&amp;P industry.</li>
1334     * </ul>
1335     *
1336     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1337     */
1338    @Test
1339    public void testTunisiaZones() throws FactoryException {
1340        important  = true;
1341        name       = "Tunisia zones";
1342        methodName = "Lambert Conic Conformal (1SP)";
1343        createAndVerifyProjection(18181);
1344        createAndVerifyProjection(18182);
1345    }
1346
1347    /**
1348     * Tests “Voirol Unifie” coordinate operation creation from the factory.
1349     *
1350     * <ul>
1351     *   <li>EPSG coordinate operation codes: <b>18021</b>, <b>18022</b></li>
1352     *   <li>EPSG coordinate operation name: <b>Voirol Unifie</b></li>
1353     *   <li>Coordinate operation method: <b>Lambert Conic Conformal (1SP)</b></li>
1354     *   <li>Specific usage / Remarks: <b>Check not old parameters (codes 18011-18012)</b></li>
1355     *   <li>Particularly important to E&amp;P industry.</li>
1356     * </ul>
1357     *
1358     * @throws FactoryException if an error occurred while creating the coordinate operation from the EPSG code.
1359     */
1360    @Test
1361    public void testVoirolUnifie() throws FactoryException {
1362        important  = true;
1363        name       = "Voirol Unifie";
1364        methodName = "Lambert Conic Conformal (1SP)";
1365        createAndVerifyProjection(18021);
1366        createAndVerifyProjection(18022);
1367    }
1368}