/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * 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 com.android.mediaframeworktest.unit;

import android.hardware.photography.CameraAccessException;
import android.hardware.photography.utils.CameraRuntimeException;
import android.hardware.photography.utils.UncheckedThrow;
import android.test.suitebuilder.annotation.SmallTest;

import junit.framework.Assert;

public class CameraUtilsRuntimeExceptionTest extends junit.framework.TestCase {

    @SmallTest
    public void testCameraRuntimeException1() {
        try {
            CameraRuntimeException runtimeExc = new CameraRuntimeException(12345);
            throw runtimeExc.asChecked();
        } catch (CameraAccessException e) {
            assertEquals(12345, e.getReason());
            assertNull(e.getMessage());
            assertNull(e.getCause());
        }
    }

    @SmallTest
    public void testCameraRuntimeException2() {
        try {
            CameraRuntimeException runtimeExc = new CameraRuntimeException(12345, "Hello");
            throw runtimeExc.asChecked();
        } catch (CameraAccessException e) {
            assertEquals(12345, e.getReason());
            assertEquals("Hello", e.getMessage());
            assertNull(e.getCause());
        }
    }

    @SmallTest
    public void testCameraRuntimeException3() {
        Throwable cause = new IllegalStateException("For great justice");
        try {
            CameraRuntimeException runtimeExc = new CameraRuntimeException(12345, cause);
            throw runtimeExc.asChecked();
        } catch (CameraAccessException e) {
            assertEquals(12345, e.getReason());
            assertNull(e.getMessage());
            assertEquals(cause, e.getCause());
        }
    }

    @SmallTest
    public void testCameraRuntimeException4() {
        Throwable cause = new IllegalStateException("For great justice");
        try {
            CameraRuntimeException runtimeExc = new CameraRuntimeException(12345, "Hello", cause);
            throw runtimeExc.asChecked();
        } catch (CameraAccessException e) {
            assertEquals(12345, e.getReason());
            assertEquals("Hello", e.getMessage());
            assertEquals(cause, e.getCause());
        }
    }
}
