From 1ff84671f89012a0e571df474dd40a418e725459 Mon Sep 17 00:00:00 2001 From: Sam Brannen <104798+sbrannen@users.noreply.github.com> Date: Sun, 28 Jan 2024 14:25:37 +0100 Subject: [PATCH] Remove obsolete InProgressTests Since SpEL is no longer "in progress", this commit removes the obsolete InProgressTests class and moves all non-duplicated test cases to other test classes. --- .../expression/spel/EvaluationTests.java | 13 ++ .../expression/spel/InProgressTests.java | 146 ------------------ .../expression/spel/ListTests.java | 30 +++- .../spel/SelectionAndProjectionTests.java | 70 ++++++++- 4 files changed, 109 insertions(+), 150 deletions(-) delete mode 100644 spring-expression/src/test/java/org/springframework/expression/spel/InProgressTests.java diff --git a/spring-expression/src/test/java/org/springframework/expression/spel/EvaluationTests.java b/spring-expression/src/test/java/org/springframework/expression/spel/EvaluationTests.java index 526c516dd3..293ec505aa 100644 --- a/spring-expression/src/test/java/org/springframework/expression/spel/EvaluationTests.java +++ b/spring-expression/src/test/java/org/springframework/expression/spel/EvaluationTests.java @@ -46,6 +46,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.assertj.core.api.Assertions.within; +import static org.springframework.expression.spel.SpelMessage.BETWEEN_RIGHT_OPERAND_MUST_BE_TWO_ELEMENT_LIST; /** * Tests the evaluation of real expressions in a real context. @@ -546,6 +547,18 @@ class EvaluationTests extends AbstractExpressionTests { evaluateAndCheckError("'X' matches '" + pattern + "'", Boolean.class, SpelMessage.MAX_REGEX_LENGTH_EXCEEDED); } + @Test + void betweenOperator() { + evaluate("1 between listOneFive", "true", Boolean.class); + evaluate("1 between {1, 5}", "true", Boolean.class); + } + + @Test + void betweenOperatorErrors() { + evaluateAndCheckError("1 between T(String)", BETWEEN_RIGHT_OPERAND_MUST_BE_TWO_ELEMENT_LIST, 10); + evaluateAndCheckError("1 between listOfNumbersUpToTen", BETWEEN_RIGHT_OPERAND_MUST_BE_TWO_ELEMENT_LIST, 10); + } + } @Nested diff --git a/spring-expression/src/test/java/org/springframework/expression/spel/InProgressTests.java b/spring-expression/src/test/java/org/springframework/expression/spel/InProgressTests.java deleted file mode 100644 index a3926d3ace..0000000000 --- a/spring-expression/src/test/java/org/springframework/expression/spel/InProgressTests.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright 2002-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.expression.spel; - -import java.util.ArrayList; -import java.util.HashMap; - -import org.junit.jupiter.api.Test; - -import org.springframework.expression.spel.standard.SpelExpression; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.expression.spel.SpelMessage.BETWEEN_RIGHT_OPERAND_MUST_BE_TWO_ELEMENT_LIST; -import static org.springframework.expression.spel.SpelMessage.PROJECTION_NOT_SUPPORTED_ON_TYPE; -import static org.springframework.expression.spel.SpelMessage.RESULT_OF_SELECTION_CRITERIA_IS_NOT_BOOLEAN; - -/** - * These are tests for language features that are not yet considered 'live': - * either missing implementation or documentation. - * - * @author Andy Clement - */ -class InProgressTests extends AbstractExpressionTests { - - // BETWEEN - - @Test - void betweenOperator() { - evaluate("1 between listOneFive", "true", Boolean.class); - evaluate("1 between {1, 5}", "true", Boolean.class); - } - - @Test - void betweenOperatorErrors() { - evaluateAndCheckError("1 between T(String)", BETWEEN_RIGHT_OPERAND_MUST_BE_TWO_ELEMENT_LIST, 10); - evaluateAndCheckError("1 between listOfNumbersUpToTen", BETWEEN_RIGHT_OPERAND_MUST_BE_TWO_ELEMENT_LIST, 10); - } - - // PROJECTION - - @Test - void projectionOnList() { - evaluate("listOfNumbersUpToTen.![#this<5?'y':'n']", "[y, y, y, y, n, n, n, n, n, n]", ArrayList.class); - } - - @Test - void projectionOnInlineList() { - evaluate("{1,2,3,4,5,6,7,8,9,10}.![#this<5?'y':'n']", "[y, y, y, y, n, n, n, n, n, n]", ArrayList.class); - } - - @Test - void projectionOnMap() { - evaluate("mapOfNumbersUpToTen.![key > 5 ? value : null]", - "[null, null, null, null, null, six, seven, eight, nine, ten]", ArrayList.class); - } - - @Test - void projectionOnUnsupportedType() { - evaluateAndCheckError("'abc'.![true]", PROJECTION_NOT_SUPPORTED_ON_TYPE); - evaluateAndCheckError("null.![true]", PROJECTION_NOT_SUPPORTED_ON_TYPE); - } - - @Test - void projectionOnNullWithSafeNavigation() { - evaluate("null?.![true]", null, null); - } - - // SELECTION - - @Test - void selectionWithNonBooleanSelectionCriteria() { - evaluateAndCheckError("listOfNumbersUpToTen.?['nonboolean']", RESULT_OF_SELECTION_CRITERIA_IS_NOT_BOOLEAN); - evaluateAndCheckError("mapOfNumbersUpToTen.?['hello'].size()", RESULT_OF_SELECTION_CRITERIA_IS_NOT_BOOLEAN); - } - - @Test - void selectionOnSet() { - evaluate("testMap.keySet().?[#this matches '.*o.*']", "[monday]", ArrayList.class); - evaluate("testMap.keySet().?[#this matches '.*r.*'].contains('saturday')", "true", Boolean.class); - evaluate("testMap.keySet().?[#this matches '.*r.*'].size()", "3", Integer.class); - } - - @Test - void selectionOnMap() { - evaluate("mapOfNumbersUpToTen.?[key>5].size()", "5", Integer.class); - evaluate("mapOfNumbersUpToTen.?[key>11].size()", "0", Integer.class); - evaluate("mapOfNumbersUpToTen.^[key>11]", null, null); - evaluate("mapOfNumbersUpToTen.$[key>11]", null, null); - evaluate("null?.$[key>11]", null, null); - evaluateAndCheckError("null.?[key>11]", SpelMessage.INVALID_TYPE_FOR_SELECTION); - evaluateAndCheckError("'abc'.?[key>11]", SpelMessage.INVALID_TYPE_FOR_SELECTION); - } - - @Test - void selectFirstOnList() { - evaluate("listOfNumbersUpToTen.^[#isEven(#this) == 'y']", "2", Integer.class); - } - - @Test - void selectFirstOnMap() { - evaluate("mapOfNumbersUpToTen.^[key>5].size()", "1", Integer.class); - } - - @Test - void selectLastOnList() { - evaluate("listOfNumbersUpToTen.$[#isEven(#this) == 'y']", "10", Integer.class); - } - - @Test - void selectLastOnMap() { - evaluate("mapOfNumbersUpToTen.$[key>5]", "{10=ten}", HashMap.class); - evaluate("mapOfNumbersUpToTen.$[key>5].size()", "1", Integer.class); - } - - @Test - void selectionAST() { - SpelExpression expr = (SpelExpression) parser.parseExpression("'abc'.^[true]"); - assertThat(expr.toStringAST()).isEqualTo("'abc'.^[true]"); - expr = (SpelExpression) parser.parseExpression("'abc'.?[true]"); - assertThat(expr.toStringAST()).isEqualTo("'abc'.?[true]"); - expr = (SpelExpression) parser.parseExpression("'abc'.$[true]"); - assertThat(expr.toStringAST()).isEqualTo("'abc'.$[true]"); - } - - // Constructor invocation - - @Test - void constructorInvocationMethodInvocationAndInlineList() { - evaluate("new java.util.HashSet().addAll({'a','b','c'})", "true", Boolean.class); - } - -} diff --git a/spring-expression/src/test/java/org/springframework/expression/spel/ListTests.java b/spring-expression/src/test/java/org/springframework/expression/spel/ListTests.java index 492a948df2..c9d23d8140 100644 --- a/spring-expression/src/test/java/org/springframework/expression/spel/ListTests.java +++ b/spring-expression/src/test/java/org/springframework/expression/spel/ListTests.java @@ -27,6 +27,7 @@ import org.springframework.expression.spel.standard.SpelExpressionParser; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.springframework.expression.spel.SpelMessage.RESULT_OF_SELECTION_CRITERIA_IS_NOT_BOOLEAN; /** * Test usage of inline lists. @@ -89,14 +90,39 @@ class ListTests extends AbstractExpressionTests { } @Test - void testInlineListAndProjectionSelection() { + void projectionOnList() { + evaluate("listOfNumbersUpToTen.![#this<5?'y':'n']", "[y, y, y, y, n, n, n, n, n, n]", ArrayList.class); + } + + @Test + void projectionOnInlineList() { evaluate("{1,2,3,4,5,6}.![#this>3]", "[false, false, false, true, true, true]", ArrayList.class); + evaluate("{1,2,3,4,5,6,7,8,9,10}.![#this<5?'y':'n']", "[y, y, y, y, n, n, n, n, n, n]", ArrayList.class); + } + + @Test + void selectionOnInlineList() { evaluate("{1,2,3,4,5,6}.?[#this>3]", "[4, 5, 6]", ArrayList.class); evaluate("{1,2,3,4,5,6,7,8,9,10}.?[#isEven(#this) == 'y']", "[2, 4, 6, 8, 10]", ArrayList.class); } @Test - void testSetConstruction01() { + void selectionOnListWithNonBooleanSelectionCriteria() { + evaluateAndCheckError("listOfNumbersUpToTen.?['nonboolean']", RESULT_OF_SELECTION_CRITERIA_IS_NOT_BOOLEAN); + } + + @Test + void selectFirstOnList() { + evaluate("listOfNumbersUpToTen.^[#isEven(#this) == 'y']", "2", Integer.class); + } + + @Test + void selectLastOnList() { + evaluate("listOfNumbersUpToTen.$[#isEven(#this) == 'y']", "10", Integer.class); + } + + @Test + void setConstructionWithInlineList() { evaluate("new java.util.HashSet().addAll({'a','b','c'})", "true", Boolean.class); } diff --git a/spring-expression/src/test/java/org/springframework/expression/spel/SelectionAndProjectionTests.java b/spring-expression/src/test/java/org/springframework/expression/spel/SelectionAndProjectionTests.java index e0727f9e1e..3ae88937b7 100644 --- a/spring-expression/src/test/java/org/springframework/expression/spel/SelectionAndProjectionTests.java +++ b/spring-expression/src/test/java/org/springframework/expression/spel/SelectionAndProjectionTests.java @@ -29,17 +29,65 @@ import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.TypedValue; +import org.springframework.expression.spel.standard.SpelExpression; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.expression.spel.SpelMessage.INVALID_TYPE_FOR_SELECTION; +import static org.springframework.expression.spel.SpelMessage.PROJECTION_NOT_SUPPORTED_ON_TYPE; +import static org.springframework.expression.spel.SpelMessage.RESULT_OF_SELECTION_CRITERIA_IS_NOT_BOOLEAN; /** * @author Mark Fisher * @author Sam Brannen * @author Juergen Hoeller + * @author Andy Clement */ -class SelectionAndProjectionTests { +class SelectionAndProjectionTests extends AbstractExpressionTests { + + @Test + void selectionOnUnsupportedType() { + evaluateAndCheckError("'abc'.?[#this<5]", INVALID_TYPE_FOR_SELECTION); + evaluateAndCheckError("null.?[#this<5]", INVALID_TYPE_FOR_SELECTION); + } + + @Test + void projectionOnUnsupportedType() { + evaluateAndCheckError("'abc'.![true]", PROJECTION_NOT_SUPPORTED_ON_TYPE); + evaluateAndCheckError("null.![true]", PROJECTION_NOT_SUPPORTED_ON_TYPE); + } + + @Test + void selectionOnNullWithSafeNavigation() { + evaluate("null?.?[#this<5]", null, null); + } + + @Test + void projectionOnNullWithSafeNavigation() { + evaluate("null?.![true]", null, null); + } + + @Test + void selectionWithNonBooleanSelectionCriteria() { + evaluateAndCheckError("mapOfNumbersUpToTen.?['hello']", RESULT_OF_SELECTION_CRITERIA_IS_NOT_BOOLEAN); + evaluateAndCheckError("mapOfNumbersUpToTen.keySet().?['hello']", RESULT_OF_SELECTION_CRITERIA_IS_NOT_BOOLEAN); + } + + @Test + void selectionAST() { + // select first + SpelExpression expr = (SpelExpression) parser.parseExpression("'abc'.^[true]"); + assertThat(expr.toStringAST()).isEqualTo("'abc'.^[true]"); + + // select all + expr = (SpelExpression) parser.parseExpression("'abc'.?[true]"); + assertThat(expr.toStringAST()).isEqualTo("'abc'.?[true]"); + + // select last + expr = (SpelExpression) parser.parseExpression("'abc'.$[true]"); + assertThat(expr.toStringAST()).isEqualTo("'abc'.$[true]"); + } @Test @SuppressWarnings("unchecked") @@ -70,6 +118,13 @@ class SelectionAndProjectionTests { assertThat(value).isEqualTo(4); } + @Test + void selectionWithSetAndRegex() { + evaluate("testMap.keySet().?[#this matches '.*o.*']", "[monday]", ArrayList.class); + evaluate("testMap.keySet().?[#this matches '.*r.*'].contains('saturday')", "true", Boolean.class); + evaluate("testMap.keySet().?[#this matches '.*r.*'].size()", "3", Integer.class); + } + @Test @SuppressWarnings("unchecked") void selectionWithSet() { @@ -175,10 +230,15 @@ class SelectionAndProjectionTests { void selectionWithMap() { EvaluationContext context = new StandardEvaluationContext(new MapTestBean()); ExpressionParser parser = new SpelExpressionParser(); - Expression exp = parser.parseExpression("colors.?[key.startsWith('b')]"); + Expression exp = parser.parseExpression("colors.?[key.startsWith('b')]"); Map colorsMap = (Map) exp.getValue(context); assertThat(colorsMap).containsOnlyKeys("beige", "blue", "brown"); + + exp = parser.parseExpression("colors.?[key.startsWith('X')]"); + + colorsMap = (Map) exp.getValue(context); + assertThat(colorsMap).isEmpty(); } @Test @@ -215,6 +275,12 @@ class SelectionAndProjectionTests { assertThat(list).containsExactly(5, 6, 7); } + @Test + void projectionWithMap() { + evaluate("mapOfNumbersUpToTen.![key > 5 ? value : null]", + "[null, null, null, null, null, six, seven, eight, nine, ten]", ArrayList.class); + } + @Test @SuppressWarnings("unchecked") void projectionWithSet() {