content: package com.annimon.stream.function;
  
  import com.annimon.stream.Functions;
  import java.util.Locale;
  import org.junit.Test;
  import static com.annimon.stream.test.hamcrest.CommonMatcher.hasOnlyPrivateConstructors;
  import static org.hamcrest.MatcherAssert.assertThat;
  import static org.junit.Assert.assertEquals;
  
  /**
   * Tests {@code BiFunction}.
   * 
   * @see com.annimon.stream.function.BiFunction
   */
  public class BiFunctionTest {
      
      private static final boolean TO_UPPER = true;
      private static final boolean TO_LOWER = false;
      private static final boolean INCREMENT = true;
      private static final boolean IDENTITY = false;
      
      @Test
      public void testApplyCharacterToString() {
          assertEquals("w", toString.apply('w', TO_LOWER));
          assertEquals("x", toString.apply('w', TO_UPPER));
      }
      
      @Test
      public void testApplyAsciiToString() {
          assertEquals("0", toString.apply((char)48, TO_LOWER));
          assertEquals("1", toString.apply((char)48, TO_UPPER));
      }
      
      @Test
      public void testApplyChangeCase() {
          assertEquals("JAVA", changeCase.apply("JAva", TO_UPPER));
          assertEquals("java", changeCase.apply("JAva", TO_LOWER));
      }
      
      @Test
      public void testAndThen() {
          BiFunction<Character, Boolean, Integer> function = BiFunction.Util.andThen(
                  toString, Functions.stringToInteger());
          assertEquals(0, (int) function.apply('0', IDENTITY));
          assertEquals(1, (int) function.apply('0', INCREMENT));
      }
  
      @Test
      public void testReverse() {
          BiFunction<Boolean, String, String> function = BiFunction.Util.reverse(changeCase);
          assertEquals("JAVA", function.apply(TO_UPPER, "JAva"));
          assertEquals("java", function.apply(TO_LOWER, "JAva"));
      }
      
      @Test
      public void testPrivateConstructor() throws Exception {
          assertThat(BiFunction.Util.class, hasOnlyPrivateConstructors());
      }
      
      private static final BiFunction<Character, Boolean, String> toString = new BiFunction<Character, Boolean, String>() {
          @Override
          public String apply(Character value, Boolean increment) {
              final char character = (char) (increment ? value + 1 : value);
              return String.valueOf(character);
          }
      };
      
      private static final BiFunction<String, Boolean, String> changeCase = new BiFunction<String, Boolean, String>() {
          @Override
          public String apply(String value, Boolean flag) {
              if (flag) return value.toUpperCase(Locale.ENGLISH);
              return value.toLowerCase(Locale.ENGLISH);
          }
      };
      
  }
  