1 // This file is part of OpenTSDB.
2 // Copyright (C) 2015  The OpenTSDB Authors.
3 //
4 // This program is free software: you can redistribute it and/or modify it
5 // under the terms of the GNU Lesser General Public License as published by
6 // the Free Software Foundation, either version 2.1 of the License, or (at your
7 // option) any later version.  This program is distributed in the hope that it
8 // will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
9 // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
10 // General Public License for more details.  You should have received a copy
11 // of the GNU Lesser General Public License along with this program.  If not,
12 // see <http://www.gnu.org/licenses/>.
13 package net.opentsdb.query.expression;
14 
15 import static org.junit.Assert.assertEquals;
16 import static org.junit.Assert.assertTrue;
17 import static org.junit.Assert.fail;
18 import net.opentsdb.core.FillPolicy;
19 import net.opentsdb.utils.JSON;
20 
21 import org.junit.Test;
22 
23 public class TestNumericFillPolicy {
24 
25   @Test
builder()26   public void builder() throws Exception {
27     NumericFillPolicy nfp = NumericFillPolicy.Builder()
28         .setPolicy(FillPolicy.NOT_A_NUMBER).build();
29     assertEquals(FillPolicy.NOT_A_NUMBER, nfp.getPolicy());
30     assertTrue(Double.isNaN((Double)nfp.getValue()));
31 
32     nfp = NumericFillPolicy.Builder()
33         .setPolicy(null).build();
34     assertEquals(FillPolicy.ZERO, nfp.getPolicy());
35     assertEquals(0, nfp.getValue(), 0.0001);
36   }
37 
38   @Test
policyCtor()39   public void policyCtor() throws Exception {
40     NumericFillPolicy nfp = new NumericFillPolicy(FillPolicy.NONE);
41     assertTrue(Double.isNaN((Double)nfp.getValue()));
42     assertEquals(FillPolicy.NONE, nfp.getPolicy());
43 
44     nfp = new NumericFillPolicy(FillPolicy.NOT_A_NUMBER);
45     assertTrue(Double.isNaN((Double)nfp.getValue()));
46     assertEquals(FillPolicy.NOT_A_NUMBER, nfp.getPolicy());
47 
48     nfp = new NumericFillPolicy(FillPolicy.NULL);
49     assertTrue(Double.isNaN((Double)nfp.getValue()));
50     assertEquals(FillPolicy.NULL, nfp.getPolicy());
51 
52     nfp = new NumericFillPolicy(FillPolicy.ZERO);
53     assertEquals(0, nfp.getValue(), 0.0001);
54     assertEquals(FillPolicy.ZERO, nfp.getPolicy());
55 
56     nfp = new NumericFillPolicy(null);
57     assertEquals(0, nfp.getValue(), 0.0001);
58     assertEquals(FillPolicy.ZERO, nfp.getPolicy());
59 
60     nfp = new NumericFillPolicy(FillPolicy.SCALAR);
61     assertEquals(0, nfp.getValue(), 0.0001);
62     assertEquals(FillPolicy.SCALAR, nfp.getPolicy());
63 
64   }
65 
66   @Test
policyAndValueCtor()67   public void policyAndValueCtor() throws Exception {
68     NumericFillPolicy nfp = new NumericFillPolicy(FillPolicy.NONE, Double.NaN);
69     assertTrue(Double.isNaN((Double)nfp.getValue()));
70     assertEquals(FillPolicy.NONE, nfp.getPolicy());
71 
72     nfp = new NumericFillPolicy(FillPolicy.NOT_A_NUMBER, Double.NaN);
73     assertTrue(Double.isNaN((Double)nfp.getValue()));
74     assertEquals(FillPolicy.NOT_A_NUMBER, nfp.getPolicy());
75 
76     nfp = new NumericFillPolicy(FillPolicy.NULL, 0);
77     assertTrue(Double.isNaN((Double)nfp.getValue()));
78     assertEquals(FillPolicy.NULL, nfp.getPolicy());
79 
80     nfp = new NumericFillPolicy(FillPolicy.ZERO, 0);
81     assertEquals(0, nfp.getValue(), 0.0001);
82     assertEquals(FillPolicy.ZERO, nfp.getPolicy());
83 
84     nfp = new NumericFillPolicy(null, 0);
85     assertEquals(0, nfp.getValue(), 0.0001);
86     assertEquals(FillPolicy.ZERO, nfp.getPolicy());
87 
88     nfp = new NumericFillPolicy(FillPolicy.SCALAR, 42);
89     assertEquals(42, nfp.getValue(), 0.0001);
90     assertEquals(FillPolicy.SCALAR, nfp.getPolicy());
91 
92     nfp = new NumericFillPolicy(FillPolicy.SCALAR, 0);
93     assertEquals(0, nfp.getValue(), 0.0001);
94     assertEquals(FillPolicy.SCALAR, nfp.getPolicy());
95 
96     nfp = new NumericFillPolicy(FillPolicy.SCALAR, Double.NaN);
97     assertTrue(Double.isNaN((Double)nfp.getValue()));
98     assertEquals(FillPolicy.SCALAR, nfp.getPolicy());
99 
100     nfp = new NumericFillPolicy(FillPolicy.SCALAR, 42.5);
101     assertEquals(42.5, (Double)nfp.getValue(), 0.0001);
102     assertEquals(FillPolicy.SCALAR, nfp.getPolicy());
103 
104     // defaults from value
105     nfp = new NumericFillPolicy(null, Double.NaN);
106     assertTrue(Double.isNaN((Double)nfp.getValue()));
107     assertEquals(FillPolicy.NOT_A_NUMBER, nfp.getPolicy());
108 
109     nfp = new NumericFillPolicy(null, 42);
110     assertEquals(42, nfp.getValue(), 0.0001);
111     assertEquals(FillPolicy.SCALAR, nfp.getPolicy());
112 
113     nfp = new NumericFillPolicy(null, 42.5);
114     assertEquals(42.5, (Double)nfp.getValue(), 0.0001);
115     assertEquals(FillPolicy.SCALAR, nfp.getPolicy());
116 
117     nfp = new NumericFillPolicy(null, -42.5);
118     assertEquals(-42.5, (Double)nfp.getValue(), 0.0001);
119     assertEquals(FillPolicy.SCALAR, nfp.getPolicy());
120 
121     nfp = new NumericFillPolicy(null, Double.NaN);
122     assertTrue(Double.isNaN((Double)nfp.getValue()));
123     assertEquals(FillPolicy.NOT_A_NUMBER, nfp.getPolicy());
124 
125     nfp = new NumericFillPolicy(null, 0);
126     assertEquals(0, nfp.getValue(), 0.0001);
127     assertEquals(FillPolicy.ZERO, nfp.getPolicy());
128 
129     nfp = new NumericFillPolicy(null, 0.0);
130     assertEquals(0.0, (Double)nfp.getValue(), 0.0001);
131     assertEquals(FillPolicy.ZERO, nfp.getPolicy());
132 
133     nfp = new NumericFillPolicy(null, -0.0);
134     assertEquals(-0.0, (Double)nfp.getValue(), 0.0001);
135     assertEquals(FillPolicy.ZERO, nfp.getPolicy());
136 
137     nfp = new NumericFillPolicy(null, -0);
138     assertEquals(-0, nfp.getValue(), 0.0001);
139     assertEquals(FillPolicy.ZERO, nfp.getPolicy());
140 
141     nfp = new NumericFillPolicy(FillPolicy.NOT_A_NUMBER, 0);
142     assertTrue(Double.isNaN((Double)nfp.getValue()));
143     assertEquals(FillPolicy.NOT_A_NUMBER, nfp.getPolicy());
144 
145     nfp = new NumericFillPolicy(FillPolicy.NULL, Double.NaN);
146     assertTrue(Double.isNaN((Double)nfp.getValue()));
147     assertEquals(FillPolicy.NULL, nfp.getPolicy());
148 
149     // inappropriate combos
150     try {
151       nfp = new NumericFillPolicy(FillPolicy.ZERO, 42);
152       fail("expected an IllegalArgumentException");
153     } catch (IllegalArgumentException iae) { }
154 
155     try {
156       nfp = new NumericFillPolicy(FillPolicy.NONE, 42);
157       fail("expected an IllegalArgumentException");
158     } catch (IllegalArgumentException iae) { }
159 
160     try {
161       nfp = new NumericFillPolicy(FillPolicy.NULL, 42);
162       fail("expected an IllegalArgumentException");
163     } catch (IllegalArgumentException iae) { }
164 
165     try {
166       nfp = new NumericFillPolicy(FillPolicy.NOT_A_NUMBER, 42);
167       fail("expected an IllegalArgumentException");
168     } catch (IllegalArgumentException iae) { }
169 
170   }
171 
172   @Test
serdes()173   public void serdes() throws Exception {
174 
175     NumericFillPolicy ser_nfp = new NumericFillPolicy(FillPolicy.NONE);
176     String json = JSON.serializeToString(ser_nfp);
177     assertTrue(json.contains("\"policy\":\"none\""));
178     assertTrue(json.contains("\"value\":\"NaN\""));
179     NumericFillPolicy des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
180     assertTrue(des_nfp != ser_nfp);
181     assertTrue(des_nfp.equals(ser_nfp));
182 
183     ser_nfp = new NumericFillPolicy(FillPolicy.ZERO);
184     json = JSON.serializeToString(ser_nfp);
185     assertTrue(json.contains("\"policy\":\"zero\""));
186     assertTrue(json.contains("\"value\":0"));
187     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
188     assertTrue(des_nfp != ser_nfp);
189     assertTrue(des_nfp.equals(ser_nfp));
190 
191     ser_nfp = new NumericFillPolicy(FillPolicy.NOT_A_NUMBER);
192     json = JSON.serializeToString(ser_nfp);
193     assertTrue(json.contains("\"policy\":\"nan\""));
194     assertTrue(json.contains("\"value\":\"NaN\""));
195     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
196     assertTrue(des_nfp != ser_nfp);
197     assertTrue(des_nfp.equals(ser_nfp));
198 
199     ser_nfp = new NumericFillPolicy(FillPolicy.NULL);
200     json = JSON.serializeToString(ser_nfp);
201     assertTrue(json.contains("\"policy\":\"null\""));
202     assertTrue(json.contains("\"value\":\"NaN\""));
203     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
204     assertTrue(des_nfp != ser_nfp);
205     assertTrue(des_nfp.equals(ser_nfp));
206 
207     ser_nfp = new NumericFillPolicy(FillPolicy.SCALAR, 42);
208     json = JSON.serializeToString(ser_nfp);
209     assertTrue(json.contains("\"policy\":\"scalar\""));
210     assertTrue(json.contains("\"value\":42"));
211     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
212     assertTrue(des_nfp != ser_nfp);
213     assertTrue(des_nfp.equals(ser_nfp));
214 
215     ser_nfp = new NumericFillPolicy(FillPolicy.SCALAR, 42.5);
216     json = JSON.serializeToString(ser_nfp);
217     assertTrue(json.contains("\"policy\":\"scalar\""));
218     assertTrue(json.contains("\"value\":42.5"));
219     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
220     assertTrue(des_nfp != ser_nfp);
221     assertTrue(des_nfp.equals(ser_nfp));
222 
223     ser_nfp = new NumericFillPolicy(FillPolicy.SCALAR, -42.5);
224     json = JSON.serializeToString(ser_nfp);
225     assertTrue(json.contains("\"policy\":\"scalar\""));
226     assertTrue(json.contains("\"value\":-42.5"));
227     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
228     assertTrue(des_nfp != ser_nfp);
229     assertTrue(des_nfp.equals(ser_nfp));
230 
231     json = "{\"policy\":\"zero\"}";
232     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
233     assertEquals(FillPolicy.ZERO, des_nfp.getPolicy());
234     assertEquals(0, des_nfp.getValue(), 0.0001);
235 
236     json = "{\"policy\":\"nan\"}";
237     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
238     assertEquals(FillPolicy.NOT_A_NUMBER, des_nfp.getPolicy());
239     assertTrue(Double.isNaN((Double)des_nfp.getValue()));
240 
241     json = "{\"policy\":\"scalar\"}";
242     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
243     assertEquals(FillPolicy.SCALAR, des_nfp.getPolicy());
244     assertEquals(0, des_nfp.getValue(), 0.0001);
245 
246     json = "{\"policy\":\"none\"}";
247     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
248     assertEquals(FillPolicy.NONE, des_nfp.getPolicy());
249     assertTrue(Double.isNaN((Double)des_nfp.getValue()));
250 
251     json = "{\"policy\":\"null\"}";
252     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
253     assertEquals(FillPolicy.NULL, des_nfp.getPolicy());
254     assertTrue(Double.isNaN((Double)des_nfp.getValue()));
255 
256     json = "{\"policy\":\"scalar\",\"value\":42}";
257     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
258     assertEquals(FillPolicy.SCALAR, des_nfp.getPolicy());
259     assertEquals(42, des_nfp.getValue(), 0.0001);
260 
261     json = "{\"policy\":\"scalar\",\"value\":\"42\"}";
262     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
263     assertEquals(FillPolicy.SCALAR, des_nfp.getPolicy());
264     assertEquals(42, des_nfp.getValue(), 0.0001);
265 
266     json = "{\"policy\":\"scalar\",\"value\":42.5}";
267     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
268     assertEquals(FillPolicy.SCALAR, des_nfp.getPolicy());
269     assertEquals(42.5, (Double)des_nfp.getValue(), 0.0001);
270 
271     json = "{\"policy\":\"nan\",\"value\":NaN}";
272     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
273     assertEquals(FillPolicy.NOT_A_NUMBER, des_nfp.getPolicy());
274     assertTrue(Double.isNaN((Double)des_nfp.getValue()));
275 
276     json = "{\"policy\":\"scalar\",\"value\":0}";
277     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
278     assertEquals(FillPolicy.SCALAR, des_nfp.getPolicy());
279     assertEquals(0, des_nfp.getValue(), 0.0001);
280 
281     json = "{\"policy\":\"scalar\",\"value\":0.0}";
282     des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
283     assertEquals(FillPolicy.SCALAR, des_nfp.getPolicy());
284     assertEquals(0.0, (Double)des_nfp.getValue(), 0.0001);
285 
286     try {
287       json = "{\"policy\":\"unknown\"}";
288       des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
289       fail("Expected a IllegalArgumentException");
290     } catch (IllegalArgumentException e) { }
291 
292     try {
293       json = "{\"policy\":\"scalar\",value\":\"foo\"}";
294       des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
295       fail("Expected a IllegalArgumentException");
296     } catch (IllegalArgumentException e) { }
297 
298     try {
299       json = "{\"policy\":\"badjson";
300       des_nfp = JSON.parseToObject(json, NumericFillPolicy.class);
301       fail("Expected a IllegalArgumentException");
302     } catch (IllegalArgumentException e) { }
303   }
304 }
305