/*
 * Copyright 2019, TeamDev. All rights reserved.
 *
 * Redistribution and use in source and/or binary forms, with or without
 * modification, must retain the above copyright notice and the following
 * disclaimer.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package io.spine.base;

import io.spine.testing.UtilityClassTest;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static io.spine.base.Errors.causeOf;
import static io.spine.base.Errors.fromThrowable;
import static io.spine.base.Identifier.newUuid;
import static org.junit.jupiter.api.Assertions.assertEquals;

@DisplayName("Errors utility class should")
class ErrorsTest extends UtilityClassTest<Errors> {

    ErrorsTest() {
        super(Errors.class);
    }

    @Test
    @DisplayName("convert cause of throwable to Error")
    void convert_cause_of_throwable_to_Error() {
        int errorCode = 404;
        String errorMessage = newUuid();

        // A Throwable with cause.
        RuntimeException throwable = new IllegalStateException(
                new RuntimeException(errorMessage)
        );

        Error error = causeOf(throwable, errorCode);

        assertEquals(errorCode, error.getCode());
        assertEquals(errorMessage, error.getMessage());
    }

    @Test
    @DisplayName("convert throwable to Error")
    void convert_throwable_to_Error() {
        String errorMessage = newUuid();
        RuntimeException throwable = new RuntimeException(errorMessage);

        Error error = fromThrowable(throwable);

        assertEquals(errorMessage, error.getMessage());
    }
}

@@ -1083,78 +1083,274 @@
 ort 
-org.junit.jupiter.api.DisplayName;%0Aimport org.junit.jupiter.api.Test;%0A
+io.spine.validate.ConstraintViolation;%0Aimport io.spine.validate.ValidationException;%0Aimport org.junit.jupiter.api.DisplayName;%0Aimport org.junit.jupiter.api.Test;%0Aimport com.google.common.collect.ImmutableList;%0A%0Aimport static com.google.common.truth.Truth.assertThat;
 %0Aimp
@@ -1788,27 +1788,24 @@
 vert
-_c
+C
 ause
-_of_t
+OfT
 hrowable
 _to_
@@ -1792,36 +1792,34 @@
 CauseOfThrowable
-_to_
+To
 Error() %7B%0A      
@@ -2289,18 +2289,17 @@
 vert
-_t
+T
 hrowable
 _to_
@@ -2298,12 +2298,10 @@
 able
-_to_
+To
 Erro
@@ -2531,11 +2531,483 @@
 );%0A    %7D
+%0A%0A    @Test%0A    @DisplayName(%22convert ValidationException into an error with validation_error%22)%0A    void validation() %7B%0A        ConstraintViolation violation = ConstraintViolation%0A                .newBuilder()%0A                .build();%0A        ValidationException exception = new ValidationException(ImmutableList.of(violation));%0A        Error error = fromThrowable(exception);%0A        assertThat(error.getValidationError()).isEqualTo(exception.asValidationError());%0A    %7D
 %0A%7D%0A

Add a test