/*
Copyright (c) 2008 Arno Haase, Andr� Arnold.
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
Contributors:
Arno Haase - initial API and implementation
Andr� Arnold
*/
package org.eclipse.xtend.backend.expr;
import static org.eclipse.xtend.backend.testhelpers.BackendTestHelper.SOURCE_POS;
import static org.eclipse.xtend.backend.testhelpers.BackendTestHelper.createEmptyExecutionContext;
import static org.eclipse.xtend.backend.testhelpers.BackendTestHelper.createEmptyFdc;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.xtend.backend.common.ExecutionContext;
import org.eclipse.xtend.backend.common.ExpressionBase;
import org.eclipse.xtend.backend.common.NamedFunction;
import org.eclipse.xtend.backend.functions.FunctionDefContextInternal;
import org.eclipse.xtend.backend.testhelpers.CheckEvaluationExpression;
import org.eclipse.xtend.backend.testhelpers.NamedFunctionFactory;
import org.eclipse.xtend.backend.types.CompositeTypesystem;
import org.eclipse.xtend.backend.types.builtin.StringType;
import org.eclipse.xtend.backend.util.Pair;
import org.junit.Test;
/**
*
* @author Arno Haase (http://www.haase-consulting.com)
* @author Andr� Arnold
*/
public class SwitchExpressionTest {
@Test public void testLogic () {
final CheckEvaluationExpression switchExpr = new CheckEvaluationExpression ("a");
final CheckEvaluationExpression caseAExpr = new CheckEvaluationExpression ("a");
final CheckEvaluationExpression valueAExpr = new CheckEvaluationExpression ("aValue");
final CheckEvaluationExpression caseBExpr = new CheckEvaluationExpression ("b");
final CheckEvaluationExpression valueBExpr = new CheckEvaluationExpression ("bValue");
final CheckEvaluationExpression defaultExpr = new CheckEvaluationExpression ("defaultValue");
final List<Pair<ExpressionBase, ExpressionBase>> cases = new ArrayList<Pair<ExpressionBase,ExpressionBase>> ();
cases.add (new Pair<ExpressionBase, ExpressionBase> (caseAExpr, valueAExpr));
cases.add (new Pair<ExpressionBase, ExpressionBase> (caseBExpr, valueBExpr));
final SwitchExpression expr = new SwitchExpression (switchExpr, cases, defaultExpr, SOURCE_POS);
assertEquals ("aValue", expr.evaluate (createEmptyExecutionContext()));
assertEquals (1, switchExpr._evalCounter);
assertEquals (1, caseAExpr._evalCounter);
assertEquals (1, valueAExpr._evalCounter);
assertEquals (0, caseBExpr._evalCounter);
assertEquals (0, valueBExpr._evalCounter);
assertEquals (0, defaultExpr._evalCounter);
switchExpr._value = "b";
assertEquals ("bValue", expr.evaluate (createEmptyExecutionContext()));
assertEquals (2, switchExpr._evalCounter);
assertEquals (2, caseAExpr._evalCounter);
assertEquals (1, valueAExpr._evalCounter);
assertEquals (1, caseBExpr._evalCounter);
assertEquals (1, valueBExpr._evalCounter);
assertEquals (0, defaultExpr._evalCounter);
switchExpr._value = "c";
assertEquals ("defaultValue", expr.evaluate (createEmptyExecutionContext()));
assertEquals (3, switchExpr._evalCounter);
assertEquals (3, caseAExpr._evalCounter);
assertEquals (1, valueAExpr._evalCounter);
assertEquals (2, caseBExpr._evalCounter);
assertEquals (1, valueBExpr._evalCounter);
assertEquals (1, defaultExpr._evalCounter);
switchExpr._value = null;
assertEquals ("defaultValue", expr.evaluate (createEmptyExecutionContext()));
assertEquals (4, switchExpr._evalCounter);
assertEquals (4, caseAExpr._evalCounter);
assertEquals (1, valueAExpr._evalCounter);
assertEquals (3, caseBExpr._evalCounter);
assertEquals (1, valueBExpr._evalCounter);
assertEquals (2, defaultExpr._evalCounter);
}
@Test public void testUsesOperatorEquals () {
final CheckEvaluationExpression switchExpr = new CheckEvaluationExpression ("xyz");
final CheckEvaluationExpression caseAExpr = new CheckEvaluationExpression ("a");
final CheckEvaluationExpression valueAExpr = new CheckEvaluationExpression ("aValue");
final CheckEvaluationExpression defaultExpr = new CheckEvaluationExpression ("defaultValue");
final List<Pair<ExpressionBase, ExpressionBase>> cases = new ArrayList<Pair<ExpressionBase,ExpressionBase>> ();
cases.add (new Pair<ExpressionBase, ExpressionBase> (caseAExpr, valueAExpr));
final SwitchExpression expr = new SwitchExpression (switchExpr, cases, defaultExpr, SOURCE_POS);
// register an equals function that returns "true" for any two strings
final NamedFunction myStringEquals = new NamedFunctionFactory ("operatorEquals", StringType.INSTANCE, StringType.INSTANCE) {
public Object invoke (ExecutionContext ctx, Object[] params) {
return true;
}
}.create();
final FunctionDefContextInternal fdc = createEmptyFdc (new CompositeTypesystem ());
fdc.register (myStringEquals, true);
final ExecutionContext ctx = createEmptyExecutionContext();
assertEquals ("defaultValue", expr.evaluate (ctx));
ctx.setFunctionDefContext(fdc);
assertEquals ("aValue", expr.evaluate (ctx));
}
}