diff options
Diffstat (limited to 'container-search/src/test/java/com/yahoo/search/grouping/request/MathResolverTestCase.java')
-rw-r--r-- | container-search/src/test/java/com/yahoo/search/grouping/request/MathResolverTestCase.java | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/container-search/src/test/java/com/yahoo/search/grouping/request/MathResolverTestCase.java b/container-search/src/test/java/com/yahoo/search/grouping/request/MathResolverTestCase.java new file mode 100644 index 00000000000..af007a6f85c --- /dev/null +++ b/container-search/src/test/java/com/yahoo/search/grouping/request/MathResolverTestCase.java @@ -0,0 +1,133 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.search.grouping.request; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a> + */ +public class MathResolverTestCase { + + // -------------------------------------------------------------------------------- + // + // Tests + // + // -------------------------------------------------------------------------------- + + @Test + public void testOperators() { + MathResolver resolver = new MathResolver(); + resolver.push(MathResolver.Type.ADD, new LongValue(1)); + resolver.push(MathResolver.Type.ADD, new LongValue(2)); + assertEquals("add(1, 2)", + resolver.resolve().toString()); + + resolver = new MathResolver(); + resolver.push(MathResolver.Type.ADD, new LongValue(1)); + resolver.push(MathResolver.Type.SUB, new LongValue(2)); + assertEquals("sub(1, 2)", + resolver.resolve().toString()); + + resolver = new MathResolver(); + resolver.push(MathResolver.Type.ADD, new LongValue(1)); + resolver.push(MathResolver.Type.DIV, new LongValue(2)); + assertEquals("div(1, 2)", + resolver.resolve().toString()); + + resolver = new MathResolver(); + resolver.push(MathResolver.Type.ADD, new LongValue(1)); + resolver.push(MathResolver.Type.MOD, new LongValue(2)); + assertEquals("mod(1, 2)", + resolver.resolve().toString()); + + resolver = new MathResolver(); + resolver.push(MathResolver.Type.ADD, new LongValue(1)); + resolver.push(MathResolver.Type.MUL, new LongValue(2)); + assertEquals("mul(1, 2)", + resolver.resolve().toString()); + } + + @Test + public void testOperatorPrecedence() { + assertResolve("add(add(1, 2), 3)", MathResolver.Type.ADD, MathResolver.Type.ADD); + assertResolve("add(1, sub(2, 3))", MathResolver.Type.ADD, MathResolver.Type.SUB); + assertResolve("add(1, div(2, 3))", MathResolver.Type.ADD, MathResolver.Type.DIV); + assertResolve("add(1, mod(2, 3))", MathResolver.Type.ADD, MathResolver.Type.MOD); + assertResolve("add(1, mul(2, 3))", MathResolver.Type.ADD, MathResolver.Type.MUL); + + assertResolve("add(sub(1, 2), 3)", MathResolver.Type.SUB, MathResolver.Type.ADD); + assertResolve("sub(sub(1, 2), 3)", MathResolver.Type.SUB, MathResolver.Type.SUB); + assertResolve("sub(1, div(2, 3))", MathResolver.Type.SUB, MathResolver.Type.DIV); + assertResolve("sub(1, mod(2, 3))", MathResolver.Type.SUB, MathResolver.Type.MOD); + assertResolve("sub(1, mul(2, 3))", MathResolver.Type.SUB, MathResolver.Type.MUL); + + assertResolve("add(div(1, 2), 3)", MathResolver.Type.DIV, MathResolver.Type.ADD); + assertResolve("sub(div(1, 2), 3)", MathResolver.Type.DIV, MathResolver.Type.SUB); + assertResolve("div(div(1, 2), 3)", MathResolver.Type.DIV, MathResolver.Type.DIV); + assertResolve("div(1, mod(2, 3))", MathResolver.Type.DIV, MathResolver.Type.MOD); + assertResolve("div(1, mul(2, 3))", MathResolver.Type.DIV, MathResolver.Type.MUL); + + assertResolve("add(mod(1, 2), 3)", MathResolver.Type.MOD, MathResolver.Type.ADD); + assertResolve("sub(mod(1, 2), 3)", MathResolver.Type.MOD, MathResolver.Type.SUB); + assertResolve("div(mod(1, 2), 3)", MathResolver.Type.MOD, MathResolver.Type.DIV); + assertResolve("mod(mod(1, 2), 3)", MathResolver.Type.MOD, MathResolver.Type.MOD); + assertResolve("mod(1, mul(2, 3))", MathResolver.Type.MOD, MathResolver.Type.MUL); + + assertResolve("add(mul(1, 2), 3)", MathResolver.Type.MUL, MathResolver.Type.ADD); + assertResolve("sub(mul(1, 2), 3)", MathResolver.Type.MUL, MathResolver.Type.SUB); + assertResolve("div(mul(1, 2), 3)", MathResolver.Type.MUL, MathResolver.Type.DIV); + assertResolve("mod(mul(1, 2), 3)", MathResolver.Type.MUL, MathResolver.Type.MOD); + assertResolve("mul(mul(1, 2), 3)", MathResolver.Type.MUL, MathResolver.Type.MUL); + + assertResolve("add(1, sub(div(2, mod(3, mul(4, 5))), 6))", + MathResolver.Type.ADD, MathResolver.Type.DIV, MathResolver.Type.MOD, + MathResolver.Type.MUL, MathResolver.Type.SUB); + assertResolve("add(sub(1, div(mod(mul(2, 3), 4), 5)), 6)", + MathResolver.Type.SUB, MathResolver.Type.MUL, MathResolver.Type.MOD, + MathResolver.Type.DIV, MathResolver.Type.ADD); + assertResolve("add(1, sub(2, div(3, mod(4, mul(5, 6)))))", + MathResolver.Type.ADD, MathResolver.Type.SUB, MathResolver.Type.DIV, + MathResolver.Type.MOD, MathResolver.Type.MUL); + assertResolve("add(sub(div(mod(mul(1, 2), 3), 4), 5), 6)", + MathResolver.Type.MUL, MathResolver.Type.MOD, MathResolver.Type.DIV, + MathResolver.Type.SUB, MathResolver.Type.ADD); + } + + @Test + public void testOperatorSupport() { + MathResolver resolver = new MathResolver(); + for (MathResolver.Type type : MathResolver.Type.values()) { + if (type == MathResolver.Type.ADD) { + continue; + } + try { + resolver.push(type, new AttributeValue("foo")); + } catch (IllegalArgumentException e) { + assertEquals("First item in an arithmetic operation must be an addition.", e.getMessage()); + } + } + } + + // -------------------------------------------------------------------------------- + // + // Utilities + // + // -------------------------------------------------------------------------------- + + private static void assertResolve(String expected, MathResolver.Type... types) { + MathResolver resolver = new MathResolver(); + + int val = 0; + resolver.push(MathResolver.Type.ADD, new LongValue(++val)); + for (MathResolver.Type type : types) { + resolver.push(type, new LongValue(++val)); + } + + GroupingExpression exp = resolver.resolve(); + assertNotNull(exp); + assertEquals(expected, exp.toString()); + } +} |