package edu.washington.escience.myria.operator.apply;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import org.junit.Test;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.google.common.collect.ImmutableList;
import edu.washington.escience.myria.Type;
import edu.washington.escience.myria.api.MyriaJsonMapperProvider;
import edu.washington.escience.myria.expression.AbsExpression;
import edu.washington.escience.myria.expression.AndExpression;
import edu.washington.escience.myria.expression.CastExpression;
import edu.washington.escience.myria.expression.CeilExpression;
import edu.washington.escience.myria.expression.ConditionalExpression;
import edu.washington.escience.myria.expression.ConstantExpression;
import edu.washington.escience.myria.expression.CosExpression;
import edu.washington.escience.myria.expression.DivideExpression;
import edu.washington.escience.myria.expression.EqualsExpression;
import edu.washington.escience.myria.expression.ExpressionOperator;
import edu.washington.escience.myria.expression.FloorExpression;
import edu.washington.escience.myria.expression.GreaterExpression;
import edu.washington.escience.myria.expression.GreaterThanExpression;
import edu.washington.escience.myria.expression.GreaterThanOrEqualsExpression;
import edu.washington.escience.myria.expression.HashMd5Expression;
import edu.washington.escience.myria.expression.IntDivideExpression;
import edu.washington.escience.myria.expression.LenExpression;
import edu.washington.escience.myria.expression.LessThanExpression;
import edu.washington.escience.myria.expression.LessThanOrEqualsExpression;
import edu.washington.escience.myria.expression.LesserExpression;
import edu.washington.escience.myria.expression.LogExpression;
import edu.washington.escience.myria.expression.MinusExpression;
import edu.washington.escience.myria.expression.ModuloExpression;
import edu.washington.escience.myria.expression.NegateExpression;
import edu.washington.escience.myria.expression.NotEqualsExpression;
import edu.washington.escience.myria.expression.NotExpression;
import edu.washington.escience.myria.expression.OrExpression;
import edu.washington.escience.myria.expression.PlusExpression;
import edu.washington.escience.myria.expression.PowExpression;
import edu.washington.escience.myria.expression.RandomExpression;
import edu.washington.escience.myria.expression.SinExpression;
import edu.washington.escience.myria.expression.SqrtExpression;
import edu.washington.escience.myria.expression.StateExpression;
import edu.washington.escience.myria.expression.SubstrExpression;
import edu.washington.escience.myria.expression.TanExpression;
import edu.washington.escience.myria.expression.TimesExpression;
import edu.washington.escience.myria.expression.ToUpperCaseExpression;
import edu.washington.escience.myria.expression.TypeExpression;
import edu.washington.escience.myria.expression.TypeOfExpression;
import edu.washington.escience.myria.expression.VariableExpression;
import edu.washington.escience.myria.expression.WorkerIdExpression;
public class ApplySerializationTest {
@Test
public void testJsonMapping() throws IOException {
ObjectReader reader = MyriaJsonMapperProvider.getReader().withType(ExpressionOperator.class);
ObjectWriter writer = MyriaJsonMapperProvider.getWriter();
ImmutableList.Builder<ExpressionOperator> expressions = ImmutableList.builder();
/* Zeroary */
ConstantExpression constant = new ConstantExpression(Type.INT_TYPE, "5");
RandomExpression random = new RandomExpression();
StateExpression state = new StateExpression(3);
TypeExpression type = new TypeExpression(Type.INT_TYPE);
TypeOfExpression typeof = new TypeOfExpression(2);
VariableExpression variable = new VariableExpression(1);
WorkerIdExpression worker = new WorkerIdExpression();
expressions
.add(constant)
.add(random)
.add(state)
.add(type)
.add(typeof)
.add(variable)
.add(worker);
/* Unary */
AbsExpression abs = new AbsExpression(constant);
CeilExpression ceil = new CeilExpression(constant);
FloorExpression floor = new FloorExpression(constant);
LogExpression log = new LogExpression(constant);
HashMd5Expression md5 = new HashMd5Expression(constant);
NegateExpression negate = new NegateExpression(constant);
CosExpression cos = new CosExpression(constant);
SinExpression sin = new SinExpression(constant);
SqrtExpression sqrt = new SqrtExpression(constant);
TanExpression tan = new TanExpression(constant);
ToUpperCaseExpression upper = new ToUpperCaseExpression(constant);
NotExpression not = new NotExpression(constant);
LenExpression len = new LenExpression(constant);
expressions
.add(abs)
.add(ceil)
.add(cos)
.add(floor)
.add(log)
.add(md5)
.add(negate)
.add(not)
.add(sin)
.add(sqrt)
.add(tan)
.add(upper)
.add(len);
/* Binary */
DivideExpression divide = new DivideExpression(constant, variable);
IntDivideExpression idivide = new IntDivideExpression(constant, variable);
MinusExpression minus = new MinusExpression(constant, variable);
PlusExpression plus = new PlusExpression(constant, variable);
PowExpression pow = new PowExpression(constant, variable);
TimesExpression times = new TimesExpression(constant, variable);
AndExpression and = new AndExpression(constant, variable);
OrExpression or = new OrExpression(constant, variable);
EqualsExpression eq = new EqualsExpression(constant, variable);
NotEqualsExpression ne = new NotEqualsExpression(constant, variable);
GreaterThanExpression gt = new GreaterThanExpression(constant, variable);
LessThanExpression lt = new LessThanExpression(constant, variable);
GreaterThanOrEqualsExpression gte = new GreaterThanOrEqualsExpression(constant, variable);
LessThanOrEqualsExpression lte = new LessThanOrEqualsExpression(constant, variable);
CastExpression cast = new CastExpression(constant, typeof);
ModuloExpression modulo = new ModuloExpression(constant, variable);
LesserExpression min = new LesserExpression(constant, variable);
GreaterExpression max = new GreaterExpression(constant, variable);
expressions
.add(and)
.add(divide)
.add(idivide)
.add(eq)
.add(gt)
.add(gte)
.add(lt)
.add(lte)
.add(minus)
.add(ne)
.add(or)
.add(plus)
.add(pow)
.add(times)
.add(cast)
.add(modulo)
.add(min)
.add(max);
/* NAry */
VariableExpression variable2 = new VariableExpression(2);
ConditionalExpression conditional = new ConditionalExpression(variable, constant, variable2);
SubstrExpression substr = new SubstrExpression(constant, constant, constant);
expressions.add(conditional).add(substr);
/* Test serializing and deserializing all of them. */
for (ExpressionOperator op : expressions.build()) {
assertTrue(writer.canSerialize(op.getClass()));
String serialized = writer.writeValueAsString(op);
ExpressionOperator op2 = reader.readValue(serialized);
assertEquals(op2, op);
}
}
}