| package com.android.test.hierarchyviewer; |
| |
| import android.test.ActivityInstrumentationTestCase2; |
| import android.view.View; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.lang.reflect.Constructor; |
| import java.lang.reflect.InvocationTargetException; |
| import java.lang.reflect.Method; |
| import java.util.List; |
| import java.util.Map; |
| |
| public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { |
| private MainActivity mActivity; |
| private View mTextView; |
| |
| |
| public MainActivityTest() { |
| super(MainActivity.class); |
| } |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| |
| mActivity = getActivity(); |
| mTextView = mActivity.findViewById(R.id.textView); |
| } |
| |
| private byte[] encode(View view) throws ClassNotFoundException, NoSuchMethodException, |
| IllegalAccessException, InstantiationException, InvocationTargetException { |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(1024 * 1024); |
| |
| Object encoder = createEncoder(baos); |
| invokeMethod(View.class, view, "encode", encoder); |
| invokeMethod(encoder.getClass(), encoder, "endStream"); |
| |
| return baos.toByteArray(); |
| } |
| |
| private Object invokeMethod(Class targetClass, Object target, String methodName, Object... params) |
| throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { |
| Class[] paramClasses = new Class[params.length]; |
| for (int i = 0; i < params.length; i++) { |
| paramClasses[i] = params[i].getClass(); |
| } |
| Method method = targetClass.getDeclaredMethod(methodName, paramClasses); |
| method.setAccessible(true); |
| return method.invoke(target, params); |
| } |
| |
| private Object createEncoder(ByteArrayOutputStream baos) throws ClassNotFoundException, |
| NoSuchMethodException, IllegalAccessException, InvocationTargetException, |
| InstantiationException { |
| Class clazz = Class.forName("android.view.ViewHierarchyEncoder"); |
| Constructor constructor = clazz.getConstructor(ByteArrayOutputStream.class); |
| return constructor.newInstance(baos); |
| } |
| |
| public void testTextView() throws Exception { |
| byte[] data = encode(mTextView); |
| assertNotNull(data); |
| assertTrue(data.length > 0); |
| |
| ViewDumpParser parser = new ViewDumpParser(); |
| parser.parse(data); |
| |
| List<Map<Short, Object>> views = parser.getViews(); |
| Map<String, Short> propertyNameTable = parser.getIds(); |
| |
| assertEquals(1, views.size()); |
| assertNotNull(propertyNameTable); |
| |
| Map<Short, Object> textViewProperties = views.get(0); |
| assertEquals("android.widget.TextView", |
| textViewProperties.get(propertyNameTable.get("meta:__name__"))); |
| |
| assertEquals(mActivity.getString(R.string.test), |
| textViewProperties.get(propertyNameTable.get("text:text"))); |
| } |
| } |