// This file is part of OpenTSDB. // Copyright (C) 2015 The OpenTSDB Authors. // // This program is free software: you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 2.1 of the License, or (at your // option) any later version. This program is distributed in the hope that it // will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser // General Public License for more details. You should have received a copy // of the GNU Lesser General Public License along with this program. If not, // see <http://www.gnu.org/licenses/>. package net.opentsdb.query.expression; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import net.opentsdb.core.FillPolicy; import net.opentsdb.utils.JSON; import org.junit.Test; public class TestNumericFillPolicy { @Test public void builder() throws Exception { NumericFillPolicy nfp = NumericFillPolicy.Builder() .setPolicy(FillPolicy.NOT_A_NUMBER).build(); assertEquals(FillPolicy.NOT_A_NUMBER, nfp.getPolicy()); assertTrue(Double.isNaN((Double)nfp.getValue())); nfp = NumericFillPolicy.Builder() .setPolicy(null).build(); assertEquals(FillPolicy.ZERO, nfp.getPolicy()); assertEquals(0, nfp.getValue(), 0.0001); } @Test public void policyCtor() throws Exception { NumericFillPolicy nfp = new NumericFillPolicy(FillPolicy.NONE); assertTrue(Double.isNaN((Double)nfp.getValue())); assertEquals(FillPolicy.NONE, nfp.getPolicy()); nfp = new NumericFillPolicy(FillPolicy.NOT_A_NUMBER); assertTrue(Double.isNaN((Double)nfp.getValue())); assertEquals(FillPolicy.NOT_A_NUMBER, nfp.getPolicy()); nfp = new NumericFillPolicy(FillPolicy.NULL); assertTrue(Double.isNaN((Double)nfp.getValue())); assertEquals(FillPolicy.NULL, nfp.getPolicy()); nfp = new NumericFillPolicy(FillPolicy.ZERO); assertEquals(0, nfp.getValue(), 0.0001); assertEquals(FillPolicy.ZERO, nfp.getPolicy()); nfp = new NumericFillPolicy(null); assertEquals(0, nfp.getValue(), 0.0001); assertEquals(FillPolicy.ZERO, nfp.getPolicy()); nfp = new NumericFillPolicy(FillPolicy.SCALAR); assertEquals(0, nfp.getValue(), 0.0001); assertEquals(FillPolicy.SCALAR, nfp.getPolicy()); } @Test public void policyAndValueCtor() throws Exception { NumericFillPolicy nfp = new NumericFillPolicy(FillPolicy.NONE, Double.NaN); assertTrue(Double.isNaN((Double)nfp.getValue())); assertEquals(FillPolicy.NONE, nfp.getPolicy()); nfp = new NumericFillPolicy(FillPolicy.NOT_A_NUMBER, Double.NaN); assertTrue(Double.isNaN((Double)nfp.getValue())); assertEquals(FillPolicy.NOT_A_NUMBER, nfp.getPolicy()); nfp = new NumericFillPolicy(FillPolicy.NULL, 0); assertTrue(Double.isNaN((Double)nfp.getValue())); assertEquals(FillPolicy.NULL, nfp.getPolicy()); nfp = new NumericFillPolicy(FillPolicy.ZERO, 0); assertEquals(0, nfp.getValue(), 0.0001); assertEquals(FillPolicy.ZERO, nfp.getPolicy()); nfp = new NumericFillPolicy(null, 0); assertEquals(0, nfp.getValue(), 0.0001); assertEquals(FillPolicy.ZERO, nfp.getPolicy()); nfp = new NumericFillPolicy(FillPolicy.SCALAR, 42); assertEquals(42, nfp.getValue(), 0.0001); assertEquals(FillPolicy.SCALAR, nfp.getPolicy()); nfp = new NumericFillPolicy(FillPolicy.SCALAR, 0); assertEquals(0, nfp.getValue(), 0.0001); assertEquals(FillPolicy.SCALAR, nfp.getPolicy()); nfp = new NumericFillPolicy(FillPolicy.SCALAR, Double.NaN); assertTrue(Double.isNaN((Double)nfp.getValue())); assertEquals(FillPolicy.SCALAR, nfp.getPolicy()); nfp = new NumericFillPolicy(FillPolicy.SCALAR, 42.5); assertEquals(42.5, (Double)nfp.getValue(), 0.0001); assertEquals(FillPolicy.SCALAR, nfp.getPolicy()); // defaults from value nfp = new NumericFillPolicy(null, Double.NaN); assertTrue(Double.isNaN((Double)nfp.getValue())); assertEquals(FillPolicy.NOT_A_NUMBER, nfp.getPolicy()); nfp = new NumericFillPolicy(null, 42); assertEquals(42, nfp.getValue(), 0.0001); assertEquals(FillPolicy.SCALAR, nfp.getPolicy()); nfp = new NumericFillPolicy(null, 42.5); assertEquals(42.5, (Double)nfp.getValue(), 0.0001); assertEquals(FillPolicy.SCALAR, nfp.getPolicy()); nfp = new NumericFillPolicy(null, -42.5); assertEquals(-42.5, (Double)nfp.getValue(), 0.0001); assertEquals(FillPolicy.SCALAR, nfp.getPolicy()); nfp = new NumericFillPolicy(null, Double.NaN); assertTrue(Double.isNaN((Double)nfp.getValue())); assertEquals(FillPolicy.NOT_A_NUMBER, nfp.getPolicy()); nfp = new NumericFillPolicy(null, 0); assertEquals(0, nfp.getValue(), 0.0001); assertEquals(FillPolicy.ZERO, nfp.getPolicy()); nfp = new NumericFillPolicy(null, 0.0); assertEquals(0.0, (Double)nfp.getValue(), 0.0001); assertEquals(FillPolicy.ZERO, nfp.getPolicy()); nfp = new NumericFillPolicy(null, -0.0); assertEquals(-0.0, (Double)nfp.getValue(), 0.0001); assertEquals(FillPolicy.ZERO, nfp.getPolicy()); nfp = new NumericFillPolicy(null, -0); assertEquals(-0, nfp.getValue(), 0.0001); assertEquals(FillPolicy.ZERO, nfp.getPolicy()); nfp = new NumericFillPolicy(FillPolicy.NOT_A_NUMBER, 0); assertTrue(Double.isNaN((Double)nfp.getValue())); assertEquals(FillPolicy.NOT_A_NUMBER, nfp.getPolicy()); nfp = new NumericFillPolicy(FillPolicy.NULL, Double.NaN); assertTrue(Double.isNaN((Double)nfp.getValue())); assertEquals(FillPolicy.NULL, nfp.getPolicy()); // inappropriate combos try { nfp = new NumericFillPolicy(FillPolicy.ZERO, 42); fail("expected an IllegalArgumentException"); } catch (IllegalArgumentException iae) { } try { nfp = new NumericFillPolicy(FillPolicy.NONE, 42); fail("expected an IllegalArgumentException"); } catch (IllegalArgumentException iae) { } try { nfp = new NumericFillPolicy(FillPolicy.NULL, 42); fail("expected an IllegalArgumentException"); } catch (IllegalArgumentException iae) { } try { nfp = new NumericFillPolicy(FillPolicy.NOT_A_NUMBER, 42); fail("expected an IllegalArgumentException"); } catch (IllegalArgumentException iae) { } } @Test public void serdes() throws Exception { NumericFillPolicy ser_nfp = new NumericFillPolicy(FillPolicy.NONE); String json = JSON.serializeToString(ser_nfp); assertTrue(json.contains("\"policy\":\"none\"")); assertTrue(json.contains("\"value\":\"NaN\"")); NumericFillPolicy des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertTrue(des_nfp != ser_nfp); assertTrue(des_nfp.equals(ser_nfp)); ser_nfp = new NumericFillPolicy(FillPolicy.ZERO); json = JSON.serializeToString(ser_nfp); assertTrue(json.contains("\"policy\":\"zero\"")); assertTrue(json.contains("\"value\":0")); des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertTrue(des_nfp != ser_nfp); assertTrue(des_nfp.equals(ser_nfp)); ser_nfp = new NumericFillPolicy(FillPolicy.NOT_A_NUMBER); json = JSON.serializeToString(ser_nfp); assertTrue(json.contains("\"policy\":\"nan\"")); assertTrue(json.contains("\"value\":\"NaN\"")); des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertTrue(des_nfp != ser_nfp); assertTrue(des_nfp.equals(ser_nfp)); ser_nfp = new NumericFillPolicy(FillPolicy.NULL); json = JSON.serializeToString(ser_nfp); assertTrue(json.contains("\"policy\":\"null\"")); assertTrue(json.contains("\"value\":\"NaN\"")); des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertTrue(des_nfp != ser_nfp); assertTrue(des_nfp.equals(ser_nfp)); ser_nfp = new NumericFillPolicy(FillPolicy.SCALAR, 42); json = JSON.serializeToString(ser_nfp); assertTrue(json.contains("\"policy\":\"scalar\"")); assertTrue(json.contains("\"value\":42")); des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertTrue(des_nfp != ser_nfp); assertTrue(des_nfp.equals(ser_nfp)); ser_nfp = new NumericFillPolicy(FillPolicy.SCALAR, 42.5); json = JSON.serializeToString(ser_nfp); assertTrue(json.contains("\"policy\":\"scalar\"")); assertTrue(json.contains("\"value\":42.5")); des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertTrue(des_nfp != ser_nfp); assertTrue(des_nfp.equals(ser_nfp)); ser_nfp = new NumericFillPolicy(FillPolicy.SCALAR, -42.5); json = JSON.serializeToString(ser_nfp); assertTrue(json.contains("\"policy\":\"scalar\"")); assertTrue(json.contains("\"value\":-42.5")); des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertTrue(des_nfp != ser_nfp); assertTrue(des_nfp.equals(ser_nfp)); json = "{\"policy\":\"zero\"}"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertEquals(FillPolicy.ZERO, des_nfp.getPolicy()); assertEquals(0, des_nfp.getValue(), 0.0001); json = "{\"policy\":\"nan\"}"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertEquals(FillPolicy.NOT_A_NUMBER, des_nfp.getPolicy()); assertTrue(Double.isNaN((Double)des_nfp.getValue())); json = "{\"policy\":\"scalar\"}"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertEquals(FillPolicy.SCALAR, des_nfp.getPolicy()); assertEquals(0, des_nfp.getValue(), 0.0001); json = "{\"policy\":\"none\"}"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertEquals(FillPolicy.NONE, des_nfp.getPolicy()); assertTrue(Double.isNaN((Double)des_nfp.getValue())); json = "{\"policy\":\"null\"}"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertEquals(FillPolicy.NULL, des_nfp.getPolicy()); assertTrue(Double.isNaN((Double)des_nfp.getValue())); json = "{\"policy\":\"scalar\",\"value\":42}"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertEquals(FillPolicy.SCALAR, des_nfp.getPolicy()); assertEquals(42, des_nfp.getValue(), 0.0001); json = "{\"policy\":\"scalar\",\"value\":\"42\"}"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertEquals(FillPolicy.SCALAR, des_nfp.getPolicy()); assertEquals(42, des_nfp.getValue(), 0.0001); json = "{\"policy\":\"scalar\",\"value\":42.5}"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertEquals(FillPolicy.SCALAR, des_nfp.getPolicy()); assertEquals(42.5, (Double)des_nfp.getValue(), 0.0001); json = "{\"policy\":\"nan\",\"value\":NaN}"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertEquals(FillPolicy.NOT_A_NUMBER, des_nfp.getPolicy()); assertTrue(Double.isNaN((Double)des_nfp.getValue())); json = "{\"policy\":\"scalar\",\"value\":0}"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertEquals(FillPolicy.SCALAR, des_nfp.getPolicy()); assertEquals(0, des_nfp.getValue(), 0.0001); json = "{\"policy\":\"scalar\",\"value\":0.0}"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); assertEquals(FillPolicy.SCALAR, des_nfp.getPolicy()); assertEquals(0.0, (Double)des_nfp.getValue(), 0.0001); try { json = "{\"policy\":\"unknown\"}"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); fail("Expected a IllegalArgumentException"); } catch (IllegalArgumentException e) { } try { json = "{\"policy\":\"scalar\",value\":\"foo\"}"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); fail("Expected a IllegalArgumentException"); } catch (IllegalArgumentException e) { } try { json = "{\"policy\":\"badjson"; des_nfp = JSON.parseToObject(json, NumericFillPolicy.class); fail("Expected a IllegalArgumentException"); } catch (IllegalArgumentException e) { } } }