/* * Copyright 1998-2009 University Corporation for Atmospheric Research/Unidata * * Portions of this software were developed by the Unidata Program at the * University Corporation for Atmospheric Research. * * Access and use of this software shall impose the following obligations * and understandings on the user. The user is granted the right, without * any fee or cost, to use, copy, modify, alter, enhance and distribute * this software, and any derivative works thereof, and its supporting * documentation for any purpose whatsoever, provided that this entire * notice appears in all copies of the software, derivative works and * supporting documentation. Further, UCAR requests that the user credit * UCAR/Unidata in any publications that result from the use of this * software or in any product that includes this software. The names UCAR * and/or Unidata, however, may not be used in any advertising or publicity * to endorse or promote any products or commercial entity unless specific * written permission is obtained from UCAR/Unidata. The user also * understands that UCAR/Unidata is not obligated to provide the user with * any support, consulting, training or assistance of any kind with regard * to the use, operation and performance of this software nor to provide * the user with any updates, revisions, new versions or "bug fixes." * * THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE. */ // $Id: TestTrajectoryObsDataset.java 51 2006-07-12 17:13:13Z caron $ package ucar.nc2.dt.trajectory; import static org.junit.Assert.*; import ucar.ma2.Array; import ucar.ma2.DataType; import ucar.ma2.InvalidRangeException; import ucar.ma2.StructureData; import ucar.nc2.Attribute; import ucar.nc2.VariableSimpleIF; import ucar.nc2.dt.PointObsDatatype; import ucar.nc2.dt.TrajectoryObsDataset; import ucar.nc2.dt.TrajectoryObsDatatype; import ucar.nc2.dt.DataIterator; import ucar.nc2.units.SimpleUnit; import ucar.unidata.geoloc.LatLonRect; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.List; /** * Test all TrajectoryObsDataset implementations. * * @author edavis * @since Feb 23, 2005T4:23:04 PM */ public class TestTrajectoryObsDataset { static void assertTrajectoryObsDatasetInfoAsExpected(TrajectoryObsDataset trajDs, TestTrajectoryObsDataset.TrajDatasetInfo trajDsInfo) throws IOException { // Check TypedDataset stuff. assertTrue("Title <" + trajDs.getTitle() + "> is not as expected <" + trajDsInfo.getTitle() + ">.", (trajDsInfo.getTitle() == null ? trajDs.getTitle() == null : trajDsInfo.getTitle().equals(trajDs.getTitle()))); assertTrue("Description <" + trajDs.getDescription() + "> is not as expected <" + trajDsInfo.getDescription() + ">.", (trajDsInfo.getDescription() == null ? trajDs.getDescription() == null : trajDsInfo.getDescription().equals(trajDs.getDescription()))); assertTrue("Dataset location URI <" + trajDs.getLocationURI() + "> not as expected <" + trajDsInfo.getLocationURI() + ">.", new File(trajDsInfo.getLocationURI()).toURI().equals(new File(trajDs.getLocationURI()).toURI())); assertTrue("Start date <" + trajDs.getStartDate() + " - " + trajDs.getStartDate().getTime() + "> not as expected <" + trajDsInfo.getStartDateLong() + ">.", trajDs.getStartDate().getTime() == trajDsInfo.getStartDateLong()); assertTrue("End date <" + trajDs.getEndDate() + " - " + trajDs.getEndDate().getTime() + "> not as expected <" + trajDsInfo.getEndDateLong() + ">.", trajDs.getEndDate().getTime() == trajDsInfo.getEndDateLong()); assertTrue("Bounding box <" + trajDs.getBoundingBox() + "> not as expteced <" + trajDsInfo.getBb() + ">.", (trajDsInfo.getBb() == null ? trajDs.getBoundingBox() == null : trajDsInfo.getBb().equals(trajDs.getBoundingBox()))); // Check global attributes from TypedDataset. List globalAtts = trajDs.getGlobalAttributes(); assertTrue("Global attributes list is null.", globalAtts != null); // assertTrue( "Number of global attributes <" + globalAtts.size() + "> not as expected <" + trajDsInfo.getNumGlobalAtts() + ">.", globalAtts.size() == trajDsInfo.getNumGlobalAtts() ); Attribute gatt = trajDs.findGlobalAttributeIgnoreCase(trajDsInfo.getExampGlobalAttName()); assertTrue("Global attribute \"" + trajDsInfo.getExampGlobalAttName() + "\" <" + gatt.getStringValue() + "> does not contain expected substring <" + trajDsInfo.getExampGlobalAttValSubstring() + ">.", gatt.getStringValue().contains(trajDsInfo.getExampGlobalAttValSubstring())); // Check data variables from TypedDataset. List dataVars = trajDs.getDataVariables(); assertTrue("Data vars list is null.", dataVars != null); assertTrue("Size of data vars list <" + dataVars.size() + "> not as expected <" + trajDsInfo.getNumVars() + ">.", dataVars.size() == trajDsInfo.getNumVars()); VariableSimpleIF tdv = trajDs.getDataVariable(trajDsInfo.getExampleVarName()); assertTrue("Variable \"" + trajDsInfo.getExampleVarName() + "\" not found.", tdv != null); assertTrue("Variable name <" + tdv.getShortName() + "> not as expected <" + trajDsInfo.getExampleVarName() + ">.", tdv.getShortName().equals(trajDsInfo.getExampleVarName())); assertTrue("Variable description <" + tdv.getDescription() + "> not as expected <" + trajDsInfo.getExampleVarDescription() + ">.", tdv.getDescription().equals(trajDsInfo.getExampleVarDescription())); assertTrue("Variable units <" + tdv.getUnitsString() + "> not convertable to <" + trajDsInfo.getExampleVarUnitsString() + ">.", tdv.getUnitsString().equals(trajDsInfo.getExampleVarUnitsString()) || SimpleUnit.isCompatible(tdv.getUnitsString(), trajDsInfo.getExampleVarUnitsString())); assertTrue("Variable rank <" + tdv.getRank() + "> not as expected <" + trajDsInfo.getExampleVarRank() + ">.", tdv.getRank() == trajDsInfo.getExampleVarRank()); assertTrue("Variable shape <" + toStringIntArray(tdv.getShape()) + "> not as expected <" + toStringIntArray(trajDsInfo.getExampleVarShape()) + ">.", compareIntArray(tdv.getShape(), trajDsInfo.getExampleVarShape())); assertTrue("Variable data type <" + tdv.getDataType() + "> not as expected <" + trajDsInfo.getExampleVarDataType() + ">.", tdv.getDataType().equals(DataType.getType(trajDsInfo.getExampleVarDataType()))); assertTrue("Num variable attributes <" + tdv.getAttributes().size() + "> not as expected <" + trajDsInfo.getExampleVarNumAtts() + ">.", tdv.getAttributes().size() == trajDsInfo.getExampleVarNumAtts()); // Check the underlying nc file. assertTrue("Underlying netCDF file <" + trajDs.getNetcdfFile().getLocation() + "> not as expected <" + trajDsInfo.getLocationURI() + ">.", new File(trajDs.getNetcdfFile().getLocation()).toURI().equals(new File(trajDsInfo.getLocationURI()).toURI())); // Check trajectory stuff. List trajNames = trajDs.getTrajectoryIds(); assertTrue("Number of trajectory names <" + trajNames.size() + "> more than expected <" + trajDsInfo.getNumTrajs() + ">.", trajNames.size() == trajDsInfo.getNumTrajs()); TrajectoryObsDatatype traj1 = trajDs.getTrajectory(trajDsInfo.getExTrajId()); assertTrue("Trajectory name <" + traj1.getId() + "> not as expected <" + trajDsInfo.getExTrajId() + ">.", (trajDsInfo.getExTrajId() == null ? traj1.getId() == null : trajDsInfo.getExTrajId().equals(traj1.getId()))); assertTrue("Trajectory description <" + traj1.getDescription() + "> not as expected <" + trajDsInfo.getExTrajDesc() + ">.", (trajDsInfo.getExTrajDesc() == null ? traj1.getDescription() == null : trajDsInfo.getExTrajDesc().equals(traj1.getDescription()))); assertTrue("Number of points in trajectory <" + traj1.getNumberPoints() + "> not as expected <" + trajDsInfo.getExTrajNumPoints() + ">.", traj1.getNumberPoints() == trajDsInfo.getExTrajNumPoints()); // Check start and end values of time, lat, lon, and elev. Date startDate = null, endDate = null; double startLat = 0, startLon = 0, startElev = 0; double endLat = 0, endLon = 0, endElev = 0; try { startDate = traj1.getTime(0); startLat = traj1.getLatitude(0); startLon = traj1.getLongitude(0); startElev = traj1.getElevation(0); endDate = traj1.getTime(traj1.getNumberPoints() - 1); endLat = traj1.getLatitude(traj1.getNumberPoints() - 1); endLon = traj1.getLongitude(traj1.getNumberPoints() - 1); endElev = traj1.getElevation(traj1.getNumberPoints() - 1); } catch (IOException e) { assertTrue("Couldn't read first/last time, lat, lon, elev from trajectory.", false); } assertTrue("Traj start date <" + startDate + " - " + startDate.getTime() + "> not as expected <" + trajDsInfo.getStartDateLong() + ">.", startDate.getTime() == trajDsInfo.getStartDateLong()); assertTrue("Traj end date <" + endDate + " - " + endDate.getTime() + "> not as expected <" + trajDsInfo.getEndDateLong() + ">.", endDate.getTime() == trajDsInfo.getEndDateLong()); assertTrue("Start latitude <" + startLat + "> not as expected <" + trajDsInfo.getExampleTrajStartLat() + ">.", doubleWithinEpsilon(startLat, trajDsInfo.getExampleTrajStartLat(), 0.0001)); assertTrue("End latitude <" + endLat + "> not as expected <" + trajDsInfo.getExampleTrajEndLat() + ">.", doubleWithinEpsilon(endLat, trajDsInfo.getExampleTrajEndLat(), 0.0001)); assertTrue("Start longitude <" + startLon + "> not as expected <" + trajDsInfo.getExampleTrajStartLon() + ">.", doubleWithinEpsilon(startLon, trajDsInfo.getExampleTrajStartLon(), 0.0001)); assertTrue("End longitude <" + endLon + "> not as expected <" + trajDsInfo.getExampleTrajEndLon() + ">.", doubleWithinEpsilon(endLon, trajDsInfo.getExampleTrajEndLon(), 0.0001)); assertTrue("Start elevation <" + startElev + "> not as expected <" + trajDsInfo.getExampleTrajStartElev() + ">.", doubleWithinEpsilon(startElev, trajDsInfo.getExampleTrajStartElev(), 0.0001)); assertTrue("End elevation <" + endElev + "> not as expected <" + trajDsInfo.getExampleTrajEndElev() + ">.", doubleWithinEpsilon(endElev, trajDsInfo.getExampleTrajEndElev(), 0.0001)); // Check the first and last values of the example variable. Object exampleVarStartVal = null; Object exampleVarEndVal = null; try { Array array = traj1.getData(0, trajDsInfo.getExampleVarName()); exampleVarStartVal = array.getObject(array.getIndex()); array = traj1.getData(traj1.getNumberPoints() - 1, trajDsInfo.getExampleVarName()); exampleVarEndVal = array.getObject(array.getIndex()); } catch (Exception e) { assertTrue("Failed to read start and end values of " + trajDsInfo.getExampleVarName() + ": " + e.getMessage(), false); } assertTrue("Example variable \"" + trajDsInfo.getExampleVarName() + "\" start value <" + exampleVarStartVal + "> not as expected <" + trajDsInfo.getExampleVarStartVal() + "> or " + "end value <" + exampleVarEndVal + "> not as expected <" + trajDsInfo.getExampleVarEndVal() + ">.", doubleWithinEpsilon(((Float) trajDsInfo.getExampleVarStartVal()).doubleValue(), ((Float) exampleVarStartVal).doubleValue(), 0.0001) && doubleWithinEpsilon(((Float) trajDsInfo.getExampleVarEndVal()).doubleValue(), ((Float) exampleVarEndVal).doubleValue(), 0.0001)); // assertTrue( "Variables' first two values <" + windSpd[0] + "," + windSpd[1] + "> not as expected <" + varVals[0] + "," + varVals[1] + ">.", // windSpd[0] == varVals[0] && windSpd[1] == varVals[1] ); // Test with getPointObsData() PointObsDatatype pointOb; try { pointOb = traj1.getPointObsData(0); } catch (IOException e) { assertTrue("IOException on call to getPointObsData(0): " + e.getMessage(), false); return; } assertTrue("Start time (getPointObsData) <" + pointOb.getNominalTimeAsDate().getTime() + "> not as expected <" + trajDsInfo.getStartDateLong() + ">.", pointOb.getNominalTimeAsDate().getTime() == trajDsInfo.getStartDateLong()); assertTrue("Start lat (getPointObsData) <" + pointOb.getLocation().getLatitude() + "> not as expected <" + trajDsInfo.getExampleTrajStartLat() + ">.", doubleWithinEpsilon(pointOb.getLocation().getLatitude(), trajDsInfo.getExampleTrajStartLat(), 0.0001)); assertTrue("Start lon (getPointObsData) <" + pointOb.getLocation().getLongitude() + "> not as expected <" + trajDsInfo.getExampleTrajStartLon() + ">.", doubleWithinEpsilon(pointOb.getLocation().getLongitude(), trajDsInfo.getExampleTrajStartLon(), 0.0001)); assertTrue("Start alt (getPointObsData) <" + pointOb.getLocation().getAltitude() + "> not as expected <" + trajDsInfo.getExampleTrajStartElev() + ">.", doubleWithinEpsilon(pointOb.getLocation().getAltitude(), trajDsInfo.getExampleTrajStartElev(), 0.0001)); // Test with StructureData sdata; try { sdata = traj1.getData(0); } catch (IOException e) { assertTrue("IOException on getData(0): " + e.getMessage(), false); return; } catch (InvalidRangeException e) { assertTrue("InvalidRangeException on getData(0): " + e.getMessage(), false); return; } assertTrue("Null StructureData from getData(0).", sdata != null); // Test with getDataIterator() DataIterator it; try { it = traj1.getDataIterator(0); } catch (IOException e) { assertTrue("IOException on call to trajectory.getDataIterator(): " + e.getMessage(), false); return; } if (it == null) { System.out.println("Null trajectory iterator, skipping iterator tests."); return; } if (!it.hasNext()) { assertTrue("First call to Iterator.hasNext() returned false.", false); return; } pointOb = (PointObsDatatype) it.nextData(); assertTrue("Start time (iterator) <" + pointOb.getNominalTimeAsDate().getTime() + "> not as expected <" + trajDsInfo.getStartDateLong() + ">.", pointOb.getNominalTimeAsDate().getTime() == trajDsInfo.getStartDateLong()); assertTrue("Start lat (iterator) <" + pointOb.getLocation().getLatitude() + "> not as expected <" + trajDsInfo.getExampleTrajStartLat() + ">.", doubleWithinEpsilon(pointOb.getLocation().getLatitude(), trajDsInfo.getExampleTrajStartLat(), 0.0001)); assertTrue("Start lon (iterator) <" + pointOb.getLocation().getLongitude() + "> not as expected <" + trajDsInfo.getExampleTrajStartLon() + ">.", doubleWithinEpsilon(pointOb.getLocation().getLongitude(), trajDsInfo.getExampleTrajStartLon(), 0.0001)); assertTrue("Start alt (iterator) <" + pointOb.getLocation().getAltitude() + "> not as expected <" + trajDsInfo.getExampleTrajStartElev() + ">.", doubleWithinEpsilon(pointOb.getLocation().getAltitude(), trajDsInfo.getExampleTrajStartElev(), 0.0001)); } private static boolean compareIntArray(int[] array1, int[] array2) { return (TestTrajectoryObsDataset.toStringIntArray(array1).equals(TestTrajectoryObsDataset.toStringIntArray(array2))); } private static String toStringIntArray(int[] array) { int size = array.length; StringBuffer rep = new StringBuffer("int[]=(").append(size).append("){"); for (int i = 0; i < size; i++) { rep.append(array[i]).append(","); } return (rep.toString()); } private static boolean doubleWithinEpsilon(double value, double target, double epsilon) { return (target - epsilon <= value && value <= target + epsilon); } static class TrajDatasetInfo { private String title; private String description; private String locationURI; private long startDateLong; private long endDateLong; private LatLonRect bb; private int numGlobalAtts; private String exampGlobalAttName; private String exampGlobalAttValSubstring; private int numVars; private String exampleVarName; private String exampleVarDescription; private String exampleVarUnitsString; private int exampleVarRank; private int[] exampleVarShape; private String exampleVarDataType; private int exampleVarNumAtts; private Object exampleVarStartVal; private Object exampleVarEndVal; private int numTrajs; private String exTrajId; private String exTrajDesc; private int exTrajNumPoints; private float exampleTrajStartLat; private float exampleTrajEndLat; private float exampleTrajStartLon; private float exampleTrajEndLon; private float exampleTrajStartElev; private float exampleTrajEndElev; public TrajDatasetInfo(String title, String description, String locationURI, long startDateLong, long endDateLong, LatLonRect bb, int numGlobalAtts, String exampGlobalAttName, String exampGlobalAttVal, int numVars, String exampleVarName, String exampleVarDescription, String exampleVarUnitsString, int exampleVarRank, int[] exampleVarShape, String exampleVarDataType, int exampleVarNumAtts, Object exampleVarStartVal, Object exampleVarEndVal, int numTrajs, String exTrajId, String exTrajDesc, int exTrajNumPoints, float exampleTrajStartLat, float exampleTrajEndLat, float exampleTrajStartLon, float exampleTrajEndLon, float exampleTrajStartElev, float exampleTrajEndElev) { this.title = title; this.description = description; this.locationURI = locationURI; this.startDateLong = startDateLong; this.endDateLong = endDateLong; this.bb = bb; this.numGlobalAtts = numGlobalAtts; this.exampGlobalAttName = exampGlobalAttName; this.exampGlobalAttValSubstring = exampGlobalAttVal; this.numVars = numVars; this.exampleVarName = exampleVarName; this.exampleVarDescription = exampleVarDescription; this.exampleVarUnitsString = exampleVarUnitsString; this.exampleVarRank = exampleVarRank; this.exampleVarShape = exampleVarShape; this.exampleVarDataType = exampleVarDataType; this.exampleVarNumAtts = exampleVarNumAtts; this.exampleVarStartVal = exampleVarStartVal; this.exampleVarEndVal = exampleVarEndVal; this.numTrajs = numTrajs; this.exTrajId = exTrajId; this.exTrajDesc = exTrajDesc; this.exTrajNumPoints = exTrajNumPoints; this.exampleTrajStartLat = exampleTrajStartLat; this.exampleTrajEndLat = exampleTrajEndLat; this.exampleTrajStartLon = exampleTrajStartLon; this.exampleTrajEndLon = exampleTrajEndLon; this.exampleTrajStartElev = exampleTrajStartElev; this.exampleTrajEndElev = exampleTrajEndElev; } public String getTitle() { return title; } public String getDescription() { return description; } public String getLocationURI() { return locationURI; } public void setLocationURI(String locationURI) { this.locationURI = locationURI; } public long getStartDateLong() { return startDateLong; } public long getEndDateLong() { return endDateLong; } public LatLonRect getBb() { return bb; } public int getNumGlobalAtts() { return numGlobalAtts; } public String getExampGlobalAttName() { return exampGlobalAttName; } public String getExampGlobalAttValSubstring() { return exampGlobalAttValSubstring; } public int getNumVars() { return numVars; } public String getExampleVarName() { return exampleVarName; } public String getExampleVarDescription() { return exampleVarDescription; } public String getExampleVarUnitsString() { return exampleVarUnitsString; } public int getExampleVarRank() { return exampleVarRank; } public int getExampleVarNumAtts() { return exampleVarNumAtts; } public String getExampleVarDataType() { return exampleVarDataType; } public int[] getExampleVarShape() { return exampleVarShape; } public int getNumTrajs() { return numTrajs; } public String getExTrajId() { return exTrajId; } public String getExTrajDesc() { return exTrajDesc; } public int getExTrajNumPoints() { return exTrajNumPoints; } public float getExampleTrajStartLat() { return exampleTrajStartLat; } public float getExampleTrajEndLat() { return exampleTrajEndLat; } public float getExampleTrajStartLon() { return exampleTrajStartLon; } public float getExampleTrajEndLon() { return exampleTrajEndLon; } public float getExampleTrajStartElev() { return exampleTrajStartElev; } public float getExampleTrajEndElev() { return exampleTrajEndElev; } public Object getExampleVarStartVal() { return exampleVarStartVal; } public Object getExampleVarEndVal() { return exampleVarEndVal; } } }