16047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar/*
26047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * Copyright (C) 2016 The Android Open Source Project
36047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar *
46047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
56047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * you may not use this file except in compliance with the License.
66047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * You may obtain a copy of the License at
76047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar *
86047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
96047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar *
106047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * Unless required by applicable law or agreed to in writing, software
116047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
126047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * See the License for the specific language governing permissions and
146047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar * limitations under the License.
156047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar */
166047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
176047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarpackage android.databinding.testapp;
186047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
196047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport static org.mockito.Matchers.eq;
206047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport static org.mockito.Mockito.any;
216047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport static org.mockito.Mockito.mock;
226047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport static org.mockito.Mockito.never;
236047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport static org.mockito.Mockito.times;
246047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport static org.mockito.Mockito.verify;
256047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport static org.mockito.Mockito.verifyZeroInteractions;
266047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport static org.mockito.Mockito.when;
276047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
286047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.annotation.TargetApi;
296047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.databinding.testapp.databinding.CallbacksBinding;
306047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.databinding.testapp.vo.CallbackBindingObject;
316047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.databinding.testapp.vo.NotBindableVo;
326047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.os.Build;
336047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.support.test.runner.AndroidJUnit4;
346047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.view.View;
356047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport android.widget.ArrayAdapter;
366047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
376047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport org.hamcrest.CoreMatchers;
386047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport org.hamcrest.MatcherAssert;
396047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport org.junit.Before;
406047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport org.junit.Rule;
416047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport org.junit.Test;
426047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport org.junit.runner.RunWith;
436047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
446047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport java.util.Arrays;
456047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarimport java.util.concurrent.atomic.AtomicInteger;
466047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
476047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar@RunWith(AndroidJUnit4.class)
486047998943beebd81e0ae1068df39c0cbee38628Yigit Boyarpublic class CallbackTest {
496047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Rule
506047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public DataBindingTestRule<CallbacksBinding> mBindingRule = new DataBindingTestRule<>(
516047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            R.layout.callbacks
526047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    );
536047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
546047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    CallbackBindingObject mObj;
556047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    NotBindableVo mOther;
566047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    CallbacksBinding mBinding;
576047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
586047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Before
596047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void setup() throws Throwable {
606047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBinding = mBindingRule.getBinding();
616047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mObj = mock(CallbackBindingObject.class);
626047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mOther = new NotBindableVo();
636047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBinding.setObj(mObj);
646047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBinding.setOtherObj(mOther);
656047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.executePending();
666047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
676047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
686047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
696047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verifyZeroInteractions(mObj);
706047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
716047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
726047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
736047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
746047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
756047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
766047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testRegularClick() throws Throwable {
776047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
786047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
796047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
806047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view1.performClick();
816047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, times(1)).onClick();
826047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onClick(any(View.class));
836047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onClickWithParam(any(NotBindableVo.class));
846047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onClickWithParam(any(View.class), any(NotBindableVo.class));
856047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
866047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
876047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
886047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
896047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
906047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testClickWithCallbackArg() throws Throwable {
916047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
926047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
936047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
946047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view2.performClick();
956047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onClick();
966047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, times(1)).onClick(mBinding.view2);
976047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onClickWithParam(any(NotBindableVo.class));
986047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onClickWithParam(any(View.class), any(NotBindableVo.class));
996047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
1006047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
1016047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
1026047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
1036047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
1046047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testClickWithAnotherVariableAsArg() throws Throwable {
1056047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
1066047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
1076047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
1086047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view3.performClick();
1096047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onClick();
1106047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onClick(any(View.class));
1116047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, times(1)).onClickWithParam(eq(mOther));
1126047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onClickWithParam(any(View.class), any(NotBindableVo.class));
1136047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
1146047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
1156047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
1166047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
1176047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
1186047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testClickWithViewAndAnotherVariableAsArgs() throws Throwable {
1196047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
1206047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
1216047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
1226047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view4.performClick();
1236047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onClick();
1246047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onClick(any(View.class));
1256047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onClickWithParam(any(NotBindableVo.class));
1266047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, times(1)).onClickWithParam(mBinding.view4, mOther);
1276047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
1286047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
1296047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
1306047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
1316047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
1326047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void nullObjectInCallback() throws Throwable {
1336047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBinding.setObj(null);
1346047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.executePending();
1356047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
1366047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
1376047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
1386047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view1.performClick();
1396047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view2.performClick();
1406047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view3.performClick();
1416047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view4.performClick();
1426047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
1436047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(mBinding.view1.performLongClick(), CoreMatchers.is(false));
1446047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(mBinding.view2.performLongClick(), CoreMatchers.is(false));
1456047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(mBinding.view3.performLongClick(), CoreMatchers.is(false));
1466047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(mBinding.view4.performLongClick(), CoreMatchers.is(false));
1476047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
1486047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
1496047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
1506047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        verifyZeroInteractions(mObj);
1516047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
1526047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
1536047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    // long click
1546047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
1556047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testRegularLongClick() throws Throwable {
1566047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
1576047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
1586047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
1596047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                when(mObj.onLongClick()).thenReturn(true);
1606047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(mBinding.view1.performLongClick(), CoreMatchers.is(true));
1616047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, times(1)).onLongClick();
1626047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onLongClick(any(View.class));
1636047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onLongClickWithParam(any(NotBindableVo.class));
1646047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onLongClickWithParam(any(View.class), any(NotBindableVo
1656047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                        .class));
1666047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
1676047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
1686047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
1696047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
1706047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
1716047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testLongClickWithCallbackArg() throws Throwable {
1726047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
1736047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
1746047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
1756047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                when(mObj.onLongClick(mBinding.view2)).thenReturn(true);
1766047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(mBinding.view2.performLongClick(), CoreMatchers.is(true));
1776047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onLongClick();
1786047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, times(1)).onLongClick(mBinding.view2);
1796047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onLongClickWithParam(any(NotBindableVo.class));
1806047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onLongClickWithParam(any(View.class), any(NotBindableVo
1816047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                        .class));
1826047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
1836047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
1846047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
1856047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
1866047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
1876047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testLongClickWithAnotherVariableAsArg() throws Throwable {
1886047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
1896047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
1906047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
1916047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                when(mObj.onLongClickWithParam(mOther)).thenReturn(true);
1926047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(mBinding.view3.performLongClick(), CoreMatchers.is(true));
1936047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onLongClick();
1946047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onLongClick(any(View.class));
1956047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, times(1)).onLongClickWithParam(mOther);
1966047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onLongClickWithParam(any(View.class), any(NotBindableVo
1976047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                        .class));
1986047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
1996047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
2006047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
2016047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
2026047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
2036047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testLongClickWithViewAndAnotherVariableAsArgs() throws Throwable {
2046047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
2056047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
2066047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
2076047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                when(mObj.onLongClickWithParam(mBinding.view4, mOther)).thenReturn(true);
2086047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(mBinding.view4.performLongClick(), CoreMatchers.is(true));
2096047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onLongClick();
2106047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onLongClick(any(View.class));
2116047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onLongClickWithParam(any(NotBindableVo.class));
2126047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, times(1)).onLongClickWithParam(mBinding.view4, mOther);
2136047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
2146047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
2156047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
2166047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
2176047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
2186047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testListViewOnScroll() throws Throwable {
2196047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        final CallbackBindingObject obj2 = mock(CallbackBindingObject.class);
2206047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBinding.setObj2(obj2);
2216047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.executePending();
2226047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
2236047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
2246047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
2256047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                // this is going to trigger scroll
2266047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.listView.setAdapter(new ArrayAdapter<>(mBinding.listView.getContext(),
2276047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                        android.R.layout.simple_list_item_1, Arrays.asList("a", "b")));
2286047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
2296047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
2306047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
2316047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @TargetApi(Build.VERSION_CODES.KITKAT)
2326047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
2336047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
2346047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                // setting listener also calls the callback
2356047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(obj2).onScrolled();
2366047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
2376047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
2386047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
2396047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
2406047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
2416047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testProgressChange() throws Throwable {
2426047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
2436047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
2446047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
2456047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.seekBar.setProgress(20);
2466047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, times(1)).onProgressChanged(mBinding.seekBar, 20, false);
2476047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
2486047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
2496047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
2506047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
2516047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
2526047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testStaticCallViaClass() throws Throwable {
2536047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        staticCall(mBinding.view5);
2546047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
2556047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
2566047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
2576047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testStaticCallViaInstance() throws Throwable {
2586047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        staticCall(mBinding.view6);
2596047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
2606047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
2616047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
2626047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testVariableOverride() throws Throwable {
2636047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
2646047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
2656047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
2666047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view8.performClick();
2676047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj).onClick(mBinding.view8);
2686047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
2696047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
2706047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
2716047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
2726047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
2736047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testArrayAccess() throws Throwable {
2746047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        final CallbackBindingObject[] objects = new CallbackBindingObject[] {
2756047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mock(CallbackBindingObject.class),
2766047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mock(CallbackBindingObject.class),
2776047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mock(CallbackBindingObject.class),
2786047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        };
2796047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBinding.setObjArr(objects);
2806047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.executePending();
2816047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
2826047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
2836047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
2846047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verifyZeroInteractions(objects);
2856047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view7.performClick();
2866047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(objects[1]).onClick(mBinding.view7);
2876047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view7.performLongClick();
2886047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(objects[2]).onLongClick(mBinding.view7);
2896047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verifyZeroInteractions(objects[0]);
2906047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
2916047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
2926047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
2936047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
2946047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
2956047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testStaticVariableFullPackage() throws Throwable {
2966047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
2976047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
2986047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
2996047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view9.performClick();
3006047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj).setVisible(View.VISIBLE);
3016047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
3026047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
3036047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
3046047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
3056047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
3066047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testStaticVariableImported() throws Throwable {
3076047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
3086047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
3096047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
3106047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view10.performClick();
3116047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj).setVisible(NotBindableVo.STATIC_VAL);
3126047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
3136047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
3146047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
3156047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
3166047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
3176047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testTernary1() throws Throwable {
3186047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
3196047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
3206047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
3216047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view11.setFocusable(false);
3226047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view11.performClick();
3236047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj).onNotFocusable();
3246047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onFocusable();
3256047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
3266047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
3276047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
3286047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
3296047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
3306047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testTernary2() throws Throwable {
3316047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
3326047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
3336047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
3346047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view11.setFocusable(true);
3356047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view11.performClick();
3366047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj).onFocusable();
3376047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onNotFocusable();
3386047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
3396047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
3406047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
3416047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
3426047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
3436047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testTernary3() throws Throwable {
3446047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
3456047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
3466047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
3476047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view11.setFocusable(false);
3486047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                when(mObj.onFocusable()).thenReturn(true, false);
3496047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                when(mObj.onNotFocusable()).thenReturn(false, true);
3506047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(mBinding.view11.performLongClick(), CoreMatchers.is(false));
3516047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(mBinding.view11.performLongClick(), CoreMatchers.is(true));
3526047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view11.setFocusable(true);
3536047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(mBinding.view11.performLongClick(), CoreMatchers.is(true));
3546047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(mBinding.view11.performLongClick(), CoreMatchers.is(false));
3556047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
3566047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
3576047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
3586047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
3596047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    @Test
3606047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    public void testTernary4() throws Throwable {
3616047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
3626047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
3636047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
3646047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view11.setFocusable(true);
3656047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                mBinding.view11.performClick();
3666047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj).onFocusable();
3676047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                verify(mObj, never()).onNotFocusable();
3686047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
3696047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
3706047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
3716047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar
3726047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    private void staticCall(final View view) throws Throwable {
3736047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        final AtomicInteger counter = NotBindableVo.sStaticCounter;
3746047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        final int start = counter.get();
3756047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        mBindingRule.runOnUiThread(new Runnable() {
3766047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            @Override
3776047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            public void run() {
3786047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                view.performClick();
3796047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(counter.get(), CoreMatchers.is(start + 1));
3806047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(view.performLongClick(), CoreMatchers.is(true));
3816047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar                MatcherAssert.assertThat(counter.get(), CoreMatchers.is(start + 2));
3826047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar            }
3836047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar        });
3846047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar    }
3856047998943beebd81e0ae1068df39c0cbee38628Yigit Boyar}
386