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


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