1/* This is part of the netCDF package. Copyright 2005 University
2   Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
3   conditions of use. See www.unidata.ucar.edu for more info.
4
5   Test netcdf-4 enum types.
6
7   $Id: tst_enums.c,v 1.17 2009/02/14 14:09:45 ed Exp $
8*/
9
10#include <nc_tests.h>
11#include "err_macros.h"
12#include "netcdf.h"
13
14#define FILE_NAME "tst_enums.nc"
15#define DIM_LEN 4
16#define NUM_MEMBERS 4
17#define DIM_NAME "dim"
18#define BASE_SIZE 20
19#define VAR_NAME "Advice"
20#define TYPE_NAME "Mysterous_Word"
21
22int
23main(int argc, char **argv)
24{
25   int ncid;
26   nc_type typeid;
27   int i;
28   char name_in[NC_MAX_NAME+1];
29   int ntypestypeids[1] = {0};
30   nc_type base_nc_typebase_nc_type_in;
31   size_t nfields_innum_membersbase_size_in;
32   int class_in;
33
34   printf("\n*** Testing netcdf-4 enum type.\n");
35   printf("*** testing creation of enum type...");
36   {
37      int value_in;
38      /* Can't use the same name twice! */
39      char member_name[NUM_MEMBERS][NC_MAX_NAME + 1] = {"Mene1", "Mene2",
40 "Tekel", "Upharsin"};
41      int member_value[NUM_MEMBERS] = {0, 99, 81232, 12};
42
43      /* Create a file. */
44      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
45
46      /* Create an enum type. */
47      if (nc_def_enum(ncidNC_INTTYPE_NAME, &typeid)) ERR;
48      for (i = 0; i < NUM_MEMBERSi++)
49  if (nc_insert_enum(ncidtypeidmember_name[i],
50     &member_value[i])) ERR;
51
52      /* Check it out. */
53      if (nc_inq_user_type(ncidtypeidname_in, &base_size_in, &base_nc_type_in,
54    &nfields_in, &class_in)) ERR;
55      if (strcmp(name_inTYPE_NAME) || base_size_in != sizeof(int) ||
56   base_nc_type_in != NC_INT || nfields_in != NUM_MEMBERS || class_in != NC_ENUMERR;
57      if (nc_inq_enum(ncidtypeidname_in, &base_nc_type, &base_size_in, &num_members)) ERR;
58      if (strcmp(name_inTYPE_NAME) || base_nc_type != NC_INT ||
59   num_members != NUM_MEMBERSERR;
60      for (i = 0; i < NUM_MEMBERSi++)
61      {
62  if (nc_inq_enum_member(ncidtypeidiname_in, &value_in)) ERR;
63  if (strcmp(name_inmember_name[i]) || value_in != member_value[i]) ERR;
64  if (nc_inq_enum_ident(ncidtypeidmember_value[i], name_in)) ERR;
65  if (strcmp(name_inmember_name[i])) ERR;
66      }
67
68      /* Write the file. */
69      if (nc_close(ncid)) ERR;
70
71      /* Reopen the file. */
72      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
73
74      /* Get type info. */
75      if (nc_inq_typeids(ncid, &ntypestypeids)) ERR;
76      if (ntypes != 1 || !typeids[0]) ERR;
77
78      /* Check it out. */
79      if (nc_inq_user_type(ncidtypeids[0], name_in, &base_size_in, &base_nc_type_in,
80    &nfields_in, &class_in)) ERR;
81      if (strcmp(name_inTYPE_NAME) || base_size_in != sizeof(int) ||
82   base_nc_type_in != NC_INT || nfields_in != NUM_MEMBERS || class_in != NC_ENUMERR;
83      if (nc_inq_type(ncidtypeids[0], name_in, &base_size_in)) ERR;
84      if (strcmp(name_inTYPE_NAME) || base_size_in != sizeof(int)) ERR;
85      if (nc_inq_enum(ncidtypeids[0], name_in, &base_nc_type, &base_size_in, &num_members)) ERR;
86      if (strcmp(name_inTYPE_NAME) || base_nc_type != NC_INT || num_members != NUM_MEMBERSERR;
87      for (i = 0; i < NUM_MEMBERSi++)
88      {
89  if (nc_inq_enum_member(ncidtypeidiname_in, &value_in)) ERR;
90  if (strcmp(name_inmember_name[i]) || value_in != member_value[i]) ERR;
91  if (nc_inq_enum_ident(ncidtypeidmember_value[i], name_in)) ERR;
92  if (strcmp(name_inmember_name[i])) ERR;
93      }
94
95      if (nc_close(ncid)) ERR;
96   }
97
98   SUMMARIZE_ERR;
99
100#define NUM_BRADYS 9
101#define BRADYS "Bradys"
102#define BRADY_DIM_LEN 3
103#define ATT_NAME "brady_attribute"
104
105   printf("*** testing enum attribute...");
106   {
107      char brady_name[NUM_BRADYS][NC_MAX_NAME + 1] = {"Mike", "Carol", "Greg", "Marsha",
108        "Peter", "Jan", "Bobby", "Whats-her-face",
109        "Alice"};
110      unsigned char brady_value[NUM_BRADYS] = {8, 7, 6 , 5, 4, 3, 2, 1, 0};
111      unsigned char data[BRADY_DIM_LEN] = {0, 4, 8};
112      unsigned char value_in;
113
114      /* Create a file. */
115      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
116
117      /* Create an enum type based on unsigned bytes. */
118      if (nc_def_enum(ncidNC_UBYTEBRADYS, &typeid)) ERR;
119      for (i = 0; i < NUM_BRADYSi++)
120  if (nc_insert_enum(ncidtypeidbrady_name[i],
121     &brady_value[i])) ERR;
122
123      /* Check it out. */
124      if (nc_inq_user_type(ncidtypeidname_in, &base_size_in, &base_nc_type_in,
125    &nfields_in, &class_in)) ERR;
126      if (strcmp(name_inBRADYS) || base_size_in != 1 ||
127   base_nc_type_in != NC_UBYTE || nfields_in != NUM_BRADYS || class_in != NC_ENUMERR;
128      if (nc_inq_enum(ncidtypeidname_in, &base_nc_type, &base_size_in, &num_members)) ERR;
129      if (strcmp(name_inBRADYS) || base_nc_type != NC_UBYTE || base_size_in != 1 ||
130   num_members != NUM_BRADYSERR;
131      for (i = 0; i < NUM_BRADYSi++)
132      {
133  if (nc_inq_enum_member(ncidtypeidiname_in, &value_in)) ERR;
134  if (strcmp(name_inbrady_name[i]) || value_in != brady_value[i]) ERR;
135  if (nc_inq_enum_ident(ncidtypeidbrady_value[i], name_in)) ERR;
136  if (strcmp(name_inbrady_name[i])) ERR;
137      }
138
139      /* Write an att of this enum type. */
140      if (nc_put_att(ncidNC_GLOBALATT_NAMEtypeidBRADY_DIM_LENdata)) ERR;
141
142      /* Close the file. */
143      if (nc_close(ncid)) ERR;
144
145      /* Reopen. */
146      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
147
148      /* Check it out. */
149      if (nc_inq_user_type(ncidtypeidname_in, &base_size_in, &base_nc_type_in,
150    &nfields_in, &class_in)) ERR;
151      if (strcmp(name_inBRADYS) || base_size_in != 1 ||
152   base_nc_type_in != NC_UBYTE || nfields_in != NUM_BRADYS || class_in != NC_ENUMERR;
153      if (nc_inq_enum(ncidtypeidname_in, &base_nc_type, &base_size_in, &num_members)) ERR;
154      if (strcmp(name_inBRADYS) || base_nc_type != NC_UBYTE || base_size_in != 1 ||
155   num_members != NUM_BRADYSERR;
156      for (i = 0; i < NUM_BRADYSi++)
157      {
158  if (nc_inq_enum_member(ncidtypeidiname_in, &value_in)) ERR;
159  if (strcmp(name_inbrady_name[i]) || value_in != brady_value[i]) ERR;
160  if (nc_inq_enum_ident(ncidtypeidbrady_value[i], name_in)) ERR;
161  if (strcmp(name_inbrady_name[i])) ERR;
162      }
163
164      if (nc_close(ncid)) ERR;
165   }
166
167   SUMMARIZE_ERR;
168
169#define TYPE2_NAME "cloud_type"
170#define DIM2_NAME "station"
171#define DIM2_LEN 5
172#define VAR2_NAME "primary_cloud"
173#define VAR2_RANK 1
174#define ATT2_NAME "_FillValue"
175#define ATT2_LEN  1
176
177   printf("*** testing enum fill value ...");
178   {
179       int dimidvarid;
180       size_t num_members_in;
181       int class_in;
182       unsigned char value_in;
183       unsigned char att_value_in;
184
185       enum clouds { /* a C enumeration */
186    CLEAR=0,
187    CUMULONIMBUS=1,
188    STRATUS=2,
189    STRATOCUMULUS=3,
190    CUMULUS=4,
191    ALTOSTRATUS=5,
192    NIMBOSTRATUS=6,
193    ALTOCUMULUS=7,
194    CIRROSTRATUS=8,
195    CIRROCUMULUS=9,
196    CIRRUS=10,
197    MISSING=255};
198
199       struct {
200    char *name;
201    unsigned char value;
202       } cloud_types[] = {
203    {"Clear", CLEAR},
204    {"Cumulonimbus", CUMULONIMBUS},
205    {"Stratus", STRATUS},
206    {"Stratocumulus", STRATOCUMULUS},
207    {"Cumulus", CUMULUS},
208    {"Altostratus", ALTOSTRATUS},
209    {"Nimbostratus", NIMBOSTRATUS},
210    {"Altocumulus", ALTOCUMULUS},
211    {"Cirrostratus", CIRROSTRATUS},
212    {"Cirrocumulus", CIRROCUMULUS},
213    {"Cirrus", CIRRUS},
214    {"Missing", MISSING}
215       };
216       int var_dims[VAR2_RANK];
217       unsigned char att_val;
218       unsigned char cloud_data[DIM2_LEN] = {
219    CLEARSTRATUSCLEARCUMULONIMBUSMISSING};
220       unsigned char cloud_data_in[DIM2_LEN];
221
222       if (nc_create(FILE_NAMENC_CLOBBER | NC_NETCDF4, &ncid)) ERR;
223
224       /* Create an enum type. */
225       if (nc_def_enum(ncidNC_UBYTETYPE2_NAME, &typeid)) ERR;
226       num_members = (sizeof cloud_types) / (sizeof cloud_types[0]);
227       for (i = 0; i < num_membersi++)
228    if (nc_insert_enum(ncidtypeidcloud_types[i].name,
229       &cloud_types[i].value)) ERR;
230
231       /* Declare a station dimension */
232       if (nc_def_dim(ncidDIM2_NAMEDIM2_LEN, &dimid)) ERR;
233       /* Declare a variable of the enum type */
234       var_dims[0] = dimid;
235       if (nc_def_var(ncidVAR2_NAMEtypeidVAR2_RANKvar_dims, &varid)) ERR;
236       /* Create and write a variable attribute of the enum type */
237       att_val = MISSING;
238       if (nc_put_att(ncidvaridATT2_NAMEtypeidATT2_LEN, &att_val)) ERR;
239       if (nc_enddef(ncid)) ERR;
240       /* Store some data of the enum type */
241       if(nc_put_var(ncidvaridcloud_data)) ERR;
242       /* Write the file. */
243       if (nc_close(ncid)) ERR;
244
245       /* Check it out. */
246
247       /* Reopen the file. */
248       if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
249
250       if (nc_inq_user_type(ncidtypeidname_in, &base_size_in, &base_nc_type_in,
251     &nfields_in, &class_in)) ERR;
252       if (strcmp(name_inTYPE2_NAME) ||
253    base_size_in != sizeof(unsigned char) ||
254    base_nc_type_in != NC_UBYTE ||
255    nfields_in != num_members ||
256    class_in != NC_ENUMERR;
257       if (nc_inq_enum(ncidtypeidname_in,
258        &base_nc_type_in, &base_size_in, &num_members_in)) ERR;
259       if (strcmp(name_inTYPE2_NAME) ||
260    base_nc_type_in !=  NC_UBYTE ||
261    num_members_in != num_membersERR;
262       for (i = 0; i < num_membersi++)
263       {
264    if (nc_inq_enum_member(ncidtypeidiname_in, &value_in)) ERR;
265    if (strcmp(name_incloud_types[i].name) ||
266        value_in != cloud_types[i].valueERR;
267    if (nc_inq_enum_ident(ncidtypeidcloud_types[i].value,
268  name_in)) ERR;
269    if (strcmp(name_incloud_types[i].name)) ERR;
270       }
271       if (nc_inq_varid(ncidVAR2_NAME, &varid)) ERR;
272
273       if (nc_get_att(ncidvaridATT2_NAME, &att_value_in)) ERR;
274       if (att_value_in != MISSINGERR;
275
276       if(nc_get_var(ncidvaridcloud_data_in)) ERR;
277       for (i = 0; i < DIM2_LENi++) {
278    if (cloud_data_in[i] != cloud_data[i]) ERR;
279       }
280
281       if (nc_close(ncid)) ERR;
282   }
283
284   SUMMARIZE_ERR;
285   printf("*** testing enum interuptus...");
286   {
287#define GEEKY_NAME "Galadriel"
288
289      /* Create a file. */
290      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
291
292      /* Create an enum type based on unsigned bytes. */
293      if (nc_def_enum(ncidNC_UBYTEGEEKY_NAME, &typeid)) ERR;
294
295      /* Check it out. */
296      if (nc_inq_user_type(ncidtypeidname_in, &base_size_in, &base_nc_type_in,
297    &nfields_in, &class_in)) ERR;
298      if (strcmp(name_inGEEKY_NAME) || base_size_in != 1 ||
299   base_nc_type_in != NC_UBYTE || nfields_in != 0 || class_in != NC_ENUMERR;
300      if (nc_inq_enum(ncidtypeidname_in, &base_nc_type, &base_size_in, &num_members)) ERR;
301      if (strcmp(name_inGEEKY_NAME) || base_nc_type != NC_UBYTE || base_size_in != 1 ||
302   num_members != 0) ERR;
303
304      /* Close the file. */
305      if (nc_close(ncid) != NC_EINVALERR;
306
307   }
308
309   SUMMARIZE_ERR;
310   FINAL_RESULTS;
311}


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