@VisibleForTesting
  Object evaluate(final GenericRow row) {
    return term.getValue(new TermEvaluationContext(row));
  }
@SuppressWarnings("unchecked")
  @Test
  public void shouldEvaluateLambda() {
    // Given:
    final Expression lambda1 = new LambdaFunctionCall(
        ImmutableList.of("X"),
        new ArithmeticBinaryExpression(
            Operator.ADD,
            new IntegerLiteral(1),
            new LambdaVariable("X")
        )
    );
    final Expression lambda2 = new LambdaFunctionCall(
        ImmutableList.of("X", "Y"),
        new ArithmeticBinaryExpression(
            Operator.ADD,
            new LambdaVariable("Y"),
            new LambdaVariable("X")
        )
    );
    final Expression lambda3 = new LambdaFunctionCall(
        ImmutableList.of("X", "Y", "Z"),
        new ArithmeticBinaryExpression(
            Operator.ADD,
            new LambdaVariable("X"),
            new ArithmeticBinaryExpression(
                Operator.ADD, new LambdaVariable("Y"),
                new LambdaVariable("Z")
            )
        )
    );
    final Context context1 = new Context(ImmutableMap.of("X", SqlTypes.INTEGER));
    final Context context2 = new Context(ImmutableMap.of("X", SqlTypes.INTEGER,
            "Y", SqlTypes.INTEGER));
    final Context context3 = new Context(ImmutableMap.of("X", SqlTypes.INTEGER,
            "Y", SqlTypes.INTEGER, "Z", SqlTypes.INTEGER));

    // When:
    InterpretedExpression interpreter1 = interpreter(lambda1, context1);
    InterpretedExpression interpreter2 = interpreter(lambda2, context2);
    InterpretedExpression interpreter3 = interpreter(lambda3, context3);

    // Then:
    final Function<Integer, Integer> func1 = (Function<Integer, Integer>) interpreter1.evaluate(ROW);
    assertThat(func1.apply(1), is(2));
    assertThat(func1.apply(2), is(3));

    final BiFunction<Integer, Integer, Integer> func2 = (BiFunction<Integer, Integer, Integer>)
        interpreter2.evaluate(ROW);
    assertThat(func2.apply(1, 2), is(3));
    assertThat(func2.apply(2, 4), is(6));

    final TriFunction<Integer, Integer, Integer, Integer> func3
        = (TriFunction<Integer, Integer, Integer, Integer>) interpreter3.evaluate(ROW);
    assertThat(func3.apply(1, 2, 3), is(6));
    assertThat(func3.apply(2, 4, 6), is(12));
  }