package org.jtwig.render.expression.test; import com.google.common.base.Optional; import org.jtwig.model.expression.Expression; import org.jtwig.model.expression.test.TestExpression; import org.jtwig.model.position.Position; import org.jtwig.render.RenderRequest; import org.jtwig.render.expression.test.calculator.TestExpressionCalculator; 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.mock; import static org.mockito.Mockito.when; public class CalculateTestExpressionServiceTest { private final TestExpressionCalculatorSelector testExpressionCalculatorSelector = mock(TestExpressionCalculatorSelector.class); private CalculateTestExpressionService underTest = new CalculateTestExpressionService(testExpressionCalculatorSelector); @Rule public ExpectedException expectedException = ExpectedException.none(); @Test public void calculateIfNotFound() throws Exception { RenderRequest request = mock(RenderRequest.class); Position position = mock(Position.class); TestExpression testExpression = mock(TestExpression.class); Expression expression = mock(Expression.class); when(testExpressionCalculatorSelector.calculatorFor(testExpression)).thenReturn(Optional.<TestExpressionCalculator>absent()); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage(containsString(String.format("Cannot find test calculator for '%s'", testExpression.getClass()))); underTest.calculate(request, position, testExpression, expression); } @Test public void calculateIfFound() throws Exception { RenderRequest request = mock(RenderRequest.class); Position position = mock(Position.class); TestExpression testExpression = mock(TestExpression.class); Expression argument = mock(Expression.class); TestExpressionCalculator testExpressionCalculator = mock(TestExpressionCalculator.class); Object expected = new Object(); when(testExpressionCalculatorSelector.calculatorFor(testExpression)).thenReturn(Optional.of(testExpressionCalculator)); when(testExpressionCalculator.calculate(request, position, testExpression, argument)).thenReturn(expected); Object result = underTest.calculate(request, position, testExpression, argument); assertSame(expected, result); } }