1dnl This is m4 source. 2dnl Process using m4 to produce 'C' language file. 3dnl 4dnl This file is supposed to be the same as PnetCDF's test_get.m4 5dnl 6dnl If you see this line, you can ignore the next one. 7/* Do not edit this file. It is produced from the corresponding .m4 source */ 8dnl 9/* 10 * Copyright (C) 2003, Northwestern University and Argonne National Laboratory 11 * See COPYRIGHT notice in top-level directory. 12 */ 13/* $Id: test_get.m4 2672 2016-12-03 19:23:53Z wkliao $ */ 14 15dnl 16dnl The command-line m4 macro "PNETCDF" is to differentiate PnetCDF and netCDF 17dnl in terms of function prefix names (ncmpi_ vs. nc_), integer data types 18dnl (MPI_Offset vs. size_t), and function name substrings for external data 19dnl types. 20dnl 21 22#include "tests.h" 23 24ifdef(`PNETCDF',,`dnl 25#ifdef USE_PNETCDF 26#include <pnetcdf.h> 27#ifndef PNETCDF_VERSION_MAJOR 28#error("PNETCDF_VERSION_MAJOR is not defined in pnetcdf.h") 29#endif 30#ifndef PNETCDF_VERSION_MINOR 31#error("PNETCDF_VERSION_MAJOR is not defined in pnetcdf.h") 32#endif 33#endif') 34 35define(`EXPECT_ERR',`error("expecting $1 but got %s",nc_err_code_name($2));')dnl 36 37define(`IntType', `ifdef(`PNETCDF',`MPI_Offset',`size_t')')dnl 38define(`PTRDType',`ifdef(`PNETCDF',`MPI_Offset',`ptrdiff_t')')dnl 39define(`TestFunc',`ifdef(`PNETCDF',`test_ncmpi_get_$1',`test_nc_get_$1')')dnl 40define(`APIFunc',` ifdef(`PNETCDF',`ncmpi_$1',`nc_$1')')dnl 41 42define(`FileOpen', `ifdef(`PNETCDF',`ncmpi_open(comm, $1, $2, info, &ncid)', `file_open($1, $2, &ncid)')')dnl 43 44define(`VarArgs', `ifdef(`PNETCDF',`int numVars',`void')')dnl 45define(`AttVarArgs',`ifdef(`PNETCDF',`int numGatts,int numVars',`void')')dnl 46 47define(`GetVar1',`ifdef(`PNETCDF',`ncmpi_get_var1_$1_all',`nc_get_var1_$1')')dnl 48define(`GetVar', `ifdef(`PNETCDF',`ncmpi_get_var_$1_all', `nc_get_var_$1')')dnl 49define(`GetVara',`ifdef(`PNETCDF',`ncmpi_get_vara_$1_all',`nc_get_vara_$1')')dnl 50define(`GetVars',`ifdef(`PNETCDF',`ncmpi_get_vars_$1_all',`nc_get_vars_$1')')dnl 51define(`GetVarm',`ifdef(`PNETCDF',`ncmpi_get_varm_$1_all',`nc_get_varm_$1')')dnl 52define(`GetAtt', `ifdef(`PNETCDF',`ncmpi_get_att_$1',`nc_get_att_$1')')dnl 53 54define(`PNETCDF_CHECK_ERANGE',`dnl 55ifelse(`$1',`uchar',`ifdef(`PNETCDF',,` 56`#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=8)')', 57 `$1',`schar',`ifdef(`PNETCDF',,` 58`#'if defined(USE_PNETCDF) && PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR<7 59 else if (cdf_format < NC_FORMAT_CDF5) { 60`#'else')') 61 else { 62ifelse(`$1',`schar',`ifdef(`PNETCDF',,``#'endif')') 63 IF (err != NC_ERANGE) 64 EXPECT_ERR(NC_ERANGE, err) 65 ELSE_NOK 66 } 67ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')')' 68)dnl 69 70undefine(`index')dnl 71dnl dnl dnl 72dnl 73dnl Macros 74dnl 75dnl dnl dnl 76dnl 77dnl Upcase(str) 78dnl 79define(`Upcase',dnl 80`dnl 81translit($1, abcdefghijklmnopqrstuvwxyz, ABCDEFGHIJKLMNOPQRSTUVWXYZ)')dnl 82dnl dnl dnl 83dnl 84dnl NCT_ITYPE(type) 85dnl 86define(`NCT_ITYPE', ``NCT_'Upcase($1)')dnl 87dnl 88 89define(`CheckText', `ifelse(`$1',`text', , `== (NCT_ITYPE($1) == NCT_TEXT)')')dnl 90define(`CheckRange',`ifelse(`$1',`text', `1', `($2 >= $1_min && $2 <= $1_max)')')dnl 91define(`IfCheckTextChar', `ifelse(`$1',`text', `if ($2 != NC_CHAR)')')dnl 92define(`CheckNumRange',`ifelse(`$1',`text', `1',`inRange3(cdf_format, $2,$3,NCT_ITYPE($1)) && ($2 >= $1_min && $2 <= $1_max)')')dnl 93 94dnl TEST_NC_GET_VAR1(TYPE) 95dnl 96define(`TEST_NC_GET_VAR1',dnl 97`dnl 98int 99TestFunc(var1)_$1(VarArgs) 100{ 101 int i, err, ncid, cdf_format; 102 int nok = 0; /* count of valid comparisons */ 103 int canConvert; /* Both text or both numeric */ 104 IntType j, index[MAX_RANK]; 105 double expect; 106 $1 value[1]; 107 108 err = FileOpen(testfile, NC_NOWRITE); 109 IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err)); 110 111 err = APIFunc(inq_format)(ncid, &cdf_format); 112 IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err)); 113 114 /* check if can detect a bad file ID */ 115 err = GetVar1($1)(BAD_ID, 0, NULL, NULL); 116 IF (err != NC_EBADID) 117 EXPECT_ERR(NC_EBADID, err) 118 ELSE_NOK 119 120 /* check if can detect a bad variable ID */ 121 err = GetVar1($1)(ncid, BAD_VARID, NULL, NULL); 122 IF (err != NC_ENOTVAR) 123 EXPECT_ERR(NC_ENOTVAR, err) 124 ELSE_NOK 125 126 for (i = 0; i < numVars; i++) { 127 assert(var_rank[i] <= MAX_RANK); 128 assert(var_nels[i] <= MAX_NELS); 129 130 /* check if can detect a bad file ID */ 131 err = GetVar1($1)(BAD_ID, i, NULL, value); 132 IF (err != NC_EBADID) 133 EXPECT_ERR(NC_EBADID, err) 134 ELSE_NOK 135 136 canConvert = (var_type[i] == NC_CHAR) CheckText($1); 137 138ifdef(`PNETCDF',`dnl 139 /* for non-scalar variables, argument start cannot be NULL */ 140 err = GetVar1($1)(ncid, i, NULL, value); 141 if (!canConvert) { 142 IF (err != NC_ECHAR) EXPECT_ERR(NC_ECHAR, err) 143 } 144 else if (var_rank[i] == 0) { 145 index[0] = 0; 146 expect = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1)); 147 if (inRange3(cdf_format, expect, var_type[i], NCT_ITYPE($1)) && 148 CheckRange($1, expect)) { 149 IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err) 150 } 151ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')') 152 else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err) 153ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')') 154 } 155 else IF (err != NC_EINVALCOORDS) { 156 EXPECT_ERR(NC_EINVALCOORDS, err) 157 } 158 ELSE_NOK 159')dnl 160 161 /* test NC_EINVALCOORDS */ 162 for (j = 0; j < var_rank[i]; j++) index[j] = 0; 163 164 for (j = 0; j < var_rank[i]; j++) { 165 if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */ 166 index[j] = var_shape[i][j]; /* out of boundary check */ 167 err = GetVar1($1)(ncid, i, index, value); 168 if (!canConvert) { 169 IF (err != NC_ECHAR) 170 EXPECT_ERR(NC_ECHAR, err) 171 ELSE_NOK 172 } else IF (err != NC_EINVALCOORDS) 173 EXPECT_ERR(NC_EINVALCOORDS, err) 174 ELSE_NOK 175 index[j] = 0; 176 } 177 178 /* check if the contents are supposed to be */ 179 for (j = 0; j < var_nels[i]; j++) { 180 err = toMixedBase(j, var_rank[i], var_shape[i], index); 181 IF (err != 0) error("error in toMixedBase"); 182 /* when file is created the variable contents are generated by 183 * hash functions */ 184 expect = hash4(cdf_format, var_type[i], var_rank[i], index, 185 NCT_ITYPE($1)); 186 err = GetVar1($1)(ncid, i, index, value); 187 if (canConvert) { 188 if (inRange3(cdf_format, expect,var_type[i], NCT_ITYPE($1))) { 189 if (CheckRange($1, expect)) { 190 IF (err != NC_NOERR) { 191 EXPECT_ERR(NC_NOERR, err) 192 } else { 193 ifelse(`$1', `uchar', ` 194 /* in put_vars(), API _put_vara_double() is used to 195 * write the NC_BYTE variables to files. In this 196 * case, NC_BYTE variables are treated as signed 197 * for CDF-1 and 2 formats. Thus, we must skip the 198 * equal test below for uchar. 199 */ 200 if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect > schar_max) continue;') 201 IF (!equal((double)value[0], expect, var_type[i], NCT_ITYPE($1))) { 202 error("expected: %G, got: %G", expect, (double)value[0]); 203 } 204 ELSE_NOK 205 } 206 } 207 PNETCDF_CHECK_ERANGE($1) 208 } else { 209 IF (err != NC_NOERR && err != NC_ERANGE) 210 EXPECT_ERR(NC_NOERR or NC_ERANGE, err) 211 } 212 } else { 213 IF (err != NC_ECHAR) 214 EXPECT_ERR(NC_ECHAR, err) 215 ELSE_NOK 216 } 217 } 218 } 219 err = APIFunc(close)(ncid); 220 IF (err != NC_NOERR) 221 error("close: %s", APIFunc(strerror)(err)); 222 return nok; 223} 224')dnl 225 226TEST_NC_GET_VAR1(text) 227TEST_NC_GET_VAR1(schar) 228TEST_NC_GET_VAR1(uchar) 229TEST_NC_GET_VAR1(short) 230TEST_NC_GET_VAR1(int) 231TEST_NC_GET_VAR1(long) 232TEST_NC_GET_VAR1(float) 233TEST_NC_GET_VAR1(double) 234TEST_NC_GET_VAR1(ushort) 235TEST_NC_GET_VAR1(uint) 236TEST_NC_GET_VAR1(longlong) 237TEST_NC_GET_VAR1(ulonglong) 238 239 240dnl TEST_NC_GET_VAR(TYPE) 241dnl 242define(`TEST_NC_GET_VAR',dnl 243`dnl 244int 245TestFunc(var)_$1(VarArgs) 246{ 247 int i, err, ncid, cdf_format; 248 int allInExtRange; /* all values within range of external data type */ 249 int allInIntRange; /* all values within range of internal data type */ 250 int nok = 0; /* count of valid comparisons */ 251 int canConvert; /* Both text or both numeric */ 252 IntType j, index[MAX_RANK]; 253 double expect[MAX_NELS]; 254 $1 value[MAX_NELS]; 255 256 err = FileOpen(testfile, NC_NOWRITE); 257 IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err)); 258 259 err = APIFunc(inq_format)(ncid, &cdf_format); 260 IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err)); 261 262 /* check if can detect a bad file ID */ 263 err = GetVar($1)(BAD_ID, 0, value); 264 IF (err != NC_EBADID) 265 EXPECT_ERR(NC_EBADID, err) 266 ELSE_NOK 267 268 /* check if can detect a bad variable ID */ 269 err = GetVar($1)(ncid, BAD_VARID, value); 270 IF (err != NC_ENOTVAR) 271 EXPECT_ERR(NC_ENOTVAR, err) 272 ELSE_NOK 273 274 for (i = 0; i < numVars; i++) { 275 assert(var_rank[i] <= MAX_RANK); 276 assert(var_nels[i] <= MAX_NELS); 277 278 /* check if can detect a bad file ID */ 279 err = GetVar($1)(BAD_ID, i, value); 280 IF (err != NC_EBADID) 281 EXPECT_ERR(NC_EBADID, err) 282 ELSE_NOK 283 284 canConvert = (var_type[i] == NC_CHAR) CheckText($1); 285 286 allInExtRange = allInIntRange = 1; 287 for (j = 0; j < var_nels[i]; j++) { 288 err = toMixedBase(j, var_rank[i], var_shape[i], index); 289 IF (err != 0) error("error in toMixedBase"); 290 expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index, 291 NCT_ITYPE($1)); 292 if (inRange3(cdf_format, expect[j],var_type[i], NCT_ITYPE($1))) { 293 IfCheckTextChar($1, var_type[i]) 294 allInIntRange &= CheckRange($1,expect[j]); 295 } else 296 allInExtRange = 0; 297 } 298 err = GetVar($1)(ncid, i, value); 299 if (canConvert) { 300 if (allInExtRange) { 301 if (allInIntRange) { 302 IF (err != NC_NOERR) 303 EXPECT_ERR(NC_NOERR, err) 304 } 305 PNETCDF_CHECK_ERANGE($1) 306 } else { 307 IF (err != NC_NOERR && err != NC_ERANGE) 308 EXPECT_ERR(NC_NOERR or NC_ERANGE, err) 309 } 310 for (j = 0; j < var_nels[i]; j++) { 311 if (CheckNumRange($1, expect[j], var_type[i])) { 312 ifelse(`$1', `uchar', ` 313 /* in put_vars(), API _put_vara_double() is used to 314 * write the NC_BYTE variables to files. In this 315 * case, NC_BYTE variables are treated as signed 316 * for CDF-1 and 2 formats. Thus, we must skip the 317 * equal test below for uchar. 318 */ 319 if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;') 320 IF (!equal((double)value[j],expect[j],var_type[i],NCT_ITYPE($1))){ 321 error("value read not that expected"); 322 if (verbose) { 323 error("\n"); 324 error("varid: %d, ", i); 325 error("var_name: %s, ", var_name[i]); 326 error("var_type: %s, ", s_nc_type(var_type[i])); 327 error("element number: %d, ", j); 328 error("expect: %g, ", expect[j]); 329 error("got: %g", (double) value[j]); 330 } 331 } 332 ELSE_NOK 333 } 334 } 335 } else { 336 IF (err != NC_ECHAR) 337 EXPECT_ERR(NC_ECHAR, err) 338 ELSE_NOK 339 } 340 } 341 err = APIFunc(close)(ncid); 342 IF (err != NC_NOERR) 343 error("close: %s", APIFunc(strerror)(err)); 344 return nok; 345} 346')dnl 347 348TEST_NC_GET_VAR(text) 349TEST_NC_GET_VAR(uchar) 350TEST_NC_GET_VAR(schar) 351TEST_NC_GET_VAR(short) 352TEST_NC_GET_VAR(int) 353TEST_NC_GET_VAR(long) 354TEST_NC_GET_VAR(float) 355TEST_NC_GET_VAR(double) 356TEST_NC_GET_VAR(ushort) 357TEST_NC_GET_VAR(uint) 358TEST_NC_GET_VAR(longlong) 359TEST_NC_GET_VAR(ulonglong) 360 361 362dnl TEST_NC_GET_VARA(TYPE) 363dnl 364define(`TEST_NC_GET_VARA',dnl 365`dnl 366int 367TestFunc(vara)_$1(VarArgs) 368{ 369 int i, k, err, nslabs, ncid, cdf_format; 370 int allInExtRange; /* all values within external range? */ 371 int allInIntRange; /* all values within internal range? */ 372 int nok = 0; /* count of valid comparisons */ 373 int canConvert; /* Both text or both numeric */ 374 IntType j; 375 IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK], mid[MAX_RANK]; 376 double expect[MAX_NELS]; 377 $1 value[MAX_NELS]; 378 379 err = FileOpen(testfile, NC_NOWRITE); 380 IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err)); 381 382 err = APIFunc(inq_format)(ncid, &cdf_format); 383 IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err)); 384 385 err = GetVara($1)(BAD_ID, 0, NULL, NULL, value); 386 IF (err != NC_EBADID) 387 EXPECT_ERR(NC_EBADID, err) 388 ELSE_NOK 389 390 err = GetVara($1)(ncid, BAD_VARID, NULL, NULL, value); 391 IF (err != NC_ENOTVAR) 392 EXPECT_ERR(NC_ENOTVAR, err) 393 ELSE_NOK 394 395 for (i = 0; i < numVars; i++) { 396 assert(var_rank[i] <= MAX_RANK); 397 assert(var_nels[i] <= MAX_NELS); 398 399 /* check if can detect a bad file ID */ 400 err = GetVara($1)(BAD_ID, i, NULL, NULL, value); 401 IF (err != NC_EBADID) 402 EXPECT_ERR(NC_EBADID, err) 403 ELSE_NOK 404 405 canConvert = (var_type[i] == NC_CHAR) CheckText($1); 406 407 for (j = 0; j < var_rank[i]; j++) { 408 start[j] = 0; 409 edge[j] = 1; 410 } 411 412ifdef(`PNETCDF',`dnl 413 /* for non-scalar variables, argument start cannot be NULL */ 414 err = GetVara($1)(ncid, i, NULL, NULL, value); 415 if (!canConvert) { 416 IF (err != NC_ECHAR) 417 EXPECT_ERR(NC_ECHAR, err) 418 ELSE_NOK 419 } 420 else if (var_rank[i] == 0) { 421 index[0] = 0; 422 expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1)); 423 if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) && 424 CheckRange($1, expect[0])) { 425 IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err) 426 } 427ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')') 428 else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err) 429ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')') 430 } 431 else IF (err != NC_EINVALCOORDS) { 432 EXPECT_ERR(NC_EINVALCOORDS, err) 433 } 434 ELSE_NOK 435 436 /* for non-scalar variables, argument count cannot be NULL */ 437 err = GetVara($1)(ncid, i, start, NULL, value); 438 if (!canConvert) { 439 IF (err != NC_ECHAR) 440 EXPECT_ERR(NC_ECHAR, err) 441 ELSE_NOK 442 } 443 else if (var_rank[i] == 0) { 444 index[0] = 0; 445 expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1)); 446 if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) && 447 CheckRange($1, expect[0])) { 448 IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err) 449 } 450 else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err) 451 } 452 else IF (err != NC_EEDGE) 453 EXPECT_ERR(NC_EEDGE, err) 454 ELSE_NOK 455')dnl 456 457 /* first test when edge[*] > 0 */ 458 for (j = 0; j < var_rank[i]; j++) { 459 start[j] = var_shape[i][j]; /* causes NC_EINVALCOORDS */ 460 err = GetVara($1)(ncid, i, start, edge, value); 461 if (!canConvert) { 462 IF (err != NC_ECHAR) 463 EXPECT_ERR(NC_ECHAR, err) 464 start[j] = 0; 465 continue; 466 } 467 IF (err != NC_EINVALCOORDS) 468 EXPECT_ERR(NC_EINVALCOORDS, err) 469 start[j] = 0; 470 edge[j] = var_shape[i][j] + 1; /* causes NC_EEDGE */ 471 err = GetVara($1)(ncid, i, start, edge, value); 472 IF (err != NC_EEDGE) 473 EXPECT_ERR(NC_EEDGE, err) 474 edge[j] = 1; 475 } 476 /* Check non-scalars for correct error returned even when there is 477 * nothing to get (edge[*]==0) */ 478 for (j = 0; j < var_rank[i]; j++) edge[j] = 0; 479 480 for (j = 0; j < var_rank[i]; j++) { 481 if (var_rank[i] == RECDIM) continue; /* skip record dim */ 482 start[j] = var_shape[i][j]; 483 err = GetVara($1)(ncid, i, start, edge, value); 484 if (!canConvert) { 485 IF (err != NC_ECHAR) 486 EXPECT_ERR(NC_ECHAR, err) 487 start[j] = 0; 488 continue; 489 } 490#ifdef RELAX_COORD_BOUND 491 IF (err != NC_NOERR) /* allowed when edge[j]==0 */ 492 EXPECT_ERR(NC_NOERR, err) 493#else 494 IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */ 495 EXPECT_ERR(NC_EINVALCOORDS, err) 496#endif 497 start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */ 498 err = GetVara($1)(ncid, i, start, edge, value); 499 IF (err != NC_EINVALCOORDS) 500 EXPECT_ERR(NC_EINVALCOORDS, err) 501 start[j] = 0; 502 } 503 504 err = GetVara($1)(ncid, i, start, edge, value); 505 if (!canConvert) { 506 IF (err != NC_ECHAR) 507 EXPECT_ERR(NC_ECHAR, err) 508 } else if (var_rank[i] == 0) { 509 expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1)); 510 if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) && 511 CheckRange($1, expect[0])) { 512 IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err) 513 } 514ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')') 515 else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err) 516ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')') 517 } else { 518 IF (err != NC_NOERR) 519 EXPECT_ERR(NC_NOERR, err) 520 } 521 for (j = 0; j < var_rank[i]; j++) edge[j] = 1; 522 523 /* Choose a random point dividing each dim into 2 parts */ 524 /* get 2^rank (nslabs) slabs so defined */ 525 nslabs = 1; 526 for (j = 0; j < var_rank[i]; j++) { 527 mid[j] = roll( var_shape[i][j] ); 528 nslabs *= 2; 529 } 530 /* bits of k determine whether to get lower or upper part of dim */ 531 for (k = 0; k < nslabs; k++) { 532 IntType nels = 1; 533 for (j = 0; j < var_rank[i]; j++) { 534 if ((k >> j) & 1) { 535 start[j] = 0; 536 edge[j] = mid[j]; 537 } else { 538 start[j] = mid[j]; 539 edge[j] = var_shape[i][j] - mid[j]; 540 } 541 nels *= edge[j]; 542 } 543 allInExtRange = allInIntRange = 1; 544 for (j = 0; j < nels; j++) { 545 int d; 546 err = toMixedBase(j, var_rank[i], edge, index); 547 IF (err != 0) error("error in toMixedBase"); 548 for (d = 0; d < var_rank[i]; d++) 549 index[d] += start[d]; 550 expect[j] = hash4(cdf_format, var_type[i], var_rank[i], index, 551 NCT_ITYPE($1)); 552 if (inRange3(cdf_format, expect[j],var_type[i],NCT_ITYPE($1))) { 553 IfCheckTextChar($1, var_type[i]) 554 allInIntRange &= CheckRange($1,expect[j]); 555 } else 556 allInExtRange = 0; 557 } 558 err = GetVara($1)(ncid, i, start, edge, value); 559 if (canConvert) { 560 if (allInExtRange) { 561 if (allInIntRange) { 562 IF (err != NC_NOERR) 563 EXPECT_ERR(NC_NOERR, err) 564 } 565 PNETCDF_CHECK_ERANGE($1) 566 } else { 567 IF (err != NC_NOERR && err != NC_ERANGE) 568 EXPECT_ERR(NC_NOERR or NC_ERANGE, err) 569 } 570 for (j = 0; j < nels; j++) { 571 if (CheckNumRange($1, expect[j], var_type[i])) { 572 ifelse(`$1', `uchar', ` 573 /* in put_vars(), API _put_vara_double() is used to 574 * write the NC_BYTE variables to files. In this 575 * case, NC_BYTE variables are treated as signed 576 * for CDF-1 and 2 formats. Thus, we must skip the 577 * equal test below for uchar. 578 */ 579 if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;') 580 IF (!equal((double)value[j],expect[j],var_type[i],NCT_ITYPE($1))){ 581 error("value read not that expected"); 582 if (verbose) { 583 error("\n"); 584 error("varid: %d, ", i); 585 error("var_name: %s, ", var_name[i]); 586 error("var_type: %s, ", s_nc_type(var_type[i])); 587 error("element number: %d, ", j); 588 error("expect: %g, ", expect[j]); 589 error("got: %g", (double) value[j]); 590 } 591 } 592 ELSE_NOK 593 } 594 } 595 } else { 596 IF (err != NC_ECHAR) 597 EXPECT_ERR(NC_ECHAR, err) 598 } 599 } 600 } 601 err = APIFunc(close)(ncid); 602 IF (err != NC_NOERR) 603 error("close: %s", APIFunc(strerror)(err)); 604 return nok; 605} 606')dnl 607 608TEST_NC_GET_VARA(text) 609TEST_NC_GET_VARA(uchar) 610TEST_NC_GET_VARA(schar) 611TEST_NC_GET_VARA(short) 612TEST_NC_GET_VARA(int) 613TEST_NC_GET_VARA(long) 614TEST_NC_GET_VARA(float) 615TEST_NC_GET_VARA(double) 616TEST_NC_GET_VARA(ushort) 617TEST_NC_GET_VARA(uint) 618TEST_NC_GET_VARA(longlong) 619TEST_NC_GET_VARA(ulonglong) 620 621 622dnl TEST_NC_GET_VARS(TYPE) 623dnl 624define(`TEST_NC_GET_VARS',dnl 625`dnl 626int 627TestFunc(vars)_$1(VarArgs) 628{ 629 int i, k, d, err, nslabs, ncid, cdf_format; 630 int allInExtRange; /* all values within external range? */ 631 int allInIntRange; /* all values within internal range? */ 632 PTRDType nstarts; /* number of different starts */ 633 int nok = 0; /* count of valid comparisons */ 634 int canConvert; /* Both text or both numeric */ 635 IntType j, m, nels; 636 IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK]; 637 IntType index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK]; 638 IntType sstride[MAX_RANK]; 639 PTRDType stride[MAX_RANK]; 640 double expect[MAX_NELS]; 641 $1 value[MAX_NELS]; 642 643 err = FileOpen(testfile, NC_NOWRITE); 644 IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err)); 645 646 err = APIFunc(inq_format)(ncid, &cdf_format); 647 IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err)); 648 649 err = GetVars($1)(BAD_ID, 0, NULL, NULL, NULL, value); 650 IF (err != NC_EBADID) 651 EXPECT_ERR(NC_EBADID, err) 652 ELSE_NOK 653 654 err = GetVars($1)(ncid, BAD_VARID, NULL, NULL, NULL, value); 655 IF (err != NC_ENOTVAR) 656 EXPECT_ERR(NC_ENOTVAR, err) 657 ELSE_NOK 658 659 for (i = 0; i < numVars; i++) { 660 assert(var_rank[i] <= MAX_RANK); 661 assert(var_nels[i] <= MAX_NELS); 662 663 /* check if can detect a bad file ID */ 664 err = GetVars($1)(BAD_ID, i, NULL, NULL, NULL, value); 665 IF (err != NC_EBADID) 666 EXPECT_ERR(NC_EBADID, err) 667 ELSE_NOK 668 669 canConvert = (var_type[i] == NC_CHAR) CheckText($1); 670 671 for (j = 0; j < var_rank[i]; j++) { 672 start[j] = 0; 673 edge[j] = 1; 674 stride[j] = 1; 675 } 676 677ifdef(`PNETCDF',`dnl 678 /* for non-scalar variables, argument start cannot be NULL */ 679 err = GetVars($1)(ncid, i, NULL, NULL, NULL, value); 680 if (!canConvert) { 681 IF (err != NC_ECHAR) 682 EXPECT_ERR(NC_ECHAR, err) 683 ELSE_NOK 684 } 685 else if (var_rank[i] == 0) { 686 index[0] = 0; 687 expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1)); 688 if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) && 689 CheckRange($1, expect[0])) { 690 IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err) 691 } 692 else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err) 693 } 694 else IF (err != NC_EINVALCOORDS) { 695 EXPECT_ERR(NC_EINVALCOORDS, err) 696 } 697 ELSE_NOK 698 699 /* for non-scalar variables, argument count cannot be NULL */ 700 err = GetVars($1)(ncid, i, start, NULL, NULL, value); 701 if (!canConvert) { 702 IF (err != NC_ECHAR) 703 EXPECT_ERR(NC_ECHAR, err) 704 ELSE_NOK 705 } 706 else if (var_rank[i] == 0) { 707 index[0] = 0; 708 expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1)); 709 if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) && 710 CheckRange($1, expect[0])) { 711 IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err) 712 } 713 else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err) 714 } 715 else IF (err != NC_EEDGE) 716 EXPECT_ERR(NC_EEDGE, err) 717 ELSE_NOK 718')dnl 719 720 /* first test when edge[*] > 0 */ 721 for (j = 0; j < var_rank[i]; j++) { 722 start[j] = var_shape[i][j]; 723 err = GetVars($1)(ncid, i, start, edge, stride, value); 724 if (!canConvert) { 725 IF (err != NC_ECHAR) 726 EXPECT_ERR(NC_ECHAR, err) 727 start[j] = 0; 728 continue; 729 } 730 IF (err != NC_EINVALCOORDS) 731 EXPECT_ERR(NC_EINVALCOORDS, err) 732 start[j] = 0; 733 edge[j] = var_shape[i][j] + 1; 734 err = GetVars($1)(ncid, i, start, edge, stride, value); 735 IF (err != NC_EEDGE) 736 EXPECT_ERR(NC_EEDGE, err) 737 edge[j] = 1; 738 stride[j] = 0; 739 err = GetVars($1)(ncid, i, start, edge, stride, value); 740 IF (err != NC_ESTRIDE) 741 EXPECT_ERR(NC_ESTRIDE, err) 742 stride[j] = 1; 743 } 744 745 /* Check non-scalars for correct error returned even when there is 746 * nothing to get (edge[j]==0) */ 747 for (j = 0; j < var_rank[i]; j++) edge[j] = 0; 748 749 for (j = 0; j < var_rank[i]; j++) { 750 if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */ 751 start[j] = var_shape[i][j]; 752 err = GetVars($1)(ncid, i, start, edge, stride, value); 753 if (!canConvert) { 754 IF (err != NC_ECHAR) 755 EXPECT_ERR(NC_ECHAR, err) 756 start[j] = 0; 757 continue; 758 } 759#ifdef RELAX_COORD_BOUND 760 IF (err != NC_NOERR) /* allowed when edge[j]==0 */ 761 EXPECT_ERR(NC_NOERR, err) 762#else 763 IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */ 764 EXPECT_ERR(NC_EINVALCOORDS, err) 765#endif 766 start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */ 767 err = GetVars($1)(ncid, i, start, edge, stride, value); 768 IF (err != NC_EINVALCOORDS) 769 EXPECT_ERR(NC_EINVALCOORDS, err) 770 start[j] = 0; 771ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)') 772 stride[j] = 0; 773 err = GetVars($1)(ncid, i, start, edge, stride, value); 774 IF (err != NC_ESTRIDE) 775 EXPECT_ERR(NC_ESTRIDE, err) 776 stride[j] = 1; 777ifdef(`PNETCDF',,``#'endif') 778 } 779 780 err = GetVars($1)(ncid, i, start, edge, stride, value); 781 if (!canConvert) { 782 IF (err != NC_ECHAR) 783 EXPECT_ERR(NC_ECHAR, err) 784 } else if (var_rank[i] == 0) { 785 expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1)); 786 if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) && 787 CheckRange($1, expect[0])) { 788 IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err) 789 } 790ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')') 791 else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err) 792ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')') 793 } else { 794 IF (err != NC_NOERR) 795 EXPECT_ERR(NC_NOERR, err) 796 } 797 for (j = 0; j < var_rank[i]; j++) edge[j] = 1; 798 799 /* Choose a random point dividing each dim into 2 parts */ 800 /* get 2^rank (nslabs) slabs so defined */ 801 nslabs = 1; 802 for (j = 0; j < var_rank[i]; j++) { 803 mid[j] = roll( var_shape[i][j] ); 804 nslabs *= 2; 805 } 806 /* bits of k determine whether to get lower or upper part of dim */ 807 /* choose random stride from 1 to edge */ 808 for (k = 0; k < nslabs; k++) { 809 nstarts = 1; 810 for (j = 0; j < var_rank[i]; j++) { 811 if ((k >> j) & 1) { 812 start[j] = 0; 813 edge[j] = mid[j]; 814 } else { 815 start[j] = mid[j]; 816 edge[j] = var_shape[i][j] - mid[j]; 817 } 818 sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1; 819 stride[j] = (PTRDType)sstride[j]; 820 nstarts *= stride[j]; 821 } 822 for (m = 0; m < nstarts; m++) { 823 err = toMixedBase(m, var_rank[i], sstride, index); 824 IF (err != 0) error("error in toMixedBase"); 825 nels = 1; 826 for (j = 0; j < var_rank[i]; j++) { 827 count[j] = 1 + (edge[j]-index[j]-1) / (IntType)stride[j]; 828 nels *= count[j]; 829 index[j] += start[j]; 830 } 831 /* Random choice of forward or backward */ 832/* TODO 833 if ( roll(2) ) { 834 for (j = 0; j < var_rank[i]; j++) { 835 index[j] += (count[j] - 1) * (IntType)stride[j]; 836 stride[j] = -stride[j]; 837 } 838 } 839*/ 840 allInExtRange = allInIntRange = 1; 841 for (j = 0; j < nels; j++) { 842 err = toMixedBase(j, var_rank[i], count, index2); 843 IF (err != 0) error("error in toMixedBase"); 844 for (d = 0; d < var_rank[i]; d++) 845 index2[d] = index[d] + index2[d] * (IntType)stride[d]; 846 expect[j] = hash4(cdf_format, var_type[i], var_rank[i], 847 index2, NCT_ITYPE($1)); 848 if (inRange3(cdf_format, expect[j],var_type[i],NCT_ITYPE($1))) { 849 IfCheckTextChar($1, var_type[i]) 850 allInIntRange &= CheckRange($1,expect[j]); 851 } else 852 allInExtRange = 0; 853 } 854 err = GetVars($1)(ncid, i, index, count, stride, value); 855 if (canConvert) { 856 if (allInExtRange) { 857 if (allInIntRange) { 858 IF (err != NC_NOERR) 859 EXPECT_ERR(NC_NOERR, err) 860 } 861 PNETCDF_CHECK_ERANGE($1) 862 } else { 863 IF (err != NC_NOERR && err != NC_ERANGE) 864 EXPECT_ERR(NC_NOERR or NC_ERANGE, err) 865 } 866 for (j = 0; j < nels; j++) { 867 if (CheckNumRange($1, expect[j], var_type[i])) { 868 ifelse(`$1', `uchar', ` 869 /* in put_vars(), API _put_vara_double() is used to 870 * write the NC_BYTE variables to files. In this 871 * case, NC_BYTE variables are treated as signed 872 * for CDF-1 and 2 formats. Thus, we must skip the 873 * equal test below for uchar. 874 */ 875 if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;') 876 IF (!equal((double)value[j],expect[j],var_type[i], NCT_ITYPE($1))){ 877 error("value read not that expected"); 878 if (verbose) { 879 error("\n"); 880 error("varid: %d, ", i); 881 error("var_name: %s, ", var_name[i]); 882 error("var_type: %s, ", s_nc_type(var_type[i])); 883 error("element number: %d, ", j); 884 error("expect: %g, ", expect[j]); 885 error("got: %g", (double) value[j]); 886 } 887 } 888 ELSE_NOK 889 } 890 } 891 } else { 892 IF (err != NC_ECHAR) 893 EXPECT_ERR(NC_ECHAR, err) 894 } 895 } 896 } 897 898 } 899 err = APIFunc(close)(ncid); 900 IF (err != NC_NOERR) 901 error("close: %s", APIFunc(strerror)(err)); 902 return nok; 903} 904')dnl 905 906TEST_NC_GET_VARS(text) 907TEST_NC_GET_VARS(uchar) 908TEST_NC_GET_VARS(schar) 909TEST_NC_GET_VARS(short) 910TEST_NC_GET_VARS(int) 911TEST_NC_GET_VARS(long) 912TEST_NC_GET_VARS(float) 913TEST_NC_GET_VARS(double) 914TEST_NC_GET_VARS(ushort) 915TEST_NC_GET_VARS(uint) 916TEST_NC_GET_VARS(longlong) 917TEST_NC_GET_VARS(ulonglong) 918 919 920dnl TEST_NC_GET_VARM(TYPE) 921dnl 922define(`TEST_NC_GET_VARM',dnl 923`dnl 924int 925TestFunc(varm)_$1(VarArgs) 926{ 927 int i, k, d, err, nslabs, ncid, cdf_format; 928 int allInExtRange; /* all values within external range? */ 929 int allInIntRange; /* all values within internal range? */ 930 PTRDType nstarts; /* number of different starts */ 931 int nok = 0; /* count of valid comparisons */ 932 int canConvert; /* Both text or both numeric */ 933 IntType j, m, nels; 934 IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK]; 935 IntType index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK]; 936 IntType sstride[MAX_RANK]; 937 PTRDType stride[MAX_RANK], imap[MAX_RANK]; 938 double expect[MAX_NELS]; 939 $1 value[MAX_NELS]; 940 941 err = FileOpen(testfile, NC_NOWRITE); 942 IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err)); 943 944 err = APIFunc(inq_format)(ncid, &cdf_format); 945 IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err)); 946 947 err = GetVarm($1)(BAD_ID, 0, NULL, NULL, NULL, NULL, value); 948 IF (err != NC_EBADID) 949 EXPECT_ERR(NC_EBADID, err) 950 ELSE_NOK 951 952 err = GetVarm($1)(ncid, BAD_VARID, NULL, NULL, NULL, NULL, value); 953 IF (err != NC_ENOTVAR) 954 EXPECT_ERR(NC_ENOTVAR, err) 955 ELSE_NOK 956 957 for (i = 0; i < numVars; i++) { 958 assert(var_rank[i] <= MAX_RANK); 959 assert(var_nels[i] <= MAX_NELS); 960 961 /* check if can detect a bad file ID */ 962 err = GetVars($1)(BAD_ID, i, NULL, NULL, NULL, value); 963 IF (err != NC_EBADID) 964 EXPECT_ERR(NC_EBADID, err) 965 ELSE_NOK 966 967 canConvert = (var_type[i] == NC_CHAR) CheckText($1); 968 969 for (j = 0; j < var_rank[i]; j++) { 970 start[j] = 0; 971 edge[j] = 1; 972 stride[j] = 1; 973 imap[j] = 1; 974 } 975 976ifdef(`PNETCDF',`dnl 977 /* for non-scalar variables, argument start cannot be NULL */ 978 err = GetVarm($1)(ncid, i, NULL, NULL, NULL, NULL, value); 979 if (!canConvert) { 980 IF (err != NC_ECHAR) 981 EXPECT_ERR(NC_ECHAR, err) 982 ELSE_NOK 983 } 984 else if (var_rank[i] == 0) { 985 index[0] = 0; 986 expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1)); 987 if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) && 988 CheckRange($1, expect[0])) { 989 IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err) 990 } 991 else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err) 992 } 993 else IF (err != NC_EINVALCOORDS) { 994 EXPECT_ERR(NC_EINVALCOORDS, err) 995 } 996 ELSE_NOK 997 998 /* for non-scalar variables, argument count cannot be NULL */ 999 err = GetVarm($1)(ncid, i, start, NULL, NULL, NULL, value); 1000 if (!canConvert) { 1001 IF (err != NC_ECHAR) 1002 EXPECT_ERR(NC_ECHAR, err) 1003 ELSE_NOK 1004 } 1005 else if (var_rank[i] == 0) { 1006 index[0] = 0; 1007 expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1)); 1008 if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) && 1009 CheckRange($1, expect[0])) { 1010 IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err) 1011 } 1012 else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err) 1013 } 1014 else IF (err != NC_EEDGE) 1015 EXPECT_ERR(NC_EEDGE, err) 1016 ELSE_NOK 1017')dnl 1018 1019 /* first test when edge[*] > 0 */ 1020 for (j = 0; j < var_rank[i]; j++) { 1021 start[j] = var_shape[i][j]; 1022 err = GetVarm($1)(ncid, i, start, edge, stride, imap, value); 1023 if (!canConvert) { 1024 IF (err != NC_ECHAR) 1025 EXPECT_ERR(NC_ECHAR, err) 1026 continue; 1027 } 1028 IF (err != NC_EINVALCOORDS) 1029 EXPECT_ERR(NC_EINVALCOORDS, err) 1030 start[j] = 0; 1031 edge[j] = var_shape[i][j] + 1; 1032 err = GetVarm($1)(ncid, i, start, edge, stride, imap, value); 1033 IF (err != NC_EEDGE) 1034 EXPECT_ERR(NC_EEDGE, err) 1035 edge[j] = 1; 1036 stride[j] = 0; 1037 err = GetVarm($1)(ncid, i, start, edge, stride, imap, value); 1038 IF (err != NC_ESTRIDE) 1039 EXPECT_ERR(NC_ESTRIDE, err) 1040 stride[j] = 1; 1041 } 1042 1043 /* Check non-scalars for correct error returned even when there is 1044 * nothing to get (edge[j]==0) */ 1045 for (j = 0; j < var_rank[i]; j++) edge[j] = 0; 1046 1047 for (j = 0; j < var_rank[i]; j++) { 1048 if (var_dimid[i][j] == RECDIM) continue; /* skip record dim */ 1049 start[j] = var_shape[i][j]; 1050 err = GetVarm($1)(ncid, i, start, edge, stride, imap, value); 1051 if (!canConvert) { 1052 IF (err != NC_ECHAR) 1053 EXPECT_ERR(NC_ECHAR, err) 1054 start[j] = 0; 1055 continue; 1056 } 1057#ifdef RELAX_COORD_BOUND 1058 IF (err != NC_NOERR) /* allowed when edge[j]==0 */ 1059 EXPECT_ERR(NC_NOERR, err) 1060#else 1061 IF (err != NC_EINVALCOORDS) /* not allowed even when edge[j]==0 */ 1062 EXPECT_ERR(NC_EINVALCOORDS, err) 1063#endif 1064 start[j] = var_shape[i][j]+1; /* should cause NC_EINVALCOORDS */ 1065 err = GetVarm($1)(ncid, i, start, edge, stride, imap, value); 1066 IF (err != NC_EINVALCOORDS) 1067 EXPECT_ERR(NC_EINVALCOORDS, err) 1068 start[j] = 0; 1069ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>=7)') 1070 stride[j] = 0; 1071 err = GetVarm($1)(ncid, i, start, edge, stride, imap, value); 1072 IF (err != NC_ESTRIDE) 1073 EXPECT_ERR(NC_ESTRIDE, err) 1074 stride[j] = 1; 1075ifdef(`PNETCDF',,``#'endif') 1076 } 1077 1078 err = GetVarm($1)(ncid, i, start, edge, stride, imap, value); 1079 if (!canConvert) { 1080 IF (err != NC_ECHAR) 1081 EXPECT_ERR(NC_ECHAR, err) 1082 } else if (var_rank[i] == 0) { 1083 expect[0] = hash4(cdf_format, var_type[i], 0, index, NCT_ITYPE($1)); 1084 if (inRange3(cdf_format, expect[0], var_type[i], NCT_ITYPE($1)) && 1085 CheckRange($1, expect[0])) { 1086 IF (err != NC_NOERR) EXPECT_ERR(NC_NOERR, err) 1087 } 1088ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')') 1089 else IF (err != NC_ERANGE) EXPECT_ERR(NC_ERANGE, err) 1090ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')') 1091 } else { 1092 IF (err != NC_NOERR) 1093 EXPECT_ERR(NC_NOERR, err) 1094 } 1095 for (j = 0; j < var_rank[i]; j++) edge[j] = 1; 1096 1097 /* Choose a random point dividing each dim into 2 parts */ 1098 /* get 2^rank (nslabs) slabs so defined */ 1099 nslabs = 1; 1100 for (j = 0; j < var_rank[i]; j++) { 1101 mid[j] = roll( var_shape[i][j] ); 1102 nslabs *= 2; 1103 } 1104 /* bits of k determine whether to get lower or upper part of dim */ 1105 /* choose random stride from 1 to edge */ 1106 for (k = 0; k < nslabs; k++) { 1107 nstarts = 1; 1108 for (j = 0; j < var_rank[i]; j++) { 1109 if ((k >> j) & 1) { 1110 start[j] = 0; 1111 edge[j] = mid[j]; 1112 } else { 1113 start[j] = mid[j]; 1114 edge[j] = var_shape[i][j] - mid[j]; 1115 } 1116 sstride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1; 1117 stride[j] = (PTRDType)sstride[j]; 1118 nstarts *= stride[j]; 1119 } 1120 for (m = 0; m < nstarts; m++) { 1121 err = toMixedBase(m, var_rank[i], sstride, index); 1122 IF (err != 0) error("error in toMixedBase"); 1123 nels = 1; 1124 for (j = 0; j < var_rank[i]; j++) { 1125 count[j] = 1 + (edge[j]-index[j]-1) / (IntType)stride[j]; 1126 nels *= count[j]; 1127 index[j] += start[j]; 1128 } 1129 /* Random choice of forward or backward */ 1130/* TODO 1131 if ( roll(2) ) { 1132 for (j = 0; j < var_rank[i]; j++) { 1133 index[j] += (count[j] - 1) * (IntType)stride[j]; 1134 stride[j] = -stride[j]; 1135 } 1136 } 1137 */ 1138 if (var_rank[i] > 0) { 1139 int jj = var_rank[i] - 1; 1140 imap[jj] = 1; 1141 for (; jj > 0; jj--) 1142 imap[jj-1] = imap[jj] * (PTRDType)count[jj]; 1143 } 1144 allInExtRange = allInIntRange = 1; 1145 for (j = 0; j < nels; j++) { 1146 err = toMixedBase(j, var_rank[i], count, index2); 1147 IF (err != 0) error("error in toMixedBase"); 1148 for (d = 0; d < var_rank[i]; d++) 1149 index2[d] = index[d] + index2[d] * (IntType)stride[d]; 1150 expect[j] = hash4(cdf_format, var_type[i], var_rank[i], 1151 index2, NCT_ITYPE($1)); 1152 if (inRange3(cdf_format, expect[j],var_type[i],NCT_ITYPE($1))) { 1153 IfCheckTextChar($1, var_type[i]) 1154 allInIntRange &= CheckRange($1,expect[j]); 1155 } else 1156 allInExtRange = 0; 1157 } 1158 err = GetVarm($1)(ncid,i,index,count,stride,imap,value); 1159 if (canConvert) { 1160 if (allInExtRange) { 1161 if (allInIntRange) { 1162 IF (err != NC_NOERR) 1163 EXPECT_ERR(NC_NOERR, err) 1164 } 1165 PNETCDF_CHECK_ERANGE($1) 1166 } else { 1167 IF (err != NC_NOERR && err != NC_ERANGE) 1168 EXPECT_ERR(NC_NOERR or NC_ERANGE, err) 1169 } 1170 for (j = 0; j < nels; j++) { 1171 if (CheckNumRange($1, expect[j], var_type[i])) { 1172 ifelse(`$1', `uchar', ` 1173 /* in put_vars(), API _put_vara_double() is used to 1174 * write the NC_BYTE variables to files. In this 1175 * case, NC_BYTE variables are treated as signed 1176 * for CDF-1 and 2 formats. Thus, we must skip the 1177 * equal test below for uchar. 1178 */ 1179 if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect[j] > schar_max) continue;') 1180 IF (!equal((double)value[j],expect[j],var_type[i], NCT_ITYPE($1))){ 1181 error("value read not that expected"); 1182 if (verbose) { 1183 error("\n"); 1184 error("varid: %d, ", i); 1185 error("var_name: %s, ", var_name[i]); 1186 error("var_type: %s, ", s_nc_type(var_type[i])); 1187 error("element number: %d, ", j); 1188 error("expect: %g, ", expect[j]); 1189 error("got: %g", (double) value[j]); 1190 } 1191 } 1192 ELSE_NOK 1193 } 1194 } 1195 } else { 1196 IF (err != NC_ECHAR) 1197 EXPECT_ERR(NC_ECHAR, err) 1198 } 1199 } 1200 } 1201 } 1202 err = APIFunc(close)(ncid); 1203 IF (err != NC_NOERR) 1204 error("close: %s", APIFunc(strerror)(err)); 1205 return nok; 1206} 1207')dnl 1208 1209TEST_NC_GET_VARM(text) 1210TEST_NC_GET_VARM(uchar) 1211TEST_NC_GET_VARM(schar) 1212TEST_NC_GET_VARM(short) 1213TEST_NC_GET_VARM(int) 1214TEST_NC_GET_VARM(long) 1215TEST_NC_GET_VARM(float) 1216TEST_NC_GET_VARM(double) 1217TEST_NC_GET_VARM(ushort) 1218TEST_NC_GET_VARM(uint) 1219TEST_NC_GET_VARM(longlong) 1220TEST_NC_GET_VARM(ulonglong) 1221 1222 1223dnl TEST_NC_GET_ATT(TYPE) 1224dnl 1225define(`TEST_NC_GET_ATT',dnl 1226`dnl 1227int 1228TestFunc(att)_$1(AttVarArgs) 1229{ 1230 int i, j, err, ncid, cdf_format; 1231 IntType k, ndx[1]; 1232 int allInExtRange; 1233 int allInIntRange; 1234 int canConvert; /* Both text or both numeric */ 1235 int nok = 0; /* count of valid comparisons */ 1236 double expect[MAX_NELS]; 1237 $1 value[MAX_NELS]; 1238 1239 err = FileOpen(testfile, NC_NOWRITE); 1240 IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err)); 1241 1242 err = APIFunc(inq_format)(ncid, &cdf_format); 1243 IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err)); 1244 1245 err = GetAtt($1)(BAD_ID, 0, NULL, value); 1246 IF (err != NC_EBADID) 1247 EXPECT_ERR(NC_EBADID, err) 1248 ELSE_NOK 1249 1250 err = GetAtt($1)(ncid, BAD_VARID, NULL, value); 1251 IF (err != NC_ENOTVAR) 1252 EXPECT_ERR(NC_ENOTVAR, err) 1253 ELSE_NOK 1254 1255 for (i = -1; i < numVars; i++) { 1256 for (j = 0; j < NATTS(i); j++) { 1257 canConvert = (ATT_TYPE(i,j) == NC_CHAR) CheckText($1); 1258 1259 err = GetAtt($1)(ncid, BAD_VARID, ATT_NAME(i,j), value); 1260 IF (err != NC_ENOTVAR) 1261 EXPECT_ERR(NC_ENOTVAR, err) 1262 ELSE_NOK 1263 1264ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)') 1265 /* check if can detect a bad name */ 1266 err = GetAtt($1)(ncid, i, NULL, NULL); 1267 IF (err != NC_EBADNAME) 1268 EXPECT_ERR(NC_EBADNAME, err) 1269 ELSE_NOK 1270ifdef(`PNETCDF',,``#'endif') 1271 1272 err = GetAtt($1)(ncid, i, "noSuch", value); 1273 IF (err != NC_ENOTATT) 1274 EXPECT_ERR(NC_ENOTATT, err) 1275 ELSE_NOK 1276 1277 allInExtRange = allInIntRange = 1; 1278 for (k = 0; k < ATT_LEN(i,j); k++) { 1279 ndx[0] = k; 1280 expect[k] = hash4(cdf_format, ATT_TYPE(i,j), -1, ndx, NCT_ITYPE($1)); 1281 if (inRange3(cdf_format, expect[k],ATT_TYPE(i,j),NCT_ITYPE($1))) { 1282 /* netCDF specification make a special case for type 1283 * conversion between uchar and scahr: do not check for 1284 * range error. See 1285 * http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion 1286 */ 1287 IfCheckTextChar($1, ATT_TYPE(i,j)) 1288 ifelse(`$1',`uchar', `if (cdf_format > NC_FORMAT_64BIT_OFFSET || (cdf_format < NC_FORMAT_CDF5 && ATT_TYPE(i,j) != NC_BYTE))') 1289 allInIntRange &= CheckRange($1,expect[k]); 1290 } else { 1291 allInExtRange = 0; 1292 } 1293 } 1294 err = GetAtt($1)(ncid, i, ATT_NAME(i,j), value); 1295 if (canConvert || ATT_LEN(i,j) == 0) { 1296 if (allInExtRange) { 1297 if (allInIntRange) { 1298 IF (err != NC_NOERR) 1299 EXPECT_ERR(NC_NOERR, err) 1300ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'if !defined(USE_PNETCDF) || (PNETCDF_VERSION_MAJOR==1 && PNETCDF_VERSION_MINOR>7)')') 1301 } else { 1302 IF (err != NC_ERANGE) 1303 EXPECT_ERR(NC_ERANGE, err) 1304ifelse(`$1',`uchar',`ifdef(`PNETCDF',,``#'endif')') 1305 } 1306 } else { 1307 IF (err != NC_NOERR && err != NC_ERANGE) 1308 EXPECT_ERR(NC_NOERR or NC_ERANGE, err) 1309 } 1310 for (k = 0; k < ATT_LEN(i,j); k++) { 1311 if (CheckNumRange($1, expect[k], ATT_TYPE(i,j))) { 1312 ifelse(`$1', `uchar', ` 1313 /* in put_vars(), API _put_vara_double() is used to 1314 * write the NC_BYTE variables to files. In this 1315 * case, NC_BYTE variables are treated as signed 1316 * for CDF-1 and 2 formats. Thus, we must skip the 1317 * equal test below for uchar. 1318 */ 1319 if (cdf_format < NC_FORMAT_CDF5 && ATT_TYPE(i,j) == NC_BYTE && expect[k] > schar_max) continue;') 1320 IF (!equal((double)value[k],expect[k],ATT_TYPE(i,j), NCT_ITYPE($1))){ 1321 error("value read not that expected"); 1322 if (verbose) { 1323 error("\n"); 1324 error("varid: %d, ", i); 1325 if (i == -1) 1326 error("var_type: GLOBAL, "); 1327 else 1328 error("var_name: %s var_type: %s, ", var_name[i],s_nc_type(var_type[i])); 1329 error("att_name: %s, ", ATT_NAME(i,j)); 1330 error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j))); 1331 error("element number: %d, ", k); 1332 error("expect: %g, ", expect[k]); 1333 error("got: %g", (double) value[k]); 1334 } 1335 } else { 1336 nok++; 1337 } 1338 } 1339 } 1340 } else { 1341 IF (err != NC_ECHAR) 1342 EXPECT_ERR(NC_ECHAR, err) 1343 } 1344 } 1345 } 1346 1347 err = APIFunc(close)(ncid); 1348 IF (err != NC_NOERR) 1349 error("close: %s", APIFunc(strerror)(err)); 1350 return nok; 1351} 1352')dnl 1353 1354TEST_NC_GET_ATT(text) 1355TEST_NC_GET_ATT(uchar) 1356TEST_NC_GET_ATT(schar) 1357TEST_NC_GET_ATT(short) 1358TEST_NC_GET_ATT(int) 1359TEST_NC_GET_ATT(long) 1360TEST_NC_GET_ATT(float) 1361TEST_NC_GET_ATT(double) 1362TEST_NC_GET_ATT(ushort) 1363TEST_NC_GET_ATT(uint) 1364TEST_NC_GET_ATT(longlong) 1365TEST_NC_GET_ATT(ulonglong) 1366 1367