/* * Copyright 2010 Henry Coles * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and limitations under the License. */ package org.pitest.functional; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.pitest.functional.prelude.Prelude.id; import static org.pitest.functional.prelude.Prelude.isEqualTo; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.List; import nl.jqno.equalsverifier.EqualsVerifier; import org.junit.Test; import org.pitest.functional.Option.None; import org.pitest.functional.Option.Some; import org.pitest.functional.prelude.Prelude; public class OptionTest { private static final String FOO = "foo"; @Test public void someShouldReturnNoneWhenPassedNull() { assertEquals(Option.none(), Option.some(null)); } @Test public void someShouldNotReturnNoneWhenPassedAValue() { assertFalse(Option.some(FOO).equals(Option.none())); } @Test public void shouldEqualItself() { assertEquals(Option.none(), Option.none()); } @Test public void shouldBeEqualsWhenConstructedWithSameValue() { assertEquals(Option.some(FOO), Option.some(FOO)); } @Test public void shouldNotBeEqualWhenConstructedWithDifferentValuesAreNotEqual() { assertFalse(Option.some(FOO).equals(Option.some("bar"))); } @Test public void noneShouldNotHaveSome() { assertFalse(Option.none().hasSome()); } @Test public void someShouldHaveSome() { assertTrue(Option.some(FOO).hasSome()); } @Test public void someShouldNotHaveNone() { assertFalse(Option.some(FOO).hasNone()); } @Test public void noneShouldHaveNone() { assertTrue(Option.none().hasNone()); } @Test public void shouldReturnUnderlyingValueWhenWeHaveSome() { assertEquals(FOO, Option.some(FOO).value()); } @Test(expected = UnsupportedOperationException.class) public void shouldThrowErrorIfTryToRetrieveValueWhenWeHaveNone() { Option.none().value(); } @Test public void shouldIterateOverNonValuesWhenNoneArePresent() { assertFalse(Option.none().iterator().hasNext()); } @Test public void shouldIterateOverExactlyOneValueWhenOneIsPresent() { final Option<String> testee = Option.some(FOO); final Iterator<String> it = testee.iterator(); assertEquals(FOO, it.next()); assertFalse(it.hasNext()); } @Test public void getOrElseShouldReturnElseConditionWhenNonePresent() { assertEquals("else", Option.none().getOrElse("else")); } @Test public void getOrElseShouldReturnValueWhenSomePresent() { assertEquals(FOO, Option.some(FOO).getOrElse("else")); } @Test public void forEachShouldBeAppliedToAllValues() { final Collection<String> actual = new ArrayList<String>(); Option.some(FOO).forEach(Prelude.accumulateTo(actual)); assertEquals(fooList(), actual); } @Test public void shouldMapSuppliedValue() { assertEquals(fooList(), Option.some(FOO).map(id(String.class))); } private List<String> fooList() { return Arrays.asList(FOO); } @Test public void shouldFlatMapSuppliedValue() { assertEquals(fooList(), Option.some(FOO).flatMap(Prelude.asList(String.class))); } @Test public void shouldFilterSuppliedValue() { assertEquals(fooList(), Option.some(FOO).filter(isEqualTo(FOO))); } @Test public void shouldImplementContains() { assertTrue(Option.some(FOO).contains(isEqualTo(FOO))); } @Test public void shouldObeyHashcodeEqualsContract() { EqualsVerifier.forClass(Some.class).verify(); EqualsVerifier.forClass(None.class).verify(); } }