netcdf-c/nc_test/test_get.m4

1371 lines
51 KiB
Plaintext
Raw Normal View History

2010-06-03 21:24:43 +08:00
dnl This is m4 source.
dnl Process using m4 to produce 'C' language file.
dnl
2016-10-13 15:17:31 +08:00
dnl This file is supposed to be the same as PnetCDF's test_get.m4
dnl
2010-06-03 21:24:43 +08:00
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
2016-10-10 11:13:30 +08:00
/*
* Copyright (C) 2003, Northwestern University and Argonne National Laboratory
* See COPYRIGHT notice in top-level directory.
*/
2017-03-12 02:51:04 +08:00
/* $Id: test_get.m4 2672 2016-12-03 19:23:53Z wkliao $ */
2010-06-03 21:24:43 +08:00
2016-10-10 11:13:30 +08:00
dnl
2016-10-13 15:17:31 +08:00
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.
2016-10-10 11:13:30 +08:00
dnl
#include "tests.h"
ifdef(`PNETCDF',,`dnl
#ifdef USE_PNETCDF
#include <pnetcdf.h>
#ifndef PNETCDF_VERSION_MAJOR
#error("PNETCDF_VERSION_MAJOR is not defined in pnetcdf.h")
#endif
#ifndef PNETCDF_VERSION_MINOR
#error("PNETCDF_VERSION_MAJOR is not defined in pnetcdf.h")
#endif
#endif')
define(`EXPECT_ERR',`error("expecting $1 but got %s",nc_err_code_name($2));')dnl
2016-10-10 11:13:30 +08:00
define(`IntType', `ifdef(`PNETCDF',`MPI_Offset',`size_t')')dnl
define(`PTRDType',`ifdef(`PNETCDF',`MPI_Offset',`ptrdiff_t')')dnl
define(`TestFunc',`ifdef(`PNETCDF',`test_ncmpi_get_$1',`test_nc_get_$1')')dnl
2016-10-13 15:17:31 +08:00
define(`APIFunc',` ifdef(`PNETCDF',`ncmpi_$1',`nc_$1')')dnl
2016-10-10 11:13:30 +08:00
2016-10-13 15:17:31 +08:00
define(`FileOpen', `ifdef(`PNETCDF',`ncmpi_open(comm, $1, $2, info, &ncid)', `file_open($1, $2, &ncid)')')dnl
2016-10-10 11:13:30 +08:00
2016-10-13 15:17:31 +08:00
define(`VarArgs', `ifdef(`PNETCDF',`int numVars',`void')')dnl
define(`AttVarArgs',`ifdef(`PNETCDF',`int numGatts,int numVars',`void')')dnl
2016-10-10 11:13:30 +08:00
define(`GetVar1',`ifdef(`PNETCDF',`ncmpi_get_var1_$1_all',`nc_get_var1_$1')')dnl
define(`GetVar', `ifdef(`PNETCDF',`ncmpi_get_var_$1_all', `nc_get_var_$1')')dnl
define(`GetVara',`ifdef(`PNETCDF',`ncmpi_get_vara_$1_all',`nc_get_vara_$1')')dnl
define(`GetVars',`ifdef(`PNETCDF',`ncmpi_get_vars_$1_all',`nc_get_vars_$1')')dnl
define(`GetVarm',`ifdef(`PNETCDF',`ncmpi_get_varm_$1_all',`nc_get_varm_$1')')dnl
define(`GetAtt', `ifdef(`PNETCDF',`ncmpi_get_att_$1',`nc_get_att_$1')')dnl
define(`PNETCDF_CHECK_ERANGE',`dnl
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,`
`#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)')',
`$1',`schar',`ifdef(`PNETCDF',,`
`#'if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7
else if (cdf_format < NC_FORMAT_CDF5) {
`#'else')')
else {
ifelse(`$1',`schar',`ifdef(`PNETCDF',,``#'endif')')
IF (err != NC_ERANGE)
EXPECT_ERR(NC_ERANGE, err)
ELSE_NOK
}
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')'
)dnl
2010-06-03 21:24:43 +08:00
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
dnl
define(`CheckText', `ifelse(`$1',`text', , `== (NCT_ITYPE($1) == NCT_TEXT)')')dnl
2016-10-10 11:13:30 +08:00
define(`CheckRange',`ifelse(`$1',`text', `1', `($2 >= $1_min && $2 <= $1_max)')')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
2010-06-03 21:24:43 +08:00
dnl TEST_NC_GET_VAR1(TYPE)
dnl
define(`TEST_NC_GET_VAR1',dnl
`dnl
2016-10-10 11:13:30 +08:00
int
2016-10-13 15:17:31 +08:00
TestFunc(var1)_$1(VarArgs)
2010-06-03 21:24:43 +08:00
{
int i=0, err=0, ncid=0, cdf_format=0;
2016-10-10 11:13:30 +08:00
int nok = 0; /* count of valid comparisons */
int canConvert=0; /* Both text or both numeric */
IntType j=0, index[MAX_RANK];
double expect=0;
$1 value[1];
2010-06-03 21:24:43 +08:00
2016-10-13 15:17:31 +08:00
err = FileOpen(testfile, NC_NOWRITE);
IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err));
2016-10-10 11:13:30 +08:00
2016-10-13 15:17:31 +08:00
err = APIFunc(inq_format)(ncid, &cdf_format);
IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err));
2016-10-10 11:13:30 +08:00
2016-10-13 15:17:31 +08:00
/* check if can detect a bad file ID */
err = GetVar1($1)(BAD_ID, 0, NULL, NULL);
2016-10-13 15:17:31 +08:00
IF (err != NC_EBADID)
EXPECT_ERR(NC_EBADID, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
2016-10-10 11:13:30 +08:00
2016-10-13 15:17:31 +08:00
/* check if can detect a bad variable ID */
err = GetVar1($1)(ncid, BAD_VARID, NULL, NULL);
2016-10-13 15:17:31 +08:00
IF (err != NC_ENOTVAR)
EXPECT_ERR(NC_ENOTVAR, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
2016-10-10 11:13:30 +08:00
2016-10-13 15:17:31 +08:00
for (i = 0; i < numVars; i++) {
assert(var_rank[i] <= MAX_RANK);
assert(var_nels[i] <= MAX_NELS);
/* check if can detect a bad file ID */
err = GetVar1($1)(BAD_ID, i, NULL, value);
IF (err != NC_EBADID)
EXPECT_ERR(NC_EBADID, err)
ELSE_NOK
2016-10-13 15:17:31 +08:00
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
2016-10-10 11:13:30 +08:00
ifdef(`PNETCDF',`dnl
/* for non-scalar variables, argument start cannot be NULL */
err = GetVar1($1)(ncid, i, NULL, value);
if (!canConvert) {
IF (err != NC_ECHAR) EXPECT_ERR(NC_ECHAR, err)
}
else if (var_rank[i] == 0) {
index[0] = 0;
expect = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
if (inRange3(cdf_format, expect, var_type[i], NCT_ITYPE($1)) &&
CheckRange($1, expect)) {
IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
}
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')')
else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')
}
else IF (err != NC_EINVALCOORDS) {
EXPECT_ERR(NC_EINVALCOORDS, err)
}
ELSE_NOK
')dnl
/* test NC_EINVALCOORDS */
for (j = 0; j < var_rank[i]; j++) index[j] = 0;
2016-10-10 11:13:30 +08:00
for (j = 0; j < var_rank[i]; j++) {
if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
index[j] = var_shape[i][j]; /* out of boundary check */
err = GetVar1($1)(ncid, i, index, value);
2016-10-10 11:13:30 +08:00
if (!canConvert) {
2016-10-13 15:17:31 +08:00
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
ELSE_NOK
2016-10-10 11:13:30 +08:00
} else IF (err != NC_EINVALCOORDS)
EXPECT_ERR(NC_EINVALCOORDS, err)
2016-10-26 04:11:16 +08:00
ELSE_NOK
index[j] = 0;
2016-10-26 04:11:16 +08:00
}
2016-10-10 11:13:30 +08:00
/* check if the contents are supposed to be */
for (j = 0; j < var_nels[i]; j++) {
err = toMixedBase(j, var_rank[i], var_shape[i], index);
IF (err != 0) error("error in toMixedBase");
2016-10-10 11:13:30 +08:00
/* when file is created the variable contents are generated by
* hash functions */
expect = hash4(cdf_format, var_type[i], var_rank[i], index,
NCT_ITYPE($1));
err = GetVar1($1)(ncid, i, index, value);
2010-06-03 21:24:43 +08:00
if (canConvert) {
2016-10-10 11:13:30 +08:00
if (inRange3(cdf_format, expect,var_type[i], NCT_ITYPE($1))) {
if (CheckRange($1, expect)) {
IF (err != NC_NOERR) {
EXPECT_ERR(NC_NOERR, err)
2016-10-10 11:13:30 +08:00
} else {
2016-10-13 15:17:31 +08:00
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((double)value[0], expect, var_type[i], NCT_ITYPE($1))) {
error("expected: %G, got: %G", expect, (double)value[0]);
2016-10-10 11:13:30 +08:00
}
ELSE_NOK
2016-10-10 11:13:30 +08:00
}
}
PNETCDF_CHECK_ERANGE($1)
2010-06-03 21:24:43 +08:00
} else {
2016-10-10 11:13:30 +08:00
IF (err != NC_NOERR && err != NC_ERANGE)
EXPECT_ERR(NC_NOERR or NC_ERANGE, err)
2016-10-10 11:13:30 +08:00
}
} else {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
ELSE_NOK
2016-10-10 11:13:30 +08:00
}
}
2010-06-03 21:24:43 +08:00
}
2016-10-13 15:17:31 +08:00
err = APIFunc(close)(ncid);
2016-10-10 11:13:30 +08:00
IF (err != NC_NOERR)
2016-10-13 15:17:31 +08:00
error("close: %s", APIFunc(strerror)(err));
2016-10-10 11:13:30 +08:00
return nok;
2010-06-03 21:24:43 +08:00
}
')dnl
TEST_NC_GET_VAR1(text)
TEST_NC_GET_VAR1(schar)
2016-10-10 11:13:30 +08:00
TEST_NC_GET_VAR1(uchar)
2010-06-03 21:24:43 +08:00
TEST_NC_GET_VAR1(short)
TEST_NC_GET_VAR1(int)
TEST_NC_GET_VAR1(long)
TEST_NC_GET_VAR1(float)
TEST_NC_GET_VAR1(double)
2015-08-16 06:26:35 +08:00
TEST_NC_GET_VAR1(ushort)
TEST_NC_GET_VAR1(uint)
TEST_NC_GET_VAR1(longlong)
TEST_NC_GET_VAR1(ulonglong)
2010-06-03 21:24:43 +08:00
dnl TEST_NC_GET_VAR(TYPE)
dnl
define(`TEST_NC_GET_VAR',dnl
`dnl
2016-10-10 11:13:30 +08:00
int
2016-10-13 15:17:31 +08:00
TestFunc(var)_$1(VarArgs)
2010-06-03 21:24:43 +08:00
{
int i, err, ncid, cdf_format;
2016-10-10 11:13:30 +08:00
int allInExtRange; /* all values within range of external data type */
int allInIntRange; /* all values within range of internal data type */
int nok = 0; /* count of valid comparisons */
2010-06-03 21:24:43 +08:00
int canConvert; /* Both text or both numeric */
IntType j, index[MAX_RANK];
2010-06-03 21:24:43 +08:00
double expect[MAX_NELS];
2016-10-10 11:13:30 +08:00
$1 value[MAX_NELS];
for(j = 0; j < MAX_NELS; j++) {
expect[j] = 0;
}
2016-10-13 15:17:31 +08:00
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));
2016-10-10 11:13:30 +08:00
2016-10-13 15:17:31 +08:00
/* check if can detect a bad file ID */
err = GetVar($1)(BAD_ID, 0, value);
IF (err != NC_EBADID)
EXPECT_ERR(NC_EBADID, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
/* check if can detect a bad variable ID */
err = GetVar($1)(ncid, BAD_VARID, value);
IF (err != NC_ENOTVAR)
EXPECT_ERR(NC_ENOTVAR, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
2010-06-03 21:24:43 +08:00
2015-08-16 06:26:35 +08:00
for (i = 0; i < numVars; i++) {
2010-06-03 21:24:43 +08:00
assert(var_rank[i] <= MAX_RANK);
assert(var_nels[i] <= MAX_NELS);
2016-10-10 11:13:30 +08:00
/* check if can detect a bad file ID */
err = GetVar($1)(BAD_ID, i, value);
IF (err != NC_EBADID)
EXPECT_ERR(NC_EBADID, err)
ELSE_NOK
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
2016-10-10 11:13:30 +08:00
allInExtRange = allInIntRange = 1;
for (j = 0; j < var_nels[i]; j++) {
2016-10-10 11:13:30 +08:00
err = toMixedBase(j, var_rank[i], var_shape[i], index);
IF (err != 0) error("error in toMixedBase");
expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
NCT_ITYPE($1));
2016-10-10 11:13:30 +08:00
if (inRange3(cdf_format, expect[j],var_type[i], NCT_ITYPE($1))) {
IfCheckTextChar($1, var_type[i])
allInIntRange &= CheckRange($1,expect[j]);
} else
2016-10-10 11:13:30 +08:00
allInExtRange = 0;
}
err = GetVar($1)(ncid, i, value);
if (canConvert) {
if (allInExtRange) {
if (allInIntRange) {
IF (err != NC_NOERR)
EXPECT_ERR(NC_NOERR, err)
2016-10-10 11:13:30 +08:00
}
PNETCDF_CHECK_ERANGE($1)
2016-10-10 11:13:30 +08:00
} else {
IF (err != NC_NOERR && err != NC_ERANGE)
EXPECT_ERR(NC_NOERR or NC_ERANGE, err)
2016-10-10 11:13:30 +08:00
}
for (j = 0; j < var_nels[i]; j++) {
2016-10-10 11:13:30 +08:00
if (CheckNumRange($1, expect[j], var_type[i])) {
2016-10-13 15:17:31 +08:00
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[j] > schar_max) continue;')
IF (!equal((double)value[j],expect[j],var_type[i],NCT_ITYPE($1))){
2016-10-10 11:13:30 +08:00
error("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("element number: %d, ", j);
error("expect: %g, ", expect[j]);
error("got: %g", (double) value[j]);
}
}
ELSE_NOK
2016-10-10 11:13:30 +08:00
}
}
} else {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
ELSE_NOK
2016-10-10 11:13:30 +08:00
}
2010-06-03 21:24:43 +08:00
}
2016-10-13 15:17:31 +08:00
err = APIFunc(close)(ncid);
2016-10-10 11:13:30 +08:00
IF (err != NC_NOERR)
2016-10-13 15:17:31 +08:00
error("close: %s", APIFunc(strerror)(err));
2016-10-10 11:13:30 +08:00
return nok;
2010-06-03 21:24:43 +08:00
}
')dnl
TEST_NC_GET_VAR(text)
TEST_NC_GET_VAR(uchar)
TEST_NC_GET_VAR(schar)
TEST_NC_GET_VAR(short)
TEST_NC_GET_VAR(int)
TEST_NC_GET_VAR(long)
TEST_NC_GET_VAR(float)
TEST_NC_GET_VAR(double)
2015-08-16 06:26:35 +08:00
TEST_NC_GET_VAR(ushort)
TEST_NC_GET_VAR(uint)
TEST_NC_GET_VAR(longlong)
TEST_NC_GET_VAR(ulonglong)
2010-06-03 21:24:43 +08:00
dnl TEST_NC_GET_VARA(TYPE)
dnl
define(`TEST_NC_GET_VARA',dnl
`dnl
2016-10-10 11:13:30 +08:00
int
2016-10-13 15:17:31 +08:00
TestFunc(vara)_$1(VarArgs)
2010-06-03 21:24:43 +08:00
{
int i, k, err, nslabs, ncid, cdf_format;
2016-10-10 11:13:30 +08:00
int allInExtRange; /* all values within external range? */
int allInIntRange; /* all values within internal range? */
int nok = 0; /* count of valid comparisons */
2010-06-03 21:24:43 +08:00
int canConvert; /* Both text or both numeric */
IntType j;
2016-10-10 11:13:30 +08:00
IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
2010-06-03 21:24:43 +08:00
double expect[MAX_NELS];
2016-10-10 11:13:30 +08:00
$1 value[MAX_NELS];
for(j = 0; j < MAX_NELS; j++) {
expect[j] = 0;
}
2016-10-13 15:17:31 +08:00
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));
err = GetVara($1)(BAD_ID, 0, NULL, NULL, value);
IF (err != NC_EBADID)
EXPECT_ERR(NC_EBADID, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
2016-10-10 11:13:30 +08:00
2016-10-13 15:17:31 +08:00
err = GetVara($1)(ncid, BAD_VARID, NULL, NULL, value);
IF (err != NC_ENOTVAR)
EXPECT_ERR(NC_ENOTVAR, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
2010-06-03 21:24:43 +08:00
2015-08-16 06:26:35 +08:00
for (i = 0; i < numVars; i++) {
2010-06-03 21:24:43 +08:00
assert(var_rank[i] <= MAX_RANK);
assert(var_nels[i] <= MAX_NELS);
/* check if can detect a bad file ID */
err = GetVara($1)(BAD_ID, i, NULL, NULL, value);
IF (err != NC_EBADID)
EXPECT_ERR(NC_EBADID, err)
ELSE_NOK
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
2016-10-10 11:13:30 +08:00
for (j = 0; j < var_rank[i]; j++) {
start[j] = 0;
edge[j] = 1;
}
2016-10-26 04:11:16 +08:00
ifdef(`PNETCDF',`dnl
/* for non-scalar variables, argument start cannot be NULL */
2016-10-26 04:11:16 +08:00
err = GetVara($1)(ncid, i, NULL, NULL, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
2016-10-26 04:11:16 +08:00
ELSE_NOK
}
else if (var_rank[i] == 0) {
index[0] = 0;
expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
CheckRange($1, expect[0])) {
IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
}
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')')
else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')
}
else IF (err != NC_EINVALCOORDS) {
EXPECT_ERR(NC_EINVALCOORDS, err)
}
2016-10-26 04:11:16 +08:00
ELSE_NOK
/* for non-scalar variables, argument count cannot be NULL */
2016-10-26 04:11:16 +08:00
err = GetVara($1)(ncid, i, start, NULL, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
2016-10-26 04:11:16 +08:00
ELSE_NOK
}
else if (var_rank[i] == 0) {
index[0] = 0;
expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
CheckRange($1, expect[0])) {
IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
}
else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
}
else IF (err != NC_EEDGE)
EXPECT_ERR(NC_EEDGE, err)
2016-10-26 04:11:16 +08:00
ELSE_NOK
')dnl
/* first test when edge[*] > 0 */
2016-10-10 11:13:30 +08:00
for (j = 0; j < var_rank[i]; j++) {
start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
err = GetVara($1)(ncid, i, start, edge, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
start[j] = 0;
continue;
}
IF (err != NC_EINVALCOORDS)
EXPECT_ERR(NC_EINVALCOORDS, err)
2016-10-10 11:13:30 +08:00
start[j] = 0;
edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
err = GetVara($1)(ncid, i, start, edge, value);
IF (err != NC_EEDGE)
EXPECT_ERR(NC_EEDGE, err)
2016-10-10 11:13:30 +08:00
edge[j] = 1;
}
/* Check non-scalars for correct error returned even when there is
* nothing to get (edge[*]==0) */
for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
2016-10-10 11:13:30 +08:00
for (j = 0; j < var_rank[i]; j++) {
if (var_rank[i] == RECDIM) continue; /* skip record dim */
start[j] = var_shape[i][j];
2016-10-10 11:13:30 +08:00
err = GetVara($1)(ncid, i, start, edge, value);
if (!canConvert) {
2016-10-10 11:13:30 +08:00
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
start[j] = 0;
continue;
2016-10-10 11:13:30 +08:00
}
IF (err != NC_NOERR) /* allowed when edge[j]==0 */
EXPECT_ERR(NC_NOERR, err)
start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
err = GetVara($1)(ncid, i, start, edge, value);
IF (err != NC_EINVALCOORDS)
EXPECT_ERR(NC_EINVALCOORDS, err)
start[j] = 0;
}
err = GetVara($1)(ncid, i, start, edge, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
} else if (var_rank[i] == 0) {
expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
CheckRange($1, expect[0])) {
IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
2016-10-10 11:13:30 +08:00
}
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')')
else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')
} else {
IF (err != NC_NOERR)
EXPECT_ERR(NC_NOERR, err)
2016-10-10 11:13:30 +08:00
}
for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
2016-10-10 11:13:30 +08:00
/* Choose a random point dividing each dim into 2 parts */
/* get 2^rank (nslabs) slabs so defined */
2010-06-03 21:24:43 +08:00
nslabs = 1;
for (j = 0; j < var_rank[i]; j++) {
mid[j] = roll( var_shape[i][j] );
nslabs *= 2;
}
2016-10-10 11:13:30 +08:00
/* bits of k determine whether to get lower or upper part of dim */
2010-06-03 21:24:43 +08:00
for (k = 0; k < nslabs; k++) {
IntType nels = 1;
2010-06-03 21:24:43 +08:00
for (j = 0; j < var_rank[i]; j++) {
if ((k >> j) & 1) {
start[j] = 0;
edge[j] = mid[j];
2016-10-10 11:13:30 +08:00
} else {
2010-06-03 21:24:43 +08:00
start[j] = mid[j];
edge[j] = var_shape[i][j] - mid[j];
}
nels *= edge[j];
}
2016-10-10 11:13:30 +08:00
allInExtRange = allInIntRange = 1;
2010-06-03 21:24:43 +08:00
for (j = 0; j < nels; j++) {
int d;
2010-06-03 21:24:43 +08:00
err = toMixedBase(j, var_rank[i], edge, index);
IF (err != 0) error("error in toMixedBase");
2010-06-03 21:24:43 +08:00
for (d = 0; d < var_rank[i]; d++)
index[d] += start[d];
expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index,
NCT_ITYPE($1));
if (inRange3(cdf_format, expect[j],var_type[i],NCT_ITYPE($1))) {
2016-10-10 11:13:30 +08:00
IfCheckTextChar($1, var_type[i])
allInIntRange &= CheckRange($1,expect[j]);
} else
2016-10-10 11:13:30 +08:00
allInExtRange = 0;
}
err = GetVara($1)(ncid, i, start, edge, value);
2010-06-03 21:24:43 +08:00
if (canConvert) {
2016-10-10 11:13:30 +08:00
if (allInExtRange) {
if (allInIntRange) {
IF (err != NC_NOERR)
EXPECT_ERR(NC_NOERR, err)
2016-10-10 11:13:30 +08:00
}
PNETCDF_CHECK_ERANGE($1)
2016-10-10 11:13:30 +08:00
} else {
IF (err != NC_NOERR && err != NC_ERANGE)
EXPECT_ERR(NC_NOERR or NC_ERANGE, err)
2016-10-10 11:13:30 +08:00
}
for (j = 0; j < nels; j++) {
if (CheckNumRange($1, expect[j], var_type[i])) {
2016-10-13 15:17:31 +08:00
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[j] > schar_max) continue;')
IF (!equal((double)value[j],expect[j],var_type[i],NCT_ITYPE($1))){
2016-10-10 11:13:30 +08:00
error("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("element number: %d, ", j);
error("expect: %g, ", expect[j]);
error("got: %g", (double) value[j]);
}
}
ELSE_NOK
2016-10-10 11:13:30 +08:00
}
}
2010-06-03 21:24:43 +08:00
} else {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
2010-06-03 21:24:43 +08:00
}
}
}
2016-10-13 15:17:31 +08:00
err = APIFunc(close)(ncid);
2016-10-10 11:13:30 +08:00
IF (err != NC_NOERR)
2016-10-13 15:17:31 +08:00
error("close: %s", APIFunc(strerror)(err));
2016-10-10 11:13:30 +08:00
return nok;
2010-06-03 21:24:43 +08:00
}
')dnl
TEST_NC_GET_VARA(text)
TEST_NC_GET_VARA(uchar)
TEST_NC_GET_VARA(schar)
TEST_NC_GET_VARA(short)
TEST_NC_GET_VARA(int)
TEST_NC_GET_VARA(long)
TEST_NC_GET_VARA(float)
TEST_NC_GET_VARA(double)
2015-08-16 06:26:35 +08:00
TEST_NC_GET_VARA(ushort)
TEST_NC_GET_VARA(uint)
TEST_NC_GET_VARA(longlong)
TEST_NC_GET_VARA(ulonglong)
2010-06-03 21:24:43 +08:00
dnl TEST_NC_GET_VARS(TYPE)
dnl
define(`TEST_NC_GET_VARS',dnl
`dnl
2016-10-10 11:13:30 +08:00
int
2016-10-13 15:17:31 +08:00
TestFunc(vars)_$1(VarArgs)
2010-06-03 21:24:43 +08:00
{
int i, k, d, err, nslabs, ncid, cdf_format;
2016-10-10 11:13:30 +08:00
int allInExtRange; /* all values within external range? */
int allInIntRange; /* all values within internal range? */
PTRDType nstarts; /* number of different starts */
2016-10-10 11:13:30 +08:00
int nok = 0; /* count of valid comparisons */
2010-06-03 21:24:43 +08:00
int canConvert; /* Both text or both numeric */
IntType j, m, nels;
2016-10-10 11:13:30 +08:00
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];
2010-06-03 21:24:43 +08:00
double expect[MAX_NELS];
2016-10-10 11:13:30 +08:00
$1 value[MAX_NELS];
for(j = 0; j < MAX_NELS; j++) {
expect[j] = 0;
}
2016-10-13 15:17:31 +08:00
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));
2016-10-10 11:13:30 +08:00
2016-10-13 15:17:31 +08:00
err = GetVars($1)(BAD_ID, 0, NULL, NULL, NULL, value);
IF (err != NC_EBADID)
EXPECT_ERR(NC_EBADID, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
err = GetVars($1)(ncid, BAD_VARID, NULL, NULL, NULL, value);
IF (err != NC_ENOTVAR)
EXPECT_ERR(NC_ENOTVAR, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
2010-06-03 21:24:43 +08:00
2015-08-16 06:26:35 +08:00
for (i = 0; i < numVars; i++) {
2010-06-03 21:24:43 +08:00
assert(var_rank[i] <= MAX_RANK);
assert(var_nels[i] <= MAX_NELS);
/* check if can detect a bad file ID */
err = GetVars($1)(BAD_ID, i, NULL, NULL, NULL, value);
IF (err != NC_EBADID)
EXPECT_ERR(NC_EBADID, err)
ELSE_NOK
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
2010-06-03 21:24:43 +08:00
for (j = 0; j < var_rank[i]; j++) {
start[j] = 0;
edge[j] = 1;
stride[j] = 1;
}
2016-10-26 04:11:16 +08:00
ifdef(`PNETCDF',`dnl
/* for non-scalar variables, argument start cannot be NULL */
2016-10-26 04:11:16 +08:00
err = GetVars($1)(ncid, i, NULL, NULL, NULL, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
2016-10-26 04:11:16 +08:00
ELSE_NOK
}
else if (var_rank[i] == 0) {
index[0] = 0;
expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
CheckRange($1, expect[0])) {
IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
}
else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
}
else IF (err != NC_EINVALCOORDS) {
EXPECT_ERR(NC_EINVALCOORDS, err)
}
2016-10-26 04:11:16 +08:00
ELSE_NOK
/* for non-scalar variables, argument count cannot be NULL */
2016-10-26 04:11:16 +08:00
err = GetVars($1)(ncid, i, start, NULL, NULL, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
2016-10-26 04:11:16 +08:00
ELSE_NOK
}
else if (var_rank[i] == 0) {
index[0] = 0;
expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
CheckRange($1, expect[0])) {
IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
}
else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
}
else IF (err != NC_EEDGE)
EXPECT_ERR(NC_EEDGE, err)
2016-10-26 04:11:16 +08:00
ELSE_NOK
')dnl
/* first test when edge[*] > 0 */
2010-06-03 21:24:43 +08:00
for (j = 0; j < var_rank[i]; j++) {
start[j] = var_shape[i][j];
2016-10-10 11:13:30 +08:00
err = GetVars($1)(ncid, i, start, edge, stride, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
start[j] = 0;
continue;
}
IF (err != NC_EINVALCOORDS)
EXPECT_ERR(NC_EINVALCOORDS, err)
start[j] = 0;
edge[j] = var_shape[i][j] + 1;
err = GetVars($1)(ncid, i, start, edge, stride, value);
IF (err != NC_EEDGE)
EXPECT_ERR(NC_EEDGE, err)
edge[j] = 1;
stride[j] = 0;
err = GetVars($1)(ncid, i, start, edge, stride, value);
IF (err != NC_ESTRIDE)
EXPECT_ERR(NC_ESTRIDE, err)
stride[j] = 1;
}
/* Check non-scalars for correct error returned even when there is
* nothing to get (edge[j]==0) */
for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
for (j = 0; j < var_rank[i]; j++) {
if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
start[j] = var_shape[i][j];
err = GetVars($1)(ncid, i, start, edge, stride, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
2016-10-10 11:13:30 +08:00
start[j] = 0;
continue;
2016-10-10 11:13:30 +08:00
}
IF (err != NC_NOERR) /* allowed when edge[j]==0 */
EXPECT_ERR(NC_NOERR, err)
start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
err = GetVars($1)(ncid, i, start, edge, stride, value);
IF (err != NC_EINVALCOORDS)
EXPECT_ERR(NC_EINVALCOORDS, err)
start[j] = 0;
ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)')
stride[j] = 0;
err = GetVars($1)(ncid, i, start, edge, stride, value);
IF (err != NC_ESTRIDE)
EXPECT_ERR(NC_ESTRIDE, err)
stride[j] = 1;
ifdef(`PNETCDF',,``#'endif')
}
err = GetVars($1)(ncid, i, start, edge, stride, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
} else if (var_rank[i] == 0) {
expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
CheckRange($1, expect[0])) {
IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
}
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')')
else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')
} else {
IF (err != NC_NOERR)
EXPECT_ERR(NC_NOERR, err)
2010-06-03 21:24:43 +08:00
}
for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
2016-10-10 11:13:30 +08:00
/* Choose a random point dividing each dim into 2 parts */
/* get 2^rank (nslabs) slabs so defined */
2010-06-03 21:24:43 +08:00
nslabs = 1;
for (j = 0; j < var_rank[i]; j++) {
mid[j] = roll( var_shape[i][j] );
nslabs *= 2;
}
2016-10-10 11:13:30 +08:00
/* bits of k determine whether to get lower or upper part of dim */
/* choose random stride from 1 to edge */
2010-06-03 21:24:43 +08:00
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];
2016-10-10 11:13:30 +08:00
} else {
2010-06-03 21:24:43 +08:00
start[j] = mid[j];
edge[j] = var_shape[i][j] - mid[j];
}
sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
stride[j] = (PTRDType)sstride[j];
2010-06-03 21:24:43 +08:00
nstarts *= stride[j];
}
for (m = 0; m < nstarts; m++) {
err = toMixedBase(m, var_rank[i], sstride, index);
IF (err != 0) error("error in toMixedBase");
2010-06-03 21:24:43 +08:00
nels = 1;
for (j = 0; j < var_rank[i]; j++) {
count[j] = 1 + (edge[j]-index[j]-1) / ( (IntType)stride[j] == 0 ? 1 : (IntType)stride[j]);
2010-06-03 21:24:43 +08:00
nels *= count[j];
index[j] += start[j];
}
2016-10-10 11:13:30 +08:00
/* Random choice of forward or backward */
2010-06-03 21:24:43 +08:00
/* TODO
if ( roll(2) ) {
for (j = 0; j < var_rank[i]; j++) {
index[j] += (count[j] - 1) * (IntType)stride[j];
2010-06-03 21:24:43 +08:00
stride[j] = -stride[j];
}
}
*/
2016-10-10 11:13:30 +08:00
allInExtRange = allInIntRange = 1;
for (j = 0; j < nels; j++) {
err = toMixedBase(j, var_rank[i], count, index2);
IF (err != 0) error("error in toMixedBase");
2016-10-10 11:13:30 +08:00
for (d = 0; d < var_rank[i]; d++)
index2[d] = index[d] + index2[d] * (IntType)stride[d];
expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
index2, NCT_ITYPE($1));
2016-10-10 11:13:30 +08:00
if (inRange3(cdf_format, expect[j],var_type[i],NCT_ITYPE($1))) {
IfCheckTextChar($1, var_type[i])
allInIntRange &= CheckRange($1,expect[j]);
} else
2016-10-10 11:13:30 +08:00
allInExtRange = 0;
}
err = GetVars($1)(ncid, i, index, count, stride, value);
2016-10-10 11:13:30 +08:00
if (canConvert) {
if (allInExtRange) {
if (allInIntRange) {
IF (err != NC_NOERR)
EXPECT_ERR(NC_NOERR, err)
2016-10-10 11:13:30 +08:00
}
PNETCDF_CHECK_ERANGE($1)
2016-10-10 11:13:30 +08:00
} else {
IF (err != NC_NOERR && err != NC_ERANGE)
EXPECT_ERR(NC_NOERR or NC_ERANGE, err)
2016-10-10 11:13:30 +08:00
}
for (j = 0; j < nels; j++) {
if (CheckNumRange($1, expect[j], var_type[i])) {
2016-10-13 15:17:31 +08:00
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[j] > schar_max) continue;')
IF (!equal((double)value[j],expect[j],var_type[i], NCT_ITYPE($1))){
2016-10-10 11:13:30 +08:00
error("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("element number: %d, ", j);
2010-06-03 21:24:43 +08:00
error("expect: %g, ", expect[j]);
2016-10-10 11:13:30 +08:00
error("got: %g", (double) value[j]);
}
}
ELSE_NOK
2016-10-10 11:13:30 +08:00
}
}
} else {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
2016-10-10 11:13:30 +08:00
}
}
}
2010-06-03 21:24:43 +08:00
}
2016-10-13 15:17:31 +08:00
err = APIFunc(close)(ncid);
2016-10-10 11:13:30 +08:00
IF (err != NC_NOERR)
2016-10-13 15:17:31 +08:00
error("close: %s", APIFunc(strerror)(err));
2016-10-10 11:13:30 +08:00
return nok;
2010-06-03 21:24:43 +08:00
}
')dnl
TEST_NC_GET_VARS(text)
TEST_NC_GET_VARS(uchar)
TEST_NC_GET_VARS(schar)
TEST_NC_GET_VARS(short)
TEST_NC_GET_VARS(int)
TEST_NC_GET_VARS(long)
TEST_NC_GET_VARS(float)
TEST_NC_GET_VARS(double)
2015-08-16 06:26:35 +08:00
TEST_NC_GET_VARS(ushort)
TEST_NC_GET_VARS(uint)
TEST_NC_GET_VARS(longlong)
TEST_NC_GET_VARS(ulonglong)
2010-06-03 21:24:43 +08:00
dnl TEST_NC_GET_VARM(TYPE)
dnl
define(`TEST_NC_GET_VARM',dnl
`dnl
2016-10-10 11:13:30 +08:00
int
2016-10-13 15:17:31 +08:00
TestFunc(varm)_$1(VarArgs)
2010-06-03 21:24:43 +08:00
{
int i, k, d, err, nslabs, ncid, cdf_format;
2016-10-10 11:13:30 +08:00
int allInExtRange; /* all values within external range? */
int allInIntRange; /* all values within internal range? */
PTRDType nstarts; /* number of different starts */
2016-10-10 11:13:30 +08:00
int nok = 0; /* count of valid comparisons */
2010-06-03 21:24:43 +08:00
int canConvert; /* Both text or both numeric */
IntType j, m, nels;
2016-10-10 11:13:30 +08:00
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];
2010-06-03 21:24:43 +08:00
double expect[MAX_NELS];
2016-10-10 11:13:30 +08:00
$1 value[MAX_NELS];
for(j = 0; j < MAX_NELS; j++) {
expect[j] = 0;
}
2016-10-13 15:17:31 +08:00
err = FileOpen(testfile, NC_NOWRITE);
IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err));
2016-10-10 11:13:30 +08:00
2016-10-13 15:17:31 +08:00
err = APIFunc(inq_format)(ncid, &cdf_format);
IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err));
err = GetVarm($1)(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
IF (err != NC_EBADID)
EXPECT_ERR(NC_EBADID, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
err = GetVarm($1)(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value);
IF (err != NC_ENOTVAR)
EXPECT_ERR(NC_ENOTVAR, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
2010-06-03 21:24:43 +08:00
2015-08-16 06:26:35 +08:00
for (i = 0; i < numVars; i++) {
2010-06-03 21:24:43 +08:00
assert(var_rank[i] <= MAX_RANK);
assert(var_nels[i] <= MAX_NELS);
/* check if can detect a bad file ID */
err = GetVars($1)(BAD_ID, i, NULL, NULL, NULL, value);
IF (err != NC_EBADID)
EXPECT_ERR(NC_EBADID, err)
ELSE_NOK
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
2010-06-03 21:24:43 +08:00
for (j = 0; j < var_rank[i]; j++) {
start[j] = 0;
edge[j] = 1;
stride[j] = 1;
imap[j] = 1;
}
2016-10-26 04:11:16 +08:00
ifdef(`PNETCDF',`dnl
/* for non-scalar variables, argument start cannot be NULL */
2016-10-26 04:11:16 +08:00
err = GetVarm($1)(ncid, i, NULL, NULL, NULL, NULL, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
2016-10-26 04:11:16 +08:00
ELSE_NOK
}
else if (var_rank[i] == 0) {
index[0] = 0;
expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
CheckRange($1, expect[0])) {
IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
}
else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
}
else IF (err != NC_EINVALCOORDS) {
EXPECT_ERR(NC_EINVALCOORDS, err)
}
2016-10-26 04:11:16 +08:00
ELSE_NOK
/* for non-scalar variables, argument count cannot be NULL */
2016-10-26 04:11:16 +08:00
err = GetVarm($1)(ncid, i, start, NULL, NULL, NULL, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
2016-10-26 04:11:16 +08:00
ELSE_NOK
}
else if (var_rank[i] == 0) {
index[0] = 0;
expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
CheckRange($1, expect[0])) {
IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
}
else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
}
else IF (err != NC_EEDGE)
EXPECT_ERR(NC_EEDGE, err)
2016-10-26 04:11:16 +08:00
ELSE_NOK
')dnl
/* first test when edge[*] > 0 */
2010-06-03 21:24:43 +08:00
for (j = 0; j < var_rank[i]; j++) {
start[j] = var_shape[i][j];
2016-10-10 11:13:30 +08:00
err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
continue;
}
IF (err != NC_EINVALCOORDS)
EXPECT_ERR(NC_EINVALCOORDS, err)
start[j] = 0;
edge[j] = var_shape[i][j] + 1;
err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
IF (err != NC_EEDGE)
EXPECT_ERR(NC_EEDGE, err)
edge[j] = 1;
stride[j] = 0;
err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
IF (err != NC_ESTRIDE)
EXPECT_ERR(NC_ESTRIDE, err)
stride[j] = 1;
}
/* Check non-scalars for correct error returned even when there is
* nothing to get (edge[j]==0) */
for (j = 0; j < var_rank[i]; j++) edge[j] = 0;
for (j = 0; j < var_rank[i]; j++) {
if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */
start[j] = var_shape[i][j];
err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
2016-10-10 11:13:30 +08:00
start[j] = 0;
continue;
2016-10-10 11:13:30 +08:00
}
IF (err != NC_NOERR) /* allowed when edge[j]==0 */
EXPECT_ERR(NC_NOERR, err)
start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */
err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
IF (err != NC_EINVALCOORDS)
EXPECT_ERR(NC_EINVALCOORDS, err)
start[j] = 0;
ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)')
stride[j] = 0;
err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
IF (err != NC_ESTRIDE)
EXPECT_ERR(NC_ESTRIDE, err)
stride[j] = 1;
ifdef(`PNETCDF',,``#'endif')
2010-06-03 21:24:43 +08:00
}
err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
if (!canConvert) {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
} else if (var_rank[i] == 0) {
expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1));
if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) &&
CheckRange($1, expect[0])) {
IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err)
}
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')')
else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err)
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')
} else {
IF (err != NC_NOERR)
EXPECT_ERR(NC_NOERR, err)
}
for (j = 0; j < var_rank[i]; j++) edge[j] = 1;
2016-10-10 11:13:30 +08:00
/* Choose a random point dividing each dim into 2 parts */
/* get 2^rank (nslabs) slabs so defined */
2010-06-03 21:24:43 +08:00
nslabs = 1;
for (j = 0; j < var_rank[i]; j++) {
mid[j] = roll( var_shape[i][j] );
nslabs *= 2;
}
2016-10-10 11:13:30 +08:00
/* bits of k determine whether to get lower or upper part of dim */
/* choose random stride from 1 to edge */
2010-06-03 21:24:43 +08:00
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];
2016-10-10 11:13:30 +08:00
} else {
2010-06-03 21:24:43 +08:00
start[j] = mid[j];
edge[j] = var_shape[i][j] - mid[j];
}
sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
stride[j] = (PTRDType)sstride[j];
2010-06-03 21:24:43 +08:00
nstarts *= stride[j];
}
for (m = 0; m < nstarts; m++) {
err = toMixedBase(m, var_rank[i], sstride, index);
IF (err != 0) error("error in toMixedBase");
2010-06-03 21:24:43 +08:00
nels = 1;
for (j = 0; j < var_rank[i]; j++) {
count[j] = 1 + (edge[j]-index[j]-1) / ( (IntType)stride[j] == 0 ? 1 : (IntType)stride[j]);
2010-06-03 21:24:43 +08:00
nels *= count[j];
index[j] += start[j];
}
2016-10-10 11:13:30 +08:00
/* Random choice of forward or backward */
2010-06-03 21:24:43 +08:00
/* TODO
2016-10-10 11:13:30 +08:00
if ( roll(2) ) {
for (j = 0; j < var_rank[i]; j++) {
index[j] += (count[j] - 1) * (IntType)stride[j];
2016-10-10 11:13:30 +08:00
stride[j] = -stride[j];
}
}
2010-06-03 21:24:43 +08:00
*/
2016-10-10 11:13:30 +08:00
if (var_rank[i] > 0) {
int jj = var_rank[i] - 1;
imap[jj] = 1;
for (; jj > 0; jj--)
imap[jj-1] = imap[jj] * (PTRDType)count[jj];
2016-10-10 11:13:30 +08:00
}
2010-06-03 21:24:43 +08:00
allInExtRange = allInIntRange = 1;
for (j = 0; j < nels; j++) {
err = toMixedBase(j, var_rank[i], count, index2);
IF (err != 0) error("error in toMixedBase");
2010-06-03 21:24:43 +08:00
for (d = 0; d < var_rank[i]; d++)
index2[d] = index[d] + index2[d] * (IntType)stride[d];
expect[j] = hash4(cdf_format, var_type[i], var_rank[i],
index2, NCT_ITYPE($1));
if (inRange3(cdf_format, expect[j],var_type[i],NCT_ITYPE($1))) {
2016-10-10 11:13:30 +08:00
IfCheckTextChar($1, var_type[i])
allInIntRange &= CheckRange($1,expect[j]);
} else
2010-06-03 21:24:43 +08:00
allInExtRange = 0;
}
err = GetVarm($1)(ncid,i,index,count,stride,imap,value);
2010-06-03 21:24:43 +08:00
if (canConvert) {
if (allInExtRange) {
if (allInIntRange) {
2016-10-10 11:13:30 +08:00
IF (err != NC_NOERR)
EXPECT_ERR(NC_NOERR, err)
2010-06-03 21:24:43 +08:00
}
PNETCDF_CHECK_ERANGE($1)
2010-06-03 21:24:43 +08:00
} else {
2016-10-10 11:13:30 +08:00
IF (err != NC_NOERR && err != NC_ERANGE)
EXPECT_ERR(NC_NOERR or NC_ERANGE, err)
2010-06-03 21:24:43 +08:00
}
for (j = 0; j < nels; j++) {
2016-10-10 11:13:30 +08:00
if (CheckNumRange($1, expect[j], var_type[i])) {
2016-10-13 15:17:31 +08:00
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[j] > schar_max) continue;')
IF (!equal((double)value[j],expect[j],var_type[i], NCT_ITYPE($1))){
2010-06-03 21:24:43 +08:00
error("value read not that expected");
if (verbose) {
error("\n");
error("varid: %d, ", i);
error("var_name: %s, ", var_name[i]);
2016-10-10 11:13:30 +08:00
error("var_type: %s, ", s_nc_type(var_type[i]));
error("element number: %d, ", j);
2010-06-03 21:24:43 +08:00
error("expect: %g, ", expect[j]);
error("got: %g", (double) value[j]);
}
}
ELSE_NOK
2010-06-03 21:24:43 +08:00
}
}
} else {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
2010-06-03 21:24:43 +08:00
}
}
}
}
2016-10-13 15:17:31 +08:00
err = APIFunc(close)(ncid);
2016-10-10 11:13:30 +08:00
IF (err != NC_NOERR)
2016-10-13 15:17:31 +08:00
error("close: %s", APIFunc(strerror)(err));
2016-10-10 11:13:30 +08:00
return nok;
2010-06-03 21:24:43 +08:00
}
')dnl
TEST_NC_GET_VARM(text)
TEST_NC_GET_VARM(uchar)
TEST_NC_GET_VARM(schar)
TEST_NC_GET_VARM(short)
TEST_NC_GET_VARM(int)
TEST_NC_GET_VARM(long)
TEST_NC_GET_VARM(float)
TEST_NC_GET_VARM(double)
2015-08-16 06:26:35 +08:00
TEST_NC_GET_VARM(ushort)
TEST_NC_GET_VARM(uint)
TEST_NC_GET_VARM(longlong)
TEST_NC_GET_VARM(ulonglong)
2010-06-03 21:24:43 +08:00
dnl TEST_NC_GET_ATT(TYPE)
dnl
define(`TEST_NC_GET_ATT',dnl
`dnl
2016-10-10 11:13:30 +08:00
int
2016-10-13 15:17:31 +08:00
TestFunc(att)_$1(AttVarArgs)
2010-06-03 21:24:43 +08:00
{
2016-10-10 11:13:30 +08:00
int i, j, err, ncid, cdf_format;
2017-03-12 02:51:04 +08:00
IntType k, ndx[1];
2010-06-03 21:24:43 +08:00
int allInExtRange;
int allInIntRange;
int canConvert; /* Both text or both numeric */
2016-10-10 11:13:30 +08:00
int nok = 0; /* count of valid comparisons */
2010-06-03 21:24:43 +08:00
double expect[MAX_NELS];
2016-10-10 11:13:30 +08:00
$1 value[MAX_NELS];
for(j = 0; j < MAX_NELS; j++) {
expect[j] = 0;
}
2016-10-13 15:17:31 +08:00
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));
err = GetAtt($1)(BAD_ID, 0, NULL, value);
IF (err != NC_EBADID)
EXPECT_ERR(NC_EBADID, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
2010-06-03 21:24:43 +08:00
2016-10-13 15:17:31 +08:00
err = GetAtt($1)(ncid, BAD_VARID, NULL, value);
IF (err != NC_ENOTVAR)
EXPECT_ERR(NC_ENOTVAR, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
2010-06-03 21:24:43 +08:00
2015-08-16 06:26:35 +08:00
for (i = -1; i < numVars; i++) {
2010-06-03 21:24:43 +08:00
for (j = 0; j < NATTS(i); j++) {
2016-10-10 11:13:30 +08:00
canConvert = (ATT_TYPE(i,j) == NC_CHAR) CheckText($1);
2016-10-13 15:17:31 +08:00
2016-10-10 11:13:30 +08:00
err = GetAtt($1)(ncid, BAD_VARID, ATT_NAME(i,j), value);
2016-10-13 15:17:31 +08:00
IF (err != NC_ENOTVAR)
EXPECT_ERR(NC_ENOTVAR, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')
2016-10-13 15:17:31 +08:00
/* check if can detect a bad name */
err = GetAtt($1)(ncid, i, NULL, NULL);
IF (err != NC_EBADNAME)
EXPECT_ERR(NC_EBADNAME, err)
2016-10-13 15:17:31 +08:00
ELSE_NOK
ifdef(`PNETCDF',,``#'endif')
2016-10-13 15:17:31 +08:00
2016-10-10 11:13:30 +08:00
err = GetAtt($1)(ncid, i, "noSuch", value);
2016-10-13 15:17:31 +08:00
IF (err != NC_ENOTATT)
EXPECT_ERR(NC_ENOTATT, err)
ELSE_NOK
2016-10-13 15:17:31 +08:00
2016-10-10 11:13:30 +08:00
allInExtRange = allInIntRange = 1;
2010-06-03 21:24:43 +08:00
for (k = 0; k < ATT_LEN(i,j); k++) {
2017-03-12 02:51:04 +08:00
ndx[0] = k;
expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_ITYPE($1));
if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_ITYPE($1))) {
2016-10-10 11:13:30 +08:00
/* netCDF specification make a special case for type
* conversion between uchar and scahr: do not check for
* range error. See
2021-11-12 01:47:49 +08:00
* https://docs.unidata.ucar.edu/netcdf-c/current/data_type.html#type_conversion
2016-10-10 11:13:30 +08:00
*/
IfCheckTextChar($1, ATT_TYPE(i,j))
ifelse(`$1',`uchar', `if (cdf_format > NC_FORMAT_64BIT_OFFSET || (cdf_format < NC_FORMAT_CDF5 && ATT_TYPE(i,j) != NC_BYTE))')
allInIntRange &= CheckRange($1,expect[k]);
2010-06-03 21:24:43 +08:00
} else {
allInExtRange = 0;
}
2016-10-10 11:13:30 +08:00
}
err = GetAtt($1)(ncid, i, ATT_NAME(i,j), value);
2010-06-03 21:24:43 +08:00
if (canConvert || ATT_LEN(i,j) == 0) {
if (allInExtRange) {
if (allInIntRange) {
2016-10-10 11:13:30 +08:00
IF (err != NC_NOERR)
EXPECT_ERR(NC_NOERR, err)
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')')
2010-06-03 21:24:43 +08:00
} else {
IF (err != NC_ERANGE)
EXPECT_ERR(NC_ERANGE, err)
ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')
2010-06-03 21:24:43 +08:00
}
} else {
2016-10-10 11:13:30 +08:00
IF (err != NC_NOERR && err != NC_ERANGE)
EXPECT_ERR(NC_NOERR or NC_ERANGE, err)
2010-06-03 21:24:43 +08:00
}
2016-10-10 11:13:30 +08:00
for (k = 0; k < ATT_LEN(i,j); k++) {
if (CheckNumRange($1, expect[k], ATT_TYPE(i,j))) {
2016-10-13 15:17:31 +08:00
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((double)value[k],expect[k],ATT_TYPE(i,j), NCT_ITYPE($1))){
2016-10-10 11:13:30 +08:00
error("value read not that expected");
2010-06-03 21:24:43 +08:00
if (verbose) {
error("\n");
error("varid: %d, ", i);
2016-10-10 11:13:30 +08:00
if (i == -1)
error("var_type: GLOBAL, ");
else
error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i]));
2010-06-03 21:24:43 +08:00
error("att_name: %s, ", ATT_NAME(i,j));
2016-10-10 11:13:30 +08:00
error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
error("element number: %d, ", k);
error("expect: %g, ", expect[k]);
2010-06-03 21:24:43 +08:00
error("got: %g", (double) value[k]);
}
2016-10-10 11:13:30 +08:00
} else {
nok++;
2010-06-03 21:24:43 +08:00
}
2016-10-10 11:13:30 +08:00
}
}
} else {
IF (err != NC_ECHAR)
EXPECT_ERR(NC_ECHAR, err)
2016-10-10 11:13:30 +08:00
}
}
2010-06-03 21:24:43 +08:00
}
2016-10-13 15:17:31 +08:00
err = APIFunc(close)(ncid);
2016-10-10 11:13:30 +08:00
IF (err != NC_NOERR)
2016-10-13 15:17:31 +08:00
error("close: %s", APIFunc(strerror)(err));
2016-10-10 11:13:30 +08:00
return nok;
2010-06-03 21:24:43 +08:00
}
')dnl
TEST_NC_GET_ATT(text)
TEST_NC_GET_ATT(uchar)
TEST_NC_GET_ATT(schar)
TEST_NC_GET_ATT(short)
TEST_NC_GET_ATT(int)
TEST_NC_GET_ATT(long)
TEST_NC_GET_ATT(float)
TEST_NC_GET_ATT(double)
2015-08-16 06:26:35 +08:00
TEST_NC_GET_ATT(ushort)
TEST_NC_GET_ATT(uint)
TEST_NC_GET_ATT(longlong)
TEST_NC_GET_ATT(ulonglong)