diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java new file mode 100644 index 00000000..075a21c1 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java @@ -0,0 +1,35 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.functions.Number; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates a specific number. + */ +public class NumberPattern extends VisitorPattern { + private final BigDecimal value; + + public NumberPattern(BigDecimal value) { + this.value = value; + } + + @Override + public Optional> visit(Number number) { + if (number.getTerm().compareTo(value) == 0) { + return Optional.of(new HashMap<>()); + } else { + return Optional.empty(); + } + } + + @Override + public Function replace(Map subFunctions) { + return new Number(null, value); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index 448154ca..37f188fa 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -4,11 +4,12 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.functions.Subtraction; import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.functions.Variable; +import it.cavallium.warppi.math.rules.dsl.patterns.NumberPattern; import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; import it.cavallium.warppi.math.rules.dsl.patterns.SumPattern; import org.junit.Test; +import java.math.BigDecimal; import java.util.Map; import java.util.Optional; @@ -78,4 +79,17 @@ public class PatternTest { ); assertFalse(pattern.match(shouldNotMatch).isPresent()); } + + @Test + public void numberPattern() { + final Pattern pattern = new NumberPattern(BigDecimal.valueOf(Math.PI)); + + final Function shouldNotMatch = new Number(null, 2); + assertFalse(pattern.match(shouldNotMatch).isPresent()); + + final Function shouldMatch = new Number(null, Math.PI); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(subFunctions.get())); + } } \ No newline at end of file