/* * Copyright 2010 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.android.testing.mocking; import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; import javassist.NotFoundException; import junit.framework.TestCase; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Vector; import java.util.jar.JarEntry; /** * @author swoodward@google.com (Stephen Woodward) */ public class AndroidFrameworkMockGeneratorTest extends TestCase { private void cleanupGeneratedClasses(CtClass... classes) { for (CtClass clazz : classes) { clazz.detach(); } } private Collection getMockJarEntries() { JarEntry firstEntry = new JarEntry("java/lang/Object.class"); JarEntry secondEntry = new JarEntry( "com/google/android/testing/mocking/AndroidFrameworkMockGeneratorTest$Inner.class"); List entryList = new ArrayList(); entryList.add(firstEntry); entryList.add(secondEntry); return entryList; } private void assertUnorderedContentsSame(Iterable expected, Iterable actual) { List missingItems = new ArrayList(); List extraItems = new ArrayList(); for (T item : expected) { missingItems.add(item); } for (T item : actual) { missingItems.remove(item); extraItems.add(item); } for (T item : expected) { extraItems.remove(item); } if (missingItems.size() + extraItems.size() != 0) { String errorMessage = "Contents were different. Missing: " + Arrays.toString(missingItems.toArray()) + " Extra: " + Arrays.toString(extraItems.toArray()); fail(errorMessage); } } private List getClassNames(List classes) { List classNames = new ArrayList(); for (GeneratedClassFile clazz : classes) { classNames.add(clazz.getClassName()); } return classNames; } private AndroidFrameworkMockGenerator getMockGenerator() { return new AndroidFrameworkMockGenerator(); } public void testCreateMockForClass() throws ClassNotFoundException, IOException, CannotCompileException { AndroidFrameworkMockGenerator mockGenerator = getMockGenerator(); for (SdkVersion version : SdkVersion.getAllVersions()) { List classes = mockGenerator.createMocksForClass(Object.class, version); List expectedNames = new ArrayList(); expectedNames.addAll(Arrays.asList(new String[] { version.getPackagePrefix() + "genmocks.java.lang.ObjectDelegateSubclass", version.getPackagePrefix() + "genmocks.java.lang.ObjectDelegateInterface"})); List actualNames = getClassNames(classes); assertUnorderedContentsSame(expectedNames, actualNames); } } public void testGetClassList() throws ClassNotFoundException { Collection jarEntries = getMockJarEntries(); List expectedClassNames = new ArrayList(Arrays.asList(new String[] { "java.lang.Object", "com.google.android.testing.mocking.AndroidFrameworkMockGeneratorTest$Inner"})); List> list = getMockGenerator().getClassList(jarEntries); assertEquals(expectedClassNames.size(), list.size()); for (Class clazz : list) { assertTrue(clazz.getName(), expectedClassNames.contains(clazz.getName())); } } public void testIsClassFile() { assertTrue(getMockGenerator().jarEntryIsClassFile(new JarEntry("something.class"))); assertTrue(getMockGenerator().jarEntryIsClassFile(new JarEntry("/Foo/Bar.class"))); assertFalse(getMockGenerator().jarEntryIsClassFile(new JarEntry("/Foo/Bar.clas"))); assertFalse(getMockGenerator().jarEntryIsClassFile(new JarEntry("/Foo/Bar.class "))); assertFalse(getMockGenerator().jarEntryIsClassFile(new JarEntry("/Foo/Bar"))); } public void testGetJarFileNameForVersion() { for (SdkVersion version : SdkVersion.getAllVersions()) { getMockGenerator(); assertEquals("lib/android/android_" + version.getVersionName() + ".jar", AndroidFrameworkMockGenerator.getJarFileNameForVersion(version) .replace('\\', '/')); } } public void testGetMocksForClass() throws ClassNotFoundException, IOException, CannotCompileException, NotFoundException { List createdClasses = new ArrayList(); AndroidFrameworkMockGenerator mockGenerator = getMockGenerator(); for (SdkVersion version : SdkVersion.getAllVersions()) { List createdMocks = mockGenerator.createMocksForClass( Vector.class, version); for (GeneratedClassFile mock : createdMocks) { CtClass ctClass = ClassPool.getDefault().get(mock.getClassName()); createdClasses.add(ctClass); ctClass.toClass(); } } List mocks = mockGenerator.getMocksForClass(Vector.class); String[] expectedClassNames = new String[] { "v15.genmocks.java.util.VectorDelegateSubclass", "v15.genmocks.java.util.VectorDelegateInterface", "v16.genmocks.java.util.VectorDelegateSubclass", "v16.genmocks.java.util.VectorDelegateInterface", "v201.genmocks.java.util.VectorDelegateSubclass", "v201.genmocks.java.util.VectorDelegateInterface", "v21.genmocks.java.util.VectorDelegateSubclass", "v21.genmocks.java.util.VectorDelegateInterface", "v22.genmocks.java.util.VectorDelegateSubclass", "v22.genmocks.java.util.VectorDelegateInterface", "v23.genmocks.java.util.VectorDelegateSubclass", "v23.genmocks.java.util.VectorDelegateInterface" }; assertEquals(expectedClassNames.length, mocks.size()); for (int i = 0; i < mocks.size(); ++i) { assertEquals(expectedClassNames[i], mocks.get(i).getClassName()); } cleanupGeneratedClasses(createdClasses.toArray(new CtClass[0])); } class Inner { } }