package com.mobify.astro.messaging;

import com.mobify.astro.messaging.RpcMethodWrapper.RpcMethodType;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import java.lang.reflect.Method;

import static org.mockito.Mockito.mock;

public class RpcMethodWrapperTest {

    private RpcMessageListenerTestHelpers.TestRpcMessageListenerClass testRpcMessageListener;

    @Before
    public void setup() throws Exception {
        EventManager mockEventManager = mock(EventManager.class);
        MessageSender mockMessageSender = mock(MessageSender.class);
        testRpcMessageListener = new RpcMessageListenerTestHelpers.TestRpcMessageListenerClass(mockEventManager, mockMessageSender);
    }

    @Test
    public void testGetMethodParameterNames() throws Exception {
        String[] expectedNames = new String[]{"height","width"};

        RpcMethodWrapper testMethod = new RpcMethodWrapper(
                testRpcMessageListener.getClass().getMethod("area", int.class, int.class),
                RpcMethodType.SYNC);
        String[] resultNames = testMethod.getParameterNames();

        Assert.assertArrayEquals(expectedNames, resultNames);
    }

    @Test
    public void testGetMethodParameterNamesAsync() throws Exception {
        String[] expectedNames = new String[]{"foo"};

        RpcMethodWrapper testMethod = new RpcMethodWrapper(
                testRpcMessageListener.getClass().getMethod("asyncTest", RpcResponse.class, String.class),
                RpcMethodType.ASYNC);
        String[] resultNames = testMethod.getParameterNames();

        Assert.assertArrayEquals(expectedNames, resultNames);
    }

    @Test(expected = Exceptions.UnannotatedMethodException.class)
    public void testThrowsUnannotatedMethodException() throws Throwable {
        Method unAnnotatedMethod = String.class.getMethod("valueOf", Object.class);
        RpcMethodWrapper methodWrapper = new RpcMethodWrapper(unAnnotatedMethod, RpcMethodType.SYNC);

        methodWrapper.getParameterNames();
    }
}
