package org.jtwig.render.expression.calculator;
import org.jtwig.exceptions.ResolveValueException;
import org.jtwig.model.expression.VariableExpression;
import org.jtwig.render.RenderRequest;
import org.jtwig.value.Undefined;
import org.jtwig.value.context.ValueContext;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.*;
public class VariableExpressionCalculatorTest {
private VariableExpressionCalculator underTest = new VariableExpressionCalculator();
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void calculateWhenUndefinedAndStrictMode() throws Exception {
RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS);
ValueContext valueContext = mock(ValueContext.class);
VariableExpression variableExpression = mock(VariableExpression.class);
String identifier = "identifier";
when(variableExpression.getIdentifier()).thenReturn(identifier);
when(request.getRenderContext().getCurrent(ValueContext.class)).thenReturn(valueContext);
when(valueContext.resolve(identifier)).thenReturn(Undefined.UNDEFINED);
when(request.getEnvironment().getRenderEnvironment().getStrictMode()).thenReturn(true);
expectedException.expect(ResolveValueException.class);
expectedException.expectMessage(containsString(String.format("Variable '%s' undefined", identifier)));
underTest.calculate(request, variableExpression);
}
@Test
public void calculateWhenUndefinedAndNotStrictMode() throws Exception {
RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS);
ValueContext valueContext = mock(ValueContext.class);
VariableExpression variableExpression = mock(VariableExpression.class);
String identifier = "identifier";
when(variableExpression.getIdentifier()).thenReturn(identifier);
when(request.getRenderContext().getCurrent(ValueContext.class)).thenReturn(valueContext);
when(valueContext.resolve(identifier)).thenReturn(Undefined.UNDEFINED);
when(request.getEnvironment().getRenderEnvironment().getStrictMode()).thenReturn(false);
Object result = underTest.calculate(request, variableExpression);
assertSame(Undefined.UNDEFINED, result);
}
@Test
public void calculateWhenDefined() throws Exception {
RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS);
VariableExpression variableExpression = mock(VariableExpression.class);
ValueContext valueContext = mock(ValueContext.class);
Object value = new Object();
String identifier = "identifier";
when(variableExpression.getIdentifier()).thenReturn(identifier);
when(request.getRenderContext().getCurrent(ValueContext.class)).thenReturn(valueContext);
when(valueContext.resolve(identifier)).thenReturn(value);
when(request.getEnvironment().getRenderEnvironment().getStrictMode()).thenReturn(false);
Object result = underTest.calculate(request, variableExpression);
assertSame(value, result);
}
}