18da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal/*
28da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * Copyright 2010 Google Inc.
38da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal *
48da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * Licensed under the Apache License, Version 2.0 (the "License"); you may not
58da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * use this file except in compliance with the License. You may obtain a copy of
68da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * the License at
78da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal *
88da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * http://www.apache.org/licenses/LICENSE-2.0
98da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal *
108da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * Unless required by applicable law or agreed to in writing, software
118da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
128da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
138da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * License for the specific language governing permissions and limitations under
148da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * the License.
158da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal */
168da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalpackage com.google.android.testing.mocking;
178da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
188da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport javassist.CannotCompileException;
198da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport javassist.ClassPool;
208da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport javassist.CtClass;
218da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport javassist.CtMethod;
228da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport javassist.NotFoundException;
238da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
248da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport junit.framework.TestCase;
258da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
268da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.io.ByteArrayInputStream;
278da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.io.IOException;
288da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.lang.reflect.Method;
298da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.util.ArrayList;
308da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.util.Arrays;
318da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.util.HashMap;
328da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.util.List;
338da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.util.Map;
348da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
358da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
368da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal/**
378da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * Various tests that verify that different types of Classes are handled
388da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * correctly.
398da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal *
408da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * @author swoodward@google.com (Stephen Woodward)
418da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal */
428da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalpublic class ClassTypeTests extends TestCase {
438da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private AndroidMockGenerator androidMockGenerator = new AndroidMockGenerator();
448da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
458da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private AndroidMockGenerator getAndroidMockGenerator() {
468da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return androidMockGenerator;
478da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
488da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
498da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private void assertAllMethodNames(List<String> expectedNames,
508da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      Map<String, List<String>> expectedMethods, List<GeneratedClassFile> classes)
518da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      throws IOException {
528da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (GeneratedClassFile clazz : classes) {
538da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      assertTrue(expectedNames.contains(clazz.getClassName()));
548da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      assertUnorderedContentsSame(expectedMethods.get(clazz.getClassName()), getMethodNames(clazz));
558da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
568da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
578da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
588da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private <T> void assertUnorderedContentsSame(Iterable<T> expected, Iterable<T> actual) {
598da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<T> missingItems = new ArrayList<T>();
608da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<T> extraItems = new ArrayList<T>();
618da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (T item : expected) {
628da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      missingItems.add(item);
638da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
648da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (T item : actual) {
658da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      missingItems.remove(item);
668da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      extraItems.add(item);
678da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
688da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (T item : expected) {
698da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      extraItems.remove(item);
708da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
718da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    if (missingItems.size() + extraItems.size() != 0) {
728da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      String errorMessage =
738da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal          "Contents were different. Missing: " + Arrays.toString(missingItems.toArray())
748da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal              + " Extra: " + Arrays.toString(extraItems.toArray());
758da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      fail(errorMessage);
768da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
778da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
788da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
798da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private List<String> getExpectedNames(Class<?> clazz) {
808da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return new ArrayList<String>(Arrays.asList(new String[] {
818da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "genmocks." + clazz.getCanonicalName() + "DelegateInterface",
828da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "genmocks." + clazz.getCanonicalName() + "DelegateSubclass"}));
838da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
848da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
858da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private Iterable<String> getMethodNames(GeneratedClassFile clazz) throws IOException {
868da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    ByteArrayInputStream classInputStream = new ByteArrayInputStream(clazz.getContents());
878da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass ctClass;
888da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    try {
898da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      ctClass = ClassPool.getDefault().getCtClass(clazz.getClassName());
908da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      if (ctClass.isFrozen()) {
918da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        ctClass.defrost();
928da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      }
938da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    } catch (NotFoundException e) {
948da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      // That's ok, we're just defrosting any classes that affect us that were created
958da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      // by other tests.  NotFoundException implies the class is not frozen.
968da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
978da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    ctClass = ClassPool.getDefault().makeClass(classInputStream);
988da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return getMethodNames(ctClass.getDeclaredMethods());
998da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1008da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1018da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private List<String> getMethodNames(CtMethod[] methods) {
1028da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> methodNames = new ArrayList<String>();
1038da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (CtMethod method : methods) {
1048da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      methodNames.add(method.getName());
1058da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
1068da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return methodNames;
1078da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1088da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1098da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private List<String> getMethodNames(Method[] methods, String[] exclusions) {
1108da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> methodNames = new ArrayList<String>();
1118da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (Method method : methods) {
1128da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      if (!Arrays.asList(exclusions).contains(method.getName())) {
1138da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        methodNames.add(method.getName());
1148da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      }
1158da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
1168da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return methodNames;
1178da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1188da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1198da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private Map<String, List<String>> getExpectedMethodsMap(List<String> expectedNames,
1208da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      Class<?> clazz) {
1218da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return getExpectedMethodsMap(expectedNames, clazz, new String[0]);
1228da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1238da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1248da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private Map<String, List<String>> getExpectedMethodsMap(List<String> expectedNames,
1258da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      Class<?> clazz, String[] exclusions) {
1268da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Map<String, List<String>> expectedMethods = new HashMap<String, List<String>>();
1278da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    expectedMethods.put(expectedNames.get(0), new ArrayList<String>(Arrays.asList(new String[] {
1288da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "finalize", "clone"})));
1298da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    expectedMethods.put(expectedNames.get(1), new ArrayList<String>(Arrays.asList(new String[] {
1308da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "finalize", "clone", "setDelegate___AndroidMock", "getDelegate___AndroidMock"})));
1318da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    expectedMethods.get(expectedNames.get(0)).addAll(
1328da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        getMethodNames(clazz.getDeclaredMethods(), exclusions));
1338da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    expectedMethods.get(expectedNames.get(1)).addAll(
1348da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        getMethodNames(clazz.getDeclaredMethods(), exclusions));
1358da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return expectedMethods;
1368da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1378da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1388da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassIsDuplicate() throws ClassNotFoundException, IOException,
1398da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException {
1408da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classList =
1418da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        getAndroidMockGenerator().createMocksForClass(Object.class);
1428da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> secondClassList =
1438da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        getAndroidMockGenerator().createMocksForClass(Object.class);
1448da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(classList, secondClassList);
1458da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1468da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1478da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassHasDelegateMethods() throws ClassNotFoundException, IOException,
1488da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException {
1498da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = getExpectedNames(ClassHasDelegateMethods.class);
1508da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Map<String, List<String>> expectedMethods =
1518da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        getExpectedMethodsMap(expectedNames, ClassHasDelegateMethods.class,
1528da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            new String[] {"getDelegate___AndroidMock"});
1538da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    // This use case doesn't fit our util in any nice way, so just tweak it.
1548da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    expectedMethods.get(
1558da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "genmocks.com.google.android.testing.mocking.ClassHasDelegateMethodsDelegateInterface")
1568da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        .add("getDelegate___AndroidMock");
1578da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1588da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
1598da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes =
1608da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        mockGenerator.createMocksForClass(ClassHasDelegateMethods.class);
1618da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(2, classes.size());
1628da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertAllMethodNames(expectedNames, expectedMethods, classes);
1638da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1648da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1658da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassHasFinalMethods() throws ClassNotFoundException, IOException,
1668da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException {
1678da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = getExpectedNames(ClassHasFinalMethods.class);
1688da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Map<String, List<String>> expectedMethods =
1698da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        getExpectedMethodsMap(expectedNames, ClassHasFinalMethods.class, new String[] {"foo",
1708da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            "foobar"});
1718da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1728da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
1738da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes =
1748da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        mockGenerator.createMocksForClass(ClassHasFinalMethods.class);
1758da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(2, classes.size());
1768da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertAllMethodNames(expectedNames, expectedMethods, classes);
1778da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1788da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1798da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassHasNoDefaultConstructor() throws ClassNotFoundException, IOException,
1808da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException {
1818da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
1828da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes =
1838da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        mockGenerator.createMocksForClass(ClassHasNoDefaultConstructor.class);
1848da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(2, classes.size());
1858da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1868da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1878da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassHasNoPublicConstructors() throws ClassNotFoundException, IOException,
1888da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException {
1898da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
1908da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes =
1918da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        mockGenerator.createMocksForClass(ClassHasNoPublicConstructors.class);
1928da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(0, classes.size());
1938da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1948da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1958da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassHasOverloadedMethods() throws ClassNotFoundException, IOException,
1968da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException {
1978da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = getExpectedNames(ClassHasOverloadedMethods.class);
1988da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Map<String, List<String>> expectedMethods =
1998da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        getExpectedMethodsMap(expectedNames, ClassHasOverloadedMethods.class);
2008da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2018da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
2028da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes =
2038da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        mockGenerator.createMocksForClass(ClassHasOverloadedMethods.class);
2048da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(2, classes.size());
2058da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertAllMethodNames(expectedNames, expectedMethods, classes);
2068da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2078da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2088da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassHasStaticMethods() throws ClassNotFoundException, IOException,
2098da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException {
2108da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = getExpectedNames(ClassHasStaticMethods.class);
2118da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Map<String, List<String>> expectedMethods =
2128da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        getExpectedMethodsMap(expectedNames, ClassHasStaticMethods.class,
2138da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            new String[] {"staticFoo"});
2148da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2158da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
2168da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes =
2178da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        mockGenerator.createMocksForClass(ClassHasStaticMethods.class);
2188da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(2, classes.size());
2198da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertAllMethodNames(expectedNames, expectedMethods, classes);
2208da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2218da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2228da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassIsAnnotation() throws ClassNotFoundException, IOException,
2238da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException {
2248da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
2258da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes = mockGenerator.createMocksForClass(ClassIsAnnotation.class);
2268da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(0, classes.size());
2278da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2288da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2298da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassIsEnum() throws ClassNotFoundException, IOException, CannotCompileException {
2308da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
2318da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes = mockGenerator.createMocksForClass(ClassIsEnum.class);
2328da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(0, classes.size());
2338da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2348da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2358da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassIsFinal() throws ClassNotFoundException, IOException,
2368da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException {
2378da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
2388da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes = mockGenerator.createMocksForClass(ClassIsFinal.class);
2398da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(0, classes.size());
2408da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2418da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2428da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassIsInterface() throws ClassNotFoundException, IOException,
2438da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException {
2448da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
2458da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes = mockGenerator.createMocksForClass(ClassIsInterface.class);
2468da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(0, classes.size());
2478da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2488da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2498da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassIsArray() throws ClassNotFoundException, IOException,
2508da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException {
2518da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
2528da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes = mockGenerator.createMocksForClass(Object[].class);
2538da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(0, classes.size());
2548da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2558da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2568da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassIsNormal() throws ClassNotFoundException, IOException,
2578da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException {
2588da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
2598da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes = mockGenerator.createMocksForClass(Object.class);
2608da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(2, classes.size());
2618da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2628da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2638da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testClassIsPrimitive() throws ClassNotFoundException, IOException,
2648da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException {
2658da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
2668da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes = mockGenerator.createMocksForClass(Integer.TYPE);
2678da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(0, classes.size());
2688da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2698da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal}
270