15cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount/*
25cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount * Copyright (C) 2015 The Android Open Source Project
35cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount *
45cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount * Licensed under the Apache License, Version 2.0 (the "License");
55cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount * you may not use this file except in compliance with the License.
65cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount * You may obtain a copy of the License at
75cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount *
85cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount *      http://www.apache.org/licenses/LICENSE-2.0
95cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount *
105cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount * Unless required by applicable law or agreed to in writing, software
115cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount * distributed under the License is distributed on an "AS IS" BASIS,
125cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount * See the License for the specific language governing permissions and
145cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount * limitations under the License.
155cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount */
16fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountpackage android.databinding.testapp;
175cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
18fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.ObservableArrayList;
192e2043d30f95585de2069e1cbb23e022ab0e71c4George Mountimport android.databinding.testapp.databinding.BasicBindingBinding;
205cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
21fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.ObservableList;
22722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mountimport android.databinding.ObservableList.OnListChangedCallback;
235cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
245cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mountimport java.util.ArrayList;
255cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
264c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mountpublic class ObservableArrayListTest extends BaseDataBinderTest<BasicBindingBinding> {
275cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
285cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    private static final int ALL = 0;
295cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
305cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    private static final int CHANGE = 1;
315cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
325cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    private static final int INSERT = 2;
335cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
345cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    private static final int MOVE = 3;
355cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
365cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    private static final int REMOVE = 4;
375cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
385cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    private ObservableList<String> mObservable;
395cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
405cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    private ArrayList<ListChange> mNotifications = new ArrayList<>();
415cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
42722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    private OnListChangedCallback mListener = new OnListChangedCallback() {
435cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        @Override
44722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        public void onChanged(ObservableList sender) {
455cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            mNotifications.add(new ListChange(ALL, 0, 0));
465cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        }
475cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
485cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        @Override
49722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        public void onItemRangeChanged(ObservableList sender, int start, int count) {
505cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            mNotifications.add(new ListChange(CHANGE, start, count));
515cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        }
525cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
535cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        @Override
54722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        public void onItemRangeInserted(ObservableList sender, int start, int count) {
555cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            mNotifications.add(new ListChange(INSERT, start, count));
565cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        }
575cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
585cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        @Override
59722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        public void onItemRangeMoved(ObservableList sender, int from, int to, int count) {
605cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            mNotifications.add(new ListChange(MOVE, from, to, count));
615cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        }
625cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
635cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        @Override
64722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        public void onItemRangeRemoved(ObservableList sender, int start, int count) {
655cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            mNotifications.add(new ListChange(REMOVE, start, count));
665cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        }
675cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    };
685cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
695cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    private static class ListChange {
705cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
715cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        public ListChange(int change, int start, int count) {
725cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            this.start = start;
735cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            this.count = count;
745cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            this.from = 0;
755cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            this.to = 0;
765cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            this.change = change;
775cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        }
785cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
795cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        public ListChange(int change, int from, int to, int count) {
805cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            this.from = from;
815cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            this.to = to;
825cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            this.count = count;
835cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            this.start = 0;
845cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount            this.change = change;
855cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        }
865cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
875cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        public final int start;
885cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
895cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        public final int count;
905cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
915cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        public final int from;
925cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
935cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        public final int to;
945cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
955cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        public final int change;
965cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    }
975cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
985cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    public ObservableArrayListTest() {
994c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount        super(BasicBindingBinding.class);
1005cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    }
1015cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
1025cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    @Override
1035cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    protected void setUp() throws Exception {
1045cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mNotifications.clear();
1055cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable = new ObservableArrayList<>();
1065cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    }
1075cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
1085cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    public void testAddListener() {
1095cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("Hello");
1105cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertTrue(mNotifications.isEmpty());
111722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.addOnListChangedCallback(mListener);
1125cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("World");
1135cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertFalse(mNotifications.isEmpty());
1145cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    }
1155cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
1165cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    public void testRemoveListener() {
1175cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        // test there is no exception when the listener isn't there
118722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.removeOnListChangedCallback(mListener);
1195cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
120722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.addOnListChangedCallback(mListener);
1215cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("Hello");
1225cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mNotifications.clear();
123722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.removeOnListChangedCallback(mListener);
1245cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("World");
1255cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertTrue(mNotifications.isEmpty());
1265cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
1275cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        // test there is no exception when the listener isn't there
128722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.removeOnListChangedCallback(mListener);
1295cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    }
1305cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
1315cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    public void testAdd() {
132722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        OnListChangedCallback listChangedListener = new OnListChangedCallback() {
13365bf08e7cd0acc5e13ab131433e35981d4416a79George Mount            @Override
134722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount            public void onChanged(ObservableList sender) {
13565bf08e7cd0acc5e13ab131433e35981d4416a79George Mount            }
13665bf08e7cd0acc5e13ab131433e35981d4416a79George Mount
13765bf08e7cd0acc5e13ab131433e35981d4416a79George Mount            @Override
138722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount            public void onItemRangeChanged(ObservableList sender, int i, int i1) {
13965bf08e7cd0acc5e13ab131433e35981d4416a79George Mount
14065bf08e7cd0acc5e13ab131433e35981d4416a79George Mount            }
14165bf08e7cd0acc5e13ab131433e35981d4416a79George Mount
14265bf08e7cd0acc5e13ab131433e35981d4416a79George Mount            @Override
143722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount            public void onItemRangeInserted(ObservableList sender, int i, int i1) {
14465bf08e7cd0acc5e13ab131433e35981d4416a79George Mount
14565bf08e7cd0acc5e13ab131433e35981d4416a79George Mount            }
14665bf08e7cd0acc5e13ab131433e35981d4416a79George Mount
14765bf08e7cd0acc5e13ab131433e35981d4416a79George Mount            @Override
148722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount            public void onItemRangeMoved(ObservableList sender, int i, int i1, int i2) {
14965bf08e7cd0acc5e13ab131433e35981d4416a79George Mount
15065bf08e7cd0acc5e13ab131433e35981d4416a79George Mount            }
15165bf08e7cd0acc5e13ab131433e35981d4416a79George Mount
15265bf08e7cd0acc5e13ab131433e35981d4416a79George Mount            @Override
153722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount            public void onItemRangeRemoved(ObservableList sender, int i, int i1) {
15465bf08e7cd0acc5e13ab131433e35981d4416a79George Mount            }
15565bf08e7cd0acc5e13ab131433e35981d4416a79George Mount        };
156722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.addOnListChangedCallback(mListener);
157722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.addOnListChangedCallback(listChangedListener);
1585cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("Hello");
1595cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, mNotifications.size());
1605cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        ListChange change = mNotifications.get(0);
1615cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(INSERT, change.change);
1625cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(0, change.start);
1635cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, change.count);
1645cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals("Hello", mObservable.get(0));
1655cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    }
1665cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
1675cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    public void testInsert() {
168722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.addOnListChangedCallback(mListener);
1695cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("Hello");
1705cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add(0, "World");
1715cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add(1, "Dang");
1725cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add(3, "End");
1735cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(4, mObservable.size());
1745cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals("World", mObservable.get(0));
1755cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals("Dang", mObservable.get(1));
1765cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals("Hello", mObservable.get(2));
1775cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals("End", mObservable.get(3));
1785cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(4, mNotifications.size());
1795cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        ListChange change = mNotifications.get(1);
1805cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(INSERT, change.change);
1815cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(0, change.start);
1825cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, change.count);
1835cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    }
1845cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
1855cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    public void testAddAll() {
1865cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        ArrayList<String> toAdd = new ArrayList<>();
1875cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        toAdd.add("Hello");
1885cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        toAdd.add("World");
1895cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("First");
190722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.addOnListChangedCallback(mListener);
1915cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.addAll(toAdd);
1925cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(3, mObservable.size());
1935cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals("Hello", mObservable.get(1));
1945cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals("World", mObservable.get(2));
1955cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, mNotifications.size());
1965cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        ListChange change = mNotifications.get(0);
1975cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(INSERT, change.change);
1985cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, change.start);
1995cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(2, change.count);
2005cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    }
2015cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
2025cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    public void testInsertAll() {
2035cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        ArrayList<String> toAdd = new ArrayList<>();
2045cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        toAdd.add("Hello");
2055cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        toAdd.add("World");
2065cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("First");
207722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.addOnListChangedCallback(mListener);
2085cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.addAll(0, toAdd);
2095cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(3, mObservable.size());
2105cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals("Hello", mObservable.get(0));
2115cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals("World", mObservable.get(1));
2125cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, mNotifications.size());
2135cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        ListChange change = mNotifications.get(0);
2145cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(INSERT, change.change);
2155cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(0, change.start);
2165cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(2, change.count);
2175cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    }
2185cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
2195cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    public void testClear() {
2205cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("Hello");
2215cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("World");
222722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.addOnListChangedCallback(mListener);
2235cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.clear();
2245cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, mNotifications.size());
2255cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        ListChange change = mNotifications.get(0);
2265cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(REMOVE, change.change);
2275cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(0, change.start);
2285cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(2, change.count);
2295cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
2305cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.clear();
2315cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        // No notification when nothing is cleared.
2325cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, mNotifications.size());
2335cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    }
2345cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
2355cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    public void testRemoveIndex() {
2365cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("Hello");
2375cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("World");
238722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.addOnListChangedCallback(mListener);
2395cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals("Hello", mObservable.remove(0));
2405cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, mNotifications.size());
2415cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        ListChange change = mNotifications.get(0);
2425cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(REMOVE, change.change);
2435cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(0, change.start);
2445cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, change.count);
2455cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    }
2465cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
2475cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    public void testRemoveObject() {
2485cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("Hello");
2495cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("World");
250722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.addOnListChangedCallback(mListener);
2515cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertTrue(mObservable.remove("Hello"));
2525cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, mNotifications.size());
2535cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        ListChange change = mNotifications.get(0);
2545cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(REMOVE, change.change);
2555cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(0, change.start);
2565cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, change.count);
2575cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
2585cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertFalse(mObservable.remove("Hello"));
2595cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        // nothing removed, don't notify
2605cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, mNotifications.size());
2615cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    }
2625cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount
2635cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    public void testSet() {
2645cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("Hello");
2655cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        mObservable.add("World");
266722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        mObservable.addOnListChangedCallback(mListener);
2675cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals("Hello", mObservable.set(0, "Goodbye"));
2685cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals("Goodbye", mObservable.get(0));
2695cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(2, mObservable.size());
2705cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        ListChange change = mNotifications.get(0);
2715cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(CHANGE, change.change);
2725cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(0, change.start);
2735cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount        assertEquals(1, change.count);
2745cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount    }
2755cc4e7270573c2c1a101fdade15287b405cf7d9cGeorge Mount}
276