/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.sling.api;

import junit.framework.TestCase;

import org.junit.Test;

public class SlingExceptionTest {

    private static final String MESSAGE = "message";

    private static final Throwable CAUSE = new Exception("cause");

    @Test
    public void test_SlingException_msg_ex() {
        validate(new SlingException(null, null), null, null);
        validate(new SlingException(MESSAGE, null), MESSAGE, null);
        validate(new SlingException(null, CAUSE), null, CAUSE);
        validate(new SlingException(MESSAGE, CAUSE), MESSAGE, CAUSE);
    }

    @Test
    public void test_SlingException_ex() {
        validate(new SlingException((Throwable) null), null, null);
        validate(new SlingException(CAUSE), CAUSE.toString(), CAUSE);
    }

    @Test
    public void test_SlingException_msg() {
        validate(new SlingException((String) null), null, null);
        validate(new SlingException(MESSAGE), MESSAGE, null);
    }

    @Test
    public void test_SlingException() {
        validate(new SlingException(), null, null);
    }

    private void validate(final SlingException e, final String message, final Throwable cause) {
        TestCase.assertNotNull(e);
        TestCase.assertEquals(message, e.getMessage());
        TestCase.assertEquals(cause, e.getCause());
    }

}
