1/*********************************************************************
2 *   Copyright 1993, UCAR/Unidata
3 *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 *   $Header: /upc/share/CVS/netcdf-3/nctest/varget.c,v 1.14 2006/10/31 16:22:03 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 ncvarget
19 *    check that proper call worked after ncvarput
20 *    try with negative coords, edges, check error
21 *    try with too-large coords, edges, check error
22 *    try with bad variable handle, check error
23 *    try in define mode, check error
24 *    try with bad netCDF handle, check error
25 */
26int
27test_ncvarget(path)
28     const char *path; /* name of writable netcdf file to open */
29{
30    int nerrs = 0;
31    static char pname[] = "test_ncvarget";
32    int cdfid; /* netcdf id */
33    int iv; /* variable id */
34    struct cdfhc { /* a hypercube with generic values */
35 long cor[MAX_NC_DIMS]; /* netcdf coordinates for lower corner */
36 long edg[MAX_NC_DIMS]; /* netcdf edge lengths to upper corner */
37 void *vals; /* pointer to block of values */
38    } hc; /* test hypercube */
39
40    (void) fprintf(stderr, "*** Testing %s ...\t", &pname[5]);
41
42    if ((cdfid = ncopen(pathNC_WRITE)) == -1) {
43 error("%s: ncopen failed", pname);
44 return ++nerrs;
45    }
46    /* opened in data mode, try putting and getting hypercubes of each type */
47    nerrs += test_varputget (cdfid);
48
49    /* try putting hypercube and getting various interior slabs */
50    nerrs += test_slabs (cdfid);
51
52    /* find a variable with at least one dimension */
53    iv = 0;
54    while (test.vars[iv].ndims <= 0 && iv < test.nvars)
55      iv++;
56    if (iv < test.nvars) { /* iv is varid of variable with dimensions */
57 long tmp;
58 /* set coords */
59 int id; /* dimension id */
60 for (id = 0; id < test.vars[iv].ndimsid++) {
61     hc.cor[id] = 0;
62     hc.edg[id] = 1;
63 }
64 /* get space for vals */
65 hc.vals = emalloc(nctypelen(test.vars[iv].type) + 8);
66
67 id = test.vars[iv].ndims - 1;
68 tmp = hc.cor[id];
69 hc.cor[id] = -1; /* try negative coordinate, should fail */
70 if(ncvarget (cdfidivhc.corhc.edghc.vals) != -1) {
71     error("%s: ncvarget should fail for negative corner", pname);
72     ncclose(cdfid); return ++nerrs;
73 }
74 hc.cor[id] = tmp;
75 tmp = hc.edg[id];
76 hc.edg[id] = -1; /* try negative edge, should fail */
77 if(ncvarget (cdfidivhc.corhc.edghc.vals) != -1) {
78     error("%s: ncvarget should fail for negative edge", pname);
79     ncclose(cdfid); return ++nerrs;
80 }
81 hc.edg[id] = tmp;
82
83 {
84 long mqv = test.vars[iv].ndims -1 ;
85 int dim = test.vars[iv].dims[mqv] ;
86
87 tmp = hc.cor[mqv];
88 hc.cor[mqv] = test.dims[dim].size; /* try big coordinate, should fail */
89 if(ncvarget (cdfidivhc.corhc.edghc.vals) != -1) {
90     error("%s: ncvarget should fail for too-high coordinate", pname);
91     ncclose(cdfid); return ++nerrs;
92 }
93 hc.cor[mqv] = tmp;
94 tmp = hc.edg[mqv];
95 hc.edg[mqv] = test.dims[dim].size + 1; /* try big edge, should fail */
96 if(ncvarget (cdfidivhc.corhc.edghc.vals) != -1) {
97     error("%s: ncvarget should fail for too-high edge", pname);
98     ncclose(cdfid); return ++nerrs;
99 }
100 hc.edg[mqv] = tmp;
101 } /* mqv block */
102
103 if (ncredef(cdfid) == -1) {
104     error("%s: ncredef failed", pname);
105     ncclose(cdfid); return ++nerrs;
106 }
107 /* try in define mode, should fail */
108 if(ncvarget (cdfidivhc.corhc.edghc.vals) != -1) {
109     error("%s: ncvarget should fail in define mode",
110   pname);
111     ncclose(cdfid); return ++nerrs;
112 }
113 if (ncendef (cdfid) == -1) {
114     error("%s: ncendef failed", pname);
115     ncclose(cdfid); return ++nerrs;
116 }
117    }
118    /* try with bad variable handle, should fail */
119    if(ncvarget (cdfid, -1, hc.corhc.edghc.vals) != -1) {
120 error("%s: ncvarget should fail for bad variable handle", pname);
121 ncclose(cdfid); return ++nerrs;
122    }
123    if (ncclose (cdfid) == -1) {
124 error("%s: ncclose failed", pname);
125 return ++nerrs;
126    }
127    /* try with bad netCDF handle, should fail */
128    if(ncvarget (cdfid, 0, hc.corhc.edghc.vals) != -1) {
129 error("%s: ncvarget failed to report bad netcdf handle", pname);
130 nerrs++;
131    }
132    free (hc.vals);
133    if (nerrs > 0)
134      (void) fprintf(stderr,"FAILED! ***\n");
135    else
136      (void) fprintf(stderr,"ok ***\n");
137
138    return nerrs;
139}


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