1/* This is part of the netCDF package.
2   Copyright 2008 University Corporation for Atmospheric Research/Unidata
3   See COPYRIGHT file for conditions of use.
4
5   Test for a bug that Russ found testing fill values.
6
7   $Id: tst_fillbug.c,v 1.2 2008/10/03 16:03:24 ed Exp $
8*/
9
10#include <nc_tests.h>
11#include "err_macros.h"
12#include <stdio.h>
13#include <stdlib.h>
14#include <netcdf.h>
15
16#define FILENAME "tst_fillbug.nc"
17#define RANK_Time 1
18#define RANK_P 3
19#define LEN 4
20
21int
22main()
23{
24   int nciddimids[RANK_P], time_idp_id;
25   int ndimsdimids_in[RANK_P];
26
27   double data[1] = {3.14159};
28   size_t start[1] = {0}, count[1] = {1};
29   static float P_data[LEN];
30   size_t cor[RANK_P] = {0, 1, 0};
31   size_t edg[RANK_P] = {1, 1, LEN};
32   int i;
33
34   printf("\n*** Testing for a netCDF-4 fill-value bug.\n");
35   printf("*** Testing fill-values...");
36
37   /* Create a 3D test file. */
38   if (nc_create(FILENAMENC_CLOBBER|NC_NETCDF4, &ncid)) ERR;
39
40   /* define dimensions */
41   if (nc_def_dim(ncid, "Time", NC_UNLIMITED, &dimids[0])) ERR;
42   if (nc_def_dim(ncid, "X", 4, &dimids[2])) ERR;
43   if (nc_def_dim(ncid, "Y", 3, &dimids[1])) ERR;
44
45   /* define variables */
46   if (nc_def_var(ncid, "Time", NC_DOUBLE, 1, dimids, &time_id)) ERR;
47   if (nc_def_var(ncid, "P", NC_FLOATRANK_Pdimids, &p_id)) ERR;
48
49   /* Add one record in coordinate variable. */
50   if (nc_put_vara(ncidtime_idstartcountdata)) ERR;
51
52   /* The other variable should show an increase in size, since it
53    * uses the unlimited dimension. */
54   if (nc_inq_var(ncid, 1, NULLNULL, &ndimsdimids_inNULL)) ERR;
55   if (ndims != 3 || dimids_in[0] != 0 || dimids_in[1] != 2 || dimids_in[2] != 1) ERR;
56
57   /* Also test for fix of another bug, allowing invalid _FillValue
58    * attribute (not of same type as variable or with 0 values or more
59    * than 1 value) to be created. */
60    {
61 static const float p_FillValue_atts[] = {NC_FILL_FLOAT, -99} ;
62 int p_FillValue_att = -99 ;
63 /* This should returns error, too many attribute vals */
64 if (nc_put_att_float(ncidp_id, "_FillValue", NC_FLOAT, 2, p_FillValue_atts) != NC_EINVALERR;
65 /* This also should return error, wrong type */
66 if (nc_put_att_int(ncidp_id, "_FillValue", NC_INT, 1, &p_FillValue_att) != NC_EBADTYPEERR;
67 /* This should succeed, _FillValue is valid */
68 if (nc_put_att_float(ncidp_id, "_FillValue", NC_FLOAT, 1, p_FillValue_atts)) ERR;
69    }
70
71   /* Read the record of non-existent data. */
72   if (nc_get_vara(ncid, 1, coredgP_data)) ERR;
73   for (i = 0; i < LENi++)
74      if (P_data[i] != NC_FILL_FLOATERR;
75
76   /* That's it! */
77   if (nc_close(ncid)) ERR;
78
79   /* Reopen the file and read the second slice. */
80   if (nc_open(FILENAMENC_NOWRITE, &ncid)) ERR;
81
82   if (nc_inq_var(ncid, 1, NULLNULL, &ndimsdimids_inNULL)) ERR;
83   if (ndims != 3 || dimids_in[0] != 0 || dimids_in[1] != 2 || dimids_in[2] != 1) ERR;
84   if (nc_get_vara(ncid, 1, coredgP_data)) ERR;
85   for (i = 0; i < LENi++)
86      if (P_data[i] != NC_FILL_FLOATERR;
87
88   if (nc_close(ncid)) ERR;
89
90   SUMMARIZE_ERR;
91
92   FINAL_RESULTS;
93   return 0;
94}


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