/******************************************************************************* * Copyright (c) 2010 Andr� Arnold and others. * 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 *******************************************************************************/ 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.createLiteral; import static org.eclipse.xtend.backend.testhelpers.BackendTestHelper.createLocalVar; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.List; import org.eclipse.xtend.backend.common.EvaluationVetoException; import org.eclipse.xtend.backend.common.ExecutionContext; import org.eclipse.xtend.backend.common.ExecutionListener; import org.eclipse.xtend.backend.common.ExpressionBase; import org.eclipse.xtend.backend.common.FutureResultHolder; import org.eclipse.xtend.backend.common.FutureResultNotReadyException; import org.junit.Test; /** * @author Andr� Arnold - Initial contribution and API */ public class DeferredEvalExpressionTest { class ResultExtractorListener implements ExecutionListener { private Object intermediateResult; public Object getIntermediateResult() { return intermediateResult; } public void preExecute(ExecutionContext ctx, ExpressionBase originator) throws EvaluationVetoException { // TODO Auto-generated method stub } public void postExecute(Object result, ExecutionContext ctx, ExpressionBase originator) { intermediateResult = result; } } @Test public void testDeferredEvaluation () { ExecutionContext ctx = createEmptyExecutionContext(); ExpressionBase part1 = createLiteral ("First"); DeferredEvalExpression part2 = new DeferredEvalExpression (createLocalVar ("deferredVar"), null); final ExpressionBase expr = new NewLocalVarDefExpression ("deferredVar", createLiteral("bValue"), part2, SOURCE_POS); ExpressionBase part3 = createLiteral ("Last"); List<ExpressionBase> parts = new ArrayList<ExpressionBase> (); parts.add (part1); ResultExtractorListener listener = new ResultExtractorListener(); part2.registerExecutionListener (listener); parts.add (part2); parts.add (part3); ExpressionBase parentExpr = new ConcatExpression(parts, null); ctx.getLocalVarContext().getLocalVars().get("deferredVar"); Object preDefEvalResult = null; try { preDefEvalResult = parentExpr.evaluate(ctx); preDefEvalResult.toString(); fail(); } catch (FutureResultNotReadyException e) { assertTrue (true); } ctx.getLocalVarContext().getLocalVars().put ("deferredVar", "Deferred"); FutureResultHolder future = (FutureResultHolder) listener.getIntermediateResult(); Object o = future.evaluate(ctx); assertEquals("FirstDeferredLast", preDefEvalResult.toString()); } }