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