package base;

import com.yanzuoguang.util.contants.ResultConstants;
import com.yanzuoguang.util.exception.CodeException;
import com.yanzuoguang.util.exception.CodeTargetException;
import com.yanzuoguang.util.exception.ExceptionHelper;
import com.yanzuoguang.util.exception.RuntimeCodeException;
import com.yanzuoguang.util.vo.ResponseResult;
import org.junit.Assert;
import org.junit.Test;

public class TestException {

    @Test
    public void testCodeException() {
        CodeException codeException = new CodeException("05", "message", "target");
        ResponseResult<?> error = ExceptionHelper.getError(codeException);

        Assert.assertEquals(codeException.getCode(), error.getCode());
        Assert.assertEquals(codeException.getMessage(), error.getMessage());
        Assert.assertNull(error.getTarget());
        try {
            error.check();
        } catch (CodeException ex) {
            Assert.assertEquals(ex.getClass(), CodeException.class);

            Assert.assertEquals(codeException.getCode(), ex.getCode());
            Assert.assertEquals(codeException.getMessage(), ex.getMessage());
            Assert.assertNull(ex.getTarget());
        }
    }

    @Test
    public void testCodeTargetException() {
        CodeTargetException codeException = new CodeTargetException("05", "message", "target");
        ResponseResult<?> error = ExceptionHelper.getError(codeException);

        Assert.assertEquals(codeException.getCode(), error.getCode());
        Assert.assertEquals(codeException.getMessage(), error.getMessage());
        Assert.assertEquals(codeException.getTarget(), error.getTarget());

        try {
            error.check();
        } catch (CodeTargetException ex) {
            Assert.assertEquals(ex.getClass(), CodeTargetException.class);

            Assert.assertEquals(codeException.getCode(), ex.getCode());
            Assert.assertEquals(codeException.getMessage(), ex.getMessage());
            Assert.assertEquals(codeException.getTarget(), ex.getTarget());
        }
    }

    @Test
    public void testRuntimeCodeException() {
        RuntimeCodeException codeException = new RuntimeCodeException("05", "message", "target");
        ResponseResult<?> error = ExceptionHelper.getError(codeException);

        Assert.assertEquals(codeException.getCode(), error.getCode());
        Assert.assertEquals(codeException.getMessage(), error.getMessage());
        Assert.assertNull(error.getTarget());

        try {
            error.check();
        } catch (RuntimeCodeException ex) {
            Assert.assertEquals(ex.getClass(), RuntimeCodeException.class);

            Assert.assertEquals(codeException.getCode(), ex.getCode());
            Assert.assertEquals(codeException.getMessage(), ex.getMessage());
            Assert.assertNull(ex.getTarget());
        }
    }

    @Test
    public void testException() {
        Exception codeException = new Exception("message");
        ResponseResult<?> error = ExceptionHelper.getError(codeException);

        Assert.assertEquals(ResultConstants.UNKNOW_ERROR, error.getCode());
        Assert.assertEquals(codeException.getMessage(), error.getMessage());
        Assert.assertNull(error.getTarget());

        try {
            error.check();
        } catch (RuntimeCodeException ex) {
            Assert.assertEquals(ex.getClass(), RuntimeCodeException.class);

            Assert.assertEquals(ResultConstants.UNKNOW_ERROR, ex.getCode());
            Assert.assertEquals(codeException.getMessage(), ex.getMessage());
            Assert.assertNull(ex.getTarget());
        }
    }
}