content: package com.annimon.stream.test.hamcrest;
  
  import com.annimon.stream.Optional;
  import org.junit.Test;
  import static com.annimon.stream.test.hamcrest.CommonMatcher.description;
  import static com.annimon.stream.test.hamcrest.CommonMatcher.hasOnlyPrivateConstructors;
  import static com.annimon.stream.test.hamcrest.OptionalMatcher.hasValue;
  import static com.annimon.stream.test.hamcrest.OptionalMatcher.hasValueThat;
  import static com.annimon.stream.test.hamcrest.OptionalMatcher.isEmpty;
  import static com.annimon.stream.test.hamcrest.OptionalMatcher.isPresent;
  import static org.hamcrest.CoreMatchers.is;
  import static org.hamcrest.CoreMatchers.not;
  import static org.hamcrest.CoreMatchers.startsWith;
  import static org.hamcrest.MatcherAssert.assertThat;
  
  public class OptionalMatcherTest {
  
      @Test
      public void testPrivateConstructor() {
          assertThat(OptionalMatcher.class, hasOnlyPrivateConstructors());
      }
  
      @Test
      public void testIsPresent() {
          Optional<Integer> optional = Optional.of(5);
          assertThat(optional, isPresent());
          assertThat(optional, not(isEmpty()));
  
          assertThat(isPresent(), description(is("Optional value should be present")));
      }
  
      @Test
      public void testIsEmpty() {
          Optional<Integer> optional = Optional.empty();
          assertThat(optional, isEmpty());
          assertThat(optional, not(isPresent()));
  
          assertThat(isEmpty(), description(is("Optional value should be empty")));
      }
  
      @Test
      public void testHasValue() {
          Optional<String> optional = Optional.of("text");
          assertThat(optional, hasValue("text"));
          assertThat(optional, not(hasValue("test")));
  
          assertThat(hasValue(42), description(is("Optional value is <42>")));
      }
  
      @Test
      public void testHasValueThat() {
          Optional<String> optional = Optional.of("text");
          assertThat(optional, hasValueThat(startsWith("te")));
  
          assertThat(hasValueThat(is(42)), description(is("Optional value is <42>")));
      }
  
      @Test(expected = AssertionError.class)
      public void testHasValueOnEmptyOptional() {
          assertThat(Optional.<String>empty(), hasValue(""));
      }
  
      @Test(expected = AssertionError.class)
      public void testIsEmptyOnNullValue() {
          assertThat(null, isEmpty());
      }
  
      @Test(expected = AssertionError.class)
      public void testIsPresentOnNullValue() {
          assertThat(null, isPresent());
      }
  
      @Test(expected = AssertionError.class)
      public void testHasValueOnNullValue() {
          assertThat(null, hasValue(""));
      }
  
      @Test(expected = AssertionError.class)
      public void testHasValueThatOnNullValue() {
          assertThat(null, hasValueThat(is("")));
      }
  }
  