diff --git a/docs/concepts/parsing_evaluation.md b/docs/concepts/parsing_evaluation.md index f930da11..07cc62b1 100644 --- a/docs/concepts/parsing_evaluation.md +++ b/docs/concepts/parsing_evaluation.md @@ -99,7 +99,7 @@ passing it to the _withValues()_ method: ```java Expression expression = new Expression("(a + b) * (a - b)"); -Map values = new HashMap<>(); +Map values = new HashMap<>(); values.put("a", 3.5); values.put("b", 2.5); @@ -111,6 +111,20 @@ System.out.println(result.getNumberValue()); // prints 6.00 The data conversion of the passed values will automatically be performed through the created _EvaluationObject_. +The map can also hold data of different types: +```java +Expression expression = new Expression("a+b+c"); + +Map values = new HashMap<>(); +values.put("a", true); +values.put("b", " "); +values.put("c", 24.7); + +EvaluationValue result = expression.withValues(values).evaluate(); + +System.out.println(result.getStringValue()); // prints "true 24.7" +``` + See chapter [Data Types](datatypes.html) for details on the conversion. Another option to have EvalEx use your data is to define a custom data accessor. diff --git a/src/main/java/com/ezylang/evalex/Expression.java b/src/main/java/com/ezylang/evalex/Expression.java index 90ccf2bb..aa9143f1 100644 --- a/src/main/java/com/ezylang/evalex/Expression.java +++ b/src/main/java/com/ezylang/evalex/Expression.java @@ -292,8 +292,8 @@ public Expression and(String variable, Object value) { * @param values A map with variable values. * @return The Expression instance, to allow chaining of methods. */ - public Expression withValues(Map values) { - for (Map.Entry entry : values.entrySet()) { + public Expression withValues(Map values) { + for (Map.Entry entry : values.entrySet()) { with(entry.getKey(), entry.getValue()); } return this; diff --git a/src/test/java/com/ezylang/evalex/ExpressionTest.java b/src/test/java/com/ezylang/evalex/ExpressionTest.java index ba9cf0b3..4f838a38 100644 --- a/src/test/java/com/ezylang/evalex/ExpressionTest.java +++ b/src/test/java/com/ezylang/evalex/ExpressionTest.java @@ -81,6 +81,47 @@ void testWithValues() throws ParseException, EvaluationException { assertThat(result.getStringValue()).isEqualTo("6"); } + @Test + void testWithValuesDoubleMap() throws ParseException, EvaluationException { + Expression expression = new Expression("a+b"); + + Map values = new HashMap<>(); + values.put("a", 3.9); + values.put("b", 3.1); + + EvaluationValue result = expression.withValues(values).evaluate(); + + assertThat(result.getStringValue()).isEqualTo("7"); + } + + @Test + void testWithValuesStringMap() throws ParseException, EvaluationException { + Expression expression = new Expression("a+b+c"); + + Map values = new HashMap<>(); + values.put("a", "Hello"); + values.put("b", " "); + values.put("c", "world"); + + EvaluationValue result = expression.withValues(values).evaluate(); + + assertThat(result.getStringValue()).isEqualTo("Hello world"); + } + + @Test + void testWithValuesMixedMap() throws ParseException, EvaluationException { + Expression expression = new Expression("a+b+c"); + + Map values = new HashMap<>(); + values.put("a", true); + values.put("b", " "); + values.put("c", 24.7); + + EvaluationValue result = expression.withValues(values).evaluate(); + + assertThat(result.getStringValue()).isEqualTo("true 24.7"); + } + @Test void testDefaultExpressionOwnsOwnConfigurationEntries() { Expression expression1 = new Expression("1+1");