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.testapp.BR; 17import android.databinding.testapp.databinding.MultiArgAdapterTestBinding; 18import android.test.UiThreadTest; 19 20import static android.databinding.testapp.adapter.MultiArgTestAdapter.MultiBindingClass1; 21import static android.databinding.testapp.adapter.MultiArgTestAdapter.MultiBindingClass2; 22import static android.databinding.testapp.adapter.MultiArgTestAdapter.join; 23 24public class MultiArgAdapterTest extends BaseDataBinderTest<MultiArgAdapterTestBinding> { 25 26 public MultiArgAdapterTest() { 27 super(MultiArgAdapterTestBinding.class); 28 } 29 30 @UiThreadTest 31 public void testMultiArgIsCalled() { 32 initBinder(); 33 MultiBindingClass1 obj1 = new MultiBindingClass1(); 34 MultiBindingClass2 obj2 = new MultiBindingClass2(); 35 MultiBindingClass1 obj3 = new MultiBindingClass1(); 36 MultiBindingClass2 obj4 = new MultiBindingClass2(); 37 obj1.setValue("a", false); 38 obj2.setValue("b", false); 39 obj3.setValue("c", false); 40 obj4.setValue("d", false); 41 mBinder.setObj1(obj1); 42 mBinder.setObj2(obj2); 43 mBinder.setObj3(obj3); 44 mBinder.setObj4(obj4); 45 mBinder.executePendingBindings(); 46 47 assertEquals(mBinder.merged.getText().toString(), join(obj1, obj2)); 48 assertEquals(mBinder.view2.getText().toString(), join(obj2)); 49 assertEquals(mBinder.view3.getText().toString(), join(obj3)); 50 assertEquals(mBinder.view4.getText().toString(), join(obj4)); 51 String prev2 = mBinder.view2.getText().toString(); 52 String prevValue = mBinder.merged.getText().toString(); 53 obj1.setValue("o", false); 54 mBinder.executePendingBindings(); 55 assertEquals(prevValue, mBinder.merged.getText().toString()); 56 obj2.setValue("p", false); 57 mBinder.executePendingBindings(); 58 assertEquals(prevValue, mBinder.merged.getText().toString()); 59 // now invalidate obj1 only, obj2 should be evaluated as well 60 obj1.notifyPropertyChanged(BR._all); 61 String prev3 = mBinder.view3.getText().toString(); 62 String prev4 = mBinder.view4.getText().toString(); 63 obj3.setValue("q", false); 64 obj4.setValue("r", false); 65 mBinder.executePendingBindings(); 66 assertEquals(join(obj1, obj2), mBinder.merged.getText().toString()); 67 assertEquals("obj2 should not be re-evaluated", prev2, mBinder.view2.getText().toString()); 68 // make sure 3 and 4 are not invalidated 69 assertEquals("obj3 should not be re-evaluated", prev3, mBinder.view3.getText().toString()); 70 assertEquals("obj4 should not be re-evaluated", prev4, mBinder.view4.getText().toString()); 71 } 72 73 @UiThreadTest 74 public void testSetWithOldValues() throws Throwable { 75 initBinder(); 76 MultiBindingClass1 obj1 = new MultiBindingClass1(); 77 MultiBindingClass2 obj2 = new MultiBindingClass2(); 78 MultiBindingClass1 obj3 = new MultiBindingClass1(); 79 MultiBindingClass2 obj4 = new MultiBindingClass2(); 80 obj1.setValue("a", false); 81 obj2.setValue("b", false); 82 obj3.setValue("c", false); 83 obj4.setValue("d", false); 84 mBinder.setObj1(obj1); 85 mBinder.setObj2(obj2); 86 mBinder.setObj3(obj3); 87 mBinder.setObj4(obj4); 88 mBinder.executePendingBindings(); 89 90 assertEquals("null -> a", mBinder.view7.getText().toString()); 91 assertEquals("null, null -> a, b", mBinder.view8.getText().toString()); 92 93 obj1.setValue("x", true); 94 obj2.setValue("y", true); 95 mBinder.executePendingBindings(); 96 97 assertEquals("a -> x", mBinder.view7.getText().toString()); 98 assertEquals("a, b -> x, y", mBinder.view8.getText().toString()); 99 100 obj1.setValue("x", true); 101 obj2.setValue("y", true); 102 mBinder.executePendingBindings(); 103 104 // Calls setter 105 assertEquals("x -> x", mBinder.view7.getText().toString()); 106 assertEquals("x, y -> x, y", mBinder.view8.getText().toString()); 107 108 obj2.setValue("z", true); 109 mBinder.executePendingBindings(); 110 111 // only the two-arg value changed 112 assertEquals("x -> x", mBinder.view7.getText().toString()); 113 assertEquals("x, y -> x, z", mBinder.view8.getText().toString()); 114 } 115} 116