/*
* Copyright 2012 Intuit Inc. All Rights Reserved
*/
package com.intuit.tank.harness.functions;
/*
* #%L
* Intuit Tank Agent (apiharness)
* %%
* Copyright (C) 2011 - 2015 Intuit Inc.
* %%
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* #L%
*/
import java.util.Random;
import org.apache.commons.jexl2.JexlContext;
import org.apache.commons.lang3.math.NumberUtils;
import com.intuit.tank.vm.common.util.ExpressionContextVisitor;
/**
*
* JexlNumericFunctions numerical based functions like add, subtract and modulo. Also contains random number generators
* of different lengths
*
* @author rchalmela
*
*/
public class JexlNumericFunctions implements ExpressionContextVisitor {
static Random rnd = new Random();
/**
*
* @{inheritDoc
*/
@Override
public void visit(JexlContext context) {
context.set("numericFunctions", this);
}
/**
* finds first number modulo second number
*
* @param num
* @param mod
* @return result as a string
*/
public String mod(Object num, Object mod) {
return Integer.toString(FunctionHandler.getInt(num) % FunctionHandler.getInt(mod));
}
/**
* Adds all values together
*
* @param values
* @return summation
*/
public String add(Object... values) {
double result = 0;
for (int i = 0; i < values.length; i++) {
result += FunctionHandler.getDouble(values[i]);
}
return Double.toString(result);
}
/**
* Subtracts all values from the first value
*
* @param values
* @return subtraction of values
*/
public String subtract(Object... values) {
double result = FunctionHandler.getDouble(values[0]);
for (int i = 1; i < values.length; i++) {
result -= FunctionHandler.getDouble(values[i]);
}
return Double.toString(result);
}
/**
* Returns a random number between min(inclusive) and max(exclusive)
*
* @param min
* the min number
* @param max
* the maximum number
* @return the value
*/
public String random(Object omin, Object omax) {
int min = FunctionHandler.getInt(omin);
int max = FunctionHandler.getInt(omax);
if (max > min) {
return Integer.toString(rnd.nextInt(max - min) + min);
}
return "0";
}
/**
* Returns a random number between 0(inclusive) and max(exclusive)
*
* @param max
* the maximum number
* @return the value
*/
public String random(Object omax) {
return random(0, omax);
}
/**
* Get a random, positive whole number
*
* @param length
* The length of the full numbers
* @return A random whole number
*/
public String randomPositiveWhole(Object olength) {
int length = FunctionHandler.getInt(olength);
if (length == 0) {
return "";
}
StringBuilder output = new StringBuilder(length);
output.append(rnd.nextInt(8) + 1);
for (int i = 0; i < length - 1; i++) {
output.append(rnd.nextInt(9));
}
return output.toString();
}
/**
* Get a random, negative whole number
*
* @param length
* The length of the full numbers
* @return A random whole number
*/
public String randomNegativeWhole(Object olength) {
return "-" + randomPositiveWhole(olength);
}
/**
* Get a random, positive float
*
* @param whole
* The number of whole digits
* @param decimal
* The number of decimal digits
* @return A random float
*/
public String randomPositiveFloat(Object owhole, Object odecimal) {
int whole = FunctionHandler.getInt(owhole);
int decimal = FunctionHandler.getInt(odecimal);
StringBuilder output = new StringBuilder();
output.append(rnd.nextInt(8) + 1);
for (int i = 0; i < whole - 1; i++) {
output.append(rnd.nextInt(9));
}
output.append(".");
for (int i = 0; i < decimal; i++) {
output.append(rnd.nextInt(9));
}
return output.toString();
}
/**
* Get a random, negative float
*
* @param whole
* The number of whole digits
* @param decimal
* The number of decimal digits
* @return A random float
*/
public String randomNegativeFloat(Object owhole, Object odecimal) {
return "-" + randomPositiveFloat(owhole, odecimal);
}
/**
* converts the Double to an Int
*
* @param num
* @return
*/
public String toInt(String num) {
return Integer.toString(FunctionHandler.getInt(num));
}
}