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.
This commit is contained in:
Sam Brannen 2024-01-28 14:25:37 +01:00
parent e1c22c5385
commit 1ff84671f8
4 changed files with 109 additions and 150 deletions

View File

@ -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

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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<String, String> colorsMap = (Map<String, String>) exp.getValue(context);
assertThat(colorsMap).containsOnlyKeys("beige", "blue", "brown");
exp = parser.parseExpression("colors.?[key.startsWith('X')]");
colorsMap = (Map<String, String>) 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() {