package org.exist.xquery; import org.exist.EXistException; import org.exist.storage.*; import org.exist.test.ExistEmbeddedServer; import org.exist.util.DatabaseConfigurationException; import org.exist.xquery.Constants.ArithmeticOperator; import org.exist.xquery.value.*; import org.junit.*; import java.util.Optional; import static org.junit.Assert.assertEquals; public class OpNumericTest { private static DBBroker broker; private static XQueryContext context; private static DayTimeDurationValue dtDuration; private static YearMonthDurationValue ymDuration; private static DateTimeValue dateTime; private static DateValue date; private static TimeValue time; private static IntegerValue integer; private static DecimalValue decimal; @ClassRule public static final ExistEmbeddedServer existEmbeddedServer = new ExistEmbeddedServer(true, false); @BeforeClass public static void setUp() throws DatabaseConfigurationException, EXistException, XPathException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); context = new XQueryContext(pool); dtDuration = new DayTimeDurationValue("P1D"); ymDuration = new YearMonthDurationValue("P1Y"); dateTime = new DateTimeValue("2005-06-02T16:28:00Z"); date = new DateValue("2005-06-02"); time = new TimeValue("16:28:00Z"); integer = new IntegerValue(2); decimal = new DecimalValue("1.5"); } @AfterClass public static void tearDown() throws EXistException { if(broker != null) { broker.close(); } broker = null; context = null; } private OpNumeric buildOp(ArithmeticOperator op, AtomicValue a, AtomicValue b) { return new OpNumeric( context, new LiteralValue(context, a), new LiteralValue(context, b), op); } private void assertOp(String result, ArithmeticOperator op, AtomicValue a, AtomicValue b) throws XPathException { Sequence r = buildOp(op, a, b).eval(Sequence.EMPTY_SEQUENCE); assertEquals(result, r.itemAt(0).getStringValue()); } @Test public void idiv1() throws XPathException { assertOp("2", ArithmeticOperator.DIVISION_INTEGER, new IntegerValue(3), new DecimalValue("1.5")); } @Test public void idiv2() throws XPathException { assertOp("2", ArithmeticOperator.DIVISION_INTEGER, new IntegerValue(4), new IntegerValue(2)); } @Test public void idiv3() throws XPathException { assertOp("2", ArithmeticOperator.DIVISION_INTEGER, new IntegerValue(5), new IntegerValue(2)); } @Test public void idivReturnType1() { assertEquals(Type.INTEGER, buildOp(ArithmeticOperator.DIVISION_INTEGER, integer, integer).returnsType()); } @Test public void idivReturnType2() { assertEquals(Type.INTEGER, buildOp(ArithmeticOperator.DIVISION_INTEGER, integer, decimal).returnsType()); } @Test public void idivReturnType3() { assertEquals(Type.INTEGER, buildOp(ArithmeticOperator.DIVISION_INTEGER, decimal, integer).returnsType()); } @Test public void divReturnType1() { assertEquals(Type.DECIMAL, buildOp(ArithmeticOperator.DIVISION, integer, integer).returnsType()); } @Test public void divReturnType2() { assertEquals(Type.DECIMAL, buildOp(ArithmeticOperator.DIVISION, integer, decimal).returnsType()); } @Test public void divReturnType3() { assertEquals(Type.DECIMAL, buildOp(ArithmeticOperator.DIVISION, decimal, integer).returnsType()); } @Test public void divReturnType4() { assertEquals(Type.DAY_TIME_DURATION, buildOp(ArithmeticOperator.DIVISION, dtDuration, integer).returnsType()); } @Test public void divReturnType5() { assertEquals(Type.YEAR_MONTH_DURATION, buildOp(ArithmeticOperator.DIVISION, ymDuration, integer).returnsType()); } @Test public void divReturnType6() { assertEquals(Type.DECIMAL, buildOp(ArithmeticOperator.DIVISION, dtDuration, dtDuration).returnsType()); } @Test public void divReturnType7() { assertEquals(Type.DECIMAL, buildOp(ArithmeticOperator.DIVISION, ymDuration, ymDuration).returnsType()); } @Test public void multReturnType1() { assertEquals(Type.DAY_TIME_DURATION, buildOp(ArithmeticOperator.MULTIPLICATION, dtDuration, integer).returnsType()); } @Test public void multReturnType2() { assertEquals(Type.DAY_TIME_DURATION, buildOp(ArithmeticOperator.MULTIPLICATION, integer, dtDuration).returnsType()); } @Test public void multReturnType3() { assertEquals(Type.YEAR_MONTH_DURATION, buildOp(ArithmeticOperator.MULTIPLICATION, ymDuration, integer).returnsType()); } @Test public void multReturnType4() { assertEquals(Type.YEAR_MONTH_DURATION, buildOp(ArithmeticOperator.MULTIPLICATION, integer, ymDuration).returnsType()); } @Test public void plusReturnType1() { assertEquals(Type.DAY_TIME_DURATION, buildOp(ArithmeticOperator.ADDITION, dtDuration, dtDuration).returnsType()); } @Test public void plusReturnType2() { assertEquals(Type.YEAR_MONTH_DURATION, buildOp(ArithmeticOperator.ADDITION, ymDuration, ymDuration).returnsType()); } @Test public void plusReturnType3() { assertEquals(Type.DATE, buildOp(ArithmeticOperator.ADDITION, date, dtDuration).returnsType()); } @Test public void plusReturnType4() { assertEquals(Type.DATE_TIME, buildOp(ArithmeticOperator.ADDITION, dateTime, dtDuration).returnsType()); } @Test public void plusReturnType5() { assertEquals(Type.TIME, buildOp(ArithmeticOperator.ADDITION, time, dtDuration).returnsType()); } @Test public void plusReturnType6() { assertEquals(Type.DATE, buildOp(ArithmeticOperator.ADDITION, dtDuration, date).returnsType()); } @Test public void plusReturnType7() { assertEquals(Type.DATE_TIME, buildOp(ArithmeticOperator.ADDITION, dtDuration, dateTime).returnsType()); } @Test public void plusReturnType8() { assertEquals(Type.TIME, buildOp(ArithmeticOperator.ADDITION, dtDuration, time).returnsType()); } @Test public void plusReturnType9() { assertEquals(Type.DATE, buildOp(ArithmeticOperator.ADDITION, date, ymDuration).returnsType()); } @Test public void plusReturnType10() { assertEquals(Type.DATE_TIME, buildOp(ArithmeticOperator.ADDITION, dateTime, ymDuration).returnsType()); } @Test public void plusReturnType11() { assertEquals(Type.DATE, buildOp(ArithmeticOperator.ADDITION, ymDuration, date).returnsType()); } @Test public void plusReturnType12() { assertEquals(Type.DATE_TIME, buildOp(ArithmeticOperator.ADDITION, ymDuration, dateTime).returnsType()); } @Test public void minusReturnType1() { assertEquals(Type.DAY_TIME_DURATION, buildOp(ArithmeticOperator.SUBTRACTION, dtDuration, dtDuration).returnsType()); } @Test public void minusReturnType2() { assertEquals(Type.YEAR_MONTH_DURATION, buildOp(ArithmeticOperator.SUBTRACTION, ymDuration, ymDuration).returnsType()); } @Test public void minusReturnType3() { assertEquals(Type.DAY_TIME_DURATION, buildOp(ArithmeticOperator.SUBTRACTION, dateTime, dateTime).returnsType()); } @Test public void minusReturnType4() { assertEquals(Type.DAY_TIME_DURATION, buildOp(ArithmeticOperator.SUBTRACTION, date, date).returnsType()); } @Test public void minusReturnType5() { assertEquals(Type.DAY_TIME_DURATION, buildOp(ArithmeticOperator.SUBTRACTION, time, time).returnsType()); } @Test public void minusReturnType6() { assertEquals(Type.DATE_TIME, buildOp(ArithmeticOperator.SUBTRACTION, dateTime, ymDuration).returnsType()); } @Test public void minusReturnType7() { assertEquals(Type.DATE_TIME, buildOp(ArithmeticOperator.SUBTRACTION, dateTime, dtDuration).returnsType()); } @Test public void minusReturnType8() { assertEquals(Type.DATE, buildOp(ArithmeticOperator.SUBTRACTION, date, ymDuration).returnsType()); } @Test public void minusReturnType9() { assertEquals(Type.DATE, buildOp(ArithmeticOperator.SUBTRACTION, date, dtDuration).returnsType()); } @Test public void minusReturnType10() { assertEquals(Type.TIME, buildOp(ArithmeticOperator.SUBTRACTION, time, dtDuration).returnsType()); } }