netcdf-c/nc_test/test_put.m4
2016-10-09 22:13:40 -05:00

1288 lines
43 KiB
Plaintext

dnl This is m4 source.
dnl Process using m4 to produce 'C' language file.
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 2529 2016-10-10 00:12:39Z wkliao $ */
dnl
dnl The following m4 macro is to differentiate PnetCDF and netCDF in terms of
dnl function prefix names (ncmpi_ vs. nc_), integer data types (MPI_Offset
dnl vs. size_t), and function name substrings for external data types.
dnl
dnl define(`PNETCDF')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(`FileClose',`ifdef(`PNETCDF',`ncmpi_close',`nc_close')')dnl
define(`FileOpen', `ifdef(`PNETCDF',`ncmpi_open(comm, $1, $2, info, &ncid);', `file_open($1, $2, &ncid);')')
define(`FileCreate',`ifdef(`PNETCDF',`ncmpi_create(comm, $1, $2, info, &ncid);', `file_create($1, $2, &ncid);')')
define(`EndDef',`ifdef(`PNETCDF',`ncmpi_enddef($1)',`nc_enddef($1)')')dnl
define(`FileDelete',`ifdef(`PNETCDF',`ncmpi_delete($1,$2)',`nc_delete($1)')')dnl
define(`Inq',`ifdef(`PNETCDF',`ncmpi_inq_$1',`nc_inq_$1')')dnl
define(`PutVarArgs',`ifdef(`PNETCDF',`int numVars',`void')')dnl
define(`PutAttArgs',`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(`GetAtt', `ifdef(`PNETCDF',`ncmpi_get_att_$1',`nc_get_att_$1')')dnl
define(`StrError', `ifdef(`PNETCDF',`ncmpi_strerror',`nc_strerror')')dnl
define(`InqFormat',`ifdef(`PNETCDF',`ncmpi_inq_format',`nc_inq_format')')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", StrError (err));
err = Inq(format)(ncid, &cdf_format);
IF (err != NC_NOERR) error("inq_format: %s", StrError (err));
for (i = 0; i < numVars; i++) {
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
if (!canConvert) continue;
err = Inq(var)(ncid, i, name, &datatype, &ndims, dimids, NULL);
IF (err != NC_NOERR)
error("inq_var: %s", 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 = Inq(dim)(ncid, dimids[j], 0, &length);
IF (err != NC_NOERR)
error("inq_dim: %s", 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", StrError (err));
} else {
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 = FileClose (ncid);
IF (err != NC_NOERR)
error("close: %s", 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 = InqFormat (ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", 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 = Inq(att)(ncid, i, ATT_NAME(i,j), &datatype, &length);
IF (err != NC_NOERR)
error("inq_att: %s", 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 = GetAtt($1)(ncid, i, ATT_NAME(i,j), value);
if (nInExtRange == length && nInIntRange == length) {
IF (err != NC_NOERR)
error("%s", StrError (err));
} else {
IF (err != NC_NOERR && err != NC_ERANGE)
error("OK or Range error: err = %d", err);
}
for (k = 0; k < length; k++) {
if (CheckNumRange($1, expect[k], datatype)) {
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(PutVarArgs)
{
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", StrError (err));
return nok;
}
err = InqFormat (ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", StrError (err));
def_dims(ncid);
DefVars(ncid, numVars);
err = EndDef(ncid);
IF (err != NC_NOERR)
error("enddef: %s", StrError (err));
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;
err = PutVar1($1)(BAD_ID, i, index, &value);
IF (err != NC_EBADID)
error("expecting NC_EBADID (bad ncid), but err = %s", nc_err_code_name(err));
ELSE_NOK
err = PutVar1($1)(ncid, BAD_VARID, index, &value);
IF (err != NC_ENOTVAR)
error("expecting NC_ENOTVAR (bad var id), but err = %s", nc_err_code_name(err));
ELSE_NOK
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", StrError (err));
ELSE_NOK
} else {
IF (err != NC_ERANGE) {
error("Range error: err = %d", 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: err = %d", err);
ELSE_NOK
}
}
}
err = FileClose (ncid);
IF (err != NC_NOERR)
error("close: %s", StrError (err));
nok += check_vars_$1(scratch, numVars);
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("remove of %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(PutVarArgs)
{
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", StrError (err));
return nok;
}
err = InqFormat (ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", StrError (err));
def_dims(ncid);
DefVars(ncid, numVars);
err = EndDef(ncid);
IF (err != NC_NOERR)
error("enddef: %s", StrError (err));
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);
err = PutVar($1)(BAD_ID, i, value);
IF (err != NC_EBADID)
error("expecting bad ncid, but err = %d", err);
ELSE_NOK
err = PutVar($1)(ncid, BAD_VARID, value);
IF (err != NC_ENOTVAR)
error("expecting bad var id, but err = %d", 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");
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", StrError (err));
ELSE_NOK
} else {
IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
error("expecting range error, but err = %d", err);
ELSE_NOK
}
} else { /* should flag wrong type even if nothing to write */
IF (nels > 0 && err != NC_ECHAR)
error("wrong type: err = %d", 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 = Inq(varid)(ncid, "cr", &varid);
IF (err != NC_NOERR)
error("inq_varid: %s", StrError (err));
index[0] = NRECS-1;
err = PutVar1(text)(ncid, varid, index, "x");
IF (err != NC_NOERR)
error("put_var1_text_all: %s", 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 bad ncid, but err = %d", 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", StrError (err));
ELSE_NOK
} else {
IF (err != NC_ERANGE)
error("expecting range error, but err = %d", err);
ELSE_NOK
}
} else {
IF (nels > 0 && err != NC_ECHAR)
error("wrong type: err = %d", err);
ELSE_NOK
}
}
}
err = FileClose (ncid);
IF (err != NC_NOERR)
error("close: %s", StrError (err));
nok += check_vars_$1(scratch, numVars);
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("remove of %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(PutVarArgs)
{
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", StrError (err));
return nok;
}
err = InqFormat (ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", StrError (err));
def_dims(ncid);
DefVars(ncid, numVars);
err = EndDef(ncid);
IF (err != NC_NOERR)
error("enddef: %s", StrError (err));
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;
}
err = PutVara($1)(BAD_ID, i, start, edge, value);
IF (err != NC_EBADID)
error("expecting bad ncid, but err = %d", err);
ELSE_NOK
err = PutVara($1)(ncid, BAD_VARID, start, edge, value);
IF (err != NC_ENOTVAR)
error("expecting bad var id, but err = %d", err);
ELSE_NOK
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 bad edge, but err = %d", 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;
}
err = PutVara($1)(BAD_ID, i, start, edge, value);
IF (err != NC_EBADID)
error("expecting bad ncid, but err = %d", err);
ELSE_NOK
err = PutVara($1)(ncid, BAD_VARID, start, edge, value);
IF (err != NC_ENOTVAR)
error("expecting bad var id, but err = %d", err);
ELSE_NOK
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", StrError (err));
ELSE_NOK
} else {
IF (err != NC_ECHAR)
error("wrong type: err = %d", 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", StrError (err));
ELSE_NOK
} else {
IF (err != NC_ERANGE)
error("expecting range error, but err = %d", err);
ELSE_NOK
}
} else {
IF (nels > 0 && err != NC_ECHAR)
error("wrong type: err = %d", err);
ELSE_NOK
}
}
}
err = FileClose (ncid);
IF (err != NC_NOERR)
error("close: %s", StrError (err));
nok += check_vars_$1(scratch, numVars);
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("remove of %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(PutVarArgs)
{
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", StrError (err));
return nok;
}
err = InqFormat (ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", StrError (err));
def_dims(ncid);
DefVars(ncid, numVars);
err = EndDef(ncid);
IF (err != NC_NOERR)
error("enddef: %s", StrError (err));
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;
}
err = PutVars($1)(BAD_ID, i, start, edge, stride, value);
IF (err != NC_EBADID)
error("expecting bad ncid, but err = %d", err);
ELSE_NOK
err = PutVars($1)(ncid, BAD_VARID, start, edge, stride, value);
IF (err != NC_ENOTVAR)
error("expecting bad var id, but err = %d", err);
ELSE_NOK
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("conversion: err = %d", 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 bad edge, but err = %d", err);
ELSE_NOK
edge[j] = 1;
stride[j] = 0;
err = PutVars($1)(ncid, i, start, edge, stride, value);
IF (err != NC_ESTRIDE)
error("expecting bad stride, but err = %d", 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", StrError (err));
ELSE_NOK
} else {
IF (err != NC_ERANGE)
error("expecting range error, but err = %d", err);
ELSE_NOK
}
} else {
IF (nels > 0 && err != NC_ECHAR)
error("wrong type: err = %d", err);
ELSE_NOK
}
}
}
}
err = FileClose (ncid);
IF (err != NC_NOERR)
error("close: %s", StrError (err));
nok += check_vars_$1(scratch, numVars);
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("remove of %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(PutVarArgs)
{
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", StrError (err));
return nok;
}
err = InqFormat (ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", StrError (err));
def_dims(ncid);
DefVars(ncid, numVars);
err = EndDef(ncid);
IF (err != NC_NOERR)
error("enddef: %s", StrError (err));
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;
}
err = PutVarm($1)(BAD_ID, i, start, edge, stride, imap, value);
IF (err != NC_EBADID)
error("expecting bad ncid, but err = %d", err);
ELSE_NOK
err = PutVarm($1)(ncid, BAD_VARID, start, edge, stride, imap, value);
IF (err != NC_ENOTVAR)
error("expecting bad var id, but err = %d", err);
ELSE_NOK
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("conversion: err = %d", 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 bad edge, but err = %d", 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 bad stride, but err = %d", 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", StrError (err));
ELSE_NOK
} else {
IF (err != NC_ERANGE)
error("expecting range error, but err = %d", err);
ELSE_NOK
}
} else {
IF (nels > 0 && err != NC_ECHAR)
error("wrong type: err = %d", err);
ELSE_NOK
}
}
}
}
err = FileClose (ncid);
IF (err != NC_NOERR)
error("close: %s", StrError (err));
nok += check_vars_$1(scratch, numVars);
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("remove of %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(PutAttArgs)
{
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", StrError (err));
return nok;
}
def_dims(ncid);
DefVars(ncid, numVars);
{
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("should be NC_EBADNAME: err = %d", 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)(BAD_ID, i, ATT_NAME(i,j), ATT_LEN(i,j), value);
IF (err != NC_EBADID)
error("expecting bad ncid, but err = %d", err);
ELSE_NOK
err = PutAtt(text)(ncid, BAD_VARID, ATT_NAME(i,j), ATT_LEN(i,j), value);
IF (err != NC_ENOTVAR)
error("expecting bad var id, but err = %d", 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", StrError (err));
ELSE_NOK
}
}
}
nok += check_atts_text(ncid, numGatts, numVars);
err = FileClose (ncid);
IF (err != NC_NOERR)
error("close: %s", StrError (err));
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("remove of %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(PutAttArgs)
{
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", StrError (err));
return nok;
}
err = InqFormat (ncid, &cdf_format);
IF (err != NC_NOERR)
error("inq_format: %s", StrError (err));
def_dims(ncid);
DefVars(ncid, numVars);
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)(BAD_ID, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
IF (err != NC_EBADID)
error("expecting bad ncid, but err = %d", err);
ELSE_NOK
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 bad var id, but err = %d", 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 bad type, but err = %d", 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", StrError (err));
ELSE_NOK
} else {
IF (err != NC_ERANGE)
error("expecting range error, but err = %d", err);
ELSE_NOK
}
}
}
}
nok += check_atts_$1(ncid, numGatts, numVars);
err = FileClose (ncid);
IF (err != NC_NOERR)
error("close: %s", StrError (err));
err = FileDelete(scratch, info);
IF (err != NC_NOERR)
error("remove of %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)