1dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar/* 2dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * Copyright (C) 2015 The Android Open Source Project 3dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 4dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * you may not use this file except in compliance with the License. 5dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * You may obtain a copy of the License at 6dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 7dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * Unless required by applicable law or agreed to in writing, software 8dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 9dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * See the License for the specific language governing permissions and 11dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar * limitations under the License. 12dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar */ 13dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar 14fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountpackage android.databinding.testapp; 15dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar 164d4979490e1fa374c0d7f3599fed0a9e83a579d0George Mountimport android.app.FragmentManager; 17fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.ViewDataBinding; 18dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar 195bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyarimport android.content.pm.ActivityInfo; 200fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyarimport android.os.Looper; 21dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyarimport android.test.ActivityInstrumentationTestCase2; 229bdb2415487832e88a05c7bd19391b05440b468eGeorge Mountimport android.view.LayoutInflater; 23dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar 24fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport java.io.PrintWriter; 25fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport java.io.StringWriter; 264c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mountimport java.lang.reflect.Method; 274c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount 284c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mountpublic class BaseDataBinderTest<T extends ViewDataBinding> 29dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar extends ActivityInstrumentationTestCase2<TestActivity> { 3071eb6908f2689bd17000237eb645896c36da0138George Mount protected Class<T> mBinderClass; 315bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar private int mOrientation; 32dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar protected T mBinder; 33dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar 344c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount public BaseDataBinderTest(final Class<T> binderClass) { 354c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount this(binderClass, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 365bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 375bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar 384c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount public BaseDataBinderTest(final Class<T> binderClass, final int orientation) { 39dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar super(TestActivity.class); 40dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar mBinderClass = binderClass; 415bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar mOrientation = orientation; 42dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar } 43dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar 44dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar @Override 45dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar protected void setUp() throws Exception { 46dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar super.setUp(); 475bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar getActivity().setRequestedOrientation(mOrientation); 480fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar } 490fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar 500fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar public boolean isMainThread() { 510fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar return Looper.myLooper() == Looper.getMainLooper(); 520fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar } 530fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar 543f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar protected T getBinder() { 553f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar return mBinder; 563f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar } 573f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar 583f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar protected T initBinder() { 593f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar return initBinder(null); 603f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar } 613f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar 623f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar @Override 633f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar public void runTestOnUiThread(Runnable r) throws Throwable { 643f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar if (Looper.myLooper() == Looper.getMainLooper()) { 653f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar r.run(); 663f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar } else { 673f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar // ensure activity is created 683f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar getActivity(); 693f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar super.runTestOnUiThread(r); 703f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar } 713f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar 723f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar } 733f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar 743f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar protected T initBinder(final Runnable init) { 753f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar assertNull("should not initialize binder twice", mBinder); 763f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar if (Looper.myLooper() != Looper.getMainLooper()) { 773f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar getActivity();// ensure activity is created 780fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar getInstrumentation().waitForIdleSync(); 790fa158e8aa91297cc246e3bb9e5d1388dc2355ccYigit Boyar } 803f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar 813f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar final Method[] method = {null}; 823f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar Throwable[] initError = new Throwable[1]; 833f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar try { 843f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar runTestOnUiThread(new Runnable() { 853f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar @Override 863f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar public void run() { 873f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar try { 883f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar method[0] = mBinderClass.getMethod("inflate", LayoutInflater.class); 893f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar mBinder = (T) method[0].invoke(null, getActivity().getLayoutInflater()); 903f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar getActivity().setContentView(mBinder.getRoot()); 913f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar if (init != null) { 923f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar init.run(); 933f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar } 943f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar } catch (Exception e) { 953f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar StringWriter sw = new StringWriter(); 963f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar PrintWriter pw = new PrintWriter(sw); 973f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar e.printStackTrace(pw); 983f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar fail("Error creating binder: " + sw.toString()); 993f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar } 1003f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar } 1013f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar }); 1023f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar } catch (Throwable throwable) { 1033f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar initError[0] = throwable; 1043f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar } 1053f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar assertNull(initError[0]); 106dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar assertNotNull(mBinder); 1073f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar return mBinder; 1083f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar } 1093f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar 1103f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar protected void reCreateBinder(Runnable init) { 1113f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar mBinder = null; 1123f73e3149732132c02f5d19aab7b5da429794058Yigit Boyar initBinder(init); 113dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar } 1145bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar 1155bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar protected void assertMethod(Class<?> klass, String methodName) throws NoSuchMethodException { 1165bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar assertEquals(klass, mBinder.getClass().getDeclaredMethod(methodName).getReturnType()); 1175bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 1185bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar 1195bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar protected void assertField(Class<?> klass, String fieldName) throws NoSuchFieldException { 1205bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar assertEquals(klass, mBinder.getClass().getDeclaredField(fieldName).getType()); 1215bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 1225bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar 12334a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount protected void assertPublicField(Class<?> klass, String fieldName) throws NoSuchFieldException { 12434a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount assertEquals(klass, mBinder.getClass().getField(fieldName).getType()); 12534a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount } 12634a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount 1275bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar protected void assertNoField(String fieldName) { 1285bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar Exception[] ex = new Exception[1]; 1295bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar try { 13034a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount mBinder.getClass().getField(fieldName); 1315bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } catch (NoSuchFieldException e) { 1325bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar ex[0] = e; 1335bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 1345bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar assertNotNull(ex[0]); 1355bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 136dc69f49d687ec036947f26a9bf9025a305de0721Yigit Boyar} 137