package com.hubspot.jinjava.interpret;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.*;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableMap;
import com.hubspot.jinjava.interpret.LazyExpression.Memoization;
import java.util.List;
import org.junit.Test;

public class LazyExpressionTest {

  @Test
  public void itSerializesUnderlyingValue() throws JsonProcessingException {
    LazyExpression expression = LazyExpression.of(
      () -> ImmutableMap.of("test", "hello", "test2", "hello2"),
      "{}"
    );
    Object evaluated = expression.get();
    assertThat(evaluated).isNotNull();
    assertThat(new ObjectMapper().writeValueAsString(expression))
      .isEqualTo("{\"test\":\"hello\",\"test2\":\"hello2\"}");
  }

  @Test
  public void itSerializesNonEvaluatedValueToEmpty() throws JsonProcessingException {
    LazyExpression expression = LazyExpression.of(
      () -> ImmutableMap.of("test", "hello", "test2", "hello2"),
      "{}"
    );
    assertThat(new ObjectMapper().writeValueAsString(expression)).isEqualTo("\"\"");
  }

  @Test
  public void itMemoizesByDefault() {
    List mock = mock(List.class);
    LazyExpression expression = LazyExpression.of(mock::isEmpty, "");
    expression.get();
    expression.get();
    verify(mock, times(1)).isEmpty();
  }

  @Test
  public void itAllowsMemoizationToBeDisabled() {
    List mock = mock(List.class);
    LazyExpression expression = LazyExpression.of(mock::isEmpty, "", Memoization.OFF);
    expression.get();
    expression.get();
    verify(mock, times(2)).isEmpty();
  }

  @Test
  public void itAllowsMemoizationToBeEnabled() {
    List mock = mock(List.class);
    LazyExpression expression = LazyExpression.of(mock::isEmpty, "", Memoization.ON);
    expression.get();
    expression.get();
    verify(mock, times(1)).isEmpty();
  }
}

@@ -1390,34 +1390,24 @@
  verify(mock
-, times(1)
 ).isEmpty();
@@ -1918,18 +1918,8 @@
 mock
-, times(1)
 ).is

Apply suggestions from code review