From 0afacf7ddcc21280db0812b50df5e605ee74f3da Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 14:27:06 +0200 Subject: [PATCH] Implement NegativePattern --- .../rules/dsl/patterns/NegativePattern.java | 33 +++++++++++++++++++ .../warppi/math/rules/dsl/PatternTest.java | 20 +++++++++++ 2 files changed, 53 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java new file mode 100644 index 00000000..d71d5a56 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java @@ -0,0 +1,33 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.functions.Negative; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates the negative of another pattern. + */ +public class NegativePattern extends VisitorPattern { + private final Pattern inner; + + public NegativePattern(Pattern inner) { + this.inner = inner; + } + + @Override + public Optional> visit(Negative negative) { + return inner.match(negative.getParameter()); + } + + @Override + public Function replace(Map subFunctions) { + return new Negative( + null, + inner.replace(subFunctions) + ); + } +} 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 37f188fa..c0d75568 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 @@ -1,9 +1,11 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.functions.Negative; 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.rules.dsl.patterns.NegativePattern; 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; @@ -92,4 +94,22 @@ public class PatternTest { assertTrue(subFunctions.isPresent()); assertEquals(shouldMatch, pattern.replace(subFunctions.get())); } + + @Test + public void negativePattern() { + final Pattern pattern = new NegativePattern( + new SubFunctionPattern("x") + ); + + final Function shouldNotMatch = new Number(null, 1); + assertFalse(pattern.match(shouldNotMatch).isPresent()); + + final Function shouldMatch = new Negative( + null, + new Number(null, 2) + ); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(subFunctions.get())); + } } \ No newline at end of file