netcdf-c/nc_test/test_put.m4
2016-10-13 02:17:31 -05:00

1338 lines
45 KiB
Plaintext

dnl This is m4 source.
dnl Process using m4 to produce 'C' language file.
dnl
dnl This file is supposed to be the same as PnetCDF's test_put.m4
dnl
dnl If you see this line, you can ignore the next one.
/* Do not edit this file. It is produced from the corresponding .m4 source */
dnl
/*
* Copyright (C) 2003, Northwestern University and Argonne National Laboratory
* See COPYRIGHT notice in top-level directory.
*/
/* $Id: test_put.m4 2542 2016-10-12 21:14:00Z wkliao $ */
dnl
dnl The command-line m4 macro "PNETCDF" is to differentiate PnetCDF and netCDF
dnl in terms of function prefix names (ncmpi_ vs. nc_), integer data types
dnl (MPI_Offset vs. size_t), and function name substrings for external data
dnl types.
dnl
#include "tests.h"
define(`IntType', `ifdef(`PNETCDF',`MPI_Offset',`size_t')')dnl
define(`PTRDType',`ifdef(`PNETCDF',`MPI_Offset',`ptrdiff_t')')dnl
define(`TestFunc',`ifdef(`PNETCDF',`test_ncmpi_put_$1',`test_nc_put_$1')')dnl
define(`APIFunc',` ifdef(`PNETCDF',`ncmpi_$1',`nc_$1')')dnl
define(`FileOpen', `ifdef(`PNETCDF',`ncmpi_open(comm, $1, $2, info, &ncid)', `file_open($1, $2, &ncid)')')dnl
define(`FileCreate',`ifdef(`PNETCDF',`ncmpi_create(comm, $1, $2, info, &ncid)', `file_create($1, $2, &ncid)')')dnl
define(`FileDelete',`ifdef(`PNETCDF',`ncmpi_delete($1,$2)',`nc_delete($1)')')dnl
define(`VarArgs', `ifdef(`PNETCDF',`int numVars',`void')')dnl
define(`AttVarArgs',`ifdef(`PNETCDF',`int numGatts,int numVars',`void')')dnl
define(`PutVar1',`ifdef(`PNETCDF',`ncmpi_put_var1_$1_all',`nc_put_var1_$1')')dnl
define(`PutVar', `ifdef(`PNETCDF',`ncmpi_put_var_$1_all', `nc_put_var_$1')')dnl
define(`PutVara',`ifdef(`PNETCDF',`ncmpi_put_vara_$1_all',`nc_put_vara_$1')')dnl
define(`PutVars',`ifdef(`PNETCDF',`ncmpi_put_vars_$1_all',`nc_put_vars_$1')')dnl
define(`PutVarm',`ifdef(`PNETCDF',`ncmpi_put_varm_$1_all',`nc_put_varm_$1')')dnl
define(`PutAtt', `ifdef(`PNETCDF',`ncmpi_put_att_$1',`nc_put_att_$1')')dnl
define(`GetVar1',`ifdef(`PNETCDF',`ncmpi_get_var1_$1_all',`nc_get_var1_$1')')dnl
define(`DefVars',`ifdef(`PNETCDF',`def_vars($1,$2)',`def_vars($1)')')dnl
undefine(`index')dnl
dnl dnl dnl
dnl
dnl Macros
dnl
dnl dnl dnl
dnl
dnl Upcase(str)
dnl
define(`Upcase',dnl
`dnl
translit($1, abcdefghijklmnopqrstuvwxyz, ABCDEFGHIJKLMNOPQRSTUVWXYZ)')dnl
dnl dnl dnl
dnl
dnl NCT_ITYPE(type)
dnl
define(`NCT_ITYPE', ``NCT_'Upcase($1)')dnl
define(`NC_TYPE', ``NC_'Upcase($1)')dnl
define(`X_MIN', ``X_'Upcase($1)_MIN')dnl
define(`X_MAX', ``X_'Upcase($1)_MAX')dnl
dnl
define(`CheckText', `ifelse(`$1',`text', , `== (NCT_ITYPE($1) == NCT_TEXT)')')dnl
define(`IfCheckTextChar', `ifelse(`$1',`text', `if ($2 != NC_CHAR)')')dnl
define(`CheckNumRange',
`ifelse(`$1',`text', `1',
`inRange3(cdf_format, $2,$3,NCT_ITYPE($1)) && ($2 >= $1_min && $2 <= $1_max)')')dnl
define(`CheckRange',
`ifelse(`$1',`text', `0', `($2 >= $1_min && $2 <= $1_max)')')dnl
define(`CheckRange3',
`ifelse(`$1',`text', `1',
`inRange3(cdf_format, $2,$3,NCT_ITYPE($1))')')dnl
dnl HASH(TYPE)
dnl
define(`HASH',dnl
`dnl
/*
* ensure hash value within range for internal TYPE
*/
static
double
hash_$1(
const int cdf_format,
const nc_type type,
const int rank,
const IntType *index,
const nct_itype itype)
{
const double min = $1_min;
const double max = $1_max;
return MAX(min, MIN(max, hash4(cdf_format, type, rank, index, itype)));
}
')dnl
dnl HASH(text)
#define hash_text hash4
HASH(uchar)
HASH(schar)
HASH(short)
HASH(int)
HASH(long)
HASH(float)
HASH(double)
HASH(ushort)
HASH(uint)
HASH(longlong)
HASH(ulonglong)
dnl CHECK_VARS(TYPE)
dnl
define(`CHECK_VARS',dnl
`dnl
/*
* check all vars in file which are (text/numeric) compatible with TYPE
*/
static
int
check_vars_$1(const char *filename, int numVars)
{
int i, j, d, err, ncid, cdf_format, ndims;
int canConvert; /* Both text or both numeric */
int nok = 0; /* count of valid comparisons */
int dimids[MAX_RANK];
nc_type datatype;
char name[NC_MAX_NAME];
IntType index[MAX_RANK];
IntType length;
double expect;
$1 value;
err = FileOpen(testfile, NC_NOWRITE);
IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err));
err = APIFunc(inq_format)(ncid, &cdf_format);
IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err));
for (i = 0; i < numVars; i++) {
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
if (!canConvert) continue;
err = APIFunc(inq_var)(ncid, i, name, &datatype, &ndims, dimids, NULL);
IF (err != NC_NOERR)
error("inq_var: %s", APIFunc(strerror)(err));
IF (strcmp(name, var_name[i]) != 0)
error("Unexpected var_name");
IF (datatype != var_type[i])
error("Unexpected type");
IF (ndims != var_rank[i])
error("Unexpected rank");
for (j = 0; j < ndims; j++) {
err = APIFunc(inq_dim)(ncid, dimids[j], 0, &length);
IF (err != NC_NOERR)
error("inq_dim: %s", APIFunc(strerror)(err));
IF (length != var_shape[i][j])
error("Unexpected shape");
}
for (j = 0; j < var_nels[i]; j++) {
err = toMixedBase(j, var_rank[i], var_shape[i], index);
IF (err != NC_NOERR)
error("error in toMixedBase 2");
expect = hash4(cdf_format, var_type[i], var_rank[i], index, NCT_ITYPE($1));
err = GetVar1($1)(ncid, i, index, &value);
if (CheckNumRange($1, expect, datatype)) {
IF (err != NC_NOERR) {
error("get_var1_$1_all: %s", APIFunc(strerror)(err));
} else {
ifelse(`$1', `uchar', `
/* in put_vars(), API _put_vara_double() is used to
* write the NC_BYTE variables to files. In this
* case, NC_BYTE variables are treated as signed
* for CDF-1 and 2 formats. Thus, we must skip the
* equal test below for uchar.
*/
if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect > schar_max) continue;')
IF (!equal(value,expect,var_type[i],NCT_ITYPE($1))) {
error("Var value read not that expected");
if (verbose) {
error("\n");
error("varid: %d, ", i);
error("var_name: %s, ", var_name[i]);
error("var_type: %s, ", s_nc_type(var_type[i]));
error("index:");
for (d = 0; d < var_rank[i]; d++)
error(" %d", index[d]);
error(", expect: %g, ", expect);
error("got: %g", (double) value);
}
} else {
++nok;
}
}
}
}
}
err = APIFunc(close)(ncid);
IF (err != NC_NOERR)
error("close: %s", APIFunc(strerror)(err));
return nok;
}
')dnl
CHECK_VARS(text)
CHECK_VARS(uchar)
CHECK_VARS(schar)
CHECK_VARS(short)
CHECK_VARS(int)
CHECK_VARS(long)
CHECK_VARS(float)
CHECK_VARS(double)
CHECK_VARS(ushort)
CHECK_VARS(uint)
CHECK_VARS(longlong)
CHECK_VARS(ulonglong)
dnl CHECK_ATTS(TYPE)
dnl
define(`CHECK_ATTS',dnl
`dnl
/*
* for _text tests, check all attributes in file which are of text type
* Note no NC_ERANGE check for text attributes as text is not convertible to
* any other numerical data types (i.e. NC_ECHAR)
*
* for other tests, check all numerical attributes in file against values
* outside range of type $1
*/
static
int
check_atts_$1(int ncid, int numGatts, int numVars)
{
int i, j, cdf_format, err;
int canConvert; /* Both text or both numeric */
int nok = 0; /* count of valid comparisons */
IntType k, length;
nc_type datatype;
size_t nInExtRange; /* number values within external range */
size_t nInIntRange; /* number values within internal range */
double expect[MAX_NELS];
$1 value[MAX_NELS];
err = APIFunc(inq_format)(ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", APIFunc(strerror)(err));
for (i = -1; i < numVars; i++) {
for (j = 0; j < NATTS(i); j++) {
canConvert = (ATT_TYPE(i,j) == NC_CHAR) CheckText($1);
if (!canConvert) continue;
err = APIFunc(inq_att)(ncid, i, ATT_NAME(i,j), &datatype, &length);
IF (err != NC_NOERR)
error("inq_att: %s", APIFunc(strerror)(err));
IF (datatype != ATT_TYPE(i,j))
error("inq_att: unexpected type");
IF (length != ATT_LEN(i,j))
error("inq_att: unexpected length");
assert(length <= MAX_NELS);
nInIntRange = nInExtRange = 0;
for (k = 0; k < length; k++) {
expect[k] = hash4(cdf_format, datatype, -1, &k, NCT_ITYPE($1));
if (inRange3(cdf_format, expect[k], datatype, NCT_ITYPE($1))) {
++nInExtRange;
if (CheckRange($1, expect[k]))
++nInIntRange;
}
}
err = APIFunc(get_att_$1)(ncid, i, ATT_NAME(i,j), value);
if (nInExtRange == length && nInIntRange == length) {
IF (err != NC_NOERR)
error("%s", APIFunc(strerror)(err));
} else {
IF (err != NC_NOERR && err != NC_ERANGE)
error("expecting NC_NOERR or NC_ERANGE but got %s", nc_err_code_name(err));
}
for (k = 0; k < length; k++) {
if (CheckNumRange($1, expect[k], datatype)) {
ifelse(`$1', `uchar', `
/* in put_vars(), API _put_vara_double() is used to
* write the NC_BYTE variables to files. In this
* case, NC_BYTE variables are treated as signed
* for CDF-1 and 2 formats. Thus, we must skip the
* equal test below for uchar.
*/
if (cdf_format < NC_FORMAT_CDF5 && ATT_TYPE(i,j) == NC_BYTE && expect[k] > schar_max) continue;')
IF (!equal(value[k],expect[k],datatype,NCT_ITYPE($1))) {
error("att. value read not that expected");
if (verbose) {
error("\n");
error("varid: %d, ", i);
error("att_name: %s, ", ATT_NAME(i,j));
error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
error("element number: %d ", k);
error("expect: %g, ", expect[k]);
error("got: %g", (double) value[k]);
}
} else {
nok++;
}
}
}
}
}
return nok;
}
')dnl
CHECK_ATTS(text)
CHECK_ATTS(uchar)
CHECK_ATTS(schar)
CHECK_ATTS(short)
CHECK_ATTS(int)
CHECK_ATTS(long)
CHECK_ATTS(float)
CHECK_ATTS(double)
CHECK_ATTS(ushort)
CHECK_ATTS(uint)
CHECK_ATTS(longlong)
CHECK_ATTS(ulonglong)
dnl TEST_NC_PUT_VAR1(TYPE)
dnl
define(`TEST_NC_PUT_VAR1',dnl
`dnl
int
TestFunc(var1)_$1(VarArgs)
{
int i, j, err, ncid, cdf_format, nok=0;
IntType index[MAX_RANK];
int canConvert; /* Both text or both numeric */
$1 value = 5; /* any value would do - only for error cases */
err = FileCreate(scratch, NC_CLOBBER);
IF (err != NC_NOERR) {
error("create: %s", APIFunc(strerror)(err));
return nok;
}
err = APIFunc(inq_format)(ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", APIFunc(strerror)(err));
def_dims(ncid);
DefVars(ncid, numVars);
err = APIFunc(enddef)(ncid);
IF (err != NC_NOERR)
error("enddef: %s", APIFunc(strerror)(err));
/* check if can detect a bad file ID */
err = PutVar1($1)(BAD_ID, 0, NULL, &value);
IF (err != NC_EBADID)
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
ELSE_NOK
/* check if can detect a bad variable ID */
err = PutVar1($1)(ncid, BAD_VARID, NULL, &value);
IF (err != NC_ENOTVAR)
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
ELSE_NOK
for (i = 0; i < numVars; i++) {
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
for (j = 0; j < var_rank[i]; j++)
index[j] = 0;
if (canConvert) {
for (j = 0; j < var_rank[i]; j++) {
if (var_dimid[i][j] > 0) { /* skip record dim */
index[j] = var_shape[i][j]; /* out of boundary check */
err = PutVar1($1)(ncid, i, index, &value);
IF (err != NC_EINVALCOORDS)
error("expecting NC_EINVALCOORDS, but got %s", nc_err_code_name(err));
ELSE_NOK
index[j] = 0;
}
}
}
for (j = 0; j < var_nels[i]; j++) {
err = toMixedBase(j, var_rank[i], var_shape[i], index);
IF (err != NC_NOERR)
error("error in toMixedBase 1");
value = hash_$1(cdf_format, var_type[i], var_rank[i], index, NCT_ITYPE($1));
if (var_rank[i] == 0 && i%2 == 0)
err = PutVar1($1)(ncid, i, NULL, &value);
else
err = PutVar1($1)(ncid, i, index, &value);
if (canConvert) {
if (CheckRange3($1, value, var_type[i])) {
IF (err != NC_NOERR)
error("%s", APIFunc(strerror)(err));
ELSE_NOK
} else {
IF (err != NC_ERANGE) {
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
error("\n\t\tfor type %s value %.17e %ld",
s_nc_type(var_type[i]),
(double)value, (long)value);
}
ELSE_NOK
}
} else {
IF (err != NC_ECHAR)
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
ELSE_NOK
}
}
}
err = APIFunc(close)(ncid);
IF (err != NC_NOERR)
error("close: %s", APIFunc(strerror)(err));
nok += check_vars_$1(scratch, numVars);
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("delete file %s failed", scratch);
return nok;
}
')dnl
TEST_NC_PUT_VAR1(text)
TEST_NC_PUT_VAR1(uchar)
TEST_NC_PUT_VAR1(schar)
TEST_NC_PUT_VAR1(short)
TEST_NC_PUT_VAR1(int)
TEST_NC_PUT_VAR1(long)
TEST_NC_PUT_VAR1(float)
TEST_NC_PUT_VAR1(double)
TEST_NC_PUT_VAR1(ushort)
TEST_NC_PUT_VAR1(uint)
TEST_NC_PUT_VAR1(longlong)
TEST_NC_PUT_VAR1(ulonglong)
dnl TEST_NC_PUT_VAR(TYPE)
dnl
define(`TEST_NC_PUT_VAR',dnl
`dnl
int
TestFunc(var)_$1(VarArgs)
{
int i, j, err, nels, ncid, varid, cdf_format, nok=0;
int canConvert; /* Both text or both numeric */
int allInExtRange; /* all values within external range? */
IntType index[MAX_RANK];
$1 value[MAX_NELS];
err = FileCreate(scratch, NC_CLOBBER);
IF (err != NC_NOERR) {
error("create: %s", APIFunc(strerror)(err));
return nok;
}
err = APIFunc(inq_format)(ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", APIFunc(strerror)(err));
def_dims(ncid);
DefVars(ncid, numVars);
err = APIFunc(enddef)(ncid);
IF (err != NC_NOERR)
error("enddef: %s", APIFunc(strerror)(err));
/* check if can detect a bad file ID */
err = PutVar($1)(BAD_ID, 0, NULL);
IF (err != NC_EBADID)
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
ELSE_NOK
/* check if can detect a bad variable ID */
err = PutVar($1)(ncid, BAD_VARID, NULL);
IF (err != NC_ENOTVAR)
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
ELSE_NOK
for (i = 0; i < numVars; i++) {
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
assert(var_rank[i] <= MAX_RANK);
assert(var_nels[i] <= MAX_NELS);
nels = 1;
for (j = 0; j < var_rank[i]; j++) {
nels *= var_shape[i][j];
}
for (allInExtRange = 1, j = 0; j < nels; j++) {
err = toMixedBase(j, var_rank[i], var_shape[i], index);
IF (err != NC_NOERR)
error("error in toMixedBase 1");
value[j]= hash_$1(cdf_format,var_type[i], var_rank[i], index, NCT_ITYPE($1));
IfCheckTextChar($1, var_type[i])
allInExtRange &= inRange3(cdf_format, value[j], var_type[i], NCT_ITYPE($1));
}
err = PutVar($1)(ncid, i, value);
if (canConvert) {
if (allInExtRange) {
IF (err != NC_NOERR)
error("%s", APIFunc(strerror)(err));
ELSE_NOK
} else {
IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
ELSE_NOK
}
} else { /* should flag wrong type even if nothing to write */
IF (nels > 0 && err != NC_ECHAR)
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
ELSE_NOK
}
}
/* Preceeding has written nothing for record variables, now try */
/* again with more than 0 records */
/* Write record number NRECS to force writing of preceding records */
/* Assumes variable cr is char vector with UNLIMITED dimension */
err = APIFunc(inq_varid)(ncid, "cr", &varid);
IF (err != NC_NOERR)
error("inq_varid: %s", APIFunc(strerror)(err));
index[0] = NRECS-1;
err = PutVar1(text)(ncid, varid, index, "x");
IF (err != NC_NOERR)
error("put_var1_text_all: %s", APIFunc(strerror)(err));
for (i = 0; i < numVars; i++) {
if (var_dimid[i][0] == RECDIM) { /* only test record variables here */
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
assert(var_rank[i] <= MAX_RANK);
assert(var_nels[i] <= MAX_NELS);
err = PutVar($1)(BAD_ID, i, value);
IF (err != NC_EBADID)
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
ELSE_NOK
nels = 1;
for (j = 0; j < var_rank[i]; j++) {
nels *= var_shape[i][j];
}
for (allInExtRange = 1, j = 0; j < nels; j++) {
err = toMixedBase(j, var_rank[i], var_shape[i], index);
IF (err != NC_NOERR)
error("error in toMixedBase 1");
ELSE_NOK
value[j]= hash_$1(cdf_format,var_type[i], var_rank[i], index, NCT_ITYPE($1));
IfCheckTextChar($1, var_type[i])
allInExtRange &= inRange3(cdf_format, value[j], var_type[i], NCT_ITYPE($1));
}
err = PutVar($1)(ncid, i, value);
if (canConvert) {
if (allInExtRange) {
IF (err != NC_NOERR)
error("%s", APIFunc(strerror)(err));
ELSE_NOK
} else {
IF (err != NC_ERANGE)
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
ELSE_NOK
}
} else {
IF (nels > 0 && err != NC_ECHAR)
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
ELSE_NOK
}
}
}
err = APIFunc(close)(ncid);
IF (err != NC_NOERR)
error("close: %s", APIFunc(strerror)(err));
nok += check_vars_$1(scratch, numVars);
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("delete file %s failed", scratch);
return nok;
}
')dnl
TEST_NC_PUT_VAR(text)
TEST_NC_PUT_VAR(uchar)
TEST_NC_PUT_VAR(schar)
TEST_NC_PUT_VAR(short)
TEST_NC_PUT_VAR(int)
TEST_NC_PUT_VAR(long)
TEST_NC_PUT_VAR(float)
TEST_NC_PUT_VAR(double)
TEST_NC_PUT_VAR(ushort)
TEST_NC_PUT_VAR(uint)
TEST_NC_PUT_VAR(longlong)
TEST_NC_PUT_VAR(ulonglong)
dnl TEST_NC_PUT_VARA(TYPE)
dnl
define(`TEST_NC_PUT_VARA',dnl
`dnl
int
TestFunc(vara)_$1(VarArgs)
{
int i, j, k, d, err, nels, nslabs, ncid, cdf_format, nok=0;
int canConvert; /* Both text or both numeric */
int allInExtRange; /* all values within external range? */
IntType start[MAX_RANK], edge[MAX_RANK];
IntType mid[MAX_RANK], index[MAX_RANK];
$1 value[MAX_NELS];
err = FileCreate(scratch, NC_CLOBBER);
IF (err != NC_NOERR) {
error("create: %s", APIFunc(strerror)(err));
return nok;
}
err = APIFunc(inq_format)(ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", APIFunc(strerror)(err));
def_dims(ncid);
DefVars(ncid, numVars);
err = APIFunc(enddef)(ncid);
IF (err != NC_NOERR)
error("enddef: %s", APIFunc(strerror)(err));
/* check if can detect a bad file ID */
err = PutVara($1)(BAD_ID, 0, NULL, NULL, NULL);
IF (err != NC_EBADID)
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
ELSE_NOK
/* check if can detect a bad variable ID */
err = PutVara($1)(ncid, BAD_VARID, NULL, NULL, NULL);
IF (err != NC_ENOTVAR)
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
ELSE_NOK
value[0] = 0;
for (i = 0; i < numVars; i++) {
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
assert(var_rank[i] <= MAX_RANK);
assert(var_nels[i] <= MAX_NELS);
for (j = 0; j < var_rank[i]; j++) {
start[j] = 0;
edge[j] = 1;
}
for (j = 0; j < var_rank[i]; j++) {
if (var_dimid[i][j] > 0) { /* skip record dim */
start[j] = var_shape[i][j]; /* out of boundary check */
err = PutVara($1)(ncid, i, start, edge, value);
IF (canConvert && err != NC_EINVALCOORDS)
error("expecting NC_EINVALCOORDS, but got %s", nc_err_code_name(err));
ELSE_NOK
start[j] = 0;
edge[j] = var_shape[i][j] + 1;
err = PutVara($1)(ncid, i, start, edge, value);
IF (canConvert && err != NC_EEDGE)
error("expecting NC_EEDGE but got %s", nc_err_code_name(err));
ELSE_NOK
edge[j] = 1;
}
}
/* Check correct error returned even when nothing to put */
for (j = 0; j < var_rank[i]; j++) {
edge[j] = 0;
}
for (j = 0; j < var_rank[i]; j++) {
if (var_dimid[i][j] > 0) { /* skip record dim */
start[j] = var_shape[i][j]; /* out of boundary check */
err = PutVara($1)(ncid, i, start, edge, value);
IF (canConvert && err != NC_EINVALCOORDS)
error("expecting NC_EINVALCOORDS, but got %s", nc_err_code_name(err));
ELSE_NOK
start[j] = 0;
}
}
/* wkliao: this test below of put_vara is redundant and incorrectly uses the
value[] set from the previously iteration. There is no such test
in put_vars and put_varm.
err = PutVara($1)(ncid, i, start, edge, value);
if (canConvert) {
IF (err != NC_NOERR)
error("%s", APIFunc(strerror)(err));
ELSE_NOK
} else {
IF (err != NC_ECHAR)
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
ELSE_NOK
}
*/
for (j = 0; j < var_rank[i]; j++) {
edge[j] = 1;
}
/* Choose a random point dividing each dim into 2 parts */
/* Put 2^rank (nslabs) slabs so defined */
nslabs = 1;
for (j = 0; j < var_rank[i]; j++) {
mid[j] = roll( var_shape[i][j] );
nslabs *= 2;
}
/* bits of k determine whether to put lower or upper part of dim */
for (k = 0; k < nslabs; k++) {
nels = 1;
for (j = 0; j < var_rank[i]; j++) {
if ((k >> j) & 1) {
start[j] = 0;
edge[j] = mid[j];
} else {
start[j] = mid[j];
edge[j] = var_shape[i][j] - mid[j];
}
nels *= edge[j];
}
for (allInExtRange = 1, j = 0; j < nels; j++) {
err = toMixedBase(j, var_rank[i], edge, index);
IF (err != NC_NOERR)
error("error in toMixedBase 1");
for (d = 0; d < var_rank[i]; d++)
index[d] += start[d];
value[j]= hash_$1(cdf_format,var_type[i], var_rank[i], index, NCT_ITYPE($1));
IfCheckTextChar($1, var_type[i])
allInExtRange &= inRange3(cdf_format, value[j], var_type[i], NCT_ITYPE($1));
}
if (var_rank[i] == 0 && i%2 == 0)
err = PutVara($1)(ncid, i, NULL, NULL, value);
else
err = PutVara($1)(ncid, i, start, edge, value);
if (canConvert) {
if (allInExtRange) {
IF (err != NC_NOERR)
error("%s", APIFunc(strerror)(err));
ELSE_NOK
} else {
IF (err != NC_ERANGE)
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
ELSE_NOK
}
} else {
IF (nels > 0 && err != NC_ECHAR)
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
ELSE_NOK
}
}
}
err = APIFunc(close)(ncid);
IF (err != NC_NOERR)
error("close: %s", APIFunc(strerror)(err));
nok += check_vars_$1(scratch, numVars);
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("delete file %s failed", scratch);
return nok;
}
')dnl
TEST_NC_PUT_VARA(text)
TEST_NC_PUT_VARA(uchar)
TEST_NC_PUT_VARA(schar)
TEST_NC_PUT_VARA(short)
TEST_NC_PUT_VARA(int)
TEST_NC_PUT_VARA(long)
TEST_NC_PUT_VARA(float)
TEST_NC_PUT_VARA(double)
TEST_NC_PUT_VARA(ushort)
TEST_NC_PUT_VARA(uint)
TEST_NC_PUT_VARA(longlong)
TEST_NC_PUT_VARA(ulonglong)
dnl TEST_NC_PUT_VARS(TYPE)
dnl
define(`TEST_NC_PUT_VARS',dnl
`dnl
int
TestFunc(vars)_$1(VarArgs)
{
int i, j, k, m, d, err, nels, nslabs, ncid, cdf_format, nok=0;
int nstarts; /* number of different starts */
int canConvert; /* Both text or both numeric */
int allInExtRange; /* all values within external range? */
IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
IntType index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
IntType sstride[MAX_RANK];
PTRDType stride[MAX_RANK];
$1 value[MAX_NELS];
err = FileCreate(scratch, NC_CLOBBER);
IF (err != NC_NOERR) {
error("create: %s", APIFunc(strerror)(err));
return nok;
}
err = APIFunc(inq_format)(ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", APIFunc(strerror)(err));
def_dims(ncid);
DefVars(ncid, numVars);
err = APIFunc(enddef)(ncid);
IF (err != NC_NOERR)
error("enddef: %s", APIFunc(strerror)(err));
/* check if can detect a bad file ID */
err = PutVars($1)(BAD_ID, 0, NULL, NULL, NULL, NULL);
IF (err != NC_EBADID)
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
ELSE_NOK
/* check if can detect a bad variable ID */
err = PutVars($1)(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
IF (err != NC_ENOTVAR)
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
ELSE_NOK
for (i = 0; i < numVars; i++) {
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
assert(var_rank[i] <= MAX_RANK);
assert(var_nels[i] <= MAX_NELS);
for (j = 0; j < var_rank[i]; j++) {
start[j] = 0;
edge[j] = 1;
stride[j] = 1;
}
for (j = 0; j < var_rank[i]; j++) {
if (var_dimid[i][j] > 0) { /* skip record dim */
start[j] = var_shape[i][j]; /* out of boundary check */
err = PutVars($1)(ncid, i, start, edge, stride, value);
if (!canConvert) {
IF (err != NC_ECHAR)
error("expecting NC_ECHAR but got %s", nc_err_code_name(err));
ELSE_NOK
} else {
IF (err != NC_EINVALCOORDS)
error("expecting NC_EINVALCOORDS, but got %s", nc_err_code_name(err));
ELSE_NOK
start[j] = 0;
edge[j] = var_shape[i][j] + 1;
err = PutVars($1)(ncid, i, start, edge, stride, value);
IF (err != NC_EEDGE)
error("expecting NC_EEDGE but got %s", nc_err_code_name(err));
ELSE_NOK
edge[j] = 1;
stride[j] = 0;
err = PutVars($1)(ncid, i, start, edge, stride, value);
IF (err != NC_ESTRIDE)
error("expecting NC_ESTRIDE but got %s", nc_err_code_name(err));
ELSE_NOK
stride[j] = 1;
}
}
}
/* Choose a random point dividing each dim into 2 parts */
/* Put 2^rank (nslabs) slabs so defined */
nslabs = 1;
for (j = 0; j < var_rank[i]; j++) {
mid[j] = roll( var_shape[i][j] );
nslabs *= 2;
}
/* bits of k determine whether to put lower or upper part of dim */
/* choose random stride from 1 to edge */
for (k = 0; k < nslabs; k++) {
nstarts = 1;
for (j = 0; j < var_rank[i]; j++) {
if ((k >> j) & 1) {
start[j] = 0;
edge[j] = mid[j];
} else {
start[j] = mid[j];
edge[j] = var_shape[i][j] - mid[j];
}
sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
nstarts *= stride[j];
}
for (m = 0; m < nstarts; m++) {
err = toMixedBase(m, var_rank[i], sstride, index);
IF (err != NC_NOERR)
error("error in toMixedBase");
nels = 1;
for (j = 0; j < var_rank[i]; j++) {
count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
nels *= count[j];
index[j] += start[j];
}
/* Random choice of forward or backward */
/* TODO
if ( roll(2) ) {
for (j = 0; j < var_rank[i]; j++) {
index[j] += (count[j] - 1) * stride[j];
stride[j] = -stride[j];
}
}
*/
for (allInExtRange = 1, j = 0; j < nels; j++) {
err = toMixedBase(j, var_rank[i], count, index2);
IF (err != NC_NOERR)
error("error in toMixedBase");
for (d = 0; d < var_rank[i]; d++)
index2[d] = index[d] + index2[d] * stride[d];
value[j] = hash_$1(cdf_format,var_type[i], var_rank[i], index2,
NCT_ITYPE($1));
IfCheckTextChar($1, var_type[i])
allInExtRange &= inRange3(cdf_format, value[j], var_type[i], NCT_ITYPE($1));
}
if (var_rank[i] == 0 && i%2 == 0)
err = PutVars($1)(ncid, i, NULL, NULL, stride, value);
else
err = PutVars($1)(ncid, i, index, count, stride, value);
if (canConvert) {
if (allInExtRange) {
IF (err != NC_NOERR)
error("%s", APIFunc(strerror)(err));
ELSE_NOK
} else {
IF (err != NC_ERANGE)
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
ELSE_NOK
}
} else {
IF (nels > 0 && err != NC_ECHAR)
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
ELSE_NOK
}
}
}
}
err = APIFunc(close)(ncid);
IF (err != NC_NOERR)
error("close: %s", APIFunc(strerror)(err));
nok += check_vars_$1(scratch, numVars);
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("delete file %s failed", scratch);
return nok;
}
')dnl
TEST_NC_PUT_VARS(text)
TEST_NC_PUT_VARS(uchar)
TEST_NC_PUT_VARS(schar)
TEST_NC_PUT_VARS(short)
TEST_NC_PUT_VARS(int)
TEST_NC_PUT_VARS(long)
TEST_NC_PUT_VARS(float)
TEST_NC_PUT_VARS(double)
TEST_NC_PUT_VARS(ushort)
TEST_NC_PUT_VARS(uint)
TEST_NC_PUT_VARS(longlong)
TEST_NC_PUT_VARS(ulonglong)
dnl TEST_NC_PUT_VARM(TYPE)
dnl
define(`TEST_NC_PUT_VARM',dnl
`dnl
int
TestFunc(varm)_$1(VarArgs)
{
int i, j, k, m, d, err, nels, nslabs, ncid, cdf_format, nok=0;
int nstarts; /* number of different starts */
int canConvert; /* Both text or both numeric */
int allInExtRange; /* all values within external range? */
IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
IntType index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
IntType sstride[MAX_RANK];
PTRDType stride[MAX_RANK], imap[MAX_RANK];
$1 value[MAX_NELS];
err = FileCreate(scratch, NC_CLOBBER);
IF (err != NC_NOERR) {
error("create: %s", APIFunc(strerror)(err));
return nok;
}
err = APIFunc(inq_format)(ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", APIFunc(strerror)(err));
def_dims(ncid);
DefVars(ncid, numVars);
err = APIFunc(enddef)(ncid);
IF (err != NC_NOERR)
error("enddef: %s", APIFunc(strerror)(err));
/* check if can detect a bad file ID */
err = PutVarm($1)(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
IF (err != NC_EBADID)
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
ELSE_NOK
/* check if can detect a bad variable ID */
err = PutVarm($1)(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
IF (err != NC_ENOTVAR)
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
ELSE_NOK
for (i = 0; i < numVars; i++) {
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
assert(var_rank[i] <= MAX_RANK);
assert(var_nels[i] <= MAX_NELS);
for (j = 0; j < var_rank[i]; j++) {
start[j] = 0;
edge[j] = 1;
stride[j] = 1;
imap[j] = 1;
}
for (j = 0; j < var_rank[i]; j++) {
if (var_dimid[i][j] > 0) { /* skip record dim */
start[j] = var_shape[i][j]; /* out of boundary check */
err = PutVarm($1)(ncid, i, start, edge, stride, imap, value);
if (!canConvert) {
IF (err != NC_ECHAR)
error("expecting NC_ECHAR but got %s", nc_err_code_name(err));
ELSE_NOK
} else {
IF (err != NC_EINVALCOORDS)
error("expecting NC_EINVALCOORDS, but got %s", nc_err_code_name(err));
ELSE_NOK
start[j] = 0;
edge[j] = var_shape[i][j] + 1;
err = PutVarm($1)(ncid, i, start, edge, stride, imap, value);
IF (err != NC_EEDGE)
error("expecting NC_EEDGE but got %s", nc_err_code_name(err));
ELSE_NOK
edge[j] = 1;
stride[j] = 0;
err = PutVarm($1)(ncid, i, start, edge, stride, imap, value);
IF (err != NC_ESTRIDE)
error("expecting NC_ESTRIDE but got %s", nc_err_code_name(err));
ELSE_NOK
stride[j] = 1;
}
}
}
/* Choose a random point dividing each dim into 2 parts */
/* Put 2^rank (nslabs) slabs so defined */
nslabs = 1;
for (j = 0; j < var_rank[i]; j++) {
mid[j] = roll( var_shape[i][j] );
nslabs *= 2;
}
/* bits of k determine whether to put lower or upper part of dim */
/* choose random stride from 1 to edge */
for (k = 0; k < nslabs; k++) {
nstarts = 1;
for (j = 0; j < var_rank[i]; j++) {
if ((k >> j) & 1) {
start[j] = 0;
edge[j] = mid[j];
} else {
start[j] = mid[j];
edge[j] = var_shape[i][j] - mid[j];
}
sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
nstarts *= stride[j];
}
for (m = 0; m < nstarts; m++) {
err = toMixedBase(m, var_rank[i], sstride, index);
IF (err != NC_NOERR)
error("error in toMixedBase");
nels = 1;
for (j = 0; j < var_rank[i]; j++) {
count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
nels *= count[j];
index[j] += start[j];
}
/* Random choice of forward or backward */
/* TODO
if ( roll(2) ) {
for (j = 0; j < var_rank[i]; j++) {
index[j] += (count[j] - 1) * stride[j];
stride[j] = -stride[j];
}
}
*/
if (var_rank[i] > 0) {
j = var_rank[i] - 1;
imap[j] = 1;
for (; j > 0; j--)
imap[j-1] = imap[j] * count[j];
}
for (allInExtRange = 1, j = 0; j < nels; j++) {
err = toMixedBase(j, var_rank[i], count, index2);
IF (err != NC_NOERR)
error("error in toMixedBase");
for (d = 0; d < var_rank[i]; d++)
index2[d] = index[d] + index2[d] * stride[d];
value[j] = hash_$1(cdf_format,var_type[i], var_rank[i], index2,
NCT_ITYPE($1));
IfCheckTextChar($1, var_type[i])
allInExtRange &= inRange3(cdf_format, value[j], var_type[i], NCT_ITYPE($1));
}
if (var_rank[i] == 0 && i%2 == 0)
err = PutVarm($1)(ncid,i,NULL,NULL,NULL,NULL,value);
else
err = PutVarm($1)(ncid,i,index,count,stride,imap,value);
if (canConvert) {
if (allInExtRange) {
IF (err != NC_NOERR)
error("%s", APIFunc(strerror)(err));
ELSE_NOK
} else {
IF (err != NC_ERANGE)
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
ELSE_NOK
}
} else {
IF (nels > 0 && err != NC_ECHAR)
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
ELSE_NOK
}
}
}
}
err = APIFunc(close)(ncid);
IF (err != NC_NOERR)
error("close: %s", APIFunc(strerror)(err));
nok += check_vars_$1(scratch, numVars);
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("delete file %s failed", scratch);
return nok;
}
')dnl
TEST_NC_PUT_VARM(text)
TEST_NC_PUT_VARM(uchar)
TEST_NC_PUT_VARM(schar)
TEST_NC_PUT_VARM(short)
TEST_NC_PUT_VARM(int)
TEST_NC_PUT_VARM(long)
TEST_NC_PUT_VARM(float)
TEST_NC_PUT_VARM(double)
TEST_NC_PUT_VARM(ushort)
TEST_NC_PUT_VARM(uint)
TEST_NC_PUT_VARM(longlong)
TEST_NC_PUT_VARM(ulonglong)
int
TestFunc(att)_text(AttVarArgs)
{
int i, j, err, ncid, nok=0;
IntType k;
text value[MAX_NELS];
err = FileCreate(scratch, NC_NOCLOBBER);
IF (err != NC_NOERR) {
error("create: %s", APIFunc(strerror)(err));
return nok;
}
def_dims(ncid);
DefVars(ncid, numVars);
/* check if can detect a bad file ID */
err = PutAtt(text)(BAD_ID, 0, NULL, 0, NULL);
IF (err != NC_EBADID)
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
ELSE_NOK
/* check if can detect a bad variable ID */
err = PutAtt(text)(ncid, BAD_VARID, NULL, 0, NULL);
IF (err != NC_ENOTVAR)
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
ELSE_NOK
{
const char *const tval = "value for bad name";
const size_t tval_len = strlen(tval);
err = PutAtt(text)(ncid, 0, "", tval_len, tval);
IF (err != NC_EBADNAME)
error("expecting NC_EBADNAME but got %s", nc_err_code_name(err));
ELSE_NOK
}
for (i = -1; i < numVars; i++) {
for (j = 0; j < NATTS(i); j++) {
if (ATT_TYPE(i,j) == NC_CHAR) {
assert(ATT_LEN(i,j) <= MAX_NELS);
err = PutAtt(text)(ncid, BAD_VARID, ATT_NAME(i,j), ATT_LEN(i,j), value);
IF (err != NC_ENOTVAR)
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
ELSE_NOK
for (k = 0; k < ATT_LEN(i,j); k++) {
value[k] = hash(ATT_TYPE(i,j), -1, &k);
}
err = PutAtt(text)(ncid, i, ATT_NAME(i,j), ATT_LEN(i,j), value);
IF (err != NC_NOERR)
error("%s", APIFunc(strerror)(err));
ELSE_NOK
}
}
}
nok += check_atts_text(ncid, numGatts, numVars);
err = APIFunc(close)(ncid);
IF (err != NC_NOERR)
error("close: %s", APIFunc(strerror)(err));
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("delete file %s failed", scratch);
return nok;
}
dnl TEST_NC_PUT_ATT(TYPE) numeric only
dnl
define(`TEST_NC_PUT_ATT',dnl
`dnl
int
TestFunc(att)_$1(AttVarArgs)
{
int i, j, err, ncid, cdf_format, nok=0;
int allInExtRange; /* all values within external range? */
IntType k;
$1 value[MAX_NELS];
err = FileCreate(scratch, NC_NOCLOBBER);
IF (err != NC_NOERR) {
error("create: %s", APIFunc(strerror)(err));
return nok;
}
err = APIFunc(inq_format)(ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", APIFunc(strerror)(err));
def_dims(ncid);
DefVars(ncid, numVars);
/* check if can detect a bad file ID */
err = PutAtt($1)(BAD_ID, 0, NULL, 0, 0, NULL);
IF (err != NC_EBADID)
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
ELSE_NOK
/* check if can detect a bad variable ID */
err = PutAtt($1)(ncid, BAD_VARID, NULL, 0, 0, NULL);
IF (err != NC_ENOTVAR)
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
ELSE_NOK
for (i = -1; i < numVars; i++) {
for (j = 0; j < NATTS(i); j++) {
if (!(ATT_TYPE(i,j) == NC_CHAR)) {
assert(ATT_LEN(i,j) <= MAX_NELS);
err = PutAtt($1)(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
IF (err != NC_ENOTVAR)
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
ELSE_NOK
/* check if can detect a bad name */
err = PutAtt($1)(ncid, i, NULL, 0, 0, NULL);
IF (err != NC_EBADNAME)
error("expecting NC_EBADNAME but got %s", nc_err_code_name(err));
ELSE_NOK
err = PutAtt($1)(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
IF (err != NC_EBADTYPE)
error("expecting NC_EBADTYPE but got %s", nc_err_code_name(err));
ELSE_NOK
for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
value[k] = hash_$1(cdf_format,ATT_TYPE(i,j), -1, &k, NCT_ITYPE($1));
IfCheckTextChar($1, ATT_TYPE(i,j))
allInExtRange &= inRange3(cdf_format, value[k], ATT_TYPE(i,j), NCT_ITYPE($1));
}
err = PutAtt($1)(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
if (allInExtRange) {
IF (err != NC_NOERR)
error("%s", APIFunc(strerror)(err));
ELSE_NOK
} else {
IF (err != NC_ERANGE)
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
ELSE_NOK
}
}
}
}
nok += check_atts_$1(ncid, numGatts, numVars);
err = APIFunc(close)(ncid);
IF (err != NC_NOERR)
error("close: %s", APIFunc(strerror)(err));
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("delete file %s failed", scratch);
return nok;
}
')dnl
TEST_NC_PUT_ATT(uchar)
TEST_NC_PUT_ATT(schar)
TEST_NC_PUT_ATT(short)
TEST_NC_PUT_ATT(int)
TEST_NC_PUT_ATT(long)
TEST_NC_PUT_ATT(float)
TEST_NC_PUT_ATT(double)
TEST_NC_PUT_ATT(ushort)
TEST_NC_PUT_ATT(uint)
TEST_NC_PUT_ATT(longlong)
TEST_NC_PUT_ATT(ulonglong)