/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.collect.result; import static com.opengamma.strata.collect.CollectProjectAssertions.assertThat; import static com.opengamma.strata.collect.TestHelper.assertThrows; import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg; import static com.opengamma.strata.collect.result.FailureReason.CALCULATION_FAILED; import static com.opengamma.strata.collect.result.FailureReason.ERROR; import static com.opengamma.strata.collect.result.FailureReason.MISSING_DATA; import static org.assertj.core.api.Assertions.assertThat; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.function.BiFunction; import java.util.function.Function; import org.testng.annotations.Test; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.opengamma.strata.collect.TestHelper; /** * Test. */ @Test public class ResultTest { private static final Function<String, Integer> MAP_STRLEN = String::length; private static final Function<String, Result<Integer>> FUNCTION_STRLEN = input -> Result.success(input.length()); private static final BiFunction<String, String, Result<String>> FUNCTION_MERGE = (t, u) -> Result.success(t + " " + u); //------------------------------------------------------------------------- public void success() { Result<String> test = Result.success("success"); assertEquals(test.isSuccess(), true); assertEquals(test.isFailure(), false); assertEquals(test.getValue(), "success"); assertEquals(test.getValueOrElse("blue"), "success"); assertThrowsIllegalArg(() -> test.getValueOrElse(null)); assertThrowsIllegalArg(() -> test.getValueOrElseApply(null)); } public void success_getFailure() { Result<String> test = Result.success("success"); assertThrows(test::getFailure, IllegalStateException.class); } //------------------------------------------------------------------------- public void success_map() { Result<String> success = Result.success("success"); Result<Integer> test = success.map(MAP_STRLEN); assertEquals(test.isSuccess(), true); assertEquals(test.getValue(), Integer.valueOf(7)); } public void success_flatMap() { Result<String> success = Result.success("success"); Result<Integer> test = success.flatMap(FUNCTION_STRLEN); assertEquals(test.isSuccess(), true); assertEquals(test.getValue(), Integer.valueOf(7)); } public void success_combineWith_success() { Result<String> success1 = Result.success("Hello"); Result<String> success2 = Result.success("World"); Result<String> test = success1.combineWith(success2, FUNCTION_MERGE); assertEquals(test.isSuccess(), true); assertEquals(test.getValue(), "Hello World"); } public void success_combineWith_failure() { Result<String> success = Result.success("Hello"); Result<String> failure = Result.failure(new IllegalArgumentException()); Result<String> test = success.combineWith(failure, FUNCTION_MERGE); assertEquals(test.isSuccess(), false); assertEquals(test.getFailure().getReason(), ERROR); assertEquals(test.getFailure().getItems().size(), 1); } public void success_combineWith_success_throws() { Result<String> success1 = Result.success("Hello"); Result<String> success2 = Result.success("World"); Result<String> test = success1.combineWith(success2, (s1, s2) -> { throw new IllegalArgumentException("Ooops"); }); assertThat(test) .isFailure() .hasFailureMessageMatching("Ooops"); } public void success_stream() { Result<String> success = Result.success("Hello"); assertThat(success.stream().toArray()).containsExactly("Hello"); } public void success_map_throwing() { Result<String> success = Result.success("success"); Result<Integer> test = success.map(r -> { throw new IllegalArgumentException("Big bad error"); }); assertEquals(test.isSuccess(), false); assertThat(test) .isFailure(ERROR) .hasFailureMessageMatching("Big bad error"); } public void success_flatMap_throwing() { Result<String> success = Result.success("success"); Result<Integer> test = success.flatMap(r -> { throw new IllegalArgumentException("Big bad error"); }); assertEquals(test.isSuccess(), false); assertThat(test) .isFailure(ERROR) .hasFailureMessageMatching("Big bad error"); } //------------------------------------------------------------------------- public void failure() { IllegalArgumentException ex = new IllegalArgumentException("failure"); Result<String> test = Result.failure(ex); assertEquals(test.isSuccess(), false); assertEquals(test.isFailure(), true); assertEquals(test.getValueOrElse("blue"), "blue"); assertEquals(test.getValueOrElseApply(f -> "blue"), "blue"); assertEquals(test.getValueOrElseApply(Failure::getMessage), "failure"); assertThrowsIllegalArg(() -> test.getValueOrElse(null)); assertThrowsIllegalArg(() -> test.getValueOrElseApply(null)); assertEquals(test.getFailure().getReason(), ERROR); assertEquals(test.getFailure().getMessage(), "failure"); assertEquals(test.getFailure().getItems().size(), 1); FailureItem item = test.getFailure().getItems().iterator().next(); assertEquals(item.getReason(), ERROR); assertEquals(item.getMessage(), "failure"); assertEquals(item.getCauseType().get(), ex.getClass()); assertEquals(item.getStackTrace(), Throwables.getStackTraceAsString(ex)); } public void failure_map_flatMap_ifSuccess() { Result<String> test = Result.failure(new IllegalArgumentException("failure")); Result<Integer> test1 = test.map(MAP_STRLEN); assertSame(test1, test); Result<Integer> test2 = test.flatMap(FUNCTION_STRLEN); assertSame(test2, test); } @Test(expectedExceptions = IllegalStateException.class) public void failure_getValue() { Result<String> test = Result.failure(new IllegalArgumentException()); test.getValue(); } public void failure_combineWith_success() { Result<String> failure = Result.failure(new IllegalArgumentException("failure")); Result<String> success = Result.success("World"); Result<String> test = failure.combineWith(success, FUNCTION_MERGE); assertEquals(test.getFailure().getReason(), ERROR); assertEquals(test.getFailure().getMessage(), "failure"); } public void failure_combineWith_failure() { Result<String> failure1 = Result.failure(new IllegalArgumentException("failure")); Result<String> failure2 = Result.failure(new IllegalArgumentException("fail")); Result<String> test = failure1.combineWith(failure2, FUNCTION_MERGE); assertEquals(test.getFailure().getReason(), ERROR); assertEquals(test.getFailure().getMessage(), "failure, fail"); } public void failure_stream() { Result<String> failure = Result.failure(new IllegalArgumentException("failure")); assertThat(failure.stream().toArray()).isEmpty(); } public void failure_map_throwing() { Result<String> success = Result.failure(new IllegalArgumentException("failure")); Result<Integer> test = success.map(r -> { throw new IllegalArgumentException("Big bad error"); }); assertEquals(test.isSuccess(), false); assertEquals(test.getFailure().getReason(), ERROR); assertEquals(test.getFailure().getMessage(), "failure"); } public void failure_flatMap_throwing() { Result<String> success = Result.failure(new IllegalArgumentException("failure")); Result<Integer> test = success.flatMap(r -> { throw new IllegalArgumentException("Big bad error"); }); assertEquals(test.isSuccess(), false); assertEquals(test.getFailure().getReason(), ERROR); assertEquals(test.getFailure().getMessage(), "failure"); } //------------------------------------------------------------------------- public void failure_fromStatusMessageArgs_placeholdersMatchArgs1() { Result<String> failure = Result.failure(ERROR, "my {} failure", "blue"); Result<Integer> test = Result.failure(failure); assertTrue(test.isFailure()); assertEquals(test.getFailure().getMessage(), "my blue failure"); } public void failure_fromStatusMessageArgs_placeholdersMatchArgs2() { Result<String> failure = Result.failure(ERROR, "my {} {} failure", "blue", "rabbit"); Result<Integer> test = Result.failure(failure); assertTrue(test.isFailure()); assertEquals(test.getFailure().getMessage(), "my blue rabbit failure"); } public void failure_fromStatusMessageArgs_placeholdersExceedArgs() { Result<String> failure = Result.failure(ERROR, "my {} {} failure", "blue"); Result<Integer> test = Result.failure(failure); assertTrue(test.isFailure()); assertEquals(test.getFailure().getMessage(), "my blue {} failure"); } public void failure_fromStatusMessageArgs_placeholdersLessThanArgs1() { Result<String> failure = Result.failure(ERROR, "my {} failure", "blue", "rabbit"); Result<Integer> test = Result.failure(failure); assertTrue(test.isFailure()); assertEquals(test.getFailure().getMessage(), "my blue failure - [rabbit]"); } public void failure_fromStatusMessageArgs_placeholdersLessThanArgs2() { Result<String> failure = Result.failure(ERROR, "my {} failure", "blue", "rabbit", "carrot"); Result<Integer> test = Result.failure(failure); assertTrue(test.isFailure()); assertEquals(test.getFailure().getMessage(), "my blue failure - [rabbit, carrot]"); } public void failure_fromStatusMessageArgs_placeholdersLessThanArgs3() { Result<String> failure = Result.failure(ERROR, "my failure", "blue", "rabbit", "carrot"); Result<Integer> test = Result.failure(failure); assertTrue(test.isFailure()); assertEquals(test.getFailure().getMessage(), "my failure - [blue, rabbit, carrot]"); } //------------------------------------------------------------------------- public void failure_fromResult_failure() { Result<String> failure = Result.failure(ERROR, "my failure"); Result<Integer> test = Result.failure(failure); assertTrue(test.isFailure()); assertEquals(test.getFailure().getMessage(), "my failure"); assertEquals(test.getFailure().getItems().size(), 1); FailureItem item = test.getFailure().getItems().iterator().next(); assertEquals(item.getReason(), ERROR); assertEquals(item.getMessage(), "my failure"); assertEquals(item.getCauseType().isPresent(), false); assertEquals(item.getStackTrace().contains(".FailureItem.of("), false); assertEquals(item.getStackTrace().contains(".Failure.of("), false); assertEquals(item.getStackTrace().contains(".Result.failure("), false); } @Test(expectedExceptions = IllegalArgumentException.class) public void failure_fromResult_success() { Result<String> success = Result.success("Hello"); Result.failure(success); } //------------------------------------------------------------------------- public void failure_fromFailure() { Failure failure = Failure.of(ERROR, "my failure"); Result<Integer> test = Result.failure(failure); assertTrue(test.isFailure()); assertEquals(test.getFailure().getMessage(), "my failure"); assertEquals(test.getFailure().getItems().size(), 1); FailureItem item = test.getFailure().getItems().iterator().next(); assertEquals(item.getReason(), ERROR); assertEquals(item.getMessage(), "my failure"); assertEquals(item.getCauseType().isPresent(), false); assertTrue(item.getStackTrace() != null); } //------------------------------------------------------------------------- public void ofNullable_nonNull() { Result<Integer> test = Result.ofNullable(6); assertFalse(test.isFailure()); assertEquals(test.getValue().intValue(), 6); } public void ofNullable_null() { Result<Integer> test = Result.ofNullable(null); assertTrue(test.isFailure()); assertEquals(test.getFailure().getMessage(), "Found null where a value was expected"); assertEquals(test.getFailure().getItems().size(), 1); FailureItem item = test.getFailure().getItems().iterator().next(); assertEquals(item.getReason(), MISSING_DATA); assertEquals(item.getMessage(), "Found null where a value was expected"); assertEquals(item.getCauseType().isPresent(), false); assertTrue(item.getStackTrace() != null); } //------------------------------------------------------------------------- public void of_with_success() { Result<String> test = Result.of(() -> "success"); assertEquals(test.isSuccess(), true); assertEquals(test.isFailure(), false); assertEquals(test.getValue(), "success"); } public void of_with_exception() { Result<String> test = Result.of(() -> { throw new IllegalArgumentException("Big bad error"); }); assertEquals(test.isSuccess(), false); assertEquals(test.isFailure(), true); assertThrows(test::getValue, IllegalStateException.class); } public void wrap_with_success() { Result<String> test = Result.wrap(() -> Result.success("success")); assertEquals(test.isSuccess(), true); assertEquals(test.isFailure(), false); assertEquals(test.getValue(), "success"); } public void wrap_with_failure() { Result<String> test = Result.wrap(() -> Result.failure(ERROR, "Something failed")); assertEquals(test.isSuccess(), false); assertEquals(test.isFailure(), true); assertThrows(test::getValue, IllegalStateException.class); } public void wrap_with_exception() { Result<String> test = Result.wrap(() -> { throw new IllegalArgumentException("Big bad error"); }); assertEquals(test.isSuccess(), false); assertEquals(test.isFailure(), true); assertThrows(test::getValue, IllegalStateException.class); } //------------------------------------------------------------------------- public void anyFailures_varargs() { Result<String> success1 = Result.success("success 1"); Result<String> success2 = Result.success("success 1"); Result<Object> failure1 = Result.failure(MISSING_DATA, "failure 1"); Result<Object> failure2 = Result.failure(ERROR, "failure 2"); assertTrue(Result.anyFailures(failure1, failure2)); assertTrue(Result.anyFailures(failure1, success1)); assertFalse(Result.anyFailures(success1, success2)); } public void anyFailures_collection() { Result<String> success1 = Result.success("success 1"); Result<String> success2 = Result.success("success 1"); Result<Object> failure1 = Result.failure(MISSING_DATA, "failure 1"); Result<Object> failure2 = Result.failure(ERROR, "failure 2"); assertTrue(Result.anyFailures(ImmutableList.of(failure1, failure2))); assertTrue(Result.anyFailures(ImmutableList.of(failure1, success1))); assertFalse(Result.anyFailures(ImmutableList.of(success1, success2))); } public void countFailures_varargs() { Result<String> success1 = Result.success("success 1"); Result<String> success2 = Result.success("success 1"); Result<Object> failure1 = Result.failure(MISSING_DATA, "failure 1"); Result<Object> failure2 = Result.failure(ERROR, "failure 2"); assertEquals(Result.countFailures(failure1, failure2), 2); assertEquals(Result.countFailures(failure1, success1), 1); assertEquals(Result.countFailures(success1, success2), 0); } public void countFailures_collection() { Result<String> success1 = Result.success("success 1"); Result<String> success2 = Result.success("success 1"); Result<Object> failure1 = Result.failure(MISSING_DATA, "failure 1"); Result<Object> failure2 = Result.failure(ERROR, "failure 2"); assertEquals(Result.countFailures(ImmutableList.of(failure1, failure2)), 2); assertEquals(Result.countFailures(ImmutableList.of(failure1, success1)), 1); assertEquals(Result.countFailures(ImmutableList.of(success1, success2)), 0); } public void allSuccess_varargs() { Result<String> success1 = Result.success("success 1"); Result<String> success2 = Result.success("success 1"); Result<Object> failure1 = Result.failure(MISSING_DATA, "failure 1"); Result<Object> failure2 = Result.failure(ERROR, "failure 2"); assertFalse(Result.allSuccessful(failure1, failure2)); assertFalse(Result.allSuccessful(failure1, success1)); assertTrue(Result.allSuccessful(success1, success2)); } public void allSuccess_collection() { Result<String> success1 = Result.success("success 1"); Result<String> success2 = Result.success("success 1"); Result<Object> failure1 = Result.failure(MISSING_DATA, "failure 1"); Result<Object> failure2 = Result.failure(ERROR, "failure 2"); assertFalse(Result.allSuccessful(ImmutableList.of(failure1, failure2))); assertFalse(Result.allSuccessful(ImmutableList.of(failure1, success1))); assertTrue(Result.allSuccessful(ImmutableList.of(success1, success2))); } //------------------------------------------------------------------------- public void combine_iterableWithFailures() { Result<String> success1 = Result.success("success 1"); Result<String> success2 = Result.success("success 2"); Result<String> failure1 = Result.failure(MISSING_DATA, "failure 1"); Result<String> failure2 = Result.failure(ERROR, "failure 2"); Set<Result<String>> results = ImmutableSet.of(success1, success2, failure1, failure2); assertThat(Result.combine(results, s -> s)) .isFailure(FailureReason.MULTIPLE); } public void combine_iterableWithSuccesses() { Result<Integer> success1 = Result.success(1); Result<Integer> success2 = Result.success(2); Result<Integer> success3 = Result.success(3); Result<Integer> success4 = Result.success(4); Set<Result<Integer>> results = ImmutableSet.of(success1, success2, success3, success4); Result<String> combined = Result.combine( results, s -> "res" + s.reduce(1, (i1, i2) -> i1 * i2)); assertThat(combined) .isSuccess() .hasValue("res24"); } public void combine_iterableWithSuccesses_throws() { Result<Integer> success1 = Result.success(1); Result<Integer> success2 = Result.success(2); Result<Integer> success3 = Result.success(3); Result<Integer> success4 = Result.success(4); Set<Result<Integer>> results = ImmutableSet.of(success1, success2, success3, success4); Result<String> combined = Result.combine( results, s -> { throw new IllegalArgumentException("Ooops"); }); assertThat(combined) .isFailure(ERROR) .hasFailureMessageMatching("Ooops"); } //------------------------------------------------------------------------- public void flatCombine_iterableWithFailures() { Result<String> success1 = Result.success("success 1"); Result<String> success2 = Result.success("success 2"); Result<String> failure1 = Result.failure(MISSING_DATA, "failure 1"); Result<String> failure2 = Result.failure(ERROR, "failure 2"); Set<Result<String>> results = ImmutableSet.of(success1, success2, failure1, failure2); assertThat(Result.flatCombine(results, Result::success)) .isFailure(FailureReason.MULTIPLE); } public void flatCombine_iterableWithSuccesses_combineFails() { Result<Integer> success1 = Result.success(1); Result<Integer> success2 = Result.success(2); Result<Integer> success3 = Result.success(3); Result<Integer> success4 = Result.success(4); Set<Result<Integer>> results = ImmutableSet.of(success1, success2, success3, success4); Result<String> combined = Result.flatCombine( results, s -> Result.failure(CALCULATION_FAILED, "Could not do it")); assertThat(combined) .isFailure(CALCULATION_FAILED); } public void flatCombine_iterableWithSuccesses_combineSucceeds() { Result<Integer> success1 = Result.success(1); Result<Integer> success2 = Result.success(2); Result<Integer> success3 = Result.success(3); Result<Integer> success4 = Result.success(4); Set<Result<Integer>> results = ImmutableSet.of(success1, success2, success3, success4); Result<String> combined = Result.flatCombine( results, s -> Result.success("res" + s.reduce(1, (i1, i2) -> i1 * i2))); assertThat(combined) .isSuccess() .hasValue("res24"); } public void flatCombine_iterableWithSuccesses_combineThrows() { Result<Integer> success1 = Result.success(1); Result<Integer> success2 = Result.success(2); Result<Integer> success3 = Result.success(3); Result<Integer> success4 = Result.success(4); Set<Result<Integer>> results = ImmutableSet.of(success1, success2, success3, success4); Result<String> combined = Result.flatCombine( results, s -> { throw new IllegalArgumentException("Ooops"); }); assertThat(combined) .isFailure(ERROR) .hasFailureMessageMatching("Ooops"); } //------------------------------------------------------------------------- public void failure_fromResults_varargs1() { Result<String> success1 = Result.success("success 1"); Result<String> success2 = Result.success("success 1"); Result<Object> failure1 = Result.failure(MISSING_DATA, "failure 1"); Result<Object> failure2 = Result.failure(ERROR, "failure 2"); Result<Object> test = Result.failure(success1, success2, failure1, failure2); Set<FailureItem> expected = new HashSet<>(); expected.addAll(failure1.getFailure().getItems()); expected.addAll(failure2.getFailure().getItems()); assertEquals(test.getFailure().getItems(), expected); } public void failure_fromResults_varargs2() { Result<String> success1 = Result.success("success 1"); Result<String> success2 = Result.success("success 1"); Result<Object> failure1 = Result.failure(MISSING_DATA, "failure 1"); Result<Object> failure2 = Result.failure(ERROR, "failure 2"); Result<Object> test = Result.failure(success1, failure1, success2, failure2); Set<FailureItem> expected = new HashSet<>(); expected.addAll(failure1.getFailure().getItems()); expected.addAll(failure2.getFailure().getItems()); assertEquals(test.getFailure().getItems(), expected); } @Test(expectedExceptions = IllegalArgumentException.class) public void failure_fromResults_varargs_allSuccess() { Result<String> success1 = Result.success("success 1"); Result<String> success2 = Result.success("success 1"); Result.failure(success1, success2); } public void failure_fromResults_collection() { Result<String> success1 = Result.success("success 1"); Result<String> success2 = Result.success("success 1"); Result<String> failure1 = Result.failure(MISSING_DATA, "failure 1"); Result<String> failure2 = Result.failure(ERROR, "failure 2"); // Exposing collection explicitly shows why signature of failure is as it is List<Result<String>> results = Arrays.asList(success1, success2, failure1, failure2); Result<String> test = Result.failure(results); Set<FailureItem> expected = new HashSet<>(); expected.addAll(failure1.getFailure().getItems()); expected.addAll(failure2.getFailure().getItems()); assertEquals(test.getFailure().getItems(), expected); } @Test(expectedExceptions = IllegalArgumentException.class) public void failure_fromResults_collection_allSuccess() { Result<String> success1 = Result.success("success 1"); Result<String> success2 = Result.success("success 1"); Result.failure(Arrays.asList(success1, success2)); } //------------------------------------------------------------------------- public void generateFailureFromException() { Exception exception = new Exception("something went wrong"); Result<Object> test = Result.failure(exception); assertEquals(test.getFailure().getReason(), ERROR); assertEquals(test.getFailure().getMessage(), "something went wrong"); } public void generateFailureFromExceptionWithMessage() { Exception exception = new Exception("something went wrong"); Result<Object> test = Result.failure(exception, "my message"); assertEquals(test.getFailure().getReason(), ERROR); assertEquals(test.getFailure().getMessage(), "my message"); } public void generateFailureFromExceptionWithCustomStatus() { Exception exception = new Exception("something went wrong"); Result<Object> test = Result.failure(CALCULATION_FAILED, exception); assertEquals(test.getFailure().getReason(), CALCULATION_FAILED); assertEquals(test.getFailure().getMessage(), "something went wrong"); } public void generateFailureFromExceptionWithCustomStatusAndMessage() { Exception exception = new Exception("something went wrong"); Result<Object> test = Result.failure(CALCULATION_FAILED, exception, "my message"); assertEquals(test.getFailure().getReason(), CALCULATION_FAILED); assertEquals(test.getFailure().getMessage(), "my message"); } //------------------------------------------------------------------------- public void failureDeduplicateFailure() { Result<Object> result = Result.failure(MISSING_DATA, "failure"); FailureItem failure = result.getFailure().getItems().iterator().next(); Result<Object> test = Result.failure(result, result); assertEquals(test.getFailure().getItems().size(), 1); assertEquals(test.getFailure().getItems(), ImmutableSet.of(failure)); assertEquals(test.getFailure().getMessage(), "failure"); } public void failureSameType() { Result<Object> failure1 = Result.failure(MISSING_DATA, "message 1"); Result<Object> failure2 = Result.failure(MISSING_DATA, "message 2"); Result<Object> failure3 = Result.failure(MISSING_DATA, "message 3"); Result<?> composite = Result.failure(failure1, failure2, failure3); assertEquals(composite.getFailure().getReason(), MISSING_DATA); assertEquals(composite.getFailure().getMessage(), "message 1, message 2, message 3"); } public void failureDifferentTypes() { Result<Object> failure1 = Result.failure(MISSING_DATA, "message 1"); Result<Object> failure2 = Result.failure(CALCULATION_FAILED, "message 2"); Result<Object> failure3 = Result.failure(ERROR, "message 3"); Result<?> composite = Result.failure(failure1, failure2, failure3); assertEquals(composite.getFailure().getReason(), FailureReason.MULTIPLE); assertEquals(composite.getFailure().getMessage(), "message 1, message 2, message 3"); } //------------------------------------------------------------------------ @Test(expectedExceptions = IllegalArgumentException.class) public void createByBuilder_neitherValueNorFailure() { Result.meta().builder().build(); } @Test(expectedExceptions = IllegalArgumentException.class) public void createByBuilder_bothValueAndFailure() { Result.meta().builder() .set("value", "A") .set("failure", Failure.of(CALCULATION_FAILED, "Fail")) .build(); } //------------------------------------------------------------------------- public void generatedStackTrace() { Result<Object> test = Result.failure(FailureReason.INVALID, "my {} {} failure", "big", "bad"); assertEquals(test.getFailure().getReason(), FailureReason.INVALID); assertEquals(test.getFailure().getMessage(), "my big bad failure"); assertEquals(test.getFailure().getItems().size(), 1); FailureItem item = test.getFailure().getItems().iterator().next(); assertEquals(item.getCauseType().isPresent(), false); assertEquals(item.getStackTrace().contains(".FailureItem.of("), false); assertEquals(item.getStackTrace().contains(".Failure.of("), false); assertEquals(item.getStackTrace().startsWith("com.opengamma.strata.collect.result.FailureItem: my big bad failure"), true); assertEquals(item.getStackTrace().contains(".generatedStackTrace("), true); assertEquals(item.toString(), "INVALID: my big bad failure"); } //------------------------------------------------------------------------- public void generatedStackTrace_Failure() { Failure test = Failure.of(FailureReason.INVALID, "my {} {} failure", "big", "bad"); assertEquals(test.getReason(), FailureReason.INVALID); assertEquals(test.getMessage(), "my big bad failure"); assertEquals(test.getItems().size(), 1); FailureItem item = test.getItems().iterator().next(); assertEquals(item.getCauseType().isPresent(), false); assertEquals(item.getStackTrace().contains(".FailureItem.of("), false); assertEquals(item.getStackTrace().contains(".Failure.of("), false); assertEquals(item.getStackTrace().startsWith("com.opengamma.strata.collect.result.FailureItem: my big bad failure"), true); assertEquals(item.getStackTrace().contains(".generatedStackTrace_Failure("), true); assertEquals(item.toString(), "INVALID: my big bad failure"); } //------------------------------------------------------------------------ public void equalsHashCode() { Exception ex = new Exception("Problem"); Result<Object> a1 = Result.failure(MISSING_DATA, ex); Result<Object> a2 = Result.failure(MISSING_DATA, ex); Result<Object> b = Result.failure(ERROR, "message 2"); Result<Object> c = Result.success("Foo"); Result<Object> d = Result.success("Bar"); assertEquals(a1.equals(a1), true); assertEquals(a1.equals(a2), true); assertEquals(a1.equals(b), false); assertEquals(a1.equals(c), false); assertEquals(a1.equals(d), false); assertEquals(b.equals(a1), false); assertEquals(b.equals(a2), false); assertEquals(b.equals(b), true); assertEquals(b.equals(c), false); assertEquals(b.equals(d), false); assertEquals(c.equals(a1), false); assertEquals(c.equals(a2), false); assertEquals(c.equals(b), false); assertEquals(c.equals(c), true); assertEquals(c.equals(d), false); assertEquals(d.equals(a1), false); assertEquals(d.equals(a2), false); assertEquals(d.equals(b), false); assertEquals(d.equals(c), false); assertEquals(d.equals(d), true); } // Following are tests for Result using the AssertJ assertions // Primarily a test of the assertions themselves public void assert_success() { Result<String> test = Result.success("success"); assertThat(test) .isSuccess() .hasValue("success"); } // We can't use assertThrows as that rethrows AssertionError @Test(expectedExceptions = AssertionError.class) public void assert_success_getFailure() { Result<String> test = Result.success("success"); assertThat(test).isFailure(); } public void assert_success_map() { Result<String> success = Result.success("success"); Result<Integer> test = success.map(MAP_STRLEN); assertThat(test).isSuccess().hasValue(7); } public void assert_success_flatMap() { Result<String> success = Result.success("success"); Result<Integer> test = success.flatMap(FUNCTION_STRLEN); assertThat(test).isSuccess().hasValue(7); } public void assert_success_combineWith_success() { Result<String> success1 = Result.success("Hello"); Result<String> success2 = Result.success("World"); Result<String> test = success1.combineWith(success2, FUNCTION_MERGE); assertThat(test).isSuccess().hasValue("Hello World"); } public void assert_success_combineWith_failure() { Result<String> success = Result.success("Hello"); Result<String> failure = Result.failure(new IllegalArgumentException()); Result<String> test = success.combineWith(failure, FUNCTION_MERGE); assertThat(test).isFailure(ERROR); assertThat(test.getFailure().getItems().size()).isEqualTo(1); } public void assert_failure() { Result<String> test = Result.failure(new IllegalArgumentException("failure")); assertThat(test) .isFailure(ERROR) .hasFailureMessageMatching("failure"); } //------------------------------------------------------------------------- public void coverage() { Result<Object> failure = Result.failure(MISSING_DATA, "message 1"); TestHelper.coverImmutableBean(failure); TestHelper.coverImmutableBean(failure.getFailure()); TestHelper.coverImmutableBean(failure.getFailure().getItems().iterator().next()); Result<String> success = Result.success("Hello"); TestHelper.coverImmutableBean(success); TestHelper.coverEnum(FailureReason.class); } }