blob: b43fa5d83a9c93b667cc9de78db732c9b14587eb [file] [log] [blame]
/*
* 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<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)
.replace('\\', '/'));
}
}
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",
"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 {
}
}