/* * 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. */ package ucar.unidata.util.test; import ucar.ma2.*; import java.util.List; import java.io.IOException; /** * @author caron * @since Apr 14, 2008 */ public class UtilsTestStructureArray { public void testArrayStructure(ArrayStructure as) { try { testArrayStructureByRecno(as); testArrayStructureByIterator(as); testArrayStructureByMemberArray(as); } catch (IOException e) { assert false; } } private double testArrayStructureByMemberArray(ArrayStructure as) throws IOException { List<StructureMembers.Member> members = as.getMembers(); for (StructureMembers.Member m : members) { Array memberArray = as.extractMemberArray(m); assert (memberArray.getElementType() == m.getDataType().getPrimitiveClassType()); // random tests if (m.getDataType().isNumeric()) { double sum = 0.0; while (memberArray.hasNext()) sum += memberArray.nextDouble(); return sum; } else if (m.getDataType().isString()) { while (memberArray.hasNext()) System.out.println(" " + memberArray.next()); } } return 0.0; } private void testArrayStructureByIterator(ArrayStructure as) throws IOException { StructureDataIterator si = as.getStructureDataIterator(); try { while (si.hasNext()) { StructureData sdata = si.next(); // run through each member on the StructureData List<StructureMembers.Member> members = sdata.getMembers(); for (StructureMembers.Member m : members) { Array sdataArray = sdata.getArray(m); assert (sdataArray.getElementType() == m.getDataType().getPrimitiveClassType()); } testStructureData(sdata); } } finally { si.finish(); } } private void testArrayStructureByRecno(ArrayStructure as) { // run through each StructureData for (int recno = 0; recno < as.getSize(); recno++) { Object o = as.getObject(recno); assert (o instanceof StructureData); StructureData sdata = as.getStructureData(recno); assert (o == sdata); // run through each member on the StructureData List<StructureMembers.Member> members = sdata.getMembers(); for (StructureMembers.Member m : members) { Array sdataArray = sdata.getArray(m); assert (sdataArray.getElementType() == m.getDataType().getPrimitiveClassType()) : sdataArray.getElementType() +" != "+m.getDataType().getPrimitiveClassType(); Array sdataArray2 = sdata.getArray(m.getName()); UtilsMa2Test.testEquals(sdataArray, sdataArray2); Array a = as.getArray(recno, m); assert (a.getElementType() == m.getDataType().getPrimitiveClassType()); UtilsMa2Test.testEquals(sdataArray, a); testGetArrayByType(as, recno, m, a); } testStructureData(sdata); } } private void testGetArrayByType(ArrayStructure as, int recno, StructureMembers.Member m, Array a) { DataType dtype = m.getDataType(); Object data = null; if (dtype == DataType.DOUBLE) { assert a.getElementType() == double.class; data = as.getJavaArrayDouble(recno, m); } else if (dtype == DataType.FLOAT) { assert a.getElementType() == float.class; data = as.getJavaArrayFloat(recno, m); } else if (dtype == DataType.LONG) { assert a.getElementType() == long.class; data = as.getJavaArrayLong(recno, m); } else if (dtype == DataType.INT) { assert a.getElementType() == int.class; data = as.getJavaArrayInt(recno, m); } else if (dtype == DataType.SHORT) { assert a.getElementType() == short.class; data = as.getJavaArrayShort(recno, m); } else if (dtype == DataType.BYTE) { assert a.getElementType() == byte.class; data = as.getJavaArrayByte(recno, m); } else if (dtype == DataType.CHAR) { assert a.getElementType() == char.class; data = as.getJavaArrayChar(recno, m); } else if (dtype == DataType.STRING) { assert a.getElementType() == String.class; data = as.getJavaArrayString(recno, m); } else if (dtype == DataType.STRUCTURE) { assert a.getElementType() == StructureData.class; ArrayStructure nested = as.getArrayStructure(recno, m); testArrayStructure(nested); } if (data != null) UtilsMa2Test.testJarrayEquals(data, a.getStorage(), m.getSize()); } private void testStructureData(StructureData sdata) { List<StructureMembers.Member> members = sdata.getMembers(); for (StructureMembers.Member m : members) { Array sdataArray = sdata.getArray(m); assert (sdataArray.getElementType() == m.getDataType().getPrimitiveClassType()); Array sdataArray2 = sdata.getArray(m.getName()); UtilsMa2Test.testEquals(sdataArray, sdataArray2); //NCdump.printArray(sdataArray, m.getName(), System.out, null); testGetArrayByType(sdata, m, sdataArray); } } private void testGetArrayByType(StructureData sdata, StructureMembers.Member m, Array a) { DataType dtype = m.getDataType(); Object data = null; if (dtype == DataType.DOUBLE) { assert a.getElementType() == double.class; data = sdata.getJavaArrayDouble(m); } else if (dtype == DataType.FLOAT) { assert a.getElementType() == float.class; data = sdata.getJavaArrayFloat(m); } else if (dtype == DataType.LONG) { assert a.getElementType() == long.class; data = sdata.getJavaArrayLong(m); } else if (dtype == DataType.INT) { assert a.getElementType() == int.class; data = sdata.getJavaArrayInt(m); } else if (dtype == DataType.SHORT) { assert a.getElementType() == short.class; data = sdata.getJavaArrayShort(m); } else if (dtype == DataType.BYTE) { assert a.getElementType() == byte.class; data = sdata.getJavaArrayByte(m); } else if (dtype == DataType.CHAR) { assert a.getElementType() == char.class; data = sdata.getJavaArrayChar(m); } else if (dtype == DataType.STRING) { assert a.getElementType() == String.class; data = sdata.getJavaArrayString(m); } else if (dtype == DataType.STRUCTURE) { assert a.getElementType() == StructureData.class; ArrayStructure nested = sdata.getArrayStructure(m); testArrayStructure(nested); } if (data != null) UtilsMa2Test.testJarrayEquals(data, a.getStorage(), m.getSize()); } }