// Path: src/test/java/com/github/vbauer/caesar/basic/BasicTest.java
// @RunWith(BlockJUnit4ClassRunner.class)
// public abstract class BasicTest {
// 
//     protected final boolean checkUtilConstructorContract(final Class<?>... utilClasses) {
//         Assert.assertTrue(utilClasses.length > 0);
// 
//         PrivateConstructorChecker
//             .forClasses(utilClasses)
//             .expectedTypeOfException(UnsupportedOperationException.class)
//             .check();
// 
//         return true;
//     }
// 
// }
// 
// Path: src/test/java/com/github/vbauer/caesar/bean/CallbackAsync.java
// public interface CallbackAsync {
// 
//     void hello(AsyncCallback<String> callback, String name1, String name2);
// 
//     void hello(AsyncCallback<String> callback, String name);
// 
//     void emptyHello(AsyncCallback<Void> callback, String name);
// 
//     void empty(AsyncCallback<Void> callback);
// 
//     void exception(AsyncCallback<Void> callback);
// 
//     void methodWithoutSyncImpl(AsyncCallback<Boolean> callback);
// 
//     @Timeout(value = 1, unit = TimeUnit.MILLISECONDS)
//     void timeout(AsyncCallback<Boolean> callback);
// 
// }
// 
// Path: src/test/java/com/github/vbauer/caesar/bean/SimpleAsync.java
// @Timeout(5)
// public interface SimpleAsync {
// 
//     Future<Integer> getId();
// 
//     Future<Boolean> timeout();
// 
// }
// 
// Path: src/test/java/com/github/vbauer/caesar/bean/SimpleSync.java
// public class SimpleSync {
// 
//     public static final boolean TIMEOUT_VALUE = true;
//     private final int id;
// 
// 
//     public SimpleSync(final int id) {
//         this.id = id;
//     }
// 
// 
//     public int getId() {
//         return id;
//     }
// 
//     public Boolean timeout() throws InterruptedException {
//         Thread.sleep(1000);
//         return TIMEOUT_VALUE;
//     }
// 
// 
//     @Override
//     public int hashCode() {
//         return id;
//     }
// 
//     @Override
//     public boolean equals(final Object obj) {
//         if (obj instanceof SimpleSync) {
//             final SimpleSync other = (SimpleSync) obj;
//             return other.getId() == getId();
//         }
//         return false;
//     }
// 
//     @Override
//     public String toString() {
//         return String.valueOf(getId());
//     }
// 
// }
// 
// Path: src/test/java/com/github/vbauer/caesar/bean/Sync.java
// public class Sync {
// 
//     public String hello(final String name) {
//         return String.format("Hello, %s", name);
//     }
// 
//     public String hello(final String name1, final String name2) {
//         return String.format("Hello, %s and %s", name1, name2);
//     }
// 
//     public void empty() {
//         // Do nothing.
//     }
// 
//     public void emptyHello(@SuppressWarnings("unused") final String name) {
//         // Do nothing.
//     }
// 
//     public void exception() {
//         throw new UnsupportedOperationException();
//     }
// 
//     public Boolean timeout() throws InterruptedException {
//         Thread.sleep(1000);
//         return true;
//     }
// 
// }
// 
// Path: src/main/java/com/github/vbauer/caesar/exception/MissedSyncMethodException.java
// @SuppressWarnings("serial")
// public class MissedSyncMethodException extends AbstractCaesarException {
// 
//     private final Method method;
//     private final Object[] arguments;
// 
// 
//     public MissedSyncMethodException(final Method method, final Object... arguments) {
//         this.method = method;
//         this.arguments = arguments;
//     }
// 
// 
//     public Method getMethod() {
//         return method;
//     }
// 
//     public Object[] getArguments() {
//         return arguments;
//     }
// 
// 
//     /**
//      * {@inheritDoc}
//      */
//     @Override
//     public String getMessage() {
//         return String.format(
//             "Can not find appropriate sync-method \"%s\", parameters: %s",
//             getMethod(), Arrays.toString(getArguments())
//         );
//     }
// 
// }


import com.github.vbauer.caesar.basic.BasicTest;
import com.github.vbauer.caesar.bean.CallbackAsync;
import com.github.vbauer.caesar.bean.SimpleAsync;
import com.github.vbauer.caesar.bean.SimpleSync;
import com.github.vbauer.caesar.bean.Sync;
import com.github.vbauer.caesar.exception.MissedSyncMethodException;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
package com.github.vbauer.caesar.proxy;



/**
 * @author Vladislav Bauer
 */

public class AsyncProxyCreatorTest extends BasicTest {

    private static final ThreadLocal<ExecutorService> EXECUTOR = new ThreadLocal<>();


    @BeforeClass
    public static void setUp() {
        EXECUTOR.set(Executors.newScheduledThreadPool(5));
    }

    @AfterClass
    public static void tearDown() {
        executor().shutdown();
    }

    @Test
    public void testConstructorContract() {
        Assert.assertTrue(checkUtilConstructorContract(AsyncProxyCreator.class));
    }

    @Test(expected = MissedSyncMethodException.class)
    public void testIncorrectProxy() {
        Assert.fail(String.valueOf(AsyncProxyCreator.create(new Sync(), List.class, executor())));
    }

    @Test(expected = MissedSyncMethodException.class)
    public void testBadProxy() {
        Assert.fail(String.valueOf(
            AsyncProxyCreator.create(new Sync(), CallbackAsync.class, executor())
        ));
    }

    @Test
    public void testCorrectProxy() throws Throwable {
// Path: src/test/java/com/github/vbauer/caesar/basic/BasicTest.java
// @RunWith(BlockJUnit4ClassRunner.class)
// public abstract class BasicTest {
// 
//     protected final boolean checkUtilConstructorContract(final Class<?>... utilClasses) {
//         Assert.assertTrue(utilClasses.length > 0);
// 
//         PrivateConstructorChecker
//             .forClasses(utilClasses)
//             .expectedTypeOfException(UnsupportedOperationException.class)
//             .check();
// 
//         return true;
//     }
// 
// }
// 
// Path: src/test/java/com/github/vbauer/caesar/bean/CallbackAsync.java
// public interface CallbackAsync {
// 
//     void hello(AsyncCallback<String> callback, String name1, String name2);
// 
//     void hello(AsyncCallback<String> callback, String name);
// 
//     void emptyHello(AsyncCallback<Void> callback, String name);
// 
//     void empty(AsyncCallback<Void> callback);
// 
//     void exception(AsyncCallback<Void> callback);
// 
//     void methodWithoutSyncImpl(AsyncCallback<Boolean> callback);
// 
//     @Timeout(value = 1, unit = TimeUnit.MILLISECONDS)
//     void timeout(AsyncCallback<Boolean> callback);
// 
// }
// 
// Path: src/test/java/com/github/vbauer/caesar/bean/SimpleAsync.java
// @Timeout(5)
// public interface SimpleAsync {
// 
//     Future<Integer> getId();
// 
//     Future<Boolean> timeout();
// 
// }
// 
// Path: src/test/java/com/github/vbauer/caesar/bean/SimpleSync.java
// public class SimpleSync {
// 
//     public static final boolean TIMEOUT_VALUE = true;
//     private final int id;
// 
// 
//     public SimpleSync(final int id) {
//         this.id = id;
//     }
// 
// 
//     public int getId() {
//         return id;
//     }
// 
//     public Boolean timeout() throws InterruptedException {
//         Thread.sleep(1000);
//         return TIMEOUT_VALUE;
//     }
// 
// 
//     @Override
//     public int hashCode() {
//         return id;
//     }
// 
//     @Override
//     public boolean equals(final Object obj) {
//         if (obj instanceof SimpleSync) {
//             final SimpleSync other = (SimpleSync) obj;
//             return other.getId() == getId();
//         }
//         return false;
//     }
// 
//     @Override
//     public String toString() {
//         return String.valueOf(getId());
//     }
// 
// }
// 
// Path: src/test/java/com/github/vbauer/caesar/bean/Sync.java
// public class Sync {
// 
//     public String hello(final String name) {
//         return String.format("Hello, %s", name);
//     }
// 
//     public String hello(final String name1, final String name2) {
//         return String.format("Hello, %s and %s", name1, name2);
//     }
// 
//     public void empty() {
//         // Do nothing.
//     }
// 
//     public void emptyHello(@SuppressWarnings("unused") final String name) {
//         // Do nothing.
//     }
// 
//     public void exception() {
//         throw new UnsupportedOperationException();
//     }
// 
//     public Boolean timeout() throws InterruptedException {
//         Thread.sleep(1000);
//         return true;
//     }
// 
// }
// 
// Path: src/main/java/com/github/vbauer/caesar/exception/MissedSyncMethodException.java
// @SuppressWarnings("serial")
// public class MissedSyncMethodException extends AbstractCaesarException {
// 
//     private final Method method;
//     private final Object[] arguments;
// 
// 
//     public MissedSyncMethodException(final Method method, final Object... arguments) {
//         this.method = method;
//         this.arguments = arguments;
//     }
// 
// 
//     public Method getMethod() {
//         return method;
//     }
// 
//     public Object[] getArguments() {
//         return arguments;
//     }
// 
// 
//     /**
//      * {@inheritDoc}
//      */
//     @Override
//     public String getMessage() {
//         return String.format(
//             "Can not find appropriate sync-method \"%s\", parameters: %s",
//             getMethod(), Arrays.toString(getArguments())
//         );
//     }
// 
// }


// Path: src/test/java/com/github/vbauer/caesar/proxy/AsyncProxyCreatorTest.java
import com.github.vbauer.caesar.basic.BasicTest;
import com.github.vbauer.caesar.bean.CallbackAsync;
import com.github.vbauer.caesar.bean.SimpleAsync;
import com.github.vbauer.caesar.bean.SimpleSync;
import com.github.vbauer.caesar.bean.Sync;
import com.github.vbauer.caesar.exception.MissedSyncMethodException;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

package com.github.vbauer.caesar.proxy;



/**
 * @author Vladislav Bauer
 */

public class AsyncProxyCreatorTest extends BasicTest {

    private static final ThreadLocal<ExecutorService> EXECUTOR = new ThreadLocal<>();


    @BeforeClass
    public static void setUp() {
        EXECUTOR.set(Executors.newScheduledThreadPool(5));
    }

    @AfterClass
    public static void tearDown() {
        executor().shutdown();
    }

    @Test
    public void testConstructorContract() {
        Assert.assertTrue(checkUtilConstructorContract(AsyncProxyCreator.class));
    }

    @Test(expected = MissedSyncMethodException.class)
    public void testIncorrectProxy() {
        Assert.fail(String.valueOf(AsyncProxyCreator.create(new Sync(), List.class, executor())));
    }

    @Test(expected = MissedSyncMethodException.class)
    public void testBadProxy() {
        Assert.fail(String.valueOf(
            AsyncProxyCreator.create(new Sync(), CallbackAsync.class, executor())
        ));
    }

    @Test
    public void testCorrectProxy() throws Throwable {
        final SimpleSync bean1 = new SimpleSync(1);