// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorClass.java
// public class ActorClass {
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorGenerifiedPromise.java
// public interface ActorGenerifiedPromise {
//     @NonNull
//     Promise testMethod();
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorNullablePromise.java
// public interface ActorNullablePromise {
//     Promise<String> testMethod();
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorWithConstant.java
// public interface ActorWithConstant {
//     int CONSTANT = 10;
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorWithException.java
// public interface ActorWithException {
//     void testMethod() throws IOException;
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorWithGenericMethod.java
// public interface ActorWithGenericMethod {
//     <T> void saveValue(T val);
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorWithNonPromise.java
// public interface ActorWithNonPromise {
//     int testMethod();
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/PrivateActorContainer.java
// public class PrivateActorContainer {
// 
//     public static String getActorClassName() {
//         return ActorPrivate.class.getCanonicalName();
//     }
// 
//     private interface ActorPrivate {
// 
//     }
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/SimpleActor.java
// public interface SimpleActor {
//     void save(long key, @Nullable String value);
// 
//     @NonNull
//     Promise<String> get(long key);
// }


import com.google.common.collect.Iterables;
import com.google.testing.compile.CompilationRule;
import com.truecaller.androidactors.cases.ActorClass;
import com.truecaller.androidactors.cases.ActorGenerifiedPromise;
import com.truecaller.androidactors.cases.ActorNullablePromise;
import com.truecaller.androidactors.cases.ActorWithConstant;
import com.truecaller.androidactors.cases.ActorWithException;
import com.truecaller.androidactors.cases.ActorWithGenericMethod;
import com.truecaller.androidactors.cases.ActorWithNonPromise;
import com.truecaller.androidactors.cases.PrivateActorContainer;
import com.truecaller.androidactors.cases.SimpleActor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.SimpleElementVisitor6;
import java.util.ArrayList;
import java.util.List;

        description.describeProblems(errors);
        Assert.assertEquals(true, errors.get(0).isError);
        Assert.assertEquals(GenerationError.ER0007, errors.get(0).message);
        Assert.assertSame(getMethod(element, "testMethod"), errors.get(0).element);
    }

    @Test
    public void validate_true_withConstant() {
        TypeElement element = getTypeElement(ActorWithConstant.class);
        ActorInterfaceDescriptionImpl description = new ActorInterfaceDescriptionImpl(element);
        Assert.assertEquals(true, description.validate());
    }

    @Test
    public void validate_true_simpleActor() {
        TypeElement element = getTypeElement(SimpleActor.class);
        ActorInterfaceDescriptionImpl description = new ActorInterfaceDescriptionImpl(element);
        Assert.assertEquals(true, description.validate());
    }

    @Test
    public void getType_same_simpleActor() {
        TypeElement element = getTypeElement(SimpleActor.class);
        ActorInterfaceDescriptionImpl description = new ActorInterfaceDescriptionImpl(element);
        Assert.assertSame(element, description.getType());
    }

    @Test
    public void methods_same_simpleActor() {
// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorClass.java
// public class ActorClass {
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorGenerifiedPromise.java
// public interface ActorGenerifiedPromise {
//     @NonNull
//     Promise testMethod();
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorNullablePromise.java
// public interface ActorNullablePromise {
//     Promise<String> testMethod();
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorWithConstant.java
// public interface ActorWithConstant {
//     int CONSTANT = 10;
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorWithException.java
// public interface ActorWithException {
//     void testMethod() throws IOException;
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorWithGenericMethod.java
// public interface ActorWithGenericMethod {
//     <T> void saveValue(T val);
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/ActorWithNonPromise.java
// public interface ActorWithNonPromise {
//     int testMethod();
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/PrivateActorContainer.java
// public class PrivateActorContainer {
// 
//     public static String getActorClassName() {
//         return ActorPrivate.class.getCanonicalName();
//     }
// 
//     private interface ActorPrivate {
// 
//     }
// }
// 
// Path: generator/src/test/java/com/truecaller/androidactors/cases/SimpleActor.java
// public interface SimpleActor {
//     void save(long key, @Nullable String value);
// 
//     @NonNull
//     Promise<String> get(long key);
// }


// Path: generator/src/test/java/com/truecaller/androidactors/ActorInterfaceDescriptionImplTest.java
import com.google.common.collect.Iterables;
import com.google.testing.compile.CompilationRule;
import com.truecaller.androidactors.cases.ActorClass;
import com.truecaller.androidactors.cases.ActorGenerifiedPromise;
import com.truecaller.androidactors.cases.ActorNullablePromise;
import com.truecaller.androidactors.cases.ActorWithConstant;
import com.truecaller.androidactors.cases.ActorWithException;
import com.truecaller.androidactors.cases.ActorWithGenericMethod;
import com.truecaller.androidactors.cases.ActorWithNonPromise;
import com.truecaller.androidactors.cases.PrivateActorContainer;
import com.truecaller.androidactors.cases.SimpleActor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.SimpleElementVisitor6;
import java.util.ArrayList;
import java.util.List;


        description.describeProblems(errors);
        Assert.assertEquals(true, errors.get(0).isError);
        Assert.assertEquals(GenerationError.ER0007, errors.get(0).message);
        Assert.assertSame(getMethod(element, "testMethod"), errors.get(0).element);
    }

    @Test
    public void validate_true_withConstant() {
        TypeElement element = getTypeElement(ActorWithConstant.class);
        ActorInterfaceDescriptionImpl description = new ActorInterfaceDescriptionImpl(element);
        Assert.assertEquals(true, description.validate());
    }

    @Test
    public void validate_true_simpleActor() {
        TypeElement element = getTypeElement(SimpleActor.class);
        ActorInterfaceDescriptionImpl description = new ActorInterfaceDescriptionImpl(element);
        Assert.assertEquals(true, description.validate());
    }

    @Test
    public void getType_same_simpleActor() {
        TypeElement element = getTypeElement(SimpleActor.class);
        ActorInterfaceDescriptionImpl description = new ActorInterfaceDescriptionImpl(element);
        Assert.assertSame(element, description.getType());
    }

    @Test
    public void methods_same_simpleActor() {
        TypeElement element = getTypeElement(SimpleActor.class);