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