/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.tinkerpop.gremlin.process.traversal; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import static org.junit.Assert.assertEquals; /** * @author Stephen Mallette (http://stephen.genoprime.com) */ @RunWith(Parameterized.class) public class OperatorTest { /** * Required to verify that Operator can handle Number type, that it doesn't know explicitly. */ static class CustomNumber extends Number { public final static CustomNumber ONE = new CustomNumber(1); public final static CustomNumber TEN = new CustomNumber(10); private int n; private CustomNumber(final int number) { this.n = number; } @Override public int intValue() { return n; } @Override public long longValue() { return n; } @Override public float floatValue() { return n; } @Override public double doubleValue() { return n; } } @Parameterized.Parameters(name = "{0}({1},{2}) = {3}") public static Iterable<Object[]> data() { return new ArrayList<>(Arrays.asList(new Object[][]{ {Operator.div, 10, 2, 5}, {Operator.div, 10l, 2l, 5l}, {Operator.div, 10f, 2f, 5f}, {Operator.div, 10d, 2d, 5d}, {Operator.div, 10, 2d, 5d}, {Operator.div, 10, 2f, 5f}, {Operator.div, 10d, 2, 5d}, {Operator.div, 10f, 2d, 5d}, {Operator.div, 10f, 2l, 5d}, {Operator.div, 10f, 2, 5f}, {Operator.div, BigInteger.TEN, 2, BigInteger.valueOf(5l)}, {Operator.div, BigInteger.TEN, 2f, BigDecimal.valueOf(5l)}, {Operator.div, BigDecimal.TEN, 2, BigDecimal.valueOf(5l)}, {Operator.div, CustomNumber.TEN, 2, BigDecimal.valueOf(5l)}, {Operator.max, 10, 2, 10}, {Operator.max, 10l, 2l, 10l}, {Operator.max, 10f, 2f, 10f}, {Operator.max, 10d, 2d, 10d}, {Operator.max, 2, 10, 10}, {Operator.max, 2l, 10l, 10l}, {Operator.max, 2f, 10f, 10f}, {Operator.max, 2d, 10d, 10d}, {Operator.max, 10, 2d, 10d}, {Operator.max, 10, 2f, 10f}, {Operator.max, 10d, 2, 10d}, {Operator.max, 10f, 2d, 10d}, {Operator.max, 10f, 2l, 10d}, {Operator.max, 10f, 2, 10f}, {Operator.max, BigInteger.TEN, 1, BigInteger.TEN}, {Operator.max, BigInteger.TEN, BigDecimal.ONE, BigDecimal.TEN}, {Operator.max, BigDecimal.TEN, 1, BigDecimal.TEN}, {Operator.max, 1, CustomNumber.TEN, BigDecimal.TEN}, {Operator.min, 10, 2, 2}, {Operator.min, 10l, 2l, 2l}, {Operator.min, 10f, 2f, 2f}, {Operator.min, 10d, 2d, 2d}, {Operator.min, 2, 10, 2}, {Operator.min, 2l, 10l, 2l}, {Operator.min, 2f, 10f, 2f}, {Operator.min, 2d, 10d, 2d}, {Operator.min, 10, 2d, 2d}, {Operator.min, 10, 2f, 2f}, {Operator.min, 10d, 2, 2d}, {Operator.min, 10f, 2d, 2d}, {Operator.min, 10f, 2l, 2d}, {Operator.min, 10f, 2, 2f}, {Operator.min, BigInteger.TEN, 1, BigInteger.ONE}, {Operator.min, BigInteger.TEN, BigDecimal.ONE, BigDecimal.ONE}, {Operator.min, BigDecimal.TEN, 1, BigDecimal.ONE}, {Operator.min, 1, CustomNumber.TEN, BigDecimal.ONE}, {Operator.minus, 10, 2, 8}, {Operator.minus, 10l, 2l, 8l}, {Operator.minus, 10f, 2f, 8f}, {Operator.minus, 10d, 2d, 8d}, {Operator.minus, 10, 2d, 8d}, {Operator.minus, 10, 2f, 8f}, {Operator.minus, 10d, 2, 8d}, {Operator.minus, 10f, 2d, 8d}, {Operator.minus, 10f, 2l, 8d}, {Operator.minus, 10f, 2, 8f}, {Operator.minus, BigInteger.TEN, 2, BigInteger.valueOf(8l)}, {Operator.minus, BigInteger.TEN, 2f, BigDecimal.valueOf(8d)}, {Operator.minus, BigDecimal.TEN, 2, BigDecimal.valueOf(8l)}, {Operator.minus, CustomNumber.TEN, 2, BigDecimal.valueOf(8l)}, {Operator.mult, 5, 4, 20}, {Operator.mult, 5l, 4l, 20l}, {Operator.mult, 5f, 4f, 20f}, {Operator.mult, 5d, 4d, 20d}, {Operator.mult, 5, 4d, 20d}, {Operator.mult, 5, 4f, 20f}, {Operator.mult, 5d, 4, 20d}, {Operator.mult, 5f, 4d, 20d}, {Operator.mult, 5f, 4l, 20d}, {Operator.mult, 5f, 4, 20f}, {Operator.mult, BigInteger.valueOf(5l), 4, BigInteger.valueOf(20l)}, {Operator.mult, BigInteger.valueOf(5l), 4f, BigDecimal.valueOf(20d)}, {Operator.mult, BigDecimal.valueOf(5d), 4, BigDecimal.valueOf(20d)}, {Operator.mult, CustomNumber.TEN, 2f, BigDecimal.valueOf(20d)}, {Operator.sum, 7, 3, 10}, {Operator.sum, 7l, 3l, 10l}, {Operator.sum, 7f, 3f, 10f}, {Operator.sum, 7d, 3d, 10d}, {Operator.sum, 7, 3d, 10d}, {Operator.sum, 7, 3f, 10f}, {Operator.sum, 7d, 3, 10d}, {Operator.sum, 7f, 3d, 10d}, {Operator.sum, 7f, 3l, 10d}, {Operator.sum, 7f, 3, 10f}, {Operator.sum, BigInteger.valueOf(7l), 3, BigInteger.TEN}, {Operator.sum, BigInteger.valueOf(7l), 3f, BigDecimal.valueOf(10d)}, {Operator.sum, BigDecimal.valueOf(7d), 3, BigDecimal.valueOf(10d)}, {Operator.sum, CustomNumber.TEN, CustomNumber.ONE, BigDecimal.valueOf(11l)} })); } @Parameterized.Parameter(value = 0) public Operator operator; @Parameterized.Parameter(value = 1) public Number a; @Parameterized.Parameter(value = 2) public Number b; @Parameterized.Parameter(value = 3) public Number expected; @Test public void shouldApplyOperator() { assertEquals(expected, operator.apply(a, b)); } }