1/* This is part of the netCDF package.
2   Copyright 2005 University Corporation for Atmospheric Research/Unidata
3   See COPYRIGHT file for conditions of use.
4
5   Test netcdf-4 group code.
6   $Id: tst_grps.c,v 1.37 2010/04/07 15:21:28 ed Exp $
7*/
8
9#include <nc_tests.h>
10#include "err_macros.h"
11#include "netcdf.h"
12
13#define FILE_NAME "tst_grps.nc"
14#define DIM1_NAME "kingdom"
15#define DIM1_LEN 3
16#define DIM2_NAME "year"
17#define DIM2_LEN 5
18#define VAR1_NAME "Number_of_Beheadings_in_Family"
19#define DYNASTY "Tudor"
20#define HENRY_VII "Henry_VII"
21#define MARGARET "Margaret"
22#define JAMES_V_OF_SCOTLAND "James_V_of_Scotland"
23#define MARY_I_OF_SCOTLAND "Mary_I_of_Scotland"
24#define JAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND "James_VI_of_Scotland_and_I_of_England"
25#define MAX_SIBLING_GROUPS 10
26#define NUM_CASTLES_NAME "Number_of_Castles"
27
28int
29main(int argc, char **argv)
30{
31   printf("\n*** Testing netcdf-4 group functions.\n");
32   printf("*** testing simple group create...");
33   {
34      int ncid;
35      char name_in[NC_MAX_NAME + 1];
36      int henry_vii_id;
37      int grpid_in[MAX_SIBLING_GROUPS], varids_in[MAX_SIBLING_GROUPS];
38      int dimids_in[MAX_SIBLING_GROUPS], nvars_inndims_inncid_in;
39      int parent_ncid;
40      char name_out[NC_MAX_NAME + 1];
41      int num_grps;
42
43      /* Create a file with one group, a group to contain data about
44       * Henry VII. */
45      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
46      if (nc_inq_grp_parent(ncid, &parent_ncid) != NC_ENOGRPERR;
47      /* This should also work as simple "is this the root group" test */
48      if (nc_inq_grp_parent(ncidNULL) != NC_ENOGRPERR;
49      strcpy(name_outHENRY_VII);
50      if (nc_def_grp(ncidname_out, &henry_vii_id)) ERR;
51      if (nc_inq_grp_parent(henry_vii_id, &parent_ncid)) ERR;
52      if (parent_ncid != ncidERR;
53      if (nc_inq_ncid(ncidHENRY_VII, &ncid_in)) ERR;
54      if (ncid_in != henry_vii_idERR;
55      if (nc_inq_ncid(ncidMARGARET, &ncid_in) != NC_ENOGRPERR;
56      if (nc_close(ncid)) ERR;
57
58      /* Check it out. */
59      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
60      if (nc_inq_grp_parent(ncid, &parent_ncid) != NC_ENOGRPERR;
61      if (nc_inq_grps(ncid, &num_grpsNULL)) ERR;
62      if (num_grps != 1) ERR;
63      if (nc_inq_grps(ncidNULLgrpid_in)) ERR;
64      if (nc_inq_grpname(ncidname_in)) ERR;
65      if (strcmp(name_in, "/")) ERR;
66      if (nc_inq_grpname(grpid_in[0], name_in)) ERR;
67      if (nc_inq_grp_parent(grpid_in[0], &parent_ncid)) ERR;
68      if (parent_ncid != ncidERR;
69      if (strcmp(name_inHENRY_VII)) ERR;
70      if (nc_inq_varids(grpid_in[0], &nvars_invarids_in)) ERR;
71      if (nvars_in != 0) ERR;
72      if (nc_inq_varids(grpid_in[0], &ndims_indimids_in)) ERR;
73      if (ndims_in != 0) ERR;
74      if (nc_inq_ncid(ncidHENRY_VII, &ncid_in)) ERR;
75      if (ncid_in != grpid_in[0]) ERR;
76      if (nc_close(ncid)) ERR;
77   }
78   SUMMARIZE_ERR;
79
80   printf("*** testing netcdf-3 and group functions...");
81   {
82      int ncid;
83      char name_in[NC_MAX_NAME + 1];
84      size_t len_in;
85
86      /* Create a classic file. */
87      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
88      if (nc_inq_grpname(ncidname_in)) ERR;
89      if (strcmp(name_in, "/")) ERR;
90      if (nc_inq_grpname_full(ncid, &len_inname_in)) ERR;
91      if (strcmp(name_in, "/") || len_in != 1) ERR;
92      if (nc_close(ncid)) ERR;
93   }
94   SUMMARIZE_ERR;
95
96   printf("*** testing use of unlimited dim in parent group...");
97   {
98#define NDIMS_IN_VAR 1
99#define NDIMS_IN_FILE 2
100#define BABE_LIMIT 3
101#define DIM_NAME1 "Influence"
102#define DIM_NAME2 "Babe_Factor"
103#define VAR_NAME1 "Court_of_Star_Chamber"
104#define VAR_NAME2 "Justice_of_the_Peace"
105#define VAR_NAME3 "Bosworth_Field"
106      int nciddimid1dimid2varid1varid2varid3henry_vii_id;
107      int grpid_invarid_in1varid_in2varid_in3;
108      nc_type xtype_in;
109      int ndims_indimids_in[NDIMS_IN_FILE], dimid1_innatts;
110      char name_in[NC_MAX_NAME + 1];
111      size_t len_inindex[NDIMS_IN_VAR] = {0};
112      long long value = NC_FILL_INT64 + 1, value_in;
113
114      /* Create a file with an unlimited dim and a limited, used by
115       * variables in child groups. */
116      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
117      if (nc_def_dim(ncidDIM_NAME1NC_UNLIMITED, &dimid1)) ERR;
118      if (nc_def_dim(ncidDIM_NAME2BABE_LIMIT, &dimid2)) ERR;
119      if (nc_def_grp(ncidHENRY_VII, &henry_vii_id)) ERR;
120      if (nc_def_var(henry_vii_idVAR_NAME1NC_INT64NDIMS_IN_VAR, &dimid1, &varid1)) ERR;
121      if (nc_def_var(henry_vii_idVAR_NAME2NC_INT64NDIMS_IN_VAR, &dimid1, &varid2)) ERR;
122      if (nc_def_var(henry_vii_idVAR_NAME3NC_INT64NDIMS_IN_VAR, &dimid2, &varid3)) ERR;
123
124      /* Check it out. Find the group by name. */
125      if (nc_inq_ncid(ncidHENRY_VII, &grpid_in)) ERR;
126
127      /* Ensure that dimensions in parent are visible and correct. */
128      if (nc_inq_dimids(grpid_in, &ndims_indimids_in, 1)) ERR;
129      if (ndims_in != NDIMS_IN_FILE || dimids_in[0] != dimid1 || dimids_in[1] != dimid2ERR;
130      if (nc_inq_dim(grpid_indimids_in[0], name_in, &len_in)) ERR;
131      if (strcmp(name_inDIM_NAME1) || len_in != 0) ERR;
132      if (nc_inq_dim(grpid_indimids_in[1], name_in, &len_in)) ERR;
133      if (strcmp(name_inDIM_NAME2) || len_in != BABE_LIMITERR;
134
135      /* Check the vars in the group. */
136      if (nc_inq_varid(grpid_inVAR_NAME1, &varid_in1)) ERR;
137      if (nc_inq_varid(grpid_inVAR_NAME2, &varid_in2)) ERR;
138      if (nc_inq_varid(grpid_inVAR_NAME3, &varid_in3)) ERR;
139      if (varid_in1 != varid1 || varid_in2 != varid2 || varid_in3 != varid3ERR;
140      if (nc_inq_var(grpid_invarid1name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR;
141      if (strcmp(name_inVAR_NAME1) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR ||
142          dimid1_in != dimid1 || natts != 0) ERR;
143      if (nc_inq_var(grpid_invarid2name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR;
144      if (strcmp(name_inVAR_NAME2) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR ||
145          dimid1_in != dimid1 || natts != 0) ERR;
146      if (nc_inq_var(grpid_invarid3name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR;
147      if (strcmp(name_inVAR_NAME3) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR ||
148          dimid1_in != dimid2 || natts != 0) ERR;
149
150      /* Write one value to one variable. */
151      if (nc_put_var1_longlong(grpid_invarid_in1index, &value)) ERR;
152
153      /* Read one value from the second unlim dim variable. It should
154       * be the fill value. */
155      if (nc_get_var1_longlong(grpid_invarid_in2index, &value_in)) ERR;
156      if (value_in != NC_FILL_INT64ERR;
157
158      /* Read one value from the variable with limited dim. It should
159       * be the fill value. */
160      if (nc_get_var1_longlong(grpid_invarid_in3index, &value_in)) ERR;
161      if (value_in != NC_FILL_INT64ERR;
162
163      /* Attempt to read beyond end of dimensions to generate error. */
164      index[0] = BABE_LIMIT;
165      if (nc_get_var1_longlong(grpid_invarid_in1index, &value_in) != NC_EINVALCOORDSERR;
166      if (nc_get_var1_longlong(grpid_invarid_in2index, &value_in) != NC_EINVALCOORDSERR;
167      if (nc_get_var1_longlong(grpid_invarid_in3index, &value_in) != NC_EINVALCOORDSERR;
168
169      if (nc_close(ncid)) ERR;
170
171      /* Check it out again. */
172      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
173
174      /* Find the group by name. */
175      if (nc_inq_ncid(ncidHENRY_VII, &grpid_in)) ERR;
176
177      /* Ensure that dimensions in parent are visible and correct. */
178      if (nc_inq_dimids(grpid_in, &ndims_indimids_in, 1)) ERR;
179      if (ndims_in != NDIMS_IN_FILE || dimids_in[0] != dimid1 || dimids_in[1] != dimid2ERR;
180      if (nc_inq_dim(grpid_indimids_in[0], name_in, &len_in)) ERR;
181      if (strcmp(name_inDIM_NAME1) || len_in != 1) ERR;
182      if (nc_inq_dim(grpid_indimids_in[1], name_in, &len_in)) ERR;
183      if (strcmp(name_inDIM_NAME2) || len_in != BABE_LIMITERR;
184
185      /* Check the vars in the group. */
186      if (nc_inq_varid(grpid_inVAR_NAME1, &varid_in1)) ERR;
187      if (nc_inq_varid(grpid_inVAR_NAME2, &varid_in2)) ERR;
188      if (nc_inq_varid(grpid_inVAR_NAME3, &varid_in3)) ERR;
189      if (varid_in1 != varid1 || varid_in2 != varid2 || varid_in3 != varid3ERR;
190      if (nc_inq_var(grpid_invarid1name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR;
191      if (strcmp(name_inVAR_NAME1) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR ||
192          dimid1_in != dimid1 || natts != 0) ERR;
193      if (nc_inq_var(grpid_invarid2name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR;
194      if (strcmp(name_inVAR_NAME2) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR ||
195          dimid1_in != dimid1 || natts != 0) ERR;
196      if (nc_inq_var(grpid_invarid3name_in, &xtype_in, &ndims_in, &dimid1_in, &natts)) ERR;
197      if (strcmp(name_inVAR_NAME3) || xtype_in != NC_INT64 || ndims_in != NDIMS_IN_VAR ||
198          dimid1_in != dimid2 || natts != 0) ERR;
199
200      /* Read one value from the second unlim dim variable. It should
201       * be the fill value. */
202      index[0] = 0;
203      if (nc_get_var1_longlong(grpid_invarid_in2index, &value_in)) ERR;
204      if (value_in != NC_FILL_INT64ERR;
205
206      /* Read one value from the variable with limited dim. It should
207       * be the fill value. */
208      if (nc_get_var1_longlong(grpid_invarid_in3index, &value_in)) ERR;
209      if (value_in != NC_FILL_INT64ERR;
210
211      /* Attempt to read beyond end of dimensions to generate error. */
212      index[0] = BABE_LIMIT;
213      if (nc_get_var1_longlong(grpid_invarid_in1index, &value_in) != NC_EINVALCOORDSERR;
214      if (nc_get_var1_longlong(grpid_invarid_in2index, &value_in) != NC_EINVALCOORDSERR;
215      if (nc_get_var1_longlong(grpid_invarid_in3index, &value_in) != NC_EINVALCOORDSERR;
216
217      if (nc_close(ncid)) ERR;
218   }
219   SUMMARIZE_ERR;
220
221   printf("*** testing simple nested group creates...");
222   {
223      int ncidgrp_ncid;
224      int henry_vii_idmargaret_idjames_v_of_scotland_idmary_i_of_scotland_id;
225      int james_i_of_england_id;
226      char name_in[NC_MAX_NAME + 1];
227      char full_name[NC_MAX_NAME * 10], full_name_in[NC_MAX_NAME * 10];
228      int grpid_in[MAX_SIBLING_GROUPS];
229      int grp_in;
230      int num_grps;
231      size_t len;
232
233      /* Create a file with some nested groups in it, suitable
234       * to storing information about the Tudor dynasty of England. */
235      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
236      if (nc_def_grp(ncidHENRY_VII, &henry_vii_id)) ERR;
237      if (nc_def_grp(henry_vii_idMARGARET, &margaret_id)) ERR;
238      if (nc_def_grp(margaret_idJAMES_V_OF_SCOTLAND, &james_v_of_scotland_id)) ERR;
239      if (nc_def_grp(james_v_of_scotland_idMARY_I_OF_SCOTLAND, &mary_i_of_scotland_id)) ERR;
240      if (nc_def_grp(mary_i_of_scotland_idJAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND, &james_i_of_england_id)) ERR;
241
242      strcpy(full_name, "/");
243      if (nc_inq_grpname_full(ncid, &lenfull_name_in)) ERR;
244      if (len != 1 || strcmp(full_name_infull_name)) ERR;
245      if (nc_inq_grpname_len(ncid, &len)) ERR;
246      if (len != 1) ERR;
247      if (nc_inq_grp_full_ncid(ncidfull_name, &grp_in)) ERR;
248      if (grp_in != ncidERR;
249
250      if (nc_inq_grp_ncid(ncidHENRY_VIINULL)) ERR;
251      if (nc_inq_grp_ncid(ncidHENRY_VII, &grp_ncid)) ERR;
252      if (nc_inq_grps(ncid, &num_grpsNULL)) ERR;
253      if (num_grps != 1) ERR;
254      if (nc_inq_grps(ncidNULLgrpid_in)) ERR;
255      if (nc_inq_grpname(grpid_in[0], name_in)) ERR;
256      if (strcmp(name_inHENRY_VII)) ERR;
257      if (grpid_in[0] != grp_ncidERR;
258      strcat(full_nameHENRY_VII);
259      if (nc_inq_grpname_full(grpid_in[0], &lenfull_name_in)) ERR;
260      if (len != strlen(HENRY_VII) + 1 || strcmp(full_name_infull_name)) ERR;
261      if (nc_inq_grp_full_ncid(ncidfull_name, &grp_in)) ERR;
262      if (grp_in != grpid_in[0]) ERR;
263
264      if (nc_inq_grp_ncid(grpid_in[0], MARGARET, &grp_ncid)) ERR;
265      if (nc_inq_grps(grpid_in[0], &num_grpsgrpid_in)) ERR;
266      if (num_grps != 1) ERR;
267      if (nc_inq_grpname(grpid_in[0], name_in)) ERR;
268      if (strcmp(name_inMARGARET)) ERR;
269      if (grpid_in[0] != grp_ncidERR;
270      strcat(full_name, "/");
271      strcat(full_nameMARGARET);
272      if (nc_inq_grpname_full(grpid_in[0], &lenfull_name_in)) ERR;
273      if (len != strlen(full_name) || strcmp(full_name_infull_name)) ERR;
274      if (nc_inq_grp_full_ncid(ncidfull_name, &grp_in)) ERR;
275      if (grp_in != grpid_in[0]) ERR;
276
277      if (nc_inq_grp_ncid(grpid_in[0], JAMES_V_OF_SCOTLAND, &grp_ncid)) ERR;
278      if (nc_inq_grps(grpid_in[0], &num_grpsgrpid_in)) ERR;
279      if (num_grps != 1) ERR;
280      if (nc_inq_grpname(grpid_in[0], name_in)) ERR;
281      if (strcmp(name_inJAMES_V_OF_SCOTLAND)) ERR;
282      if (grpid_in[0] != grp_ncidERR;
283      strcat(full_name, "/");
284      strcat(full_nameJAMES_V_OF_SCOTLAND);
285      if (nc_inq_grpname_full(grpid_in[0], &lenfull_name_in)) ERR;
286      if (len != strlen(full_name) || strcmp(full_name_infull_name)) ERR;
287      if (nc_inq_grp_full_ncid(ncidfull_name, &grp_in)) ERR;
288      if (grp_in != grpid_in[0]) ERR;
289
290      if (nc_inq_grp_ncid(grpid_in[0], MARY_I_OF_SCOTLAND, &grp_ncid)) ERR;
291      if (nc_inq_grps(grpid_in[0], &num_grpsgrpid_in)) ERR;
292      if (num_grps != 1) ERR;
293      if (nc_inq_grpname(grpid_in[0], name_in)) ERR;
294      if (strcmp(name_inMARY_I_OF_SCOTLAND)) ERR;
295      if (grpid_in[0] != grp_ncidERR;
296      strcat(full_name, "/");
297      strcat(full_nameMARY_I_OF_SCOTLAND);
298      if (nc_inq_grpname_full(grpid_in[0], &lenfull_name_in)) ERR;
299      if (len != strlen(full_name) || strcmp(full_name_infull_name)) ERR;
300      if (nc_inq_grp_full_ncid(ncidfull_name, &grp_in)) ERR;
301      if (grp_in != grpid_in[0]) ERR;
302
303      if (nc_inq_grp_ncid(grpid_in[0], JAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND, &grp_ncid)) ERR;
304      if (nc_inq_grps(grpid_in[0], &num_grpsgrpid_in)) ERR;
305      if (num_grps != 1) ERR;
306      if (nc_inq_grpname(grpid_in[0], name_in)) ERR;
307      if (strcmp(name_inJAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND)) ERR;
308      if (grpid_in[0] != grp_ncidERR;
309      strcat(full_name, "/");
310      strcat(full_nameJAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND);
311      if (nc_inq_grpname_full(grpid_in[0], &lenfull_name_in)) ERR;
312      if (len != strlen(full_name) || strcmp(full_name_infull_name)) ERR;
313      if (nc_inq_grp_full_ncid(ncidfull_name, &grp_in)) ERR;
314      if (grp_in != grpid_in[0]) ERR;
315
316      if (nc_close(ncid)) ERR;
317
318      /* Check it out. */
319      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
320      if (nc_inq_grp_ncid(ncidHENRY_VII, &grp_ncid)) ERR;
321      if (nc_inq_grps(ncid, &num_grpsNULL)) ERR;
322      if (num_grps != 1) ERR;
323      if (nc_inq_grps(ncidNULLgrpid_in)) ERR;
324      if (nc_inq_grpname(grpid_in[0], name_in)) ERR;
325      if (strcmp(name_inHENRY_VII)) ERR;
326      if (grpid_in[0] != grp_ncidERR;
327
328      if (nc_inq_grp_ncid(grpid_in[0], MARGARET, &grp_ncid)) ERR;
329      if (nc_inq_grps(grpid_in[0], &num_grpsgrpid_in)) ERR;
330      if (num_grps != 1) ERR;
331      if (nc_inq_grpname(grpid_in[0], name_in)) ERR;
332      if (strcmp(name_inMARGARET)) ERR;
333      if (grpid_in[0] != grp_ncidERR;
334
335      if (nc_inq_grp_ncid(grpid_in[0], JAMES_V_OF_SCOTLAND, &grp_ncid)) ERR;
336      if (nc_inq_grps(grpid_in[0], &num_grpsgrpid_in)) ERR;
337      if (num_grps != 1) ERR;
338      if (nc_inq_grpname(grpid_in[0], name_in)) ERR;
339      if (strcmp(name_inJAMES_V_OF_SCOTLAND)) ERR;
340      if (grpid_in[0] != grp_ncidERR;
341
342      if (nc_inq_grp_ncid(grpid_in[0], MARY_I_OF_SCOTLAND, &grp_ncid)) ERR;
343      if (nc_inq_grps(grpid_in[0], &num_grpsgrpid_in)) ERR;
344      if (num_grps != 1) ERR;
345      if (nc_inq_grpname(grpid_in[0], name_in)) ERR;
346      if (strcmp(name_inMARY_I_OF_SCOTLAND)) ERR;
347      if (grpid_in[0] != grp_ncidERR;
348
349      if (nc_inq_grp_ncid(grpid_in[0], JAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND, &grp_ncid)) ERR;
350      if (nc_inq_grps(grpid_in[0], &num_grpsgrpid_in)) ERR;
351      if (num_grps != 1) ERR;
352      if (nc_inq_grpname(grpid_in[0], name_in)) ERR;
353      if (strcmp(name_inJAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND)) ERR;
354      if (grpid_in[0] != grp_ncidERR;
355
356      /* Close up shop. */
357      if (nc_close(ncid)) ERR;
358   }
359   SUMMARIZE_ERR;
360
361   printf("*** testing simple sibling group creates...");
362   {
363      int ncid;
364      int henry_vii_idmargaret_idjames_v_of_scotland_idmary_i_of_scotland_id;
365      int james_i_of_england_idtudor_id;
366      char name_in[NC_MAX_NAME + 1];
367      int grpid_in[MAX_SIBLING_GROUPS];
368      int ncid_in;
369      int num_grps;
370      int dynasty;
371
372      /* Create a file with one group, and beneath it a group for each Tudor. */
373      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
374      if (nc_def_grp(ncidDYNASTY, &tudor_id)) ERR;
375      if (nc_def_grp(tudor_idHENRY_VII, &henry_vii_id)) ERR;
376      if (nc_def_grp(tudor_idMARGARET, &margaret_id)) ERR;
377      if (nc_def_grp(tudor_idJAMES_V_OF_SCOTLAND, &james_v_of_scotland_id)) ERR;
378      if (nc_def_grp(tudor_idMARY_I_OF_SCOTLAND, &mary_i_of_scotland_id)) ERR;
379      if (nc_def_grp(tudor_idJAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND, &james_i_of_england_id)) ERR;
380      if (nc_close(ncid)) ERR;
381
382      /* Make sure we've got all the tudors where we want them. */
383      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
384      if (nc_inq_grps(ncid, &num_grps, &dynasty)) ERR;
385      if (num_grps != 1) ERR;
386      if (nc_inq_grpname(dynastyname_in)) ERR;
387      if (strcmp(name_inDYNASTY)) ERR;
388      if (nc_inq_grps(dynasty, &num_grpsgrpid_in)) ERR;
389      if (num_grps != 5) ERR;
390      if (nc_inq_ncid(dynastyHENRY_VII, &ncid_in)) ERR;
391      if (nc_inq_grpname(ncid_inname_in)) ERR;
392      if (strcmp(name_inHENRY_VII)) ERR;
393      if (nc_inq_ncid(dynastyMARGARET, &ncid_in)) ERR;
394      if (nc_inq_grpname(ncid_inname_in)) ERR;
395      if (strcmp(name_inMARGARET)) ERR;
396      if (nc_inq_ncid(dynastyJAMES_V_OF_SCOTLAND, &ncid_in)) ERR;
397      if (nc_inq_grpname(ncid_inname_in)) ERR;
398      if (strcmp(name_inJAMES_V_OF_SCOTLAND)) ERR;
399      if (nc_inq_ncid(dynastyMARY_I_OF_SCOTLAND, &ncid_in)) ERR;
400      if (nc_inq_grpname(ncid_inname_in)) ERR;
401      if (strcmp(name_inMARY_I_OF_SCOTLAND)) ERR;
402      if (nc_inq_ncid(dynastyJAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND, &ncid_in)) ERR;
403      if (nc_inq_grpname(ncid_inname_in)) ERR;
404      if (strcmp(name_inJAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND)) ERR;
405      if (nc_close(ncid)) ERR;
406   }
407   SUMMARIZE_ERR;
408
409   printf("*** testing more group attributes...");
410   {
411      int ncidnum_grpsdynastyncid_in;
412      int grpid_in[MAX_SIBLING_GROUPS];
413      int henry_vii_idmargaret_idjames_v_of_scotland_idmary_i_of_scotland_id;
414      int james_i_of_england_idtudor_id;
415      int num_castles_henry_vii = 1, num_castles_margaret = 0, num_castles_james_v = 2;
416      int num_castles_mary_i = 3, num_castles_james_vi = 4;
417      char name_in[NC_MAX_NAME + 1];
418
419      /* Create a file with one group, and beneath it a group for each
420       * Tudor. We will have some attributes in the groups.*/
421      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
422      if (nc_def_grp(ncidDYNASTY, &tudor_id)) ERR;
423      if (nc_def_grp(tudor_idHENRY_VII, &henry_vii_id)) ERR;
424      if (nc_put_att_int(henry_vii_idNC_GLOBALNUM_CASTLES_NAMENC_INT,
425  1, &num_castles_henry_vii)) ERR;
426      if (nc_def_grp(tudor_idMARGARET, &margaret_id)) ERR;
427      if (nc_put_att_int(margaret_idNC_GLOBALNUM_CASTLES_NAMENC_INT,
428  1, &num_castles_margaret)) ERR;
429      if (nc_def_grp(tudor_idJAMES_V_OF_SCOTLAND, &james_v_of_scotland_id)) ERR;
430      if (nc_put_att_int(james_v_of_scotland_idNC_GLOBALNUM_CASTLES_NAMENC_INT,
431  1, &num_castles_james_v)) ERR;
432      if (nc_def_grp(tudor_idMARY_I_OF_SCOTLAND, &mary_i_of_scotland_id)) ERR;
433      if (nc_put_att_int(mary_i_of_scotland_idNC_GLOBALNUM_CASTLES_NAMENC_INT,
434  1, &num_castles_mary_i)) ERR;
435      if (nc_def_grp(tudor_idJAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND,
436      &james_i_of_england_id)) ERR;
437      if (nc_put_att_int(james_i_of_england_idNC_GLOBALNUM_CASTLES_NAME,
438  NC_INT, 1, &num_castles_james_vi)) ERR;
439      if (nc_close(ncid)) ERR;
440
441      /* Make sure we've got all the tudors where we want them. */
442      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
443      if (nc_inq_grps(ncid, &num_grps, &dynasty)) ERR;
444      if (num_grps != 1) ERR;
445      if (nc_inq_grpname(dynastyname_in)) ERR;
446      if (strcmp(name_inDYNASTY)) ERR;
447      if (nc_inq_grps(dynasty, &num_grpsgrpid_in)) ERR;
448      if (num_grps != 5) ERR;
449      if (nc_inq_ncid(dynastyHENRY_VII, &ncid_in)) ERR;
450      if (nc_inq_grpname(ncid_inname_in)) ERR;
451      if (strcmp(name_inHENRY_VII)) ERR;
452      if (nc_inq_ncid(dynastyMARGARET, &ncid_in)) ERR;
453      if (nc_inq_grpname(ncid_inname_in)) ERR;
454      if (strcmp(name_inMARGARET)) ERR;
455      if (nc_inq_ncid(dynastyJAMES_V_OF_SCOTLAND, &ncid_in)) ERR;
456      if (nc_inq_grpname(ncid_inname_in)) ERR;
457      if (strcmp(name_inJAMES_V_OF_SCOTLAND)) ERR;
458      if (nc_inq_ncid(dynastyMARY_I_OF_SCOTLAND, &ncid_in)) ERR;
459      if (nc_inq_grpname(ncid_inname_in)) ERR;
460      if (strcmp(name_inMARY_I_OF_SCOTLAND)) ERR;
461      if (nc_inq_ncid(dynastyJAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND, &ncid_in)) ERR;
462      if (nc_inq_grpname(ncid_inname_in)) ERR;
463      if (strcmp(name_inJAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND)) ERR;
464      if (nc_close(ncid)) ERR;
465   }
466   SUMMARIZE_ERR;
467
468   printf("*** testing groups and dimensions...");
469   {
470      int ncid;
471      int tudor_id;
472      int num_grps;
473      int dimiddimid_indynasty;
474      size_t len_in;
475      char name_in[NC_MAX_NAME + 1];
476
477      /* Create a file with one group, and within that group, a dimension.*/
478      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
479      if (nc_def_grp(ncidDYNASTY, &tudor_id)) ERR;
480      if (nc_def_dim(tudor_idDIM1_NAMEDIM1_LEN, &dimid)) ERR;
481      if (nc_close(ncid)) ERR;
482
483      /* Now check the file to see if the dimension is there. */
484      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
485      if (nc_inq_grps(ncid, &num_grps, &dynasty)) ERR;
486      if (num_grps != 1) ERR;
487      if (nc_inq_grpname(dynastyname_in)) ERR;
488      if (strcmp(name_inDYNASTY)) ERR;
489      if (nc_inq_dimid(dynastyDIM1_NAME, &dimid_in)) ERR;
490      if (dimid_in != 0) ERR;
491      if (nc_inq_dimname(dynasty, 0, name_in)) ERR;
492      if (strcmp(name_inDIM1_NAME)) ERR;
493      if (nc_inq_dim(dynasty, 0, name_in, &len_in)) ERR;
494      if (strcmp(name_inDIM1_NAME)) ERR;
495      if (len_in != DIM1_LENERR;
496      if (nc_close(ncid)) ERR;
497   }
498   SUMMARIZE_ERR;
499
500   printf("*** testing groups and vars...");
501   {
502      int ncidndims_in;
503      int tudor_id;
504      int num_grps;
505      int dimiddynastyvarid;
506      size_t len_in;
507      int natts_in;
508      nc_type xtype_in;
509      char name_in[NC_MAX_NAME + 1];
510      int dimids_in[MAX_SIBLING_GROUPS];
511
512      /* Create a file with one group, and within that group, a
513       * dimension, and a variable.*/
514      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
515      if (nc_def_grp(ncidDYNASTY, &tudor_id)) ERR;
516      if (nc_def_dim(tudor_idDIM1_NAMEDIM1_LEN, &dimid)) ERR;
517      if (nc_def_var(tudor_idVAR1_NAMENC_INT, 1, &dimid, &varid)) ERR;
518      if (nc_close(ncid)) ERR;
519
520      /* Now check the file to see if the dimension and variable are
521       * there. */
522      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
523      if (nc_inq_grps(ncid, &num_grps, &dynasty)) ERR;
524      if (num_grps != 1) ERR;
525      if (nc_inq_dim(dynasty, 0, name_in, &len_in)) ERR;
526      if (strcmp(name_inDIM1_NAME) || len_in != DIM1_LENERR;
527      if (nc_inq_var(dynasty, 0, name_in, &xtype_in, &ndims_indimids_in,
528      &natts_in)) ERR;
529      if (strcmp(name_inVAR1_NAME) || xtype_in != NC_INT || ndims_in != 1 ||
530   dimids_in[0] != 0 || natts_in != 0) ERR;
531      if (nc_close(ncid)) ERR;
532   }
533   SUMMARIZE_ERR;
534
535   printf("*** testing group functions in netCDF classic file...");
536   {
537      int ncid;
538      int num_grps;
539
540      /* Create a classic file.*/
541      if (nc_create(FILE_NAME, 0, &ncid)) ERR;
542      if (nc_inq_grps(ncid, &num_grpsNULL)) ERR;
543      if (num_grpsERR;
544      if (nc_close(ncid)) ERR;
545
546      /* Now check the file to see if the dimension and variable are
547       * there. */
548      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
549      if (nc_inq_grps(ncid, &num_grpsNULL)) ERR;
550      if (num_grpsERR;
551      if (nc_close(ncid)) ERR;
552   }
553   SUMMARIZE_ERR;
554
555   printf("*** testing groups and vars...");
556   {
557      int ncidndims_in;
558      int henry_vii_idmargaret_idjames_v_of_scotland_idmary_i_of_scotland_id;
559      int james_i_of_england_idtudor_id;
560      int dimids_in[MAX_SIBLING_GROUPS];
561      int num_grps;
562      int dimiddynastyvarid;
563      size_t len_in;
564      int natts_in;
565      int grpids_in[10];
566      nc_type xtype_in;
567      char name_in[NC_MAX_NAME + 1];
568      int data_out[DIM1_LEN] = {-99, 0, 99}, data_in[DIM1_LEN];
569      int ij;
570
571      /* Create a file with a group, DYNASTY, containing 5 groups,
572       * each with a dimension and one int variable. */
573      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
574      if (nc_def_grp(ncidDYNASTY, &tudor_id)) ERR;
575      /* Henry VII. */
576      if (nc_def_grp(tudor_idHENRY_VII, &henry_vii_id)) ERR;
577      if (nc_def_dim(henry_vii_idDIM1_NAMEDIM1_LEN, &dimid)) ERR;
578      if (nc_def_var(henry_vii_idVAR1_NAMENC_INT, 1, &dimid, &varid)) ERR;
579      if (nc_put_var_int(henry_vii_idvariddata_out)) ERR;
580      /* Margaret. */
581      if (nc_def_grp(tudor_idMARGARET, &margaret_id)) ERR;
582      if (nc_def_dim(margaret_idDIM1_NAMEDIM1_LEN, &dimid)) ERR;
583      if (nc_def_var(margaret_idVAR1_NAMENC_INT, 1, &dimid, &varid)) ERR;
584      if (nc_put_var_int(margaret_idvariddata_out)) ERR;
585      /* James V of Scotland. */
586      if (nc_def_grp(tudor_idJAMES_V_OF_SCOTLAND, &james_v_of_scotland_id)) ERR;
587      if (nc_def_dim(james_v_of_scotland_idDIM1_NAMEDIM1_LEN, &dimid)) ERR;
588      if (nc_def_var(james_v_of_scotland_idVAR1_NAMENC_INT, 1, &dimid, &varid)) ERR;
589      if (nc_put_var_int(james_v_of_scotland_idvariddata_out)) ERR;
590      /* Mary I of Scotland. */
591      if (nc_def_grp(tudor_idMARY_I_OF_SCOTLAND, &mary_i_of_scotland_id)) ERR;
592      if (nc_def_dim(mary_i_of_scotland_idDIM1_NAMEDIM1_LEN, &dimid)) ERR;
593      if (nc_def_var(mary_i_of_scotland_idVAR1_NAMENC_INT, 1, &dimid, &varid)) ERR;
594      if (nc_put_var_int(mary_i_of_scotland_idvariddata_out)) ERR;
595      /* James VI of Scotland and I of England. */
596      if (nc_def_grp(tudor_idJAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND, &james_i_of_england_id)) ERR;
597      if (nc_def_dim(james_i_of_england_idDIM1_NAMEDIM1_LEN, &dimid)) ERR;
598      if (nc_def_var(james_i_of_england_idVAR1_NAMENC_INT, 1, &dimid, &varid)) ERR;
599      if (nc_put_var_int(james_i_of_england_idvariddata_out)) ERR;
600
601      /*nc_show_metadata(ncid);*/
602
603      /* Check it out. */
604      if (nc_inq_grps(ncid, &num_grps, &dynasty)) ERR;
605      if (num_grps != 1) ERR;
606      if (nc_inq_grps(dynasty, &num_grpsgrpids_in)) ERR;
607      if (num_grps != 5) ERR;
608      for (i = 0; i < 5; i++)
609      {
610  if (nc_inq_dim(grpids_in[i], iname_in, &len_in)) ERR;
611  if (strcmp(name_inDIM1_NAME) || len_in != DIM1_LENERR;
612  if (nc_inq_var(grpids_in[i], 0, name_in, &xtype_in, &ndims_indimids_in,
613 &natts_in)) ERR;
614  if (strcmp(name_inVAR1_NAME) || xtype_in != NC_INT || ndims_in != 1 ||
615      dimids_in[0] != i || natts_in != 0) ERR;
616  if (nc_get_var_int(grpids_in[i], 0, data_in)) ERR;
617  for (j=0; j<DIM1_LENj++)
618     if (data_in[j] != data_out[j]) ERR;
619      }
620
621      if (nc_close(ncid)) ERR;
622
623      /* Reopen. */
624      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
625
626      /* Check it out. */
627      if (nc_inq_grps(ncid, &num_grps, &dynasty)) ERR;
628      if (num_grps != 1) ERR;
629      if (nc_inq_grps(dynasty, &num_grpsgrpids_in)) ERR;
630      if (num_grps != 5) ERR;
631      for (i = 0; i < 5; i++)
632      {
633  /* We actually get the groups in alphabetical order, so our
634   * dimid is not i. */
635  /*if (nc_inq_dim(grpids_in[i], i, name_in, &len_in)) ERR;
636    if (strcmp(name_in, DIM1_NAME) || len_in != DIM1_LEN) ERR;*/
637  if (nc_inq_var(grpids_in[i], 0, name_in, &xtype_in, &ndims_indimids_in,
638 &natts_in)) ERR;
639  if (strcmp(name_inVAR1_NAME) || xtype_in != NC_INT || ndims_in != 1 ||
640      natts_in != 0) ERR;
641  if (nc_get_var_int(grpids_in[i], 0, data_in)) ERR;
642  for (j=0; j<DIM1_LENj++)
643     if (data_in[j] != data_out[j]) ERR;
644      }
645
646      if (nc_close(ncid)) ERR;
647   }
648   SUMMARIZE_ERR;
649
650   printf("*** testing very simple groups and dimension scoping...");
651   {
652      int ncid;
653      int dimids_in[MAX_SIBLING_GROUPS], nvars_inndims_in;
654      int henry_vii_id;
655      int num_grps;
656      int dimiddimid2varid;
657      size_t len_in;
658      int natts_in;
659      int unlimdimid_in;
660      int grpids_in[10];
661      nc_type xtype_in;
662      char name_in[NC_MAX_NAME + 1];
663      int data_out[DIM1_LEN] = {0, 2, 6}, data_in[DIM1_LEN];
664      int j;
665
666      /* Create a netCDF-4 file. */
667      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
668
669      /* Define two dimensions, "year" and "kingdom" in the root group. */
670      if (nc_def_dim(ncidDIM2_NAMEDIM2_LEN, &dimid2)) ERR;
671      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimid)) ERR;
672
673      /* Define a HENRY_VII group. It contains a var with dim "kingdom". */
674      if (nc_def_grp(ncidHENRY_VII, &henry_vii_id)) ERR;
675      if (nc_def_var(henry_vii_idVAR1_NAMENC_INT, 1, &dimid, &varid)) ERR;
676      if (nc_put_var_int(henry_vii_idvariddata_out)) ERR;
677
678      /* Done! */
679      if (nc_close(ncid)) ERR;
680
681      /* Reopen the file. */
682      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
683
684      /* Check the file. */
685      if (nc_inq_grps(ncid, &num_grps, &henry_vii_id)) ERR;
686      if (num_grps != 1) ERR;
687      if (nc_inq_grps(henry_vii_id, &num_grpsgrpids_in)) ERR;
688      if (num_grps != 0) ERR;
689      if (nc_inq(henry_vii_id, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
690      if (ndims_in != 0 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != -1) ERR;
691      if (nc_inq_var(henry_vii_id, 0, name_in, &xtype_in, &ndims_indimids_in,
692      &natts_in)) ERR;
693      if (strcmp(name_inVAR1_NAME) || xtype_in != NC_INT || ndims_in != 1 ||
694   dimids_in[0] != dimid || natts_in != 0) ERR;
695      if (nc_inq_dim(nciddimidname_in, &len_in)) ERR;
696      if (strcmp(name_inDIM1_NAME) || len_in != DIM1_LENERR;
697      if (nc_get_var_int(henry_vii_id, 0, data_in)) ERR;
698      for (j=0; j<DIM1_LENj++)
699  if (data_in[j] != data_out[j]) ERR;
700
701      /* Close the file. */
702      if (nc_close(ncid)) ERR;
703   }
704   SUMMARIZE_ERR;
705
706   printf("*** testing groups and dimension scoping...");
707   {
708#define NUM_GRPS 5
709      int ncid;
710      int henry_vii_idmargaret_idjames_v_of_scotland_idmary_i_of_scotland_id;
711      int james_i_of_england_idtudor_id;
712      int dimids_in[MAX_SIBLING_GROUPS], nvars_inndims_in;
713      int num_grps;
714      int dimiddimid2dynastyvarid;
715      size_t len_in;
716      int natts_in;
717      int unlimdimid_in;
718      int grpids_in[10];
719      nc_type xtype_in;
720      char name_in[NC_MAX_NAME + 1];
721      int data_out[DIM1_LEN] = {0, 2, 6}, data_in[DIM1_LEN];
722      int ij;
723
724      /* Create a netCDF-4 file. */
725      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
726
727      /* Define a bunch of groups, define a variable in each, and
728       * write some data in it. The vars use a shared dimension from
729       * the parent group. */
730
731      /* Create the parent group. */
732      if (nc_def_grp(ncidDYNASTY, &tudor_id)) ERR;
733
734      /* Define two dimensions, "year" and "kingdom" in the parent group. */
735      if (nc_def_dim(tudor_idDIM2_NAMEDIM2_LEN, &dimid2)) ERR;
736      if (nc_def_dim(tudor_idDIM1_NAMEDIM1_LEN, &dimid)) ERR;
737
738      /* Define a HENRY_VII group. It contains a var with dim "kingdom". */
739      if (nc_def_grp(tudor_idHENRY_VII, &henry_vii_id)) ERR;
740      if (nc_def_var(henry_vii_idVAR1_NAMENC_INT, 1, &dimid, &varid)) ERR;
741      if (nc_put_var_int(henry_vii_idvariddata_out)) ERR;
742
743      /* Define a MARGARET group. */
744      if (nc_def_grp(tudor_idMARGARET, &margaret_id)) ERR;
745      if (nc_def_var(margaret_idVAR1_NAMENC_INT, 1, &dimid, &varid)) ERR;
746      if (nc_put_var_int(margaret_idvariddata_out)) ERR;
747
748      /* Define a JAMES_V_OF_SCOTLAND group. */
749      if (nc_def_grp(tudor_idJAMES_V_OF_SCOTLAND, &james_v_of_scotland_id)) ERR;
750      if (nc_def_var(james_v_of_scotland_idVAR1_NAMENC_INT, 1, &dimid, &varid)) ERR;
751      if (nc_put_var_int(james_v_of_scotland_idvariddata_out)) ERR;
752
753      /* Define a MARY_I_OF_SCOTLAND group. */
754      if (nc_def_grp(tudor_idMARY_I_OF_SCOTLAND, &mary_i_of_scotland_id)) ERR;
755      if (nc_def_var(mary_i_of_scotland_idVAR1_NAMENC_INT, 1, &dimid, &varid)) ERR;
756      if (nc_put_var_int(mary_i_of_scotland_idvariddata_out)) ERR;
757
758      /* Define a JAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND group. */
759      if (nc_def_grp(tudor_idJAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND, &james_i_of_england_id)) ERR;
760      if (nc_def_var(james_i_of_england_idVAR1_NAMENC_INT, 1, &dimid, &varid)) ERR;
761      if (nc_put_var_int(james_i_of_england_idvariddata_out)) ERR;
762
763      /* Done! */
764      if (nc_close(ncid)) ERR;
765
766      /* Reopen the file. */
767      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
768
769      /* Check the file. */
770      if (nc_inq_grps(ncid, &num_grps, &dynasty)) ERR;
771      if (num_grps != 1) ERR;
772      if (nc_inq_grps(dynasty, &num_grpsgrpids_in)) ERR;
773      if (num_grps != NUM_GRPSERR;
774      for (i = 0; i < NUM_GRPSi++)
775      {
776  if (nc_inq(grpids_in[i], &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
777  if (ndims_in != 0 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != -1) ERR;
778  if (nc_inq_var(grpids_in[i], 0, name_in, &xtype_in, &ndims_indimids_in,
779 &natts_in)) ERR;
780  if (strcmp(name_inVAR1_NAME) || xtype_in != NC_INT || ndims_in != 1 ||
781      dimids_in[0] != dimid || natts_in != 0) ERR;
782  if (nc_inq_dim(grpids_in[i], dimidname_in, &len_in)) ERR;
783  if (strcmp(name_inDIM1_NAME) || len_in != DIM1_LENERR;
784  if (nc_get_var_int(grpids_in[i], 0, data_in)) ERR;
785  for (j=0; j<DIM1_LENj++)
786     if (data_in[j] != data_out[j]) ERR;
787      }
788
789      /* Close the file. */
790      if (nc_close(ncid)) ERR;
791   }
792   SUMMARIZE_ERR;
793
794   printf("*** testing more groups and dimension scoping...");
795   {
796      int ncid;
797      int henry_vii_id;
798      int tudor_id;
799      int dimids_in[MAX_SIBLING_GROUPS], ndims_in;
800      int year_didkingdom_didvariddimids[2], parent_id;
801      int natts_in;
802      int numgrps;
803      int grpids_in[10];
804      nc_type xtype_in;
805      char name_in[NC_MAX_NAME + 1];
806
807      /* Create a netCDF-4 file. */
808      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
809
810      /* Create the parent group. */
811      if (nc_def_grp(ncidDYNASTY, &tudor_id)) ERR;
812
813      /* Define two dimensions, "year" and "kingdom" in the parent group. */
814      if (nc_def_dim(tudor_idDIM1_NAMEDIM1_LEN, &kingdom_did)) ERR;
815      if (nc_def_dim(tudor_idDIM2_NAMEDIM2_LEN, &year_did)) ERR;
816
817      /* Define a HENRY_VII group. It contains a var using both dimensions. */
818      if (nc_def_grp(tudor_idHENRY_VII, &henry_vii_id)) ERR;
819      dimids[0] = year_did;
820      dimids[1] = kingdom_did;
821      if (nc_def_var(henry_vii_idVAR1_NAMENC_UINT64, 2, dimids, &varid)) ERR;
822      if (nc_inq_var(henry_vii_idvaridname_in, &xtype_in, &ndims_in,
823      dimids_in, &natts_in)) ERR;
824      if (strcmp(name_inVAR1_NAME) || xtype_in != NC_UINT64 || ndims_in != 2 ||
825   dimids_in[0] != year_did || dimids_in[1] != kingdom_did ||
826   natts_in != 0) ERR;
827
828      /* Close the file. */
829      if (nc_close(ncid)) ERR;
830
831      /* Reopen the file. */
832      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
833
834      /* Find our group. */
835      if (nc_inq_grps(ncid, &numgrpsgrpids_in)) ERR;
836      if (numgrps != 1) ERR;
837      parent_id = grpids_in[0];
838      if (nc_inq_grps(parent_id, &numgrpsgrpids_in)) ERR;
839      if (numgrps != 1) ERR;
840      henry_vii_id = grpids_in[0];
841      if (nc_inq_var(henry_vii_idvaridname_in, &xtype_in, &ndims_in,
842      dimids_in, &natts_in)) ERR;
843      if (strcmp(name_inVAR1_NAME) || xtype_in != NC_UINT64 || ndims_in != 2 ||
844   dimids_in[0] != year_did || dimids_in[1] != kingdom_did ||
845   natts_in != 0) ERR;
846      /* Close the file. */
847      if (nc_close(ncid)) ERR;
848
849   }
850   SUMMARIZE_ERR;
851   printf("*** testing groups and unlimited dimensions...");
852   {
853      int ncid;
854      int henry_vii_id;
855      int tudor_id;
856      int dimids_in[MAX_SIBLING_GROUPS], ndims_in;
857      int num_grps;
858      int dimiddynastyvarid;
859      size_t len_in;
860      int natts_in;
861      int grpids_in[10];
862      nc_type xtype_in;
863      char name_in[NC_MAX_NAME + 1];
864      int data_out[DIM1_LEN] = {0, 2, 6}, data_in[DIM1_LEN];
865      size_t start[1] = {0}, count[1] = {3};
866      int j;
867
868      /* Create one group, with one var, which has one dimension, which is unlimited. */
869      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
870      if (nc_def_grp(ncidDYNASTY, &tudor_id)) ERR;
871      if (nc_def_dim(tudor_idDIM1_NAMENC_UNLIMITED, &dimid)) ERR;
872      if (nc_def_grp(tudor_idHENRY_VII, &henry_vii_id)) ERR;
873      if (nc_def_var(henry_vii_idVAR1_NAMENC_INT, 1, &dimid, &varid)) ERR;
874      if (nc_put_vara_int(henry_vii_idvaridstartcountdata_out)) ERR;
875      if (nc_close(ncid)) ERR;
876
877      /* Now check the file to see if the dimension and variable are
878       * there. */
879      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
880      if (nc_inq_grps(ncid, &num_grps, &dynasty)) ERR;
881      if (num_grps != 1) ERR;
882      if (nc_inq_grps(dynasty, &num_grpsgrpids_in)) ERR;
883      if (num_grps != 1) ERR;
884      if (nc_inq_dim(grpids_in[0], 0, name_in, &len_in)) ERR;
885      if (strcmp(name_inDIM1_NAME) || len_in != DIM1_LENERR;
886      if (nc_inq_var(grpids_in[0], 0, name_in, &xtype_in, &ndims_indimids_in,
887      &natts_in)) ERR;
888      if (strcmp(name_inVAR1_NAME) || xtype_in != NC_INT || ndims_in != 1 ||
889   dimids_in[0] != 0 || natts_in != 0) ERR;
890      if (nc_get_vara_int(grpids_in[0], 0, startcountdata_in)) ERR;
891      for (j=0; j<DIM1_LENj++)
892  if (data_in[j] != data_out[j]) ERR;
893      if (nc_close(ncid)) ERR;
894   }
895   SUMMARIZE_ERR;
896
897   printf("*** testing nested groups...");
898   {
899#define DIM_NAME "dim"
900#define DIM_LEN 3
901#define VAR_NAME "var"
902#define VAR_RANK 1
903#define ATT_NAME "units"
904#define ATT_VAL "m/s"
905#define GATT_NAME "title"
906#define GATT_VAL "for testing groups"
907#define G1_NAME "the_in_crowd"
908#define G2_NAME "the_out_crowd"
909#define G3_NAME "the_confused_crowd"
910      int ncid;
911      int dimidvarid;
912      int var_dims[VAR_RANK];
913      int g1idg2idg3id;
914
915      /* Create a file with nested groups. */
916      if (nc_create(FILE_NAMENC_CLOBBER | NC_NETCDF4, &ncid)) ERR;
917      /* At root level define dim, var, atts */
918      if (nc_def_dim(ncidDIM_NAMEDIM_LEN, &dimid)) ERR;
919      var_dims[0] = dimid;
920      if (nc_def_var(ncidVAR_NAMENC_FLOATVAR_RANKvar_dims, &varid)) ERR;
921      if (nc_put_att_text(ncidvaridATT_NAME, strlen(ATT_VAL), ATT_VAL)) ERR;
922      if (nc_put_att_text(ncidNC_GLOBALGATT_NAME, strlen(GATT_VAL),
923   GATT_VAL)) ERR;
924
925      /* put dim, var, atts with same names in a group */
926      if (nc_def_grp(ncidG1_NAME, &g1id)) ERR;
927      if (nc_def_dim(g1idDIM_NAMEDIM_LEN, &dimid)) ERR;
928      var_dims[0] = dimid;
929      if (nc_def_var(g1idVAR_NAMENC_FLOATVAR_RANKvar_dims, &varid)) ERR;
930      if (nc_put_att_text(g1idvaridATT_NAME, strlen(ATT_VAL), ATT_VAL)) ERR;
931      if (nc_put_att_text(g1idNC_GLOBALGATT_NAME, strlen(GATT_VAL),
932   GATT_VAL)) ERR;
933      if (nc_enddef(g1id)) ERR;
934
935      /* put dim, var, atts with same names in a second group */
936      if (nc_def_grp(ncidG2_NAME, &g2id)) ERR;
937      if (nc_def_dim(g2idDIM_NAMEDIM_LEN, &dimid)) ERR;
938      var_dims[0] = dimid;
939      if (nc_def_var(g2idVAR_NAMENC_FLOATVAR_RANKvar_dims, &varid)) ERR;
940      if (nc_put_att_text(g2idvaridATT_NAME, strlen(ATT_VAL), ATT_VAL)) ERR;
941      if (nc_put_att_text(g2idNC_GLOBALGATT_NAME, strlen(GATT_VAL),
942   GATT_VAL)) ERR;
943      if (nc_enddef(g2id)) ERR;
944
945      /* put dim, var, atts with same names in a subgroup of second group */
946      if (nc_def_grp(g2idG3_NAME, &g3id)) ERR;
947      if (nc_def_dim(g3idDIM_NAMEDIM_LEN, &dimid)) ERR;
948      var_dims[0] = dimid;
949      if (nc_def_var(g3idVAR_NAMENC_FLOATVAR_RANKvar_dims, &varid)) ERR;
950      if (nc_put_att_text(g3idvaridATT_NAME, strlen(ATT_VAL), ATT_VAL)) ERR;
951      if (nc_put_att_text(g3idNC_GLOBALGATT_NAME, strlen(GATT_VAL),
952   GATT_VAL)) ERR;
953      if (nc_enddef(g3id)) ERR;
954
955      if (nc_close(ncid)) ERR;
956
957   }
958   SUMMARIZE_ERR;
959
960   printf("*** testing nested groups, user defined types, and enddef...");
961   {
962#define SCI_FI "Science_Fiction"
963#define BASE_SIZE 2
964#define TYPE_NAME "The_Blob"
965#define DATE_MOVIE "data_movie"
966      int ncidxtypeg1idclass;
967      char name_in[NC_MAX_NAME + 1];
968      size_t len_in;
969      unsigned char data[BASE_SIZE] = {42, 43}, data_in[BASE_SIZE];
970
971      /* Create a file. */
972      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
973
974      /* define subgroup with a user defined type. */
975      if (nc_def_grp(ncidSCI_FI, &g1id)) ERR;
976      if (nc_def_opaque(g1idBASE_SIZETYPE_NAME, &xtype)) ERR;
977      if (nc_put_att(g1idNC_GLOBALDATE_MOVIExtype, 1, &data)) ERR;
978
979      /* Check it. */
980      if (nc_inq_user_type(g1idxtypename_in, &len_inNULLNULL, &class)) ERR;
981      if (strcmp(name_inTYPE_NAME) || len_in != BASE_SIZE || class != NC_OPAQUEERR;
982      if (nc_get_att(g1idNC_GLOBALDATE_MOVIEdata_in)) ERR;
983      if (data[0] != data_in[0] || data[1] != data_in[1]) ERR;
984
985      /* Call enddef and try again. */
986      if (nc_enddef(g1id)) ERR;
987
988      if (nc_inq_user_type(g1idxtypename_in, &len_inNULLNULL, &class)) ERR;
989      if (strcmp(name_inTYPE_NAME) || len_in != BASE_SIZE || class != NC_OPAQUEERR;
990      if (nc_get_att(g1idNC_GLOBALDATE_MOVIEdata_in)) ERR;
991      if (data[0] != data_in[0] || data[1] != data_in[1]) ERR;
992
993      if (nc_close(ncid)) ERR;
994
995      /* Reopen and recheck. */
996      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
997      if (nc_inq_grp_ncid(ncidSCI_FI, &g1id)) ERR;
998
999      if (nc_inq_user_type(g1idxtypename_in, &len_inNULLNULL, &class)) ERR;
1000      if (strcmp(name_inTYPE_NAME) || len_in != BASE_SIZE || class != NC_OPAQUEERR;
1001      if (nc_get_att(g1idNC_GLOBALDATE_MOVIEdata_in)) ERR;
1002      if (data[0] != data_in[0] || data[1] != data_in[1]) ERR;
1003
1004      if (nc_close(ncid)) ERR;
1005
1006   }
1007   SUMMARIZE_ERR;
1008
1009   printf("*** creating file with lots of user-defined types...");
1010   {
1011      int ncidtypeid;
1012      int g1idg2idg3id;
1013
1014      /* Create a file with nested groups. */
1015      if (nc_create(FILE_NAMENC_CLOBBER | NC_NETCDF4, &ncid)) ERR;
1016      if (nc_def_opaque(ncid, 10, "opaque-1", &typeid)) ERR;
1017      if (nc_def_vlen(ncid, "vlen-1", NC_INT, &typeid)) ERR;
1018      if (nc_enddef(ncid)) ERR;
1019
1020      if (nc_def_grp(ncidG1_NAME, &g1id)) ERR;
1021      if (nc_def_opaque(g1id, 7, "opaque-2", &typeid)) ERR;
1022      if (nc_def_vlen(g1id, "vlen-2", NC_BYTE, &typeid)) ERR;
1023      if (nc_enddef(g1id)) ERR;
1024
1025      if (nc_def_grp(ncidG2_NAME, &g2id)) ERR;
1026      if (nc_def_opaque(g2id, 4, "opaque-3", &typeid)) ERR;
1027      if (nc_def_vlen(g2id, "vlen-3", NC_BYTE, &typeid)) ERR;
1028      if (nc_enddef(g2id)) ERR;
1029
1030      /* put dim, var, atts with same names in a subgroup of second group */
1031      if (nc_def_grp(g2idG3_NAME, &g3id)) ERR;
1032      if (nc_def_opaque(g3id, 13, "opaque-4", &typeid)) ERR;
1033      if (nc_def_vlen(g3id, "vlen-4", NC_BYTE, &typeid)) ERR;
1034      if (nc_enddef(g3id)) ERR;
1035
1036      if (nc_close(ncid)) ERR;
1037
1038      /* Now count how many user-defined types there are */
1039      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
1040      if (nc_close(ncid)) ERR;
1041
1042   }
1043   SUMMARIZE_ERR;
1044
1045   printf("*** creating file with lots of groups...");
1046   {
1047#define PARENT_NUM_GRPS 6
1048#define SUB_NUM_GRPS 2
1049
1050      int ncidg1idsub_grpidnum_grpsgs;
1051      char grp_name[NC_MAX_NAME + 1];
1052
1053      /* Create a file with lots of groups. */
1054      if (nc_create(FILE_NAMENC_CLOBBER | NC_NETCDF4, &ncid)) ERR;
1055      for (g = 0; g < PARENT_NUM_GRPSg++)
1056      {
1057  sprintf(grp_name, "grp_%d", g);
1058  if (nc_def_grp(ncidgrp_name, &g1id)) ERR;
1059  for (s = 0; s < SUB_NUM_GRPSs++)
1060  {
1061     sprintf(grp_name, "sub_grp_%d", s);
1062     if (nc_def_grp(g1idgrp_name, &sub_grpid)) ERR;
1063  }
1064      }
1065
1066      if (nc_close(ncid)) ERR;
1067
1068      /* Now count how groups there are. */
1069      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
1070      if (nc_inq_grps(ncid, &num_grpsNULL)) ERR;
1071      if (num_grps != PARENT_NUM_GRPSERR;
1072      if (nc_close(ncid)) ERR;
1073
1074   }
1075   SUMMARIZE_ERR;
1076
1077   printf("*** creating file with type defined after group...");
1078   {
1079#define GRP_NAME "phony_group"
1080#define CMP1_NAME "cmp1"
1081#define CMP2_NAME "cmp2"
1082
1083      int ncidvaridvarid2grpidnumvarsretval;
1084      int typeidtypeid2;
1085      size_t nfields;
1086      char name[NC_MAX_NAME + 1];
1087      size_t size;
1088      struct s1
1089      {
1090         int i1;
1091         int i2;
1092      };
1093      struct s2
1094      {
1095         int i3;
1096         double f1;
1097      };
1098      struct s1 data;
1099      struct s2 data2;
1100
1101      /* Create some phony data. */
1102      data.i1 = 5;
1103      data.i2 = 10;
1104      data2.i3 = 50;
1105      data2.f1 = 100.0;
1106
1107      /* Create file */
1108      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
1109
1110      /* Create compound datatype #1, in root group */
1111      if (nc_def_compound(ncid, sizeof(struct s1), CMP1_NAME, &typeid)) ERR;
1112      if (nc_inq_compound(ncidtypeidname, &size, &nfields)) ERR;
1113      if (size != sizeof(struct s1) || strcmp(nameCMP1_NAME) || nfieldsERR;
1114      if (nc_insert_compound(ncidtypeid, "i1",
1115      NC_COMPOUND_OFFSET(struct s1i1), NC_INT)) ERR;
1116      if (nc_insert_compound(ncidtypeid, "i2",
1117      NC_COMPOUND_OFFSET(struct s1i2), NC_INT)) ERR;
1118
1119      /* Create variable with compound datatype #1, in root group */
1120      if (nc_def_var(ncidVAR_NAMEtypeid, 0, NULL, &varid)) ERR;
1121      if (nc_put_var(ncidvarid, &data)) ERR;
1122
1123      /* Create child group, in root group*/
1124      if (nc_def_grp(ncidGRP_NAME, &grpid)) ERR;
1125
1126      /* Close and re-open file, to guarantee the creation ordering is difficult
1127       *   for the library to deal with.
1128       */
1129      if (nc_close(ncid)) ERR;
1130      if ((retval = nc_open(FILE_NAMENC_WRITE, &ncid))) ERR;
1131
1132      /* Create compound datatype #2, in root group */
1133      if (nc_def_compound(ncid, sizeof(struct s2), CMP2_NAME, &typeid2)) ERR;
1134      if (nc_inq_compound(ncidtypeid2name, &size, &nfields)) ERR;
1135      if (size != sizeof(struct s2) || strcmp(nameCMP2_NAME) || nfieldsERR;
1136      if (nc_insert_compound(ncidtypeid2, "i3",
1137      NC_COMPOUND_OFFSET(struct s2i3), NC_INT)) ERR;
1138      if (nc_insert_compound(ncidtypeid2, "f1",
1139      NC_COMPOUND_OFFSET(struct s2f1), NC_DOUBLE)) ERR;
1140
1141      /* Create variable with compound datatype #2, in root group */
1142      if (nc_def_var(grpidVAR_NAMEtypeid2, 0, NULL, &varid2)) ERR;
1143      if (nc_put_var(ncidvarid2, &data2)) ERR;
1144
1145      if (nc_close(ncid)) ERR;
1146
1147
1148      /* Verify that the variable in the child group was recognized by the library */
1149      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
1150      if (nc_inq_grp_ncid(ncidGRP_NAME, &grpid)) ERR;
1151      if (nc_inq_nvars(grpid, &numvars)) ERR;
1152      if (numvars != 1) ERR;
1153      if (nc_close(ncid)) ERR;
1154   }
1155   SUMMARIZE_ERR;
1156
1157   FINAL_RESULTS;
1158}


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