aboutsummaryrefslogtreecommitdiffstats
path: root/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/parser/MathTestCase.java
blob: 4f80f86819a2663831a71489be75d50cd5e660ad (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.indexinglanguage.parser;

import com.yahoo.document.datatypes.*;
import com.yahoo.vespa.indexinglanguage.expressions.Expression;
import com.yahoo.vespa.indexinglanguage.parser.ParseException;
import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

/**
 * @author Simon Thoresen Hult
 */
public class MathTestCase {

    private static final double EPS = 1e-6;

    @Test
    public void requireThatNumericTypeIsPreserved() throws ParseException {
        assertEquals(1, evaluateDouble("1.0"), EPS);
        assertEquals(3, evaluateDouble("1.0 + 2"), EPS);
        assertEquals(-1, evaluateDouble("1.0 - 2"), EPS);
        assertEquals(2, evaluateDouble("1.0 * 2"), EPS);
        assertEquals(0.5, evaluateDouble("1.0 / 2"), EPS);
        assertEquals(1, evaluateDouble("1.0 % 2"), EPS);

        assertEquals(1, evaluateFloat("1.0f"), EPS);
        assertEquals(3, evaluateFloat("1.0f + 2"), EPS);
        assertEquals(-1, evaluateFloat("1.0f - 2"), EPS);
        assertEquals(2, evaluateFloat("1.0f * 2"), EPS);
        assertEquals(0.5, evaluateFloat("1.0f / 2"), EPS);
        assertEquals(1, evaluateFloat("1.0f % 2"), EPS);

        assertEquals(1, evaluateInteger("1"));
        assertEquals(3, evaluateInteger("1 + 2"));
        assertEquals(-1, evaluateInteger("1 - 2"));
        assertEquals(2, evaluateInteger("1 * 2"));
        assertEquals(0, evaluateInteger("1 / 2"));
        assertEquals(1, evaluateInteger("1 % 2"));

        assertEquals(1, evaluateLong("1L"));
        assertEquals(3, evaluateLong("1L + 2"));
        assertEquals(-1, evaluateLong("1L - 2"));
        assertEquals(2, evaluateLong("1L * 2"));
        assertEquals(0, evaluateLong("1L / 2"));
        assertEquals(1, evaluateLong("1L % 2"));

        assertEquals(3, evaluateDouble("1.0 + 2"), EPS);
        assertEquals(3, evaluateDouble("1.0 + 2L"), EPS);
        assertEquals(3, evaluateDouble("1.0 + 2.0f"), EPS);
        assertEquals(3, evaluateFloat("1.0f + 2"), EPS);
        assertEquals(3, evaluateFloat("1.0f + 2L"), EPS);
        assertEquals(3, evaluateLong("1L + 2"));
    }

    @Test
    public void requireThatParenthesisControlsPrecedence() throws ParseException {
        assertEquals(2, evaluateInteger("1 - 2 + 3"));
        assertEquals(2, evaluateInteger("(1 - 2) + 3"));
        assertEquals(-4, evaluateInteger("1 - (2 + 3)"));
        assertEquals(2, evaluateInteger("(1 - 2 + 3)"));
    }

    private static double evaluateDouble(String script) throws ParseException {
        FieldValue val = evaluateMath(script);
        assertTrue(val instanceof DoubleFieldValue);
        return ((DoubleFieldValue)val).getDouble();
    }

    private static double evaluateFloat(String script) throws ParseException {
        FieldValue val = evaluateMath(script);
        assertTrue(val instanceof FloatFieldValue);
        return ((FloatFieldValue)val).getFloat();
    }

    private static long evaluateInteger(String script) throws ParseException {
        FieldValue val = evaluateMath(script);
        assertTrue(val instanceof IntegerFieldValue);
        return ((IntegerFieldValue)val).getInteger();
    }

    private static long evaluateLong(String script) throws ParseException {
        FieldValue val = evaluateMath(script);
        assertTrue(val instanceof LongFieldValue);
        return ((LongFieldValue)val).getLong();
    }

    private static FieldValue evaluateMath(String script) throws ParseException {
        return Expression.fromString(script).execute();
    }
}