Package org.geotools.geometry.xml

Source Code of org.geotools.geometry.xml.GeometryConformanceTestSuite

/*
*    GeoTools - The Open Source Java GIS Toolkit
*    http://geotools.org
*
*    (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
*    This library is free software; you can redistribute it and/or
*    modify it under the terms of the GNU Lesser General Public
*    License as published by the Free Software Foundation;
*    version 2.1 of the License.
*
*    This library is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
*    Lesser General Public License for more details.
*/
package org.geotools.geometry.xml;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.util.Properties;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.geotools.geometry.GeometryBuilder;
import org.geotools.geometry.iso.primitive.PointImpl;
import org.geotools.geometry.iso.root.GeometryImpl;
import org.geotools.geometry.text.WKTParser;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.test.TestData;
import org.opengis.geometry.Boundary;
import org.opengis.geometry.aggregate.MultiPrimitive;
import org.opengis.geometry.coordinate.GeometryFactory;
import org.opengis.geometry.primitive.PrimitiveFactory;
import org.xml.sax.InputSource;

/**
* This TestSuite picks up each JTS test and applies it to the provided
* Geometry*Factory.
*
* If an accompanying .properties file is found, the following entries may
* apply:
*  - disabled=true: eliminates all tests in the xml file
*  - description=skipped: skips the "case" entry with that description
*  - description=intersection|skipped: skips the intersection operation
*  for that description.
*  - description=intersection|WKT TEXT: replaces the expectedResult value
*  with the WKT text.
*  - description=intersection|boundary: for the case of multiprimitives, we need
*  to convert the resulting geometry to a boundary to compare with
*  - description=intersection|point: for the case of points, we need to convert
*  the resulting geometry to a point instead of a position to compare with
*  - description=intersection|skipped|union|skipped: skips both the
* intersection and union operations.
*
* notes:
* - spaces must be replaced by "_" in description
* - "No_description" is the default
*
*
*
*
* @source $URL$
*/
public class GeometryConformanceTestSuite extends TestSuite {

    public static Test suite() {
        GeometryTestParser parser = new GeometryTestParser();

        GeometryConformanceTestSuite suite = new GeometryConformanceTestSuite();

        File dir;
        try {
            dir = TestData.file(GeometryConformanceTestSuite.class, "LineTests.xml")
                    .getParentFile();

            File tests[] = dir.listFiles(new FileFilter() {
                public boolean accept(File pathname) {
                    return pathname.toString().endsWith(".xml");
                }
            });
            for (int i = 0; i < tests.length; i++) {
                File testFile = tests[i];
                Properties excludes = findExclusions(testFile);
                System.out.println("file: "+testFile.getName());
                if (!isAllExcluded(excludes)) {
                    InputStream inputStream = testFile.toURI().toURL().openStream();
                    try {
                        InputSource inputSource = new InputSource(inputStream);
                        GeometryTestContainer container = parser
                                .parseTestDefinition(inputSource);
                       
                        container.addToTestSuite(testFile.getName(), suite, excludes);
                    } catch (Exception eek){
                        //eek.printStackTrace();
                    } finally {
                        inputStream.close();
                    }
                }
            }
        } catch (IOException e) {
            //e.printStackTrace();
        }
        return suite;
    }
   
    private static Properties findExclusions(File xmlFile) {
        try {
            String excludesPath = xmlFile.getPath();
            excludesPath = excludesPath.substring(0, excludesPath.length()-3);
            excludesPath = excludesPath.concat("properties");
            File excludesFile = new File(excludesPath);
            if (excludesFile.exists()) {
                Properties excludes = new Properties();
                InputStream inputStream = excludesFile.toURI().toURL().openStream();
                excludes.load(inputStream);
                return excludes;
            }
        } catch (Exception e) {
        }
        return null;
    }
   
    private static boolean isAllExcluded(Properties prop) {
        if (prop != null && prop.containsKey("disabled")) {
            if (prop.getProperty("disabled").equalsIgnoreCase("true")) {
                return true;   
            }
        }
        return false;   
    }
   
    public static boolean hasExclusion(Properties prop, String testName) {
        if (prop != null && prop.containsKey(testName)) {
            return true;
        }
        return false;
    }
   
    public static boolean isExcluded(Properties prop, String testName) {
        String key = testName.replaceAll(" ", "_");
        if (hasExclusion(prop, key)) {
            if (prop.getProperty(key).equalsIgnoreCase("skipped")) {
                return true;
            }
        }
        return false;
    }
   
    /**
     * Scans the operations in the testcase and removes or replaces the entries
     * as specified in the excludes property.
     *
     * @param testCase
     * @param excludes
     * @return
     */
    public static GeometryTestCase overrideOps(GeometryTestCase testCase, Properties excludes) {
        String test = testCase.getDescription().replaceAll(" ", "_");
        if (excludes != null && excludes.containsKey(test)) {
            String value = excludes.getProperty(test);
            if (value.contains("|")) {
                String[] strings = value.split("\\|");
                for (int i = 0; i < strings.length; i++) {
                    String operationName = strings[i];
                    String operationValue = strings[++i];
                    GeometryTestOperation op = testCase.findTestOperation(operationName);
                    if (op != null) {
                        testCase.removeTestOperation(op);
                        //check for override, rather than just remove
                        if (operationValue.equalsIgnoreCase("skipped")) {
                          continue;
                        }
                        else if (operationValue.equalsIgnoreCase("boundary")) {
                          // post process into a surface boundary
                          GeometryImpl curves = (GeometryImpl) op.getExpectedResult();
                          //MultiPrimitive curves = (MultiPrimitive) op.getExpectedResult();
                          Boundary boundary = curves.getBoundary();
                          op.setExpectedResult( boundary );
                        }
                        else if (operationValue.equalsIgnoreCase("point")) {
                          // post obj into a point
                          PointImpl point = (PointImpl) op.getExpectedResult();
                          op.setExpectedResult( point );
                        }
                        else { // try parsing this thing as WKT
                          GeometryBuilder builder = new GeometryBuilder(DefaultGeographicCRS.WGS84);
                            GeometryFactory geomFact = builder.getGeometryFactory();
                            PrimitiveFactory primFact = builder.getPrimitiveFactory();
                            WKTParser wktFactory = new WKTParser(geomFact, primFact, null, builder.getAggregateFactory());
                            try {
                                Object expectedResult = wktFactory.parse(operationValue);
                                op.setExpectedResult(expectedResult);
                                testCase.addTestOperation(op);
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
        return testCase;
    }
}
TOP

Related Classes of org.geotools.geometry.xml.GeometryConformanceTestSuite

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.