/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
*
* 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.android.ide.eclipse.adt.sdk;
import com.android.ide.eclipse.adt.sdk.AndroidJarLoader.ClassWrapper;
import com.android.ide.eclipse.adt.sdk.IAndroidClassLoader.IClassDescriptor;
import com.android.ide.eclipse.common.resources.AttrsXmlParser;
import com.android.ide.eclipse.common.resources.ViewClassInfo;
import com.android.ide.eclipse.common.resources.ViewClassInfo.LayoutParamsInfo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.TreeMap;
import junit.framework.TestCase;
/**
* Test the inner private methods of PlatformDataParser.
*
* Convention: method names that start with an underscore are actually local wrappers
* that call private methods from {@link AndroidTargetParser} using reflection.
* This is inspired by the Python coding rule which mandates underscores prefixes for
* "private" methods.
*/
public class LayoutParamsParserTest extends TestCase {
private static class MockFrameworkClassLoader extends AndroidJarLoader {
MockFrameworkClassLoader() {
super(null /* osFrameworkLocation */);
}
@Override
public HashMap<String, ArrayList<IClassDescriptor>> findClassesDerivingFrom(
String rootPackage, String[] superClasses) throws ClassFormatError {
return new HashMap<String, ArrayList<IClassDescriptor>>();
}
}
private static class MockAttrsXmlPath {
public String getPath() {
ClassLoader cl = this.getClass().getClassLoader();
URL res = cl.getResource("data/mock_attrs.xml"); //$NON-NLS-1$
return res.getFile();
}
}
private static class MockLayoutParamsParser extends LayoutParamsParser {
public MockLayoutParamsParser() {
super(new MockFrameworkClassLoader(),
new AttrsXmlParser(new MockAttrsXmlPath().getPath()).preload());
mTopViewClass = new ClassWrapper(mock_android.view.View.class);
mTopGroupClass = new ClassWrapper(mock_android.view.ViewGroup.class);
mTopLayoutParamsClass = new ClassWrapper(mock_android.view.ViewGroup.LayoutParams.class);
mViewList = new ArrayList<IClassDescriptor>();
mGroupList = new ArrayList<IClassDescriptor>();
mViewMap = new TreeMap<String, ExtViewClassInfo>();
mGroupMap = new TreeMap<String, ExtViewClassInfo>();
mLayoutParamsMap = new HashMap<String, LayoutParamsInfo>();
}
}
private MockLayoutParamsParser mParser;
@Override
public void setUp() throws Exception {
mParser = new MockLayoutParamsParser();
}
@Override
public void tearDown() throws Exception {
}
public final void testFindLayoutParams() throws Exception {
assertEquals(mock_android.view.ViewGroup.LayoutParams.class,
((ClassWrapper)_findLayoutParams(mock_android.view.ViewGroup.class)).wrappedClass());
assertEquals(mock_android.widget.LinearLayout.LayoutParams.class,
((ClassWrapper)_findLayoutParams(mock_android.widget.LinearLayout.class)).wrappedClass());
assertEquals(mock_android.widget.TableLayout.LayoutParams.class,
((ClassWrapper)_findLayoutParams(mock_android.widget.TableLayout.class)).wrappedClass());
}
public final void testGetLayoutParamsInfo() throws Exception {
LayoutParamsInfo info1 = _getLayoutParamsInfo(
mock_android.view.ViewGroup.LayoutParams.class);
assertNotNull(info1);
// ViewGroup.LayoutData has Object for superClass, which we don't map
assertNull(info1.getSuperClass());
LayoutParamsInfo info2 = _getLayoutParamsInfo(
mock_android.widget.LinearLayout.LayoutParams.class);
assertNotNull(info2);
// LinearLayout.LayoutData links to ViewGroup.LayoutParams
assertSame(info1, info2.getSuperClass());
LayoutParamsInfo info3 = _getLayoutParamsInfo(
mock_android.widget.TableLayout.LayoutParams.class);
assertNotNull(info3);
// TableLayout.LayoutData does not link to ViewGroup.LayoutParams nor
// LinearLayout.LayoutParams
assertNotSame(info1, info3.getSuperClass());
assertNotSame(info2, info3.getSuperClass());
// TableLayout.LayoutParams => ViewGroup.MarginLayoutParams => ViewGroup.LayoutParams
assertSame(info1, info3.getSuperClass().getSuperClass());
}
public final void testGetLayoutClasses() throws Exception {
// _getLayoutClasses();
}
//---- access to private methods
/** Calls the private constructor of the parser */
@SuppressWarnings("unused")
private AndroidTargetParser _Constructor(String osJarPath) throws Exception {
Constructor<AndroidTargetParser> constructor =
AndroidTargetParser.class.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
return constructor.newInstance(osJarPath);
}
/** calls the private getLayoutClasses() of the parser */
@SuppressWarnings("unused")
private void _getLayoutClasses() throws Exception {
Method method = AndroidTargetParser.class.getDeclaredMethod("getLayoutClasses"); //$NON-NLS-1$
method.setAccessible(true);
method.invoke(mParser);
}
/** calls the private addGroup() of the parser */
@SuppressWarnings("unused")
private ViewClassInfo _addGroup(Class<?> groupClass) throws Exception {
Method method = LayoutParamsParser.class.getDeclaredMethod("addGroup", //$NON-NLS-1$
IClassDescriptor.class);
method.setAccessible(true);
return (ViewClassInfo) method.invoke(mParser, new ClassWrapper(groupClass));
}
/** calls the private addLayoutParams() of the parser */
@SuppressWarnings("unused")
private LayoutParamsInfo _addLayoutParams(Class<?> groupClass) throws Exception {
Method method = LayoutParamsParser.class.getDeclaredMethod("addLayoutParams", //$NON-NLS-1$
IClassDescriptor.class);
method.setAccessible(true);
return (LayoutParamsInfo) method.invoke(mParser, new ClassWrapper(groupClass));
}
/** calls the private getLayoutParamsInfo() of the parser */
private LayoutParamsInfo _getLayoutParamsInfo(Class<?> layoutParamsClass) throws Exception {
Method method = LayoutParamsParser.class.getDeclaredMethod("getLayoutParamsInfo", //$NON-NLS-1$
IClassDescriptor.class);
method.setAccessible(true);
return (LayoutParamsInfo) method.invoke(mParser, new ClassWrapper(layoutParamsClass));
}
/** calls the private findLayoutParams() of the parser */
private IClassDescriptor _findLayoutParams(Class<?> groupClass) throws Exception {
Method method = LayoutParamsParser.class.getDeclaredMethod("findLayoutParams", //$NON-NLS-1$
IClassDescriptor.class);
method.setAccessible(true);
return (IClassDescriptor) method.invoke(mParser, new ClassWrapper(groupClass));
}
}
|