mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-11-21 03:13:42 +08:00
1024 lines
40 KiB
Plaintext
1024 lines
40 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_get.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_get.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_get_$1',`test_nc_get_$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(`VarArgs', `ifdef(`PNETCDF',`int numVars',`void')')dnl
|
|
define(`AttVarArgs',`ifdef(`PNETCDF',`int numGatts,int numVars',`void')')dnl
|
|
|
|
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
|
|
|
|
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
|
|
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
|
|
|
|
dnl TEST_NC_GET_VAR1(TYPE)
|
|
dnl
|
|
define(`TEST_NC_GET_VAR1',dnl
|
|
`dnl
|
|
int
|
|
TestFunc(var1)_$1(VarArgs)
|
|
{
|
|
int i, j, err, ncid, cdf_format;
|
|
int nok = 0; /* count of valid comparisons */
|
|
int canConvert; /* Both text or both numeric */
|
|
IntType index[MAX_RANK];
|
|
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));
|
|
|
|
/* check if can detect a bad file ID */
|
|
err = GetVar1($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 = GetVar1($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);
|
|
|
|
/* check if can detect out of boundary requests */
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
index[j] = var_shape[i][j]; /* make an out-of-boundary starts[] */
|
|
err = GetVar1($1)(ncid, i, index, &value);
|
|
if (!canConvert) {
|
|
IF (err != NC_ECHAR)
|
|
error("expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
} else IF (err != NC_EINVALCOORDS)
|
|
error("expecting NC_EINVALCOORDS but got %s", nc_err_code_name(err));
|
|
index[j] = 0;
|
|
}
|
|
|
|
/* 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 != NC_NOERR) error("error in toMixedBase 1");
|
|
|
|
/* 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));
|
|
|
|
if (var_rank[i] == 0 && i%2 )
|
|
/* this var has no dim, a scalar variable */
|
|
err = GetVar1($1)(ncid, i, NULL, &value);
|
|
else
|
|
err = GetVar1($1)(ncid, i, index, &value);
|
|
|
|
if (canConvert) {
|
|
if (inRange3(cdf_format, expect,var_type[i], NCT_ITYPE($1))) {
|
|
if (CheckRange($1, expect)) {
|
|
IF (err != NC_NOERR) {
|
|
error("%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("expected: %G, got: %G", expect, (double) value);
|
|
} else {
|
|
nok++;
|
|
}
|
|
}
|
|
} else {
|
|
IF (err != NC_ERANGE)
|
|
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
|
|
}
|
|
} else {
|
|
IF (err != NC_NOERR && err != NC_ERANGE)
|
|
error("expecting NC_NOERR or NC_ERANGE but got %s", nc_err_code_name(err));
|
|
}
|
|
} else {
|
|
IF (err != NC_ECHAR)
|
|
error("expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
}
|
|
}
|
|
}
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
')dnl
|
|
|
|
TEST_NC_GET_VAR1(text)
|
|
TEST_NC_GET_VAR1(schar)
|
|
TEST_NC_GET_VAR1(uchar)
|
|
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)
|
|
TEST_NC_GET_VAR1(ushort)
|
|
TEST_NC_GET_VAR1(uint)
|
|
TEST_NC_GET_VAR1(longlong)
|
|
TEST_NC_GET_VAR1(ulonglong)
|
|
|
|
|
|
dnl TEST_NC_GET_VAR(TYPE)
|
|
dnl
|
|
define(`TEST_NC_GET_VAR',dnl
|
|
`dnl
|
|
int
|
|
TestFunc(var)_$1(VarArgs)
|
|
{
|
|
int i, j, err, nels, ncid, cdf_format;
|
|
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 */
|
|
int canConvert; /* Both text or both numeric */
|
|
IntType index[MAX_RANK];
|
|
double expect[MAX_NELS];
|
|
$1 value[MAX_NELS];
|
|
|
|
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));
|
|
|
|
/* check if can detect a bad file ID */
|
|
err = GetVar($1)(BAD_ID, 0, 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 = GetVar($1)(ncid, BAD_VARID, 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);
|
|
assert(var_rank[i] <= MAX_RANK);
|
|
assert(var_nels[i] <= MAX_NELS);
|
|
|
|
/* check if the contents are supposed to be */
|
|
for (nels=1,j=0; j<var_rank[i]; j++) nels *= var_shape[i][j];
|
|
|
|
allInExtRange = allInIntRange = 1;
|
|
for (j = 0; j < nels; j++) {
|
|
err = toMixedBase(j, var_rank[i], var_shape[i], index);
|
|
IF (err != NC_NOERR) error("error in toMixedBase 1");
|
|
|
|
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))) {
|
|
IfCheckTextChar($1, var_type[i])
|
|
allInIntRange &= CheckRange($1,expect[j]);
|
|
} else {
|
|
allInExtRange = 0;
|
|
}
|
|
}
|
|
err = GetVar($1)(ncid, i, value);
|
|
if (canConvert) {
|
|
if (allInExtRange) {
|
|
if (allInIntRange) {
|
|
IF (err != NC_NOERR)
|
|
error(" %s", APIFunc(strerror)(err));
|
|
} else {
|
|
IF (err != NC_ERANGE)
|
|
error("expecting NC_ERANGE but got %s", nc_err_code_name(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 (j = 0; j < nels; j++) {
|
|
if (CheckNumRange($1, expect[j], var_type[i])) {
|
|
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(value[j],expect[j],var_type[i],NCT_ITYPE($1))){
|
|
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++;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
IF (nels > 0 && err != NC_ECHAR)
|
|
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
}
|
|
}
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
')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)
|
|
TEST_NC_GET_VAR(ushort)
|
|
TEST_NC_GET_VAR(uint)
|
|
TEST_NC_GET_VAR(longlong)
|
|
TEST_NC_GET_VAR(ulonglong)
|
|
|
|
|
|
dnl TEST_NC_GET_VARA(TYPE)
|
|
dnl
|
|
define(`TEST_NC_GET_VARA',dnl
|
|
`dnl
|
|
int
|
|
TestFunc(vara)_$1(VarArgs)
|
|
{
|
|
int i, j, k, d, err, nels, nslabs, ncid, cdf_format;
|
|
int allInExtRange; /* all values within external range? */
|
|
int allInIntRange; /* all values within internal range? */
|
|
int nok = 0; /* count of valid comparisons */
|
|
int canConvert; /* Both text or both numeric */
|
|
IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK];
|
|
double expect[MAX_NELS];
|
|
$1 value[MAX_NELS];
|
|
|
|
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)
|
|
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
err = GetVara($1)(ncid, BAD_VARID, NULL, 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);
|
|
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++) {
|
|
start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */
|
|
err = GetVara($1)(ncid, i, start, edge, value);
|
|
IF (canConvert && err != NC_EINVALCOORDS)
|
|
error("expecting NC_EINVALCOORDS but got %s", nc_err_code_name(err));
|
|
start[j] = 0;
|
|
edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */
|
|
err = GetVara($1)(ncid, i, start, edge, value);
|
|
IF (canConvert && err != NC_EEDGE)
|
|
error("expecting NC_EEDGE but got %s", nc_err_code_name(err));
|
|
edge[j] = 1;
|
|
}
|
|
/* Check non-scalars for correct error returned even when */
|
|
/* there is nothing to get (edge[j]==0) */
|
|
if (var_rank[i] > 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] > 0) { /* skip record dim */
|
|
start[j] = var_shape[i][j];
|
|
err = GetVara($1)(ncid, i, start, edge, value);
|
|
IF (canConvert && err != NC_EINVALCOORDS)
|
|
error("expecting NC_EINVALCOORDS but got %s", nc_err_code_name(err));
|
|
start[j] = 0;
|
|
}
|
|
}
|
|
err = GetVara($1)(ncid, i, start, edge, value);
|
|
if (canConvert) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
} else {
|
|
IF (err != NC_ECHAR)
|
|
error("expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
}
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
edge[j] = 1;
|
|
}
|
|
}
|
|
/* Choose a random point dividing each dim into 2 parts */
|
|
/* get 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 get 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];
|
|
}
|
|
allInExtRange = allInIntRange = 1;
|
|
for (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];
|
|
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))) {
|
|
IfCheckTextChar($1, var_type[i])
|
|
allInIntRange &= CheckRange($1,expect[j]);
|
|
} else {
|
|
allInExtRange = 0;
|
|
}
|
|
}
|
|
if (var_rank[i] == 0 && i%2)
|
|
err = GetVara($1)(ncid, i, NULL, NULL, value);
|
|
else
|
|
err = GetVara($1)(ncid, i, start, edge, value);
|
|
if (canConvert) {
|
|
if (allInExtRange) {
|
|
if (allInIntRange) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
} else {
|
|
IF (err != NC_ERANGE)
|
|
error("expecting NC_ERANGE but got %s", nc_err_code_name(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 (j = 0; j < nels; j++) {
|
|
if (CheckNumRange($1, expect[j], var_type[i])) {
|
|
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(value[j],expect[j],var_type[i],NCT_ITYPE($1))){
|
|
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++;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
IF (nels > 0 && err != NC_ECHAR)
|
|
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
}
|
|
}
|
|
}
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
')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)
|
|
TEST_NC_GET_VARA(ushort)
|
|
TEST_NC_GET_VARA(uint)
|
|
TEST_NC_GET_VARA(longlong)
|
|
TEST_NC_GET_VARA(ulonglong)
|
|
|
|
|
|
dnl TEST_NC_GET_VARS(TYPE)
|
|
dnl
|
|
define(`TEST_NC_GET_VARS',dnl
|
|
`dnl
|
|
int
|
|
TestFunc(vars)_$1(VarArgs)
|
|
{
|
|
int i, j, k, d, m, err, nels, nslabs, ncid, cdf_format;
|
|
int allInExtRange; /* all values within external range? */
|
|
int allInIntRange; /* all values within internal range? */
|
|
int nstarts; /* number of different starts */
|
|
int nok = 0; /* count of valid comparisons */
|
|
int canConvert; /* Both text or both numeric */
|
|
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];
|
|
double expect[MAX_NELS];
|
|
$1 value[MAX_NELS];
|
|
|
|
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 = GetVars($1)(BAD_ID, 0, NULL, NULL, NULL, value);
|
|
IF (err != NC_EBADID)
|
|
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
err = GetVars($1)(ncid, BAD_VARID, NULL, NULL, 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);
|
|
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++) {
|
|
start[j] = var_shape[i][j];
|
|
err = GetVars($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 {
|
|
IF (err != NC_EINVALCOORDS)
|
|
error("expecting NC_EINVALCOORDS but got %s", nc_err_code_name(err));
|
|
start[j] = 0;
|
|
edge[j] = var_shape[i][j] + 1;
|
|
err = GetVars($1)(ncid, i, start, edge, stride, value);
|
|
IF (err != NC_EEDGE)
|
|
error("expecting NC_EEDGE but got %s", nc_err_code_name(err));
|
|
edge[j] = 1;
|
|
stride[j] = 0;
|
|
err = GetVars($1)(ncid, i, start, edge, stride, value);
|
|
IF (err != NC_ESTRIDE)
|
|
error("expecting NC_ESTRIDE but got %s", nc_err_code_name(err));
|
|
stride[j] = 1;
|
|
}
|
|
}
|
|
/* Choose a random point dividing each dim into 2 parts */
|
|
/* get 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 get 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];
|
|
}
|
|
}
|
|
*/
|
|
allInExtRange = allInIntRange = 1;
|
|
for (j = 0; j < nels; j++) {
|
|
err = toMixedBase(j, var_rank[i], count, index2);
|
|
IF (err != NC_NOERR)
|
|
error("error in toMixedBase 1");
|
|
for (d = 0; d < var_rank[i]; d++)
|
|
index2[d] = index[d] + index2[d] * 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))) {
|
|
IfCheckTextChar($1, var_type[i])
|
|
allInIntRange &= CheckRange($1,expect[j]);
|
|
} else {
|
|
allInExtRange = 0;
|
|
}
|
|
}
|
|
if (var_rank[i] == 0 && i%2 )
|
|
err = GetVars($1)(ncid, i, NULL, NULL, NULL, value);
|
|
else
|
|
err = GetVars($1)(ncid, i, index, count, stride, value);
|
|
if (canConvert) {
|
|
if (allInExtRange) {
|
|
if (allInIntRange) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
} else {
|
|
IF (err != NC_ERANGE)
|
|
error("expecting NC_ERANGE but got %s", nc_err_code_name(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 (j = 0; j < nels; j++) {
|
|
if (CheckNumRange($1, expect[j], var_type[i])) {
|
|
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(value[j],expect[j],var_type[i], NCT_ITYPE($1))){
|
|
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++;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
IF (nels > 0 && err != NC_ECHAR)
|
|
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
')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)
|
|
TEST_NC_GET_VARS(ushort)
|
|
TEST_NC_GET_VARS(uint)
|
|
TEST_NC_GET_VARS(longlong)
|
|
TEST_NC_GET_VARS(ulonglong)
|
|
|
|
|
|
dnl TEST_NC_GET_VARM(TYPE)
|
|
dnl
|
|
define(`TEST_NC_GET_VARM',dnl
|
|
`dnl
|
|
int
|
|
TestFunc(varm)_$1(VarArgs)
|
|
{
|
|
int i, j, k, m, d, err, nels, nslabs, ncid, cdf_format;
|
|
int allInExtRange; /* all values within external range? */
|
|
int allInIntRange; /* all values within internal range? */
|
|
int nstarts; /* number of different starts */
|
|
int nok = 0; /* count of valid comparisons */
|
|
int canConvert; /* Both text or both numeric */
|
|
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];
|
|
double expect[MAX_NELS];
|
|
$1 value[MAX_NELS];
|
|
|
|
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 = GetVarm($1)(BAD_ID, 0, NULL, NULL, NULL, NULL, value);
|
|
IF (err != NC_EBADID)
|
|
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
err = GetVarm($1)(ncid, BAD_VARID, NULL, NULL, NULL, 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);
|
|
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++) {
|
|
start[j] = var_shape[i][j];
|
|
err = GetVarm($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 {
|
|
IF (err != NC_EINVALCOORDS)
|
|
error("expecting NC_EINVALCOORDS but got %s", nc_err_code_name(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)
|
|
error("expecting NC_EEDGE but got %s", nc_err_code_name(err));
|
|
edge[j] = 1;
|
|
stride[j] = 0;
|
|
err = GetVarm($1)(ncid, i, start, edge, stride, imap, value);
|
|
IF (err != NC_ESTRIDE)
|
|
error("expecting NC_ESTRIDE but got %s", nc_err_code_name(err));
|
|
stride[j] = 1;
|
|
}
|
|
}
|
|
/* Choose a random point dividing each dim into 2 parts */
|
|
/* get 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 get 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];
|
|
}
|
|
allInExtRange = allInIntRange = 1;
|
|
for (j = 0; j < nels; j++) {
|
|
err = toMixedBase(j, var_rank[i], count, index2);
|
|
IF (err != NC_NOERR)
|
|
error("error in toMixedBase 1");
|
|
for (d = 0; d < var_rank[i]; d++)
|
|
index2[d] = index[d] + index2[d] * 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))) {
|
|
IfCheckTextChar($1, var_type[i])
|
|
allInIntRange &= CheckRange($1,expect[j]);
|
|
} else {
|
|
allInExtRange = 0;
|
|
}
|
|
}
|
|
if (var_rank[i] == 0 && i%2 )
|
|
err = GetVarm($1)(ncid,i,NULL,NULL,NULL,NULL,value);
|
|
else
|
|
err = GetVarm($1)(ncid,i,index,count,stride,imap,value);
|
|
if (canConvert) {
|
|
if (allInExtRange) {
|
|
if (allInIntRange) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
} else {
|
|
IF (err != NC_ERANGE)
|
|
error("expecting NC_ERANGE but got %s", nc_err_code_name(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 (j = 0; j < nels; j++) {
|
|
if (CheckNumRange($1, expect[j], var_type[i])) {
|
|
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(value[j],expect[j],var_type[i], NCT_ITYPE($1))){
|
|
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++;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
IF (nels > 0 && err != NC_ECHAR)
|
|
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
')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)
|
|
TEST_NC_GET_VARM(ushort)
|
|
TEST_NC_GET_VARM(uint)
|
|
TEST_NC_GET_VARM(longlong)
|
|
TEST_NC_GET_VARM(ulonglong)
|
|
|
|
|
|
dnl TEST_NC_GET_ATT(TYPE)
|
|
dnl
|
|
define(`TEST_NC_GET_ATT',dnl
|
|
`dnl
|
|
int
|
|
TestFunc(att)_$1(AttVarArgs)
|
|
{
|
|
int i, j, err, ncid, cdf_format;
|
|
IntType k;
|
|
int allInExtRange;
|
|
int allInIntRange;
|
|
int canConvert; /* Both text or both numeric */
|
|
int nok = 0; /* count of valid comparisons */
|
|
double expect[MAX_NELS];
|
|
$1 value[MAX_NELS];
|
|
|
|
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)
|
|
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
err = GetAtt($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 = -1; i < numVars; i++) {
|
|
for (j = 0; j < NATTS(i); j++) {
|
|
canConvert = (ATT_TYPE(i,j) == NC_CHAR) CheckText($1);
|
|
|
|
err = GetAtt($1)(ncid, BAD_VARID, ATT_NAME(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 = GetAtt($1)(ncid, i, NULL, NULL);
|
|
IF (err != NC_EBADNAME)
|
|
error("expecting NC_EBADNAME but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
err = GetAtt($1)(ncid, i, "noSuch", value);
|
|
IF (err != NC_ENOTATT)
|
|
error("expecting NC_ENOTATT but got %s", nc_err_code_name(err));
|
|
|
|
allInExtRange = allInIntRange = 1;
|
|
for (k = 0; k < ATT_LEN(i,j); k++) {
|
|
expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, &k, NCT_ITYPE($1));
|
|
if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_ITYPE($1))) {
|
|
/* netCDF specification make a special case for type
|
|
* conversion between uchar and scahr: do not check for
|
|
* range error. See
|
|
* http://www.unidata.ucar.edu/software/netcdf/docs_rc/data_type.html#type_conversion
|
|
*/
|
|
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]);
|
|
} else {
|
|
allInExtRange = 0;
|
|
}
|
|
}
|
|
err = GetAtt($1)(ncid, i, ATT_NAME(i,j), value);
|
|
if (canConvert || ATT_LEN(i,j) == 0) {
|
|
if (allInExtRange) {
|
|
if (allInIntRange) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
} else {
|
|
IF (err != NC_ERANGE)
|
|
error("expecting NC_ERANGE but got %s", nc_err_code_name(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 < ATT_LEN(i,j); k++) {
|
|
if (CheckNumRange($1, expect[k], ATT_TYPE(i,j))) {
|
|
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],ATT_TYPE(i,j), NCT_ITYPE($1))){
|
|
error("value read not that expected");
|
|
if (verbose) {
|
|
error("\n");
|
|
error("varid: %d, ", i);
|
|
if (i == -1)
|
|
error("var_type: GLOBAL, ");
|
|
else
|
|
error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[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++;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
IF (err != NC_ECHAR)
|
|
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
}
|
|
}
|
|
}
|
|
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
')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)
|
|
TEST_NC_GET_ATT(ushort)
|
|
TEST_NC_GET_ATT(uint)
|
|
TEST_NC_GET_ATT(longlong)
|
|
TEST_NC_GET_ATT(ulonglong)
|
|
|