/*
* 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.databinding.DataBindingUtil;
import android.databinding.OnRebindCallback;
import android.databinding.testapp.databinding.BasicBindingBinding;
import android.databinding.testapp.databinding.NoExpressionsBinding;
import android.databinding.testapp.databinding.NoDataElementBinding;
import android.databinding.testapp.databinding.JustIdBinding;
import android.test.UiThreadTest;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class BasicBindingTest extends BaseDataBinderTest<BasicBindingBinding> {
public BasicBindingTest() {
super(BasicBindingBinding.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
initBinder();
}
@UiThreadTest
public void testTextViewContentInInitialization() {
assertAB("X", "Y");
}
@UiThreadTest
public void testNullValuesInInitialization() {
assertAB(null, null);
}
@UiThreadTest
public void testSecondIsNullInInitialization() {
assertAB(null, "y");
}
@UiThreadTest
public void testFirstIsNullInInitialization() {
assertAB("x", null);
}
@UiThreadTest
public void testTextViewContent() {
assertAB("X", "Y");
}
@UiThreadTest
public void testNullValues() {
assertAB(null, null);
}
@UiThreadTest
public void testSecondIsNull() {
assertAB(null, "y");
}
@UiThreadTest
public void testFirstIsNull() {
assertAB("x", null);
}
public void testStopBinding() throws Throwable {
final NoRebind noRebind = new NoRebind();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
assertAB("X", "Y");
mBinder.addOnRebindCallback(noRebind);
}
});
mBinder.setA("Q");
WaitForRun waitForRun = new WaitForRun();
View root = mBinder.getRoot();
root.postOnAnimation(waitForRun);
waitForRun.waitForRun();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
assertEquals(1, noRebind.rebindAttempts);
assertEquals(1, noRebind.rebindHalted);
assertEquals(0, noRebind.rebindWillEvaluate);
assertEquals("XY", mBinder.textView.getText().toString());
}
});
mBinder.removeOnRebindCallback(noRebind);
final AllowRebind allowRebind = new AllowRebind();
mBinder.addOnRebindCallback(allowRebind);
mBinder.setB("R");
root.postOnAnimation(waitForRun);
waitForRun.waitForRun();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
assertEquals(1, noRebind.rebindAttempts);
assertEquals(1, noRebind.rebindHalted);
assertEquals(0, noRebind.rebindWillEvaluate);
assertEquals(1, allowRebind.rebindAttempts);
assertEquals(0, allowRebind.rebindHalted);
assertEquals(1, allowRebind.rebindWillEvaluate);
assertEquals("QR", mBinder.textView.getText().toString());
}
});
}
@UiThreadTest
public void testNoExpressionBinding() throws Throwable {
NoExpressionsBinding binding = NoExpressionsBinding.inflate(getActivity().getLayoutInflater());
assertNotNull(binding);
}
@UiThreadTest
public void testNoDataElement() throws Throwable {
NoDataElementBinding binding = NoDataElementBinding.inflate(getActivity().getLayoutInflater());
assertNotNull(binding);
}
@UiThreadTest
public void testJustIds() throws Throwable {
JustIdBinding binding = JustIdBinding.inflate(getActivity().getLayoutInflater());
assertNotNull(binding);
assertNotNull(binding.textView);
}
@UiThreadTest
public void testNoBinding() throws Throwable {
assertNull(DataBindingUtil.inflate(getActivity().getLayoutInflater(), R.layout.plain_layout,
null, false));
}
@UiThreadTest
public void testInflation() throws Throwable {
ViewGroup viewGroup = (ViewGroup) mBinder.getRoot();
BasicBindingBinding binding =
BasicBindingBinding.inflate(getActivity().getLayoutInflater(), viewGroup, true);
assertNotNull(binding);
assertNotNull(binding.textView);
assertNotSame(binding.textView, mBinder.textView);
}
@UiThreadTest
public void testAndroidId() throws Throwable {
JustIdBinding binding = JustIdBinding.inflate(getActivity().getLayoutInflater());
assertNotNull(binding);
assertNotNull(binding.empty);
assertTrue(binding.empty instanceof TextView);
}
private void assertAB(String a, String b) {
mBinder.setA(a);
mBinder.setB(b);
rebindAndAssert(a + b);
}
private void rebindAndAssert(String text) {
mBinder.executePendingBindings();
assertEquals(text, mBinder.textView.getText().toString());
}
private class AllowRebind extends OnRebindCallback<BasicBindingBinding> {
public int rebindAttempts;
public int rebindHalted;
public int rebindWillEvaluate;
@Override
public boolean onPreBind(BasicBindingBinding binding) {
rebindAttempts++;
return true;
}
@Override
public void onCanceled(BasicBindingBinding binding) {
rebindHalted++;
}
@Override
public void onBound(BasicBindingBinding binding) {
rebindWillEvaluate++;
}
}
private class NoRebind extends AllowRebind {
@Override
public boolean onPreBind(BasicBindingBinding binding) {
super.onPreBind(binding);
return false;
}
}
private static class WaitForRun implements Runnable {
@Override
public void run() {
synchronized (this) {
this.notifyAll();
}
}
public void waitForRun() {
synchronized (this) {
try {
this.wait(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}