/* * 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.ObservableArrayList; import android.databinding.testapp.databinding.BasicBindingBinding; import android.databinding.ObservableList; import android.databinding.ObservableList.OnListChangedCallback; import java.util.ArrayList; public class ObservableArrayListTest extends BaseDataBinderTest { private static final int ALL = 0; private static final int CHANGE = 1; private static final int INSERT = 2; private static final int MOVE = 3; private static final int REMOVE = 4; private ObservableList mObservable; private ArrayList mNotifications = new ArrayList<>(); private OnListChangedCallback mListener = new OnListChangedCallback() { @Override public void onChanged(ObservableList sender) { mNotifications.add(new ListChange(ALL, 0, 0)); } @Override public void onItemRangeChanged(ObservableList sender, int start, int count) { mNotifications.add(new ListChange(CHANGE, start, count)); } @Override public void onItemRangeInserted(ObservableList sender, int start, int count) { mNotifications.add(new ListChange(INSERT, start, count)); } @Override public void onItemRangeMoved(ObservableList sender, int from, int to, int count) { mNotifications.add(new ListChange(MOVE, from, to, count)); } @Override public void onItemRangeRemoved(ObservableList sender, int start, int count) { mNotifications.add(new ListChange(REMOVE, start, count)); } }; private static class ListChange { public ListChange(int change, int start, int count) { this.start = start; this.count = count; this.from = 0; this.to = 0; this.change = change; } public ListChange(int change, int from, int to, int count) { this.from = from; this.to = to; this.count = count; this.start = 0; this.change = change; } public final int start; public final int count; public final int from; public final int to; public final int change; } public ObservableArrayListTest() { super(BasicBindingBinding.class); } @Override protected void setUp() throws Exception { mNotifications.clear(); mObservable = new ObservableArrayList<>(); } public void testAddListener() { mObservable.add("Hello"); assertTrue(mNotifications.isEmpty()); mObservable.addOnListChangedCallback(mListener); mObservable.add("World"); assertFalse(mNotifications.isEmpty()); } public void testRemoveListener() { // test there is no exception when the listener isn't there mObservable.removeOnListChangedCallback(mListener); mObservable.addOnListChangedCallback(mListener); mObservable.add("Hello"); mNotifications.clear(); mObservable.removeOnListChangedCallback(mListener); mObservable.add("World"); assertTrue(mNotifications.isEmpty()); // test there is no exception when the listener isn't there mObservable.removeOnListChangedCallback(mListener); } public void testAdd() { OnListChangedCallback listChangedListener = new OnListChangedCallback() { @Override public void onChanged(ObservableList sender) { } @Override public void onItemRangeChanged(ObservableList sender, int i, int i1) { } @Override public void onItemRangeInserted(ObservableList sender, int i, int i1) { } @Override public void onItemRangeMoved(ObservableList sender, int i, int i1, int i2) { } @Override public void onItemRangeRemoved(ObservableList sender, int i, int i1) { } }; mObservable.addOnListChangedCallback(mListener); mObservable.addOnListChangedCallback(listChangedListener); mObservable.add("Hello"); assertEquals(1, mNotifications.size()); ListChange change = mNotifications.get(0); assertEquals(INSERT, change.change); assertEquals(0, change.start); assertEquals(1, change.count); assertEquals("Hello", mObservable.get(0)); } public void testInsert() { mObservable.addOnListChangedCallback(mListener); mObservable.add("Hello"); mObservable.add(0, "World"); mObservable.add(1, "Dang"); mObservable.add(3, "End"); assertEquals(4, mObservable.size()); assertEquals("World", mObservable.get(0)); assertEquals("Dang", mObservable.get(1)); assertEquals("Hello", mObservable.get(2)); assertEquals("End", mObservable.get(3)); assertEquals(4, mNotifications.size()); ListChange change = mNotifications.get(1); assertEquals(INSERT, change.change); assertEquals(0, change.start); assertEquals(1, change.count); } public void testAddAll() { ArrayList toAdd = new ArrayList<>(); toAdd.add("Hello"); toAdd.add("World"); mObservable.add("First"); mObservable.addOnListChangedCallback(mListener); mObservable.addAll(toAdd); assertEquals(3, mObservable.size()); assertEquals("Hello", mObservable.get(1)); assertEquals("World", mObservable.get(2)); assertEquals(1, mNotifications.size()); ListChange change = mNotifications.get(0); assertEquals(INSERT, change.change); assertEquals(1, change.start); assertEquals(2, change.count); } public void testInsertAll() { ArrayList toAdd = new ArrayList<>(); toAdd.add("Hello"); toAdd.add("World"); mObservable.add("First"); mObservable.addOnListChangedCallback(mListener); mObservable.addAll(0, toAdd); assertEquals(3, mObservable.size()); assertEquals("Hello", mObservable.get(0)); assertEquals("World", mObservable.get(1)); assertEquals(1, mNotifications.size()); ListChange change = mNotifications.get(0); assertEquals(INSERT, change.change); assertEquals(0, change.start); assertEquals(2, change.count); } public void testClear() { mObservable.add("Hello"); mObservable.add("World"); mObservable.addOnListChangedCallback(mListener); mObservable.clear(); assertEquals(1, mNotifications.size()); ListChange change = mNotifications.get(0); assertEquals(REMOVE, change.change); assertEquals(0, change.start); assertEquals(2, change.count); mObservable.clear(); // No notification when nothing is cleared. assertEquals(1, mNotifications.size()); } public void testRemoveIndex() { mObservable.add("Hello"); mObservable.add("World"); mObservable.addOnListChangedCallback(mListener); assertEquals("Hello", mObservable.remove(0)); assertEquals(1, mNotifications.size()); ListChange change = mNotifications.get(0); assertEquals(REMOVE, change.change); assertEquals(0, change.start); assertEquals(1, change.count); } public void testRemoveObject() { mObservable.add("Hello"); mObservable.add("World"); mObservable.addOnListChangedCallback(mListener); assertTrue(mObservable.remove("Hello")); assertEquals(1, mNotifications.size()); ListChange change = mNotifications.get(0); assertEquals(REMOVE, change.change); assertEquals(0, change.start); assertEquals(1, change.count); assertFalse(mObservable.remove("Hello")); // nothing removed, don't notify assertEquals(1, mNotifications.size()); } public void testSet() { mObservable.add("Hello"); mObservable.add("World"); mObservable.addOnListChangedCallback(mListener); assertEquals("Hello", mObservable.set(0, "Goodbye")); assertEquals("Goodbye", mObservable.get(0)); assertEquals(2, mObservable.size()); ListChange change = mNotifications.get(0); assertEquals(CHANGE, change.change); assertEquals(0, change.start); assertEquals(1, change.count); } }