/* * Copyright (C) 2015 The Android Open Source Project * 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 android.databinding.testapp; import android.app.FragmentManager; import android.databinding.ViewDataBinding; import android.content.pm.ActivityInfo; import android.os.Looper; import android.test.ActivityInstrumentationTestCase2; import android.view.LayoutInflater; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.Method; public class BaseDataBinderTest extends ActivityInstrumentationTestCase2 { protected Class mBinderClass; private int mOrientation; protected T mBinder; public BaseDataBinderTest(final Class binderClass) { this(binderClass, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } public BaseDataBinderTest(final Class binderClass, final int orientation) { super(TestActivity.class); mBinderClass = binderClass; mOrientation = orientation; } @Override protected void setUp() throws Exception { super.setUp(); getActivity().setRequestedOrientation(mOrientation); } public boolean isMainThread() { return Looper.myLooper() == Looper.getMainLooper(); } protected T getBinder() { return mBinder; } protected T initBinder() { return initBinder(null); } @Override public void runTestOnUiThread(Runnable r) throws Throwable { if (Looper.myLooper() == Looper.getMainLooper()) { r.run(); } else { // ensure activity is created getActivity(); super.runTestOnUiThread(r); } } protected T initBinder(final Runnable init) { assertNull("should not initialize binder twice", mBinder); if (Looper.myLooper() != Looper.getMainLooper()) { getActivity();// ensure activity is created getInstrumentation().waitForIdleSync(); } final Method[] method = {null}; Throwable[] initError = new Throwable[1]; try { runTestOnUiThread(new Runnable() { @Override public void run() { try { method[0] = mBinderClass.getMethod("inflate", LayoutInflater.class); mBinder = (T) method[0].invoke(null, getActivity().getLayoutInflater()); getActivity().setContentView(mBinder.getRoot()); if (init != null) { init.run(); } } catch (Exception e) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); fail("Error creating binder: " + sw.toString()); } } }); } catch (Throwable throwable) { initError[0] = throwable; } assertNull(initError[0]); assertNotNull(mBinder); return mBinder; } protected void reCreateBinder(Runnable init) { mBinder = null; initBinder(init); } protected void assertMethod(Class klass, String methodName) throws NoSuchMethodException { assertEquals(klass, mBinder.getClass().getDeclaredMethod(methodName).getReturnType()); } protected void assertField(Class klass, String fieldName) throws NoSuchFieldException { assertEquals(klass, mBinder.getClass().getDeclaredField(fieldName).getType()); } protected void assertPublicField(Class klass, String fieldName) throws NoSuchFieldException { assertEquals(klass, mBinder.getClass().getField(fieldName).getType()); } protected void assertNoField(String fieldName) { Exception[] ex = new Exception[1]; try { mBinder.getClass().getField(fieldName); } catch (NoSuchFieldException e) { ex[0] = e; } assertNotNull(ex[0]); } }