diff options
Diffstat (limited to 'tests/com/google/android/testing/mocking/AndroidFrameworkMockGeneratorTest.java')
-rw-r--r-- | tests/com/google/android/testing/mocking/AndroidFrameworkMockGeneratorTest.java | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/tests/com/google/android/testing/mocking/AndroidFrameworkMockGeneratorTest.java b/tests/com/google/android/testing/mocking/AndroidFrameworkMockGeneratorTest.java new file mode 100644 index 0000000..813063f --- /dev/null +++ b/tests/com/google/android/testing/mocking/AndroidFrameworkMockGeneratorTest.java @@ -0,0 +1,165 @@ +/* + * 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.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<JarEntry> getMockJarEntries() { + JarEntry firstEntry = new JarEntry("java/lang/Object.class"); + JarEntry secondEntry = new JarEntry( + "com/google/android/testing/mocking/AndroidFrameworkMockGeneratorTest$Inner.class"); + List<JarEntry> entryList = new ArrayList<JarEntry>(); + entryList.add(firstEntry); + entryList.add(secondEntry); + return entryList; + } + + private <T> void assertUnorderedContentsSame(Iterable<T> expected, Iterable<T> actual) { + List<T> missingItems = new ArrayList<T>(); + List<T> extraItems = new ArrayList<T>(); + 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<String> getClassNames(List<GeneratedClassFile> classes) { + List<String> classNames = new ArrayList<String>(); + 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<GeneratedClassFile> classes = mockGenerator.createMocksForClass(Object.class, version); + + List<String> expectedNames = new ArrayList<String>(); + expectedNames.addAll(Arrays.asList(new String[] { + version.getPackagePrefix() + "genmocks.java.lang.ObjectDelegateSubclass", + version.getPackagePrefix() + "genmocks.java.lang.ObjectDelegateInterface"})); + List<String> actualNames = getClassNames(classes); + assertUnorderedContentsSame(expectedNames, actualNames); + } + } + + public void testGetClassList() throws ClassNotFoundException { + Collection<JarEntry> jarEntries = getMockJarEntries(); + List<String> expectedClassNames = + new ArrayList<String>(Arrays.asList(new String[] { + "java.lang.Object", + "com.google.android.testing.mocking.AndroidFrameworkMockGeneratorTest$Inner"})); + List<Class<?>> 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)); + } + } + + public void testGetMocksForClass() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<CtClass> createdClasses = new ArrayList<CtClass>(); + AndroidFrameworkMockGenerator mockGenerator = getMockGenerator(); + for (SdkVersion version : SdkVersion.getAllVersions()) { + List<GeneratedClassFile> createdMocks = mockGenerator.createMocksForClass( + Vector.class, version); + for (GeneratedClassFile mock : createdMocks) { + CtClass ctClass = ClassPool.getDefault().get(mock.getClassName()); + createdClasses.add(ctClass); + ctClass.toClass(); + } + } + List<GeneratedClassFile> 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" + }; + 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 { + } +} |