1/*********************************************************************
2 *   Copyright 1993, UCAR/Unidata
3 *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 *   $Id: vargetg.c,v 1.10 2006/10/31 16:22:04 ed Exp $
5 *********************************************************************/
6
7#include <config.h>
8#include <stdio.h>
9#include <stdlib.h> /* for free() */
10#include "netcdf.h"
11#include "testcdf.h" /* defines in-memory test cdf structure */
12#include "error.h"
13#include "tests.h"
14#include "emalloc.h"
15
16
17/*
18 * Test ncvargetg
19 *    check that proper call worked after ncvarputg
20 *    try with negative coords, edges, check error
21 *    try with non-positive strides, check error
22 *    try with too-large coords, edges, check error
23 *    try with bad variable handle, check error
24 *    try in define mode, check error
25 *    try with bad netCDF handle, check error
26 */
27int
28test_ncvargetg(path)
29     const char *path; /* name of writable netcdf file to open */
30{
31    int nerrs = 0;
32    static char pname[] = "test_ncvargetg";
33    int cdfid; /* netcdf id */
34    int iv; /* variable id */
35    struct cdfhc { /* a hypercube with generic values */
36 long cor[MAX_NC_DIMS]; /* netcdf coordinates for lower corner */
37 long edg[MAX_NC_DIMS]; /* netcdf edge lengths to upper corner */
38 void *vals; /* pointer to block of values */
39    } hc; /* test hypercube */
40    long strides[MAX_NC_DIMS]; /* external, I/O strides */
41
42    (void) fprintf(stderr, "*** Testing %s ...\t", &pname[5]);
43
44    if ((cdfid = ncopen(pathNC_WRITE)) == -1) {
45 error("%s: ncopen failed", pname);
46 return ++nerrs;
47    }
48    /* opened in data mode, try putting and getting hypercubes of each type */
49    nerrs += test_varputgetg (cdfid);
50
51    /* find a variable with at least one dimension */
52    iv = 0;
53    while (test.vars[iv].ndims <= 0 && iv < test.nvars)
54      iv++;
55    if (iv < test.nvars) { /* iv is varid of variable with dimensions */
56 long tmp;
57 int id; /* dimension id */
58
59 /* set coords and strides */
60 for (id = 0; id < test.vars[iv].ndimsid++) {
61     hc.cor[id] = 0;
62     hc.edg[id] = 1;
63     strides[id] = 1;
64 }
65
66 /* get space for vals */
67 hc.vals = emalloc(nctypelen(test.vars[iv].type) + 8);
68
69# define TEST_FAILS(varid) \
70     (ncvarputg(cdfidvaridhc.corhc.edg, \
71        strides, (long*)NULLhc.vals) != -1)
72
73 id = test.vars[iv].ndims - 1;
74 tmp = hc.cor[id];
75 hc.cor[id] = -1; /* try negative coordinate, should fail */
76 if (TEST_FAILS(iv)) {
77     error("%s: ncvargetg should fail for negative corner", pname);
78     ncclose(cdfid); return ++nerrs;
79 }
80 hc.cor[id] = tmp;
81 tmp = hc.edg[id];
82 hc.edg[id] = -1; /* try negative edge, should fail */
83 if (TEST_FAILS(iv)) {
84     error("%s: ncvargetg should fail for negative edge", pname);
85     ncclose(cdfid); return ++nerrs;
86 }
87 hc.edg[id] = tmp;
88 tmp = hc.cor[id];
89 hc.cor[id] = test.dims[id].size; /* try big coordinate, should fail */
90 if (TEST_FAILS(iv)) {
91     error("%s: ncvargetg should fail for too-high coordinate", pname);
92     ncclose(cdfid); return ++nerrs;
93 }
94 hc.cor[id] = tmp;
95 tmp = hc.edg[id];
96 hc.edg[id] = test.dims[id].size + 1; /* try big edge, should fail */
97 if (TEST_FAILS(iv)) {
98     error("%s: ncvargetg should fail for too-high edge", pname);
99     ncclose(cdfid); return ++nerrs;
100 }
101 hc.edg[id] = tmp;
102 tmp = strides[id];
103 strides[id] = -1; /* try non-positive stride, should fail */
104 if (TEST_FAILS(iv)) {
105     error("%s: ncvargetg should fail for non-positive stride", pname);
106     ncclose(cdfid); return ++nerrs;
107 }
108 strides[id] = tmp;
109
110 if (ncredef(cdfid) == -1) {
111     error("%s: ncredef failed", pname);
112     ncclose(cdfid); return ++nerrs;
113 }
114 /* try in define mode, should fail */
115 if (TEST_FAILS(iv)) {
116     error("%s: ncvargetg should fail in define mode",
117   pname);
118     ncclose(cdfid); return ++nerrs;
119 }
120 if (ncendef (cdfid) == -1) {
121     error("%s: ncendef failed", pname);
122     ncclose(cdfid); return ++nerrs;
123 }
124    }
125    /* try with bad variable handle, should fail */
126    if (TEST_FAILS(-1)) {
127 error("%s: ncvargetg should fail for bad variable handle", pname);
128 ncclose(cdfid); return ++nerrs;
129    }
130    if (ncclose (cdfid) == -1) {
131 error("%s: ncclose failed", pname);
132 return ++nerrs;
133    }
134    /* try with bad netCDF handle, should fail */
135    if (TEST_FAILS(0)) {
136 error("%s: ncvargetg failed to report bad netcdf handle", pname);
137 nerrs++;
138    }
139    free (hc.vals);
140    if (nerrs > 0)
141      (void) fprintf(stderr,"FAILED! ***\n");
142    else
143      (void) fprintf(stderr,"ok ***\n");
144
145    return nerrs;
146}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed