Polishing

This commit is contained in:
Sam Brannen
2024-01-31 16:41:15 +01:00
parent 67958656e4
commit 2b52582dff
6 changed files with 72 additions and 90 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2023 the original author or authors.
* 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.
@@ -22,7 +22,6 @@ import org.junit.jupiter.api.Test;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.EvaluationException;
import org.springframework.expression.Operation;
import org.springframework.expression.TypedValue;
import org.springframework.expression.spel.support.StandardEvaluationContext;
@@ -223,7 +222,7 @@ class ExpressionStateTests extends AbstractExpressionTests {
}
@Test
void typeLocator() throws EvaluationException {
void typeLocator() {
assertThat(state.getEvaluationContext().getTypeLocator()).isNotNull();
assertThat(state.findType("java.lang.Integer")).isEqualTo(Integer.class);
assertThatExceptionOfType(SpelEvaluationException.class)
@@ -232,7 +231,7 @@ class ExpressionStateTests extends AbstractExpressionTests {
}
@Test
void typeConversion() throws EvaluationException {
void typeConversion() {
String s = (String) state.convertValue(34, TypeDescriptor.valueOf(String.class));
assertThat(s).isEqualTo("34");

View File

@@ -18,56 +18,50 @@ package org.springframework.expression.spel;
import org.junit.jupiter.api.Test;
import org.springframework.expression.EvaluationException;
import org.springframework.expression.Operation;
import org.springframework.expression.OperatorOverloader;
import org.springframework.expression.spel.standard.SpelExpression;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Test providing operator support
* Tests for custom {@link OperatorOverloader} support.
*
* @author Andy Clement
* @author Sam Brannen
*/
class OperatorOverloaderTests extends AbstractExpressionTests {
@Test
void testSimpleOperations() {
// no built-in support for this:
evaluateAndCheckError("'abc'-true",SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES);
void simpleOperations() {
// default behavior
evaluate("'abc' + true", "abctrue", String.class);
evaluate("'abc' + null", "abcnull", String.class);
StandardEvaluationContext eContext = TestScenarioCreator.getTestEvaluationContext();
eContext.setOperatorOverloader(new StringAndBooleanAddition());
// no built-in support for <string> - <boolean>
evaluateAndCheckError("'abc' - true", SpelMessage.OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES);
SpelExpression expr = (SpelExpression)parser.parseExpression("'abc'+true");
assertThat(expr.getValue(eContext)).isEqualTo("abctrue");
super.context.setOperatorOverloader(new StringAndBooleanOperatorOverloader());
expr = (SpelExpression)parser.parseExpression("'abc'-true");
assertThat(expr.getValue(eContext)).isEqualTo("abc");
// unaffected
evaluate("'abc' + true", "abctrue", String.class);
evaluate("'abc' + null", "abcnull", String.class);
expr = (SpelExpression)parser.parseExpression("'abc'+null");
assertThat(expr.getValue(eContext)).isEqualTo("abcnull");
// <string> - <boolean> has been overloaded
evaluate("'abc' - true", "abcTRUE", String.class);
}
static class StringAndBooleanAddition implements OperatorOverloader {
private static class StringAndBooleanOperatorOverloader implements OperatorOverloader {
@Override
public Object operate(Operation operation, Object leftOperand, Object rightOperand) throws EvaluationException {
if (operation==Operation.ADD) {
return leftOperand + ((Boolean) rightOperand).toString();
}
else {
return leftOperand;
}
public boolean overridesOperation(Operation operation, Object leftOperand, Object rightOperand) {
return (leftOperand instanceof String && rightOperand instanceof Boolean);
}
@Override
public boolean overridesOperation(Operation operation, Object leftOperand, Object rightOperand) throws EvaluationException {
return leftOperand instanceof String && rightOperand instanceof Boolean;
public Object operate(Operation operation, Object leftOperand, Object rightOperand) {
if (operation == Operation.SUBTRACT) {
return leftOperand + ((Boolean) rightOperand).toString().toUpperCase();
}
throw new UnsupportedOperationException(operation.name());
}
}