From c13781b4a51f0c6d9a92e14efabf9be5bc8b3312 Mon Sep 17 00:00:00 2001 From: Miroslav Pokorny Date: Thu, 7 Dec 2023 07:43:48 +1100 Subject: [PATCH] ExpressionFunctionParameter.setType --- .../function/ExpressionFunctionParameter.java | 25 +++++++++++- .../ExpressionFunctionParameterTest.java | 40 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/main/java/walkingkooka/tree/expression/function/ExpressionFunctionParameter.java b/src/main/java/walkingkooka/tree/expression/function/ExpressionFunctionParameter.java index 100508f6..36749ee6 100644 --- a/src/main/java/walkingkooka/tree/expression/function/ExpressionFunctionParameter.java +++ b/src/main/java/walkingkooka/tree/expression/function/ExpressionFunctionParameter.java @@ -88,7 +88,7 @@ public static ExpressionFunctionParameter with(final ExpressionFunctionPa final ExpressionFunctionParameterCardinality cardinality, final Set kinds) { Objects.requireNonNull(name, "name"); - Objects.requireNonNull(type, "type"); + checkType(type); Objects.requireNonNull(typeParameters, "typeParameters"); Objects.requireNonNull(cardinality, "cardinality"); Objects.requireNonNull(kinds, "kinds"); @@ -102,6 +102,10 @@ public static ExpressionFunctionParameter with(final ExpressionFunctionPa ); } + private static Class checkType(final Class type) { + return Objects.requireNonNull(type, "type"); + } + private ExpressionFunctionParameter(final ExpressionFunctionParameterName name, final Class type, final ExpressionFunctionParameterCardinality cardinality, @@ -142,6 +146,25 @@ public Class type() { return this.type; } + /** + * Would be setter that returns a {@link ExpressionFunctionParameter} with the new type but copying all other properties. + * This is particularly useful when updating a {@link ExpressionFunction} parameters such as COUNT which initially has its parameters declared but Object but within a + * spreadsheet it needs all parameter values converted to a number. + */ + public ExpressionFunctionParameter setType(final Class type) { + checkType(type); + + return this.type.equals(type) ? + Cast.to(this) : + new ExpressionFunctionParameter<>( + this.name, + type, + this.cardinality, + this.typeParameters, + this.kinds + ); + } + private final Class type; public List> typeParameters() { diff --git a/src/test/java/walkingkooka/tree/expression/function/ExpressionFunctionParameterTest.java b/src/test/java/walkingkooka/tree/expression/function/ExpressionFunctionParameterTest.java index 34aafb5e..c54cbf34 100644 --- a/src/test/java/walkingkooka/tree/expression/function/ExpressionFunctionParameterTest.java +++ b/src/test/java/walkingkooka/tree/expression/function/ExpressionFunctionParameterTest.java @@ -167,6 +167,46 @@ public void testSetNameWithDifferent() { this.checkKinds(parameter); } + // setType......................................................................................................... + + @Test + public void testSetTypeWithNullFails() { + assertThrows( + NullPointerException.class, + () -> this.createObject().setType(null) + ); + } + + @Test + public void testSetTypeWithSame() { + final ExpressionFunctionParameter parameter = this.createObject(); + assertSame( + parameter, + parameter.setType(TYPE) + ); + } + + @Test + public void testSetTypeWithDifferent() { + final ExpressionFunctionParameter parameter = this.createObject(); + final Class type = ExpressionFunctionParameterTest.class; + + final ExpressionFunctionParameter different = parameter.setType(type); + assertNotSame(parameter, different); + + this.checkName(different); + this.checkType(different, type); + this.checkTypeParameters(different); + this.checkCardinality(different); + this.checkKinds(different); + + this.checkName(parameter); + this.checkType(parameter); + this.checkTypeParameters(parameter); + this.checkCardinality(parameter); + this.checkKinds(parameter); + } + // setCardinality................................................................................................... @Test