1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *      http://www.apache.org/licenses/LICENSE-2.0
7 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific language governing permissions and
11 * limitations under the License.
12 */
13
14package android.databinding.testapp;
15
16import android.databinding.DataBindingUtil;
17import android.databinding.OnRebindCallback;
18import android.databinding.testapp.databinding.BasicBindingBinding;
19import android.databinding.testapp.databinding.NoExpressionsBinding;
20import android.databinding.testapp.databinding.NoDataElementBinding;
21import android.databinding.testapp.databinding.JustIdBinding;
22import android.test.UiThreadTest;
23import android.view.View;
24import android.view.ViewGroup;
25import android.widget.TextView;
26
27public class BasicBindingTest extends BaseDataBinderTest<BasicBindingBinding> {
28    public BasicBindingTest() {
29        super(BasicBindingBinding.class);
30    }
31
32    @Override
33    protected void setUp() throws Exception {
34        super.setUp();
35        initBinder();
36    }
37
38    @UiThreadTest
39    public void testTextViewContentInInitialization() {
40        assertAB("X", "Y");
41    }
42
43    @UiThreadTest
44    public void testNullValuesInInitialization() {
45        assertAB(null, null);
46    }
47
48    @UiThreadTest
49    public void testSecondIsNullInInitialization() {
50        assertAB(null, "y");
51    }
52
53    @UiThreadTest
54    public void testFirstIsNullInInitialization() {
55        assertAB("x", null);
56    }
57
58    @UiThreadTest
59    public void testTextViewContent() {
60        assertAB("X", "Y");
61    }
62
63    @UiThreadTest
64    public void testNullValues() {
65        assertAB(null, null);
66    }
67
68    @UiThreadTest
69    public void testSecondIsNull() {
70        assertAB(null, "y");
71    }
72
73    @UiThreadTest
74    public void testFirstIsNull() {
75        assertAB("x", null);
76    }
77
78    public void testStopBinding() throws Throwable {
79        final NoRebind noRebind = new NoRebind();
80        runTestOnUiThread(new Runnable() {
81            @Override
82            public void run() {
83                assertAB("X", "Y");
84                mBinder.addOnRebindCallback(noRebind);
85            }
86        });
87        mBinder.setA("Q");
88        WaitForRun waitForRun = new WaitForRun();
89        View root = mBinder.getRoot();
90        root.postOnAnimation(waitForRun);
91        waitForRun.waitForRun();
92        runTestOnUiThread(new Runnable() {
93            @Override
94            public void run() {
95                assertEquals(1, noRebind.rebindAttempts);
96                assertEquals(1, noRebind.rebindHalted);
97                assertEquals(0, noRebind.rebindWillEvaluate);
98                assertEquals("XY", mBinder.textView.getText().toString());
99            }
100        });
101        mBinder.removeOnRebindCallback(noRebind);
102        final AllowRebind allowRebind = new AllowRebind();
103        mBinder.addOnRebindCallback(allowRebind);
104        mBinder.setB("R");
105        root.postOnAnimation(waitForRun);
106        waitForRun.waitForRun();
107        runTestOnUiThread(new Runnable() {
108            @Override
109            public void run() {
110                assertEquals(1, noRebind.rebindAttempts);
111                assertEquals(1, noRebind.rebindHalted);
112                assertEquals(0, noRebind.rebindWillEvaluate);
113                assertEquals(1, allowRebind.rebindAttempts);
114                assertEquals(0, allowRebind.rebindHalted);
115                assertEquals(1, allowRebind.rebindWillEvaluate);
116                assertEquals("QR", mBinder.textView.getText().toString());
117            }
118        });
119    }
120
121    @UiThreadTest
122    public void testNoExpressionBinding() throws Throwable {
123        NoExpressionsBinding binding = NoExpressionsBinding.inflate(getActivity().getLayoutInflater());
124        assertNotNull(binding);
125    }
126
127    @UiThreadTest
128    public void testNoDataElement() throws Throwable {
129        NoDataElementBinding binding = NoDataElementBinding.inflate(getActivity().getLayoutInflater());
130        assertNotNull(binding);
131    }
132
133    @UiThreadTest
134    public void testJustIds() throws Throwable {
135        JustIdBinding binding = JustIdBinding.inflate(getActivity().getLayoutInflater());
136        assertNotNull(binding);
137        assertNotNull(binding.textView);
138    }
139
140    @UiThreadTest
141    public void testNoBinding() throws Throwable {
142        assertNull(DataBindingUtil.inflate(getActivity().getLayoutInflater(), R.layout.plain_layout,
143                null, false));
144    }
145
146    @UiThreadTest
147    public void testInflation() throws Throwable {
148        ViewGroup viewGroup = (ViewGroup) mBinder.getRoot();
149        BasicBindingBinding binding =
150                BasicBindingBinding.inflate(getActivity().getLayoutInflater(), viewGroup, true);
151        assertNotNull(binding);
152        assertNotNull(binding.textView);
153        assertNotSame(binding.textView, mBinder.textView);
154    }
155
156    @UiThreadTest
157    public void testAndroidId() throws Throwable {
158        JustIdBinding binding = JustIdBinding.inflate(getActivity().getLayoutInflater());
159        assertNotNull(binding);
160        assertNotNull(binding.empty);
161        assertTrue(binding.empty instanceof TextView);
162    }
163
164    private void assertAB(String a, String b) {
165        mBinder.setA(a);
166        mBinder.setB(b);
167        rebindAndAssert(a + b);
168    }
169
170    private void rebindAndAssert(String text) {
171        mBinder.executePendingBindings();
172        assertEquals(text, mBinder.textView.getText().toString());
173    }
174
175    private class AllowRebind extends OnRebindCallback<BasicBindingBinding> {
176        public int rebindAttempts;
177        public int rebindHalted;
178        public int rebindWillEvaluate;
179
180        @Override
181        public boolean onPreBind(BasicBindingBinding binding) {
182            rebindAttempts++;
183            return true;
184        }
185
186        @Override
187        public void onCanceled(BasicBindingBinding binding) {
188            rebindHalted++;
189        }
190
191        @Override
192        public void onBound(BasicBindingBinding binding) {
193            rebindWillEvaluate++;
194        }
195    }
196
197    private class NoRebind extends AllowRebind {
198        @Override
199        public boolean onPreBind(BasicBindingBinding binding) {
200            super.onPreBind(binding);
201            return false;
202        }
203    }
204
205    private static class WaitForRun implements Runnable {
206
207        @Override
208        public void run() {
209            synchronized (this) {
210                this.notifyAll();
211            }
212        }
213
214        public void waitForRun() {
215            synchronized (this) {
216                try {
217                    this.wait(1000);
218                } catch (InterruptedException e) {
219                    e.printStackTrace();
220                }
221            }
222        }
223    }
224}
225