/*
 * Copyright (c) 2016 Vivid Solutions.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * and Eclipse Distribution License v. 1.0 which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v20.html
 * and the Eclipse Distribution License is available at
 *
 * http://www.eclipse.org/org/documents/edl-v10.php.
 */

package org.locationtech.jts.io.oracle;

import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.io.oracle.OraWriter;

import junit.framework.TestCase;


public class OraWriterSQLTest extends TestCase {
	
	public static void main(String[] args) {
		junit.textui.TestRunner.run(OraWriterSQLTest.class);
	}

	WKTReader wktRdr = new WKTReader();

	public OraWriterSQLTest(String arg) {
		super(arg);
	}

	public void testPoint() throws Exception {
		checkValue("POINT (50 50)",
				"SDO_GEOMETRY(2001,0,SDO_POINT_TYPE(50,50,NULL),NULL,NULL)");
	}

	public void testPointType() throws Exception {
		checkValue("POINT (50 50)", false, -1,
				"SDO_GEOMETRY(2001,0,NULL,SDO_ELEM_INFO_ARRAY(1,1,1),SDO_ORDINATE_ARRAY(50,50))");
	}

	public void testXYZ_LineString() throws Exception {
	  checkValue("LINESTRING (0 0 0, 50 50 100)",
	    "SDO_GEOMETRY(3002,0,NULL,SDO_ELEM_INFO_ARRAY(1,2,1),SDO_ORDINATE_ARRAY(0,0,0,  50,50,100))");
	}

	//============================================================
	
	private void checkValue(String wkt, String sqlExpected) {
		checkValue(wkt, true, -1, sqlExpected);
	}

	private void checkValue(String wkt, boolean isOptimizePoint, int targetDim, String sqlExpected) {
	    Geometry geom = null;
	    try {
	      geom = wktRdr.read(wkt);
	    }
	    catch (ParseException e) {
	      throw new RuntimeException(e);
	    }
	    
	    final OraWriter oraWriter = new OraWriter();
	    if (targetDim > -1) 
	    	oraWriter.setDimension(targetDim);
	    oraWriter.setOptimizePoint(isOptimizePoint);
	    
	    String sql = oraWriter.writeSQL(geom);
	    boolean isEqual = sql.equals(sqlExpected);
	    if (! isEqual) {
	      System.out.println("Error writing  " + wkt);
	      System.out.println("Expected:   " + sqlExpected + "  Actual: " + sql);
	    }
	    assertTrue(isEqual);
	}

}
