1/*********************************************************************
2 *   Copyright 1993, UCAR/Unidata
3 *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 *   $Header: /upc/share/CVS/netcdf-3/nctest/varput.c,v 1.14 2006/10/31 16:22:05 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 "emalloc.h"
13#include "val.h"
14#include "error.h"
15#include "tests.h"
16
17
18/*
19 * Test ncvarput
20 *    check that proper call worked with ncvarget
21 *    try with negative coords, edges, 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_ncvarput(path)
29     const char *path; /* name of writable netcdf file to open */
30{
31    int nerrs = 0;
32    static char pname[] = "test_ncvarput";
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 tmp;
41    int id; /* dimension id */
42
43    (void) fprintf(stderr, "*** Testing %s ...\t", &pname[5]);
44
45    /* handle case where struct netcdf test is uninitialised */
46    hc.cor[0] = 0 ;
47    hc.edg[0] = 1 ;
48    hc.vals = 0 ;
49
50    if ((cdfid = ncopen(pathNC_WRITE)) == -1) {
51 error("%s: ncopen failed", pname);
52 return ++nerrs;
53    }
54
55    /* opened in data mode, try putting and getting hypercubes of each type */
56    nerrs += test_varputget (cdfid); /* prints messages for discrepencies */
57
58    /* find a variable with at least one dimension */
59    iv = 0;
60    while (test.vars[iv].ndims <= 0 && iv < test.nvars)
61      iv++;
62    if (iv < test.nvars) { /* iv is first varid of var with dimensions */
63 /* set coords */
64 for (id = 0; id < test.vars[iv].ndimsid++) {
65     hc.cor[id] = 0;
66     hc.edg[id] = 1;
67 }
68 /* fill in vals with value of appropriate type */
69 hc.vals = emalloc(nctypelen(test.vars[iv].type));
70 val_fill(test.vars[iv].type, 1, hc.vals);
71
72 id = test.vars[iv].ndims - 1;
73 tmp = hc.cor[id];
74 hc.cor[id] = -1; /* try negative coordinate, should fail */
75 if(ncvarput (cdfidivhc.corhc.edghc.vals) != -1) {
76     error("%s: ncvarput should fail for negative corner", pname);
77     ncclose(cdfid); return ++nerrs;
78 }
79 hc.cor[id] = tmp;
80 tmp = hc.edg[id];
81 hc.edg[id] = -1; /* try negative edge, should fail */
82 if(ncvarput (cdfidivhc.corhc.edghc.vals) != -1) {
83     error("%s: ncvarput should fail for negative edge", pname);
84     ncclose(cdfid); return ++nerrs;
85 }
86 hc.edg[id] = tmp;
87 {
88 long mqv = test.vars[iv].ndims -1 ;
89 int dim = test.vars[iv].dims[mqv] ;
90
91 tmp = hc.cor[mqv];
92 hc.cor[mqv] = test.dims[dim].size; /* try big coordinate, should fail */
93 if(ncvarput (cdfidivhc.corhc.edghc.vals) != -1) {
94     error("%s: ncvarput should fail for too-high coordinate", pname);
95     ncclose(cdfid); return ++nerrs;
96 }
97 hc.cor[mqv] = tmp;
98
99 tmp = hc.edg[mqv];
100 hc.edg[mqv] = test.dims[dim].size + 1; /* try big edge, should fail */
101 if(ncvarput (cdfidivhc.corhc.edghc.vals) != -1) {
102     error("%s: ncvarput should fail for too-high edge", pname);
103     ncclose(cdfid); return ++nerrs;
104 }
105 hc.edg[mqv] = tmp;
106 }
107
108 if (ncredef(cdfid) == -1) {
109     error("%s: ncredef failed", pname);
110     ncclose(cdfid); return ++nerrs;
111 }
112 /* try in define mode, should fail */
113 if(ncvarput (cdfidivhc.corhc.edghc.vals) != -1) {
114     error("%s: ncvarput should fail in define mode", pname);
115     ncclose(cdfid); return ++nerrs;
116 }
117 if (ncendef (cdfid) == -1) {
118     error("%s: ncendef failed", pname);
119     ncclose(cdfid); return ++nerrs;
120 }
121    }
122    else
123 error("\"struct netcdf test\" uninitialized, no tests performed") ;
124    /* try with bad variable handle, should fail */
125    if(ncvarput (cdfid, -1, hc.corhc.edghc.vals) != -1) {
126 error("%s: ncvarput should fail for bad variable handle", pname);
127 ncclose(cdfid); return ++nerrs;
128    }
129    if (ncclose (cdfid) == -1) {
130 error("%s: ncclose failed", pname);
131 return ++nerrs;
132    }
133    /* try with bad netCDF handle, should fail */
134    if(ncvarput (cdfid, 0, hc.corhc.edghc.vals) != -1) {
135 error("%s: ncvarput failed to report bad netcdf handle", pname);
136 nerrs++;
137    }
138    if(hc.vals) free (hc.vals);
139    if (nerrs > 0)
140      (void) fprintf(stderr,"FAILED! ***\n");
141    else
142      (void) fprintf(stderr,"ok ***\n");
143
144    return nerrs;
145}


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