/** * 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 java.util.Arrays; import org.diirt.datasource.expression.SourceRateExpressionImpl; import org.diirt.datasource.expression.DesiredRateExpression; import org.diirt.datasource.expression.SourceRateExpression; import java.util.List; import org.junit.Test; import static org.junit.Assert.*; import static org.diirt.datasource.ExpressionLanguage.*; /** * * @author carcassi */ public class CustomFunctionTest { public CustomFunctionTest() { } @Test public void singleArgFunction() { // Sets up a pipeline where we put data in the cache, and apply // a function to it SourceRateExpression<Double> vDouble = new SourceRateExpressionImpl<>("test", Double.class); @SuppressWarnings("unchecked") DesiredRateExpression<Double> expression = resultOf(new OneArgFunction<Double, Double>() { @Override public Double calculate(Double arg) { return - arg; } }, latestValueOf(vDouble)); ReadExpressionTester tester = new ReadExpressionTester(expression); ReadFunction<Double> function = expression.getFunction(); // Test values tester.writeValue("test", 1.0); assertEquals((Object) (-1.0), function.readValue()); tester.writeValue("test", 123.0); assertEquals((Object) (-123.0), function.readValue()); tester.writeValue("test", 1.0); tester.writeValue("test", 2.0); tester.writeValue("test", 3.0); assertEquals((Object) (-3.0), function.readValue()); } @Test public void twoArgFunction() { // Sets up a pipeline where we put data in the cache, and apply // a function to it SourceRateExpression<String> value1 = new SourceRateExpressionImpl<>("test1", String.class); SourceRateExpression<Integer> value2 = new SourceRateExpressionImpl<>("test2", Integer.class); DesiredRateExpression<String> expression = resultOf(new TwoArgFunction<String, String, Integer>() { @Override public String calculate(String name, Integer number) { return name + "(" + number + ")"; } }, latestValueOf(value1), latestValueOf(value2)); ReadExpressionTester tester = new ReadExpressionTester(expression); ReadFunction<String> function = expression.getFunction(); // Test values tester.writeValue("test1", "test"); tester.writeValue("test2", 1); assertEquals("test(1)", function.readValue()); tester.writeValue("test2", 2); assertEquals("test(2)", function.readValue()); tester.writeValue("test1", "A"); tester.writeValue("test1", "B"); tester.writeValue("test1", "C"); assertEquals("C(2)", function.readValue()); } @Test public void nArgFunction() { // Sets up a pipeline where we put data in the cache, and apply // a function to it @SuppressWarnings("unchecked") DesiredRateExpression<Double> expression = resultOf(new OneArgFunction<Double, List<Integer>>() { @Override public Double calculate(List<Integer> numbers) { double average = 0; for (int value : numbers) { average += value; } return average / numbers.size(); } }, listOf(latestValueOf(channels(Arrays.asList("test1", "test2", "test3"), Integer.class, Integer.class)))); ReadExpressionTester tester = new ReadExpressionTester(expression); ReadFunction<Double> function = expression.getFunction(); // Test values tester.writeValue("test1", 0); tester.writeValue("test2", 1); tester.writeValue("test3", 2); assertEquals((Object) (1.0), function.readValue()); // Test values tester.writeValue("test3", 5); assertEquals((Object) (2.0), function.readValue()); } }