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