/** * Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT * All rights reserved. Use is subject to license terms. See LICENSE.TXT */ package org.diirt.datasource; import org.diirt.datasource.expression.SourceRateExpressionImpl; import org.diirt.datasource.expression.DesiredRateExpression; import org.diirt.datasource.expression.SourceRateExpression; import java.util.Arrays; import java.util.List; import org.junit.Test; import static org.junit.Assert.*; import static org.hamcrest.CoreMatchers.*; import static org.diirt.datasource.ExpressionLanguage.*; /** * * @author carcassi */ public class FilteringTest { public FilteringTest() { } @Test public void filter() { // Sets up a pipeline where we put data in the cache, and apply // a function to it ExpressionLanguage.Filter<Integer> monotonic = new Filter<Integer>(Integer.class) { @Override public boolean filter(Integer previousValue, Integer currentValue) { if (currentValue == null) return true; if (previousValue == null) return false; if (previousValue >= currentValue) return true; return false; } }; SourceRateExpression<Integer> vInteger = new SourceRateExpressionImpl<Integer>("test", Integer.class); @SuppressWarnings("unchecked") DesiredRateExpression<List<Integer>> expression = filterBy(monotonic, newValuesOf(vInteger)); ReadExpressionTester tester = new ReadExpressionTester(expression); ReadFunction<List<Integer>> function = expression.getFunction(); // Test values tester.writeValue("test", 1); List<Integer> values = function.readValue(); assertThat(values, equalTo(Arrays.asList(1))); tester.writeValue("test", 1); tester.writeValue("test", 2); tester.writeValue("test", 4); tester.writeValue("test", 3); values = function.readValue(); assertThat(values, equalTo(Arrays.asList(2, 4))); tester.writeValue("test", 5); tester.writeValue("test", 7); tester.writeValue("test", 3); values = function.readValue(); assertThat(values, equalTo(Arrays.asList(5, 7))); } @Test public void filterAcceptsDifferentTypes() { // Sets up a pipeline where we put data in the cache, and apply // a function to it ExpressionLanguage.Filter<Number> monotonic = new Filter<Number>(Number.class) { @Override public boolean filter(Number previousValue, Number currentValue) { if (currentValue == null) return true; if (previousValue == null) return false; if (previousValue.doubleValue() >= currentValue.doubleValue()) return true; return false; } }; SourceRateExpression<Number> vInteger = new SourceRateExpressionImpl<Number>("test", Number.class); @SuppressWarnings("unchecked") DesiredRateExpression<List<Number>> expression = filterBy(monotonic, newValuesOf(vInteger)); ReadExpressionTester tester = new ReadExpressionTester(expression); ReadFunction<List<Number>> function = expression.getFunction(); // Test values tester.writeValue("test", 1); List<Number> values = function.readValue(); assertThat(values, equalTo(Arrays.<Number>asList(1))); tester.writeValue("test", 1.0); tester.writeValue("test", 2); tester.writeValue("test", 4.0); tester.writeValue("test", 3); values = function.readValue(); assertThat(values, equalTo(Arrays.<Number>asList(2, 4.0))); tester.writeValue("test", 5.0); tester.writeValue("test", 7); tester.writeValue("test", 3.0); values = function.readValue(); assertThat(values, equalTo(Arrays.<Number>asList(5.0, 7))); } @Test public void filterAcceptsDifferentTypesAndIgnoresSome() { // Sets up a pipeline where we put data in the cache, and apply // a function to it ExpressionLanguage.Filter<Number> monotonic = new Filter<Number>(Number.class) { @Override public boolean filter(Number previousValue, Number currentValue) { if (currentValue == null) return true; if (previousValue == null) return false; if (previousValue.doubleValue() >= currentValue.doubleValue()) return true; return false; } }; SourceRateExpression<Object> vInteger = new SourceRateExpressionImpl<Object>("test", Object.class); @SuppressWarnings("unchecked") DesiredRateExpression<List<Object>> expression = filterBy(monotonic, newValuesOf(vInteger)); ReadExpressionTester tester = new ReadExpressionTester(expression); ReadFunction<List<Object>> function = expression.getFunction(); // Test values tester.writeValue("test", 1); List<Object> values = function.readValue(); assertThat(values, equalTo(Arrays.<Object>asList(1))); tester.writeValue("test", "1.0"); tester.writeValue("test", 2); tester.writeValue("test", 4.0); tester.writeValue("test", 3); values = function.readValue(); assertThat(values, equalTo(Arrays.<Object>asList("1.0", 2, 4.0))); tester.writeValue("test", 5.0); tester.writeValue("test", 7); tester.writeValue("test", "3.0"); values = function.readValue(); assertThat(values, equalTo(Arrays.<Object>asList(5.0, 7, "3.0"))); } @Test public void filterAcceptsDifferentTypesAndRejectsUnmatched() { // Sets up a pipeline where we put data in the cache, and apply // a function to it ExpressionLanguage.Filter<Number> monotonic = new Filter<Number>(Number.class, true) { @Override public boolean filter(Number previousValue, Number currentValue) { if (currentValue == null) return true; if (previousValue == null) return false; if (previousValue.doubleValue() >= currentValue.doubleValue()) return true; return false; } }; SourceRateExpression<Object> vInteger = new SourceRateExpressionImpl<Object>("test", Object.class); @SuppressWarnings("unchecked") DesiredRateExpression<List<Object>> expression = filterBy(monotonic, newValuesOf(vInteger)); ReadExpressionTester tester = new ReadExpressionTester(expression); ReadFunction<List<Object>> function = expression.getFunction(); // Test values tester.writeValue("test", 1); List<Object> values = function.readValue(); assertThat(values, equalTo(Arrays.<Object>asList(1))); tester.writeValue("test", "1.0"); tester.writeValue("test", 2); tester.writeValue("test", 4.0); tester.writeValue("test", 3); values = function.readValue(); assertThat(values, equalTo(Arrays.<Object>asList(2, 4.0))); tester.writeValue("test", 5.0); tester.writeValue("test", 7); tester.writeValue("test", "3.0"); values = function.readValue(); assertThat(values, equalTo(Arrays.<Object>asList(5.0, 7))); } }