1/* This is part of the netCDF package. Copyright 2008 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   Create a test file with default fill values for variables of each type.
6
7   $Id$
8*/
9
10#include <nc_tests.h>
11#include "err_macros.h"
12#include <stdlib.h>
13#include <stdio.h>
14#include <netcdf.h>
15
16#define FILE_NAME "tst_fills2.nc"
17
18int
19main(int argc, char **argv)
20{ /* create tst_classic_fills.nc */
21   printf("\n*** Testing fill values.\n");
22   printf("*** testing read of string record var with no data...");
23   {
24#define STRING_VAR_NAME "blood_toil_tears_sweat"
25#define NDIMS_STRING 1
26#define DATA_START 1 /* Real data here. */
27
28      int  ncidvariddimidvarid_in;
29      const char *data_out[1] = {
30  "We have before us an ordeal of the most grievous kind. We have before "
31  "us many, many long months of struggle and of suffering. You ask, what "
32  "is our policy? I can say: It is to wage war, by sea, land and air, "
33  "with all our might and with all the strength that God can give us; to "
34  "wage war against a monstrous tyranny, never surpassed in the dark, "
35  "lamentable catalogue of human crime. That is our policy. You ask, what "
36  "is our aim? "
37  "I can answer in one word: It is victory, victory at all costs, victory "
38  "in spite of all terror, victory, however long and hard the road may "
39  "be; for without victory, there is no survival."};
40      char *data_in;
41      size_t index = DATA_START;
42
43      /* Create file with a 1D string var. Set its fill value to the
44       * empty string. */
45      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
46      if (nc_def_dim(ncid, "sentence", NC_UNLIMITED, &dimid)) ERR;
47      if (nc_def_var(ncidSTRING_VAR_NAMENC_STRINGNDIMS_STRING,
48      &dimid, &varid)) ERR;
49
50      /* Check it out. */
51      if (nc_inq_varid(ncidSTRING_VAR_NAME, &varid_in)) ERR;
52
53      /* Write one string, leaving some blank records which will then
54       * get the fill value. */
55      if (nc_put_var1_string(ncidvarid_in, &indexdata_out)) ERR;
56
57      /* Get all the data from the variable. */
58      if (nc_get_var1_string(ncidvarid_in, &index, &data_in)) ERR;
59      if (strcmp(data_indata_out[0])) ERR;
60      free(data_in);
61
62      if (nc_close(ncid)) ERR;
63
64      /* Now re-open file, read data, and check values again. */
65      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
66
67      data_in = NULL;
68      if (nc_get_var1_string(ncidvarid_in, &index, &data_in)) ERR;
69      if (strcmp(data_indata_out[0])) ERR;
70      free(data_in);
71
72      if (nc_close(ncid)) ERR;
73
74   }
75   SUMMARIZE_ERR;
76   printf("*** testing read of string record var w/fill-value with no data...");
77   {
78#undef STRING_VAR_NAME
79#define STRING_VAR_NAME "I_Have_A_Dream"
80#undef NDIMS_STRING
81#define NDIMS_STRING 1
82#define FILLVALUE_LEN 1 /* There is 1 string, the empty one. */
83#undef DATA_START
84#define DATA_START 2 /* Real data here. */
85
86      int  ncidvariddimidvarid_in;
87      const char *missing_val[FILLVALUE_LEN] = {""};
88      const char *missing_val_in[FILLVALUE_LEN];
89      const char *data_out[1] = {
90  "With this faith, we will be able to hew out of the mountain of "
91  "despair a stone of hope. With this faith, we will be able to "
92  "transform the jangling discords of our nation into a beautiful "
93  "symphony of brotherhood. With this faith, we will be able to work "
94  "together, to pray together, to struggle together, to go to jail "
95  "together, to stand up for freedom together, knowing that we will "
96  "be free one day."};
97      char *data_in;
98      size_t index = DATA_START;
99
100      /* Create file with a 1D string var. Set its fill value to the
101       * empty string. */
102      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
103      if (nc_def_dim(ncid, "sentence", NC_UNLIMITED, &dimid)) ERR;
104      if (nc_def_var(ncidSTRING_VAR_NAMENC_STRINGNDIMS_STRING,
105      &dimid, &varid)) ERR;
106      if (nc_put_att_string(ncidvarid, "_FillValue", FILLVALUE_LEN,
107 missing_val)) ERR;
108
109      /* Check it out. */
110      if (nc_inq_varid(ncidSTRING_VAR_NAME, &varid_in)) ERR;
111      if (nc_get_att_string(ncidvarid_in, "_FillValue",
112           (char **)missing_val_in)) ERR;
113      if (strcmp(missing_val[0], missing_val_in[0])) ERR;
114      if (nc_free_string(FILLVALUE_LEN, (char **)missing_val_in)) ERR;
115
116      /* Write one string, leaving some blank records which will then
117       * get the fill value. */
118      if (nc_put_var1_string(ncidvarid_in, &indexdata_out)) ERR;
119
120      /* Get all the data from the variable. */
121      index = 0;
122      data_in = NULL;
123      if (nc_get_var1_string(ncidvarid_in, &index, &data_in)) ERR;
124      if (strcmp(data_inmissing_val[0])) ERR;
125      free(data_in);
126      index = 1;
127      data_in = NULL;
128      if (nc_get_var1_string(ncidvarid_in, &index, &data_in)) ERR;
129      if (strcmp(data_inmissing_val[0])) ERR;
130      free(data_in);
131      index = DATA_START;
132      data_in = NULL;
133      if (nc_get_var1_string(ncidvarid_in, &index, &data_in)) ERR;
134      if (strcmp(data_indata_out[0])) ERR;
135      free(data_in);
136
137      if (nc_close(ncid)) ERR;
138
139      /* Now re-open file, read data, and check values again. */
140      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
141      if (nc_inq_varid(ncidSTRING_VAR_NAME, &varid_in)) ERR;
142      if (nc_get_att_string(ncidvarid_in, "_FillValue",
143           (char **)missing_val_in)) ERR;
144      if (strcmp(missing_val[0], missing_val_in[0])) ERR;
145      if (nc_free_string(FILLVALUE_LEN, (char **)missing_val_in)) ERR;
146
147      /* Get all the data from the variable. */
148/* As of HDF5-1.8.12, reading from an unwritten chunk in a dataset with a
149 *      variable-length datatype and a fill-value set will error, instead
150 *      of retrieving the fill-value. -QAK
151 */
152#ifdef NOT_YET
153      index = 0;
154      data_in = NULL;
155      if (nc_get_var1_string(ncidvarid_in, &index, &data_in)) ERR;
156      if (strcmp(data_inmissing_val[0])) ERR;
157      free(data_in);
158      index = 1;
159      data_in = NULL;
160      if (nc_get_var1_string(ncidvarid_in, &index, &data_in)) ERR;
161      if (strcmp(data_inmissing_val[0])) ERR;
162      free(data_in);
163#endif /* NOT_YET */
164      index = DATA_START;
165      data_in = NULL;
166      if (nc_get_var1_string(ncidvarid_in, &index, &data_in)) ERR;
167      if (strcmp(data_indata_out[0])) ERR;
168      free(data_in);
169
170      if (nc_close(ncid)) ERR;
171
172   }
173   SUMMARIZE_ERR;
174
175   printf("*** testing NULL fill values of a string var...");
176   {
177#undef STRING_VAR_NAME
178#define STRING_VAR_NAME "The_String"
179#define NDIMS_STRING 1
180#define FILLVALUE_LEN 1 /* There is 1 string, the empty one. */
181#define DATA_START 2 /* Real data here. */
182
183      int  ncidvariddimidvarid_in;
184      const char *missing_val[FILLVALUE_LEN] = {NULL};
185      const char *missing_val_in[FILLVALUE_LEN];
186      const char *data_out[1] = {"The evil that men do lives after them; "
187  "the good is oft interred with their bones."};
188      char **data_in;
189      size_t index = DATA_START;
190      int i;
191
192      /* Create file with a 1D string var. Set its fill value to the
193       * empty string. */
194      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
195      if (nc_def_dim(ncid, "rec", NC_UNLIMITED, &dimid)) ERR;
196      if (nc_def_var(ncidSTRING_VAR_NAMENC_STRINGNDIMS_STRING, &dimid, &varid)) ERR;
197      if (nc_put_att_string(ncidvarid, "_FillValue", FILLVALUE_LENmissing_val)) ERR;
198
199      /* Check it out. */
200      if (nc_inq_varid(ncidSTRING_VAR_NAME, &varid_in)) ERR;
201      if (nc_get_att_string(ncidvarid_in, "_FillValue", (char **)missing_val_in)) ERR;
202      if (missing_val[0] !=  missing_val_in[0]) ERR;
203
204      /* Write one string, leaving some blank records which will then
205       * get the fill value. */
206      if (nc_put_var1_string(ncidvarid_in, &indexdata_out)) ERR;
207
208      /* Get all the data from the variable. */
209      if (!(data_in = malloc((DATA_START + 1) * sizeof(char *)))) ERR;
210      if (nc_get_var_string(ncidvarid_indata_in)) ERR;
211
212      /* First there should be fill values, then the data value we
213       * wrote. */
214      for (i = 0; i < DATA_STARTi++)
215  if (NULL != data_in[i]) ERR;
216      if (strcmp(data_in[DATA_START], data_out[0])) ERR;
217      if (nc_free_string(DATA_START + 1, data_in)) ERR;
218
219      /* Close everything up */
220      if (nc_close(ncid)) ERR;
221
222      /* Now re-open file, read data, and check values again. */
223      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
224      if (nc_inq_varid(ncidSTRING_VAR_NAME, &varid_in)) ERR;
225      if (nc_get_att_string(ncidvarid_in, "_FillValue", (char **)missing_val_in)) ERR;
226      if (NULL != missing_val_in[0]) ERR;
227      if (nc_free_string(FILLVALUE_LEN, (char **)missing_val_in)) ERR;
228
229      /* Get all the data from the variable. */
230      if (nc_get_var_string(ncidvarid_indata_in)) ERR;
231
232      /* First there should be fill values, then the data value we
233       * wrote. */
234      for (i = 0; i < DATA_STARTi++)
235  if (NULL != data_in[i]) ERR;
236      if (strcmp(data_in[DATA_START], data_out[0])) ERR;
237      if (nc_free_string(DATA_START + 1, data_in)) ERR;
238
239      /* Close everything up */
240      if (nc_close(ncid)) ERR;
241      free(data_in);
242   }
243   SUMMARIZE_ERR;
244
245   printf("*** testing non-empty fill values of a string var...");
246   {
247#define STRING_VAR_NAME2 "CASSIUS"
248#define FILLVALUE_LEN2 1 /* There is 1 string in the fillvalue array. */
249#define DATA_START2 9 /* Real data starts here. */
250
251      int  ncidvariddimidvarid_in;
252      const char *missing_val[FILLVALUE_LEN2] = {"I know that virtue to be in you, Brutus"};
253      const char *missing_val_in[FILLVALUE_LEN2];
254      const char *data_out[1] = {"The evil that men do lives after them; "
255  "the good is oft interred with their bones."};
256      char **data_in;
257      size_t index = DATA_START2;
258      int i;
259
260      /* Create file with a 1D string var. Set its fill value to the
261       * a non-empty string. */
262      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
263      if (nc_def_dim(ncid, "rec", NC_UNLIMITED, &dimid)) ERR;
264      if (nc_def_var(ncidSTRING_VAR_NAME2NC_STRINGNDIMS_STRING, &dimid, &varid)) ERR;
265      if (nc_put_att_string(ncidvarid, "_FillValue", FILLVALUE_LEN2missing_val)) ERR;
266
267      /* Check it out. */
268      if (nc_inq_varid(ncidSTRING_VAR_NAME2, &varid_in)) ERR;
269      if (nc_get_att_string(ncidvarid_in, "_FillValue", (char **)missing_val_in)) ERR;
270      if (strcmp(missing_val[0], missing_val_in[0])) ERR;
271      if (nc_free_string(FILLVALUE_LEN2, (char **)missing_val_in)) ERR;
272
273      /* Write one string, leaving some blank records which will then
274       * get the fill value. */
275      if (nc_put_var1_string(ncidvarid_in, &indexdata_out)) ERR;
276
277      /* Get all the data from the variable. */
278      if (!(data_in = malloc((DATA_START2 + 1) * sizeof(char *)))) ERR;
279      if (nc_get_var_string(ncidvarid_indata_in)) ERR;
280
281      /* First there should be fill values, then the data value we
282       * wrote. */
283      for (i = 0; i < DATA_START2i++)
284  if (strcmp(data_in[i], missing_val[0])) ERR;
285      if (strcmp(data_in[DATA_START2], data_out[0])) ERR;
286      if (nc_free_string(DATA_START + 1, data_in)) ERR;
287
288      /* Close everything up. */
289      if (nc_close(ncid)) ERR;
290
291      /* Now re-open file, read data, and check values again. */
292      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
293      if (nc_inq_varid(ncidSTRING_VAR_NAME2, &varid_in)) ERR;
294      if (nc_get_att_string(ncidvarid_in, "_FillValue", (char **)missing_val_in)) ERR;
295      if (strcmp(missing_val[0], missing_val_in[0])) ERR;
296      if (nc_free_string(FILLVALUE_LEN2, (char **)missing_val_in)) ERR;
297
298/* As of HDF5-1.8.12, reading from an unwritten chunk in a dataset with a
299 *      variable-length datatype and a fill-value set will error, instead
300 *      of retrieving the fill-value. -QAK
301 */
302#ifdef NOT_YET
303      /* Get all the data from the variable. */
304      if (nc_get_var_string(ncidvarid_indata_in)) ERR;
305
306      /* First there should be fill values, then the data value we
307       * wrote. */
308      for (i = 0; i < DATA_START2i++)
309  if (strcmp(data_in[i], missing_val[0])) ERR;
310      if (strcmp(data_in[DATA_START2], data_out[0])) ERR;
311      if (nc_free_string(DATA_START + 1, data_in)) ERR;
312#endif /* NOT_YET */
313
314      /* Close everything up. */
315      if (nc_close(ncid)) ERR;
316      free(data_in);
317   }
318   SUMMARIZE_ERR;
319
320   printf("*** testing read of string record var with no data...");
321   {
322#undef STRING_VAR_NAME
323#define STRING_VAR_NAME "Moon_Is_A_Harsh_Mistress"
324#define NDIMS_STRING 1
325#define FILLVALUE_LEN 1 /* There is 1 string, the empty one. */
326#define DATA_START 2 /* Real data here. */
327
328      int  ncidvariddimidvarid_in;
329      const char *missing_val[FILLVALUE_LEN] = {""};
330      char *missing_val_in;
331
332      /* Create file with a 1D string var. Set its fill value to the
333       * empty string. */
334      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
335      if (nc_def_dim(ncid, "Lunar_Years", NC_UNLIMITED, &dimid)) ERR;
336      if (nc_def_var(ncidSTRING_VAR_NAMENC_STRINGNDIMS_STRING,
337      &dimid, &varid)) ERR;
338      if (nc_put_att_string(ncidvarid, "_FillValue", FILLVALUE_LEN,
339     missing_val)) ERR;
340
341      /* Check it out. */
342      if (nc_inq_varid(ncidSTRING_VAR_NAME, &varid_in)) ERR;
343      if (nc_get_att_string(ncidvarid_in, "_FillValue", &missing_val_in)) ERR;
344      if (strcmp(missing_val[0], missing_val_in)) ERR;
345      if (nc_free_string(FILLVALUE_LEN, &missing_val_in)) ERR;
346
347      /* Get all the data from the variable. There is none! */
348      if (nc_get_var_string(ncidvarid_inNULL)) ERR;
349
350      /* Close file. */
351      if (nc_close(ncid)) ERR;
352
353      /* Now re-open file, and check again. */
354      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
355      if (nc_inq_varid(ncidSTRING_VAR_NAME, &varid_in)) ERR;
356      if (nc_get_att_string(ncidvarid_in, "_FillValue", &missing_val_in)) ERR;
357      if (strcmp(missing_val[0], missing_val_in)) ERR;
358      if (nc_free_string(FILLVALUE_LEN, &missing_val_in)) ERR;
359
360      /* Get all the data from the variable. There is none! */
361      if (nc_get_var_string(ncidvarid_inNULL)) ERR;
362
363      /* Close file. */
364      if (nc_close(ncid)) ERR;
365   }
366   SUMMARIZE_ERR;
367
368   printf("*** Testing fix for netCDF-4 fill-value bug...");
369   {
370      int  ncidvariddimids[1];
371      double fillval = -9999;
372
373      /* Test case for NCF-187 bug, thanks to Alexander Barth for fix */
374      if (nc_create(FILE_NAMENC_NETCDF4 | NC_CLASSIC_MODEL, &ncid)) ERR;
375      if (nc_def_dim(ncid, "x", 182, &dimids[0])) ERR;
376      if (nc_def_var(ncid, "u_obs", NC_FLOAT, 1, dimids, &varid)) ERR;
377      if (nc_put_att_double (ncidvarid, "_FillValue", NC_FLOAT, 1, &fillval)) ERR;
378      if (nc_close(ncid)) ERR;
379      SUMMARIZE_ERR;
380   }
381
382   FINAL_RESULTS;
383}


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