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.IOException;
278da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.lang.reflect.Method;
288da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.math.BigInteger;
298da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.util.ArrayList;
308da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.util.Arrays;
318da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalimport java.util.List;
328da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
338da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
348da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal/**
358da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * Tests for the AndroidMockGenerator class.
368da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal *
378da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal * @author swoodward@google.com (Stephen Woodward)
388da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal */
398da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigalpublic class AndroidMockGeneratorTest extends TestCase {
408da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private AndroidMockGenerator getAndroidMockGenerator() {
418da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return new AndroidMockGenerator();
428da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
438da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
448da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private NoFileAndroidMockGenerator getNoFileMockGenerator() {
458da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return new NoFileAndroidMockGenerator();
468da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
478da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
488da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private void cleanupGeneratedClasses(CtClass... classes) {
498da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (CtClass clazz : classes) {
508da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      clazz.detach();
518da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
528da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
538da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
548da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private <T> void assertUnorderedContentsSame(Iterable<T> expected, Iterable<T> actual) {
558da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<T> missingItems = new ArrayList<T>();
568da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<T> extraItems = new ArrayList<T>();
578da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (T item : expected) {
588da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      missingItems.add(item);
598da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
608da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (T item : actual) {
618da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      missingItems.remove(item);
628da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      extraItems.add(item);
638da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
648da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (T item : expected) {
658da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      extraItems.remove(item);
668da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
678da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    if (missingItems.size() + extraItems.size() != 0) {
688da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      String errorMessage =
698da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal          "Contents were different. Missing: " + Arrays.toString(missingItems.toArray())
708da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal              + " Extra: " + Arrays.toString(extraItems.toArray());
718da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      fail(errorMessage);
728da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
738da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
748da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
758da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private List<String> getExpectedNamesForNumberClass() {
768da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return getExpectedNamesForNumberClass(false);
778da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
788da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
798da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private List<String> getExpectedNamesForObjectClass() {
808da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = new ArrayList<String>();
818da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    expectedNames.addAll(Arrays.asList(new String[] {"clone", "finalize"}));
828da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return expectedNames;
838da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
848da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
858da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private List<String> getExpectedNamesForNumberClass(boolean includeDelegateMethods) {
868da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = getExpectedNamesForObjectClass();
878da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    expectedNames.addAll(Arrays.asList(new String[] {"byteValue", "doubleValue", "floatValue",
888da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "intValue", "longValue", "shortValue"}));
898da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    if (includeDelegateMethods) {
908da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      expectedNames.addAll(Arrays.asList(new String[] {"getDelegate___AndroidMock",
918da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal          "setDelegate___AndroidMock"}));
928da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
938da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return expectedNames;
948da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
958da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
968da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private List<String> getExpectedNamesForBigIntegerClass() {
978da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = getExpectedNamesForNumberClass();
988da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    expectedNames.addAll(Arrays.asList(new String[] {"abs", "add", "and", "andNot", "bitCount",
998da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "bitLength", "clearBit", "compareTo", "divide", "divideAndRemainder", "flipBit", "gcd",
1008da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "getLowestSetBit", "isProbablePrime", "max", "min", "mod", "modInverse", "modPow",
1018da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "multiply", "negate", "nextProbablePrime", "not", "or", "pow", "remainder", "setBit",
1028da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "shiftLeft", "shiftRight", "signum", "subtract", "testBit", "toByteArray", "toString",
1038da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "xor"}));
1048da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return expectedNames;
1058da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1068da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1078da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private List<String> getMethodNames(CtMethod[] methods) {
1088da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> methodNames = new ArrayList<String>();
1098da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (CtMethod method : methods) {
1108da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      methodNames.add(method.getName());
1118da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
1128da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return methodNames;
1138da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1148da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1158da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private List<String> getClassNames(List<GeneratedClassFile> classes) {
1168da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> classNames = new ArrayList<String>();
1178da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (GeneratedClassFile clazz : classes) {
1188da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      classNames.add(clazz.getClassName());
1198da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
1208da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return classNames;
1218da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1228da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1238da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private List<String> getExpectedSignaturesForBigIntegerClass() {
1248da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = new ArrayList<String>();
1258da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    expectedNames.addAll(Arrays.asList(new String[] {
1268da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public int java.math.BigInteger.getLowestSetBit()",
1278da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.abs()",
1288da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "protected void java.lang.Object.finalize() throws java.lang.Throwable",
1298da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.modPow(java.math.BigInteger,"
1308da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            + "java.math.BigInteger)",
1318da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "protected native java.lang.Object java.lang.Object.clone() throws "
1328da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            + "java.lang.CloneNotSupportedException",
1338da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.setBit(int)",
1348da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.shiftRight(int)",
1358da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public int java.math.BigInteger.bitLength()",
1368da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.not()",
1378da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.subtract(java.math.BigInteger)",
1388da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.flipBit(int)",
1398da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public boolean java.math.BigInteger.isProbablePrime(int)",
1408da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.add(java.math.BigInteger)",
1418da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.modInverse(java.math.BigInteger)",
1428da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.clearBit(int)",
1438da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.multiply(java.math.BigInteger)",
1448da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public byte java.lang.Number.byteValue()",
1458da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.gcd(java.math.BigInteger)",
1468da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public float java.math.BigInteger.floatValue()",
1478da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.lang.String java.math.BigInteger.toString(int)",
1488da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.min(java.math.BigInteger)",
1498da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public int java.math.BigInteger.intValue()",
1508da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.or(java.math.BigInteger)",
1518da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.remainder(java.math.BigInteger)",
1528da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.divide(java.math.BigInteger)",
1538da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.xor(java.math.BigInteger)",
1548da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.and(java.math.BigInteger)",
1558da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public int java.math.BigInteger.signum()",
1568da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger[] java.math.BigInteger.divideAndRemainder("
1578da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            + "java.math.BigInteger)",
1588da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.max(java.math.BigInteger)",
1598da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.shiftLeft(int)",
1608da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public double java.math.BigInteger.doubleValue()",
1618da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.pow(int)",
1628da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public short java.lang.Number.shortValue()",
1638da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.andNot(java.math.BigInteger)",
1648da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public byte[] java.math.BigInteger.toByteArray()",
1658da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.negate()",
1668da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public int java.math.BigInteger.compareTo(java.math.BigInteger)",
1678da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public boolean java.math.BigInteger.testBit(int)",
1688da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public int java.math.BigInteger.bitCount()",
1698da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public long java.math.BigInteger.longValue()",
1708da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.mod(java.math.BigInteger)",
1718da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.math.BigInteger java.math.BigInteger.nextProbablePrime()",
1728da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        }));
1738da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return expectedNames;
1748da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1758da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1768da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private List<String> getMethodSignatures(Method[] methods) {
1778da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> methodSignatures = new ArrayList<String>();
1788da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (Method method : methods) {
1798da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      if (getAndroidMockGenerator().isMockable(method)) {
1808da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        methodSignatures.add(method.toGenericString());
1818da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      }
1828da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
1838da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    return methodSignatures;
1848da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1858da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1868da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testIsSupportedType() {
1878da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Class<?>[] unsupportedClasses =
1888da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        new Class[] {ClassIsAnnotation.class, ClassIsEnum.class, ClassIsFinal.class,
1898da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            ClassIsInterface.class};
1908da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Class<?>[] supportedClasses = new Class[] {Object.class};
1918da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
1928da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (Class<?> clazz : unsupportedClasses) {
1938da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      assertFalse(getAndroidMockGenerator().classIsSupportedType(clazz));
1948da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
1958da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (Class<?> clazz : supportedClasses) {
1968da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      assertTrue(getAndroidMockGenerator().classIsSupportedType(clazz));
1978da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
1988da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
1998da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2008da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetDelegateFieldName() {
2018da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("delegateMockObject", getAndroidMockGenerator().getDelegateFieldName());
2028da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2038da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2048da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetInterfaceMethodSource() throws SecurityException, NoSuchMethodException {
2058da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Object.class.getMethod("equals", Object.class);
2068da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("public boolean equals(java.lang.Object arg0);", getAndroidMockGenerator()
2078da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        .getInterfaceMethodSource(method));
2088da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2098da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2108da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetInterfaceMethodSourceMultipleExceptions() throws SecurityException,
2118da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      NoSuchMethodException {
2128da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Class.class.getDeclaredMethod("newInstance");
2138da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("public java.lang.Object newInstance() throws java.lang.InstantiationException,"
2148da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        + "java.lang.IllegalAccessException;", getAndroidMockGenerator().getInterfaceMethodSource(
2158da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        method));
2168da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2178da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2188da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetInterfaceMethodSourceProtectedMethod() throws SecurityException,
2198da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      NoSuchMethodException {
2208da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Object.class.getDeclaredMethod("finalize");
2218da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("public void finalize() throws java.lang.Throwable;", getAndroidMockGenerator()
2228da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        .getInterfaceMethodSource(method));
2238da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2248da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2258da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetInterfaceMethodSourceNoParams() throws SecurityException,
2268da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      NoSuchMethodException {
2278da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Object.class.getMethod("toString");
2288da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("public java.lang.String toString();", getAndroidMockGenerator()
2298da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        .getInterfaceMethodSource(method));
2308da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2318da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2328da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetInterfaceMethodSourceVoidReturn() throws SecurityException,
2338da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      NoSuchMethodException {
2348da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Thread.class.getMethod("run");
2358da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("public void run();", getAndroidMockGenerator().getInterfaceMethodSource(method));
2368da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2378da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2388da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetInterfaceMethodSourceFinal() throws SecurityException, NoSuchMethodException {
2398da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Object.class.getMethod("notify");
2408da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    try {
2418da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      getAndroidMockGenerator().getInterfaceMethodSource(method);
2428da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      fail("Exception not thrown on a final method");
2438da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    } catch (UnsupportedOperationException e) {
2448da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      // expected
2458da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
2468da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2478da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2488da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetInterfaceMethodSourceStatic() throws SecurityException, NoSuchMethodException {
2498da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Thread.class.getMethod("currentThread");
2508da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    try {
2518da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      getAndroidMockGenerator().getInterfaceMethodSource(method);
2528da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      fail("Exception not thrown on a static method");
2538da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    } catch (UnsupportedOperationException e) {
2548da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      // expected
2558da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
2568da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2578da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2588da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetInterfaceName() {
2598da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator r = getAndroidMockGenerator();
2608da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("genmocks.java.lang.ObjectDelegateInterface",
2618da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        FileUtils.getInterfaceNameFor(Object.class, SdkVersion.UNKNOWN));
2628da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2638da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2648da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetSubclassName() {
2658da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator r = getAndroidMockGenerator();
2668da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("genmocks.java.lang.ObjectDelegateSubclass",
2678da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        FileUtils.getSubclassNameFor(Object.class, SdkVersion.UNKNOWN));
2688da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2698da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2708da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetDelegateMethodSource() throws SecurityException, NoSuchMethodException {
2718da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Object.class.getMethod("equals", Object.class);
2728da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("public boolean equals(java.lang.Object arg0){if(this.delegateMockObject==null){"
2738da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        + "return false;}return this.delegateMockObject.equals(arg0);}", getAndroidMockGenerator()
2748da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        .getDelegateMethodSource(method));
2758da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
2768da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
2778da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetDelegateMethodSourceAllTypes() throws SecurityException,
2788da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      NoSuchMethodException {
2798da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    String[] returnTypes =
2808da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        new String[] {"boolean", "byte", "short", "int", "long", "char", "float", "double"};
2818da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    String[] castTypes =
2828da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        new String[] {"false", "(byte)0", "(short)0", "(int)0", "(long)0", "(char)0", "(float)0",
2838da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            "(double)0"};
2848da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (int i = 0; i < returnTypes.length; ++i) {
2858da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      Method method = AllTypes.class.getMethod(returnTypes[i] + "Foo");
2868da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      assertEquals("public " + returnTypes[i] + " " + returnTypes[i]
2878da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal          + "Foo(){if(this.delegateMockObject==null){return " + castTypes[i]
2888da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal          + ";}return this.delegateMockObject." + returnTypes[i] + "Foo();}",
2898da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal          getAndroidMockGenerator().getDelegateMethodSource(method));
2908da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
2918da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = AllTypes.class.getMethod("objectFoo");
2928da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("public java.lang.Object objectFoo(){if(this.delegateMockObject==null){return "
2938da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        + "null;}return this.delegateMockObject.objectFoo();}", getAndroidMockGenerator()
2948da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        .getDelegateMethodSource(method));
2958da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    method = AllTypes.class.getMethod("voidFoo");
2968da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("public void voidFoo(){if(this.delegateMockObject==null){return ;"
2978da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        + "}this.delegateMockObject.voidFoo();}", getAndroidMockGenerator()
2988da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        .getDelegateMethodSource(method));
2998da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
3008da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3018da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  private class AllTypes {
3028da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    @SuppressWarnings("unused")
3038da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    public void voidFoo() {
3048da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
3058da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3068da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    @SuppressWarnings("unused")
3078da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    public boolean booleanFoo() {
3088da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      return false;
3098da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
3108da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3118da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    @SuppressWarnings("unused")
3128da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    public byte byteFoo() {
3138da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      return 0;
3148da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
3158da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3168da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    @SuppressWarnings("unused")
3178da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    public short shortFoo() {
3188da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      return 0;
3198da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
3208da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3218da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    @SuppressWarnings("unused")
3228da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    public int intFoo() {
3238da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      return 0;
3248da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
3258da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3268da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    @SuppressWarnings("unused")
3278da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    public long longFoo() {
3288da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      return 0;
3298da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
3308da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3318da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    @SuppressWarnings("unused")
3328da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    public char charFoo() {
3338da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      return 0;
3348da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
3358da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3368da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    @SuppressWarnings("unused")
3378da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    public float floatFoo() {
3388da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      return 0;
3398da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
3408da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3418da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    @SuppressWarnings("unused")
3428da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    public double doubleFoo() {
3438da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      return 0;
3448da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
3458da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3468da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    @SuppressWarnings("unused")
3478da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    public Object objectFoo() {
3488da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      return null;
3498da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
3508da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
3518da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3528da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetDelegateMethodSourceMultipleExceptions() throws SecurityException,
3538da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      NoSuchMethodException {
3548da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Class.class.getDeclaredMethod("newInstance");
3558da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(
3568da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.lang.Object newInstance() throws java.lang.InstantiationException,"
3578da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            + "java.lang.IllegalAccessException{if(this.delegateMockObject==null){return null;}"
3588da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            + "return this.delegateMockObject.newInstance();}", getAndroidMockGenerator()
3598da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            .getDelegateMethodSource(method));
3608da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
3618da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3628da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetDelegateMethodSourceProtectedMethod() throws SecurityException,
3638da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      NoSuchMethodException {
3648da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Object.class.getDeclaredMethod("finalize");
3658da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("public void finalize() throws java.lang.Throwable{if(this.delegateMockObject=="
3668da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        + "null){return ;}this.delegateMockObject.finalize();}", getAndroidMockGenerator()
3678da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        .getDelegateMethodSource(method));
3688da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
3698da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3708da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetDelegateMethodSourceMultiParams() throws SecurityException,
3718da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      NoSuchMethodException {
3728da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method =
3738da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        String.class.getMethod("getChars", Integer.TYPE, Integer.TYPE, char[].class, Integer.TYPE);
3748da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(
3758da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public void getChars(int arg0,int arg1,char[] arg2,int arg3){if(this."
3768da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            + "delegateMockObject==null){return ;}this.delegateMockObject.getChars(arg0,arg1,arg2,"
3778da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            + "arg3);}", getAndroidMockGenerator().getDelegateMethodSource(method));
3788da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
3798da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3808da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetDelegateMethodSourceNoParams() throws SecurityException,
3818da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      NoSuchMethodException {
3828da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Object.class.getMethod("toString");
3838da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(
3848da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public java.lang.String toString(){if(this.delegateMockObject==null){return null;"
3858da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            + "}return this.delegateMockObject.toString();}", getAndroidMockGenerator()
3868da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            .getDelegateMethodSource(method));
3878da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
3888da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3898da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetDelegateMethodSourceVoidReturn() throws SecurityException,
3908da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      NoSuchMethodException {
3918da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Thread.class.getMethod("run");
3928da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("public void run(){if(this.delegateMockObject==null){return ;}this."
3938da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        + "delegateMockObject.run();}", getAndroidMockGenerator().getDelegateMethodSource(method));
3948da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
3958da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
3968da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetDelegateMethodSourceFinal() throws SecurityException, NoSuchMethodException {
3978da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Object.class.getMethod("notify");
3988da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    try {
3998da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      getAndroidMockGenerator().getDelegateMethodSource(method);
4008da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      fail("Exception not thrown on a final method");
4018da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    } catch (UnsupportedOperationException e) {
4028da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      // expected
4038da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
4048da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
4058da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4068da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetDelegateMethodSourceStatic() throws SecurityException, NoSuchMethodException {
4078da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method method = Thread.class.getMethod("currentThread");
4088da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    try {
4098da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      getAndroidMockGenerator().getDelegateMethodSource(method);
4108da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      fail("Exception not thrown on a static method");
4118da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    } catch (UnsupportedOperationException e) {
4128da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      // expected
4138da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
4148da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
4158da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4168da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGenerateEmptySubclass() throws ClassNotFoundException, NotFoundException {
4178da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
4188da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedInterface = mockGenerator.generateInterface(String.class, SdkVersion.UNKNOWN);
4198da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedClass = getAndroidMockGenerator().generateSkeletalClass(
4208da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        String.class, generatedInterface, SdkVersion.UNKNOWN);
4218da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4228da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("genmocks.java.lang", generatedClass.getPackageName());
4238da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("StringDelegateSubclass", generatedClass.getSimpleName());
4248da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals("java.lang.String", generatedClass.getSuperclass().getName());
4258da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    cleanupGeneratedClasses(generatedInterface, generatedClass);
4268da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
4278da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4288da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testAddMethods() throws ClassNotFoundException {
4298da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
4308da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedInterface = mockGenerator.generateInterface(Number.class, SdkVersion.UNKNOWN);
4318da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedClass =
4328da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        mockGenerator.generateSkeletalClass(Number.class, generatedInterface, SdkVersion.UNKNOWN);
4338da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4348da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    mockGenerator.addMethods(Number.class, generatedClass);
4358da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4368da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = getExpectedNamesForNumberClass();
4378da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> actualNames = getMethodNames(generatedClass.getDeclaredMethods());
4388da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertUnorderedContentsSame(expectedNames, actualNames);
4398da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    cleanupGeneratedClasses(generatedInterface, generatedClass);
4408da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
4418da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4428da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testAddMethodsObjectClass() throws ClassNotFoundException {
4438da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
4448da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedInterface = mockGenerator.generateInterface(Object.class, SdkVersion.UNKNOWN);
4458da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedClass =
4468da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        mockGenerator.generateSkeletalClass(Object.class, generatedInterface, SdkVersion.UNKNOWN);
4478da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4488da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    mockGenerator.addMethods(Object.class, generatedClass);
4498da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4508da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = getExpectedNamesForObjectClass();
4518da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> actualNames = getMethodNames(generatedClass.getDeclaredMethods());
4528da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertUnorderedContentsSame(expectedNames, actualNames);
4538da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    cleanupGeneratedClasses(generatedInterface, generatedClass);
4548da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
4558da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4568da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testAddMethodsUsesSuperclass() throws ClassNotFoundException {
4578da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
4588da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedInterface = mockGenerator.generateInterface(
4598da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        BigInteger.class, SdkVersion.UNKNOWN);
4608da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedClass = mockGenerator.generateSkeletalClass(
4618da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        BigInteger.class, generatedInterface, SdkVersion.UNKNOWN);
4628da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4638da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    mockGenerator.addMethods(BigInteger.class, generatedClass);
4648da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4658da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = getExpectedNamesForBigIntegerClass();
4668da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> actualNames = getMethodNames(generatedClass.getDeclaredMethods());
4678da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertUnorderedContentsSame(expectedNames, actualNames);
4688da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    cleanupGeneratedClasses(generatedInterface, generatedClass);
4698da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
4708da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4718da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetAllMethods() throws ClassNotFoundException {
4728da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
4738da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedInterface = mockGenerator.generateInterface(
4748da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        BigInteger.class, SdkVersion.UNKNOWN);
4758da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedClass = mockGenerator.generateSkeletalClass(
4768da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        BigInteger.class, generatedInterface, SdkVersion.UNKNOWN);
4778da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4788da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method[] methods = mockGenerator.getAllMethods(BigInteger.class);
4798da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4808da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = getExpectedSignaturesForBigIntegerClass();
4818da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> actualNames = getMethodSignatures(methods);
4828da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertUnorderedContentsSame(expectedNames, actualNames);
4838da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    cleanupGeneratedClasses(generatedInterface, generatedClass);
4848da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
4858da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4868da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGenerateInterface() {
4878da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
4888da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedInterface = mockGenerator.generateInterface(Number.class, SdkVersion.UNKNOWN);
4898da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4908da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = getExpectedNamesForNumberClass();
4918da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> actualNames = getMethodNames(generatedInterface.getDeclaredMethods());
4928da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertUnorderedContentsSame(expectedNames, actualNames);
4938da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    cleanupGeneratedClasses(generatedInterface);
4948da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
4958da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
4968da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testAddInterfaceMethods() {
4978da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
4988da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedInterface = AndroidMockGenerator.getClassPool().makeInterface("testInterface");
4998da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
5008da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    mockGenerator.addInterfaceMethods(Number.class, generatedInterface);
5018da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
5028da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = getExpectedNamesForNumberClass();
5038da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> actualNames = getMethodNames(generatedInterface.getDeclaredMethods());
5048da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertUnorderedContentsSame(expectedNames, actualNames);
5058da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    cleanupGeneratedClasses(generatedInterface);
5068da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
5078da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
5088da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGenerateSubclass() throws ClassNotFoundException {
5098da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
5108da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedInterface = mockGenerator.generateInterface(Number.class, SdkVersion.UNKNOWN);
5118da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
5128da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedClass =
5138da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        mockGenerator.generateSubClass(Number.class, generatedInterface, SdkVersion.UNKNOWN);
5148da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
5158da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = getExpectedNamesForNumberClass(true);
5168da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> actualNames = getMethodNames(generatedClass.getDeclaredMethods());
5178da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertUnorderedContentsSame(expectedNames, actualNames);
5188da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    cleanupGeneratedClasses(generatedInterface, generatedClass);
5198da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
5208da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
5218da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testCreateMockForClass() throws ClassNotFoundException, IOException,
5228da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      CannotCompileException, NotFoundException {
5238da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    NoFileAndroidMockGenerator mockGenerator = getNoFileMockGenerator();
5248da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<GeneratedClassFile> classes = mockGenerator.createMocksForClass(Object.class);
5258da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
5268da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> expectedNames = new ArrayList<String>();
5278da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    String subclassName = "genmocks.java.lang.ObjectDelegateSubclass";
5288da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    String interfaceName = "genmocks.java.lang.ObjectDelegateInterface";
5298da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    expectedNames.addAll(Arrays.asList(new String[] {subclassName,
5308da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        interfaceName}));
5318da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<String> actualNames = getClassNames(classes);
5328da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertUnorderedContentsSame(expectedNames, actualNames);
5338da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    cleanupGeneratedClasses(
5348da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        ClassPool.getDefault().get(subclassName),
5358da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        ClassPool.getDefault().get(interfaceName));
5368da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
5378da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
5388da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testGetSetDelegateMethodSource() {
5398da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
5408da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    CtClass generatedInterface = mockGenerator.generateInterface(Object.class, SdkVersion.UNKNOWN);
5418da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    String expectedSource =
5428da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        "public void setDelegate___AndroidMock(genmocks.java.lang.ObjectDelegateInterface obj) {"
5438da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            + " this.delegateMockObject = obj;}";
5448da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
5458da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    assertEquals(expectedSource, mockGenerator.getSetDelegateMethodSource(generatedInterface));
5468da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
5478da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
5488da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  public void testIsForbiddenMethod() throws SecurityException, NoSuchMethodException {
5498da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method[] forbiddenMethods =
5508da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal        new Method[] {Object.class.getMethod("equals", Object.class),
5518da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal            Object.class.getMethod("toString"), Object.class.getMethod("hashCode")};
5528da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    Method[] allowedMethods = new Method[] {BigInteger.class.getMethod("toString", Integer.TYPE)};
5538da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (Method method : forbiddenMethods) {
5548da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      assertTrue(getAndroidMockGenerator().isForbiddenMethod(method));
5558da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
5568da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    for (Method method : allowedMethods) {
5578da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      assertFalse(getAndroidMockGenerator().isForbiddenMethod(method));
5588da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
5598da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
5608da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
5618da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  /**
5628da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal   * Support test class for capturing the names of files that would have been
5638da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal   * saved to a jar file.
5648da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal   *
5658da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal   * @author swoodward@google.com (Stephen Woodward)
5668da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal   */
5678da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  class NoFileAndroidMockGenerator extends AndroidMockGenerator {
5688da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    List<CtClass> savedClasses = new ArrayList<CtClass>();
5698da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal
5708da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    @Override
5718da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    void saveCtClass(CtClass clazz) {
5728da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal      savedClasses.add(clazz);
5738da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal    }
5748da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal  }
5758da3e6ec64b991f5aa1e6561941d130683eba753Luis Sigal}
576