19189445c0a66d074dcded77b9c7322ef45422727George Mount/*
29189445c0a66d074dcded77b9c7322ef45422727George Mount * Copyright (C) 2015 The Android Open Source Project
39189445c0a66d074dcded77b9c7322ef45422727George Mount *
49189445c0a66d074dcded77b9c7322ef45422727George Mount * Licensed under the Apache License, Version 2.0 (the "License");
59189445c0a66d074dcded77b9c7322ef45422727George Mount * you may not use this file except in compliance with the License.
69189445c0a66d074dcded77b9c7322ef45422727George Mount * You may obtain a copy of the License at
79189445c0a66d074dcded77b9c7322ef45422727George Mount *
89189445c0a66d074dcded77b9c7322ef45422727George Mount *      http://www.apache.org/licenses/LICENSE-2.0
99189445c0a66d074dcded77b9c7322ef45422727George Mount *
109189445c0a66d074dcded77b9c7322ef45422727George Mount * Unless required by applicable law or agreed to in writing, software
119189445c0a66d074dcded77b9c7322ef45422727George Mount * distributed under the License is distributed on an "AS IS" BASIS,
129189445c0a66d074dcded77b9c7322ef45422727George Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139189445c0a66d074dcded77b9c7322ef45422727George Mount * See the License for the specific language governing permissions and
149189445c0a66d074dcded77b9c7322ef45422727George Mount * limitations under the License.
159189445c0a66d074dcded77b9c7322ef45422727George Mount */
169189445c0a66d074dcded77b9c7322ef45422727George Mountpackage com.android.internal.util;
179189445c0a66d074dcded77b9c7322ef45422727George Mount
189189445c0a66d074dcded77b9c7322ef45422727George Mountimport junit.framework.TestCase;
199189445c0a66d074dcded77b9c7322ef45422727George Mount
209189445c0a66d074dcded77b9c7322ef45422727George Mountimport org.junit.Test;
219189445c0a66d074dcded77b9c7322ef45422727George Mount
229189445c0a66d074dcded77b9c7322ef45422727George Mountimport java.util.ArrayList;
239189445c0a66d074dcded77b9c7322ef45422727George Mount
249189445c0a66d074dcded77b9c7322ef45422727George Mountimport static org.junit.Assert.assertEquals;
259189445c0a66d074dcded77b9c7322ef45422727George Mountimport static org.junit.Assert.assertFalse;
269189445c0a66d074dcded77b9c7322ef45422727George Mountimport static org.junit.Assert.assertNotNull;
279189445c0a66d074dcded77b9c7322ef45422727George Mountimport static org.junit.Assert.assertTrue;
289189445c0a66d074dcded77b9c7322ef45422727George Mount
299189445c0a66d074dcded77b9c7322ef45422727George Mountpublic class CallbackRegistryTest extends TestCase {
309189445c0a66d074dcded77b9c7322ef45422727George Mount
319189445c0a66d074dcded77b9c7322ef45422727George Mount    final Integer callback1 = 1;
329189445c0a66d074dcded77b9c7322ef45422727George Mount    final Integer callback2 = 2;
339189445c0a66d074dcded77b9c7322ef45422727George Mount    final Integer callback3 = 3;
349189445c0a66d074dcded77b9c7322ef45422727George Mount    CallbackRegistry<Integer, CallbackRegistryTest, Integer> registry;
359189445c0a66d074dcded77b9c7322ef45422727George Mount    int notify1;
369189445c0a66d074dcded77b9c7322ef45422727George Mount    int notify2;
379189445c0a66d074dcded77b9c7322ef45422727George Mount    int notify3;
389189445c0a66d074dcded77b9c7322ef45422727George Mount    int[] deepNotifyCount = new int[300];
399189445c0a66d074dcded77b9c7322ef45422727George Mount    Integer argValue;
409189445c0a66d074dcded77b9c7322ef45422727George Mount
419189445c0a66d074dcded77b9c7322ef45422727George Mount    private void addNotifyCount(Integer callback) {
429189445c0a66d074dcded77b9c7322ef45422727George Mount        if (callback == callback1) {
439189445c0a66d074dcded77b9c7322ef45422727George Mount            notify1++;
449189445c0a66d074dcded77b9c7322ef45422727George Mount        } else if (callback == callback2) {
459189445c0a66d074dcded77b9c7322ef45422727George Mount            notify2++;
469189445c0a66d074dcded77b9c7322ef45422727George Mount        } else if (callback == callback3) {
479189445c0a66d074dcded77b9c7322ef45422727George Mount            notify3++;
489189445c0a66d074dcded77b9c7322ef45422727George Mount        }
499189445c0a66d074dcded77b9c7322ef45422727George Mount        deepNotifyCount[callback]++;
509189445c0a66d074dcded77b9c7322ef45422727George Mount    }
519189445c0a66d074dcded77b9c7322ef45422727George Mount
529189445c0a66d074dcded77b9c7322ef45422727George Mount    public void testAddListener() {
539189445c0a66d074dcded77b9c7322ef45422727George Mount        CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier =
549189445c0a66d074dcded77b9c7322ef45422727George Mount                new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() {
559189445c0a66d074dcded77b9c7322ef45422727George Mount                    @Override
569189445c0a66d074dcded77b9c7322ef45422727George Mount                    public void onNotifyCallback(Integer callback, CallbackRegistryTest sender,
579189445c0a66d074dcded77b9c7322ef45422727George Mount                            int arg, Integer arg2) {
589189445c0a66d074dcded77b9c7322ef45422727George Mount                    }
599189445c0a66d074dcded77b9c7322ef45422727George Mount                };
609189445c0a66d074dcded77b9c7322ef45422727George Mount        registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier);
619189445c0a66d074dcded77b9c7322ef45422727George Mount        Integer callback = 0;
629189445c0a66d074dcded77b9c7322ef45422727George Mount
639189445c0a66d074dcded77b9c7322ef45422727George Mount        assertNotNull(registry.copyListeners());
649189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(0, registry.copyListeners().size());
659189445c0a66d074dcded77b9c7322ef45422727George Mount
669189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback);
679189445c0a66d074dcded77b9c7322ef45422727George Mount        ArrayList<Integer> callbacks = registry.copyListeners();
689189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(1, callbacks.size());
699189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(callback, callbacks.get(0));
709189445c0a66d074dcded77b9c7322ef45422727George Mount
719189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback);
729189445c0a66d074dcded77b9c7322ef45422727George Mount        callbacks = registry.copyListeners();
739189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(1, callbacks.size());
749189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(callback, callbacks.get(0));
759189445c0a66d074dcded77b9c7322ef45422727George Mount
769189445c0a66d074dcded77b9c7322ef45422727George Mount        Integer otherListener = 1;
779189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(otherListener);
789189445c0a66d074dcded77b9c7322ef45422727George Mount        callbacks = registry.copyListeners();
799189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(2, callbacks.size());
809189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(callback, callbacks.get(0));
819189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(otherListener, callbacks.get(1));
829189445c0a66d074dcded77b9c7322ef45422727George Mount
839189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.remove(callback);
849189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback);
859189445c0a66d074dcded77b9c7322ef45422727George Mount        callbacks = registry.copyListeners();
869189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(2, callbacks.size());
879189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(callback, callbacks.get(1));
889189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(otherListener, callbacks.get(0));
899189445c0a66d074dcded77b9c7322ef45422727George Mount    }
909189445c0a66d074dcded77b9c7322ef45422727George Mount
919189445c0a66d074dcded77b9c7322ef45422727George Mount    public void testSimpleNotify() {
929189445c0a66d074dcded77b9c7322ef45422727George Mount        CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier =
939189445c0a66d074dcded77b9c7322ef45422727George Mount                new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() {
949189445c0a66d074dcded77b9c7322ef45422727George Mount                    @Override
959189445c0a66d074dcded77b9c7322ef45422727George Mount                    public void onNotifyCallback(Integer callback, CallbackRegistryTest sender,
969189445c0a66d074dcded77b9c7322ef45422727George Mount                            int arg1, Integer arg) {
979189445c0a66d074dcded77b9c7322ef45422727George Mount                        assertEquals(arg1, (int) arg);
989189445c0a66d074dcded77b9c7322ef45422727George Mount                        addNotifyCount(callback);
999189445c0a66d074dcded77b9c7322ef45422727George Mount                        argValue = arg;
1009189445c0a66d074dcded77b9c7322ef45422727George Mount                    }
1019189445c0a66d074dcded77b9c7322ef45422727George Mount                };
1029189445c0a66d074dcded77b9c7322ef45422727George Mount        registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier);
1039189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback2);
1049189445c0a66d074dcded77b9c7322ef45422727George Mount        Integer arg = 1;
1059189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.notifyCallbacks(this, arg, arg);
1069189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(arg, argValue);
1079189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(1, notify2);
1089189445c0a66d074dcded77b9c7322ef45422727George Mount    }
1099189445c0a66d074dcded77b9c7322ef45422727George Mount
1109189445c0a66d074dcded77b9c7322ef45422727George Mount    public void testRemoveWhileNotifying() {
1119189445c0a66d074dcded77b9c7322ef45422727George Mount        CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier =
1129189445c0a66d074dcded77b9c7322ef45422727George Mount                new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() {
1139189445c0a66d074dcded77b9c7322ef45422727George Mount                    @Override
1149189445c0a66d074dcded77b9c7322ef45422727George Mount                    public void onNotifyCallback(Integer callback, CallbackRegistryTest sender,
1159189445c0a66d074dcded77b9c7322ef45422727George Mount                            int arg1, Integer arg) {
1169189445c0a66d074dcded77b9c7322ef45422727George Mount                        addNotifyCount(callback);
1179189445c0a66d074dcded77b9c7322ef45422727George Mount                        if (callback == callback1) {
1189189445c0a66d074dcded77b9c7322ef45422727George Mount                            registry.remove(callback1);
1199189445c0a66d074dcded77b9c7322ef45422727George Mount                            registry.remove(callback2);
1209189445c0a66d074dcded77b9c7322ef45422727George Mount                        }
1219189445c0a66d074dcded77b9c7322ef45422727George Mount                    }
1229189445c0a66d074dcded77b9c7322ef45422727George Mount                };
1239189445c0a66d074dcded77b9c7322ef45422727George Mount        registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier);
1249189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback1);
1259189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback2);
1269189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback3);
1279189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.notifyCallbacks(this, 0, null);
1289189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(1, notify1);
1299189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(1, notify2);
1309189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(1, notify3);
1319189445c0a66d074dcded77b9c7322ef45422727George Mount
1329189445c0a66d074dcded77b9c7322ef45422727George Mount        ArrayList<Integer> callbacks = registry.copyListeners();
1339189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(1, callbacks.size());
1349189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(callback3, callbacks.get(0));
1359189445c0a66d074dcded77b9c7322ef45422727George Mount    }
1369189445c0a66d074dcded77b9c7322ef45422727George Mount
1379189445c0a66d074dcded77b9c7322ef45422727George Mount    public void testDeepRemoveWhileNotifying() {
1389189445c0a66d074dcded77b9c7322ef45422727George Mount        CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier =
1399189445c0a66d074dcded77b9c7322ef45422727George Mount                new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() {
1409189445c0a66d074dcded77b9c7322ef45422727George Mount                    @Override
1419189445c0a66d074dcded77b9c7322ef45422727George Mount                    public void onNotifyCallback(Integer callback, CallbackRegistryTest sender,
1429189445c0a66d074dcded77b9c7322ef45422727George Mount                            int arg1, Integer arg) {
1439189445c0a66d074dcded77b9c7322ef45422727George Mount                        addNotifyCount(callback);
1449189445c0a66d074dcded77b9c7322ef45422727George Mount                        registry.remove(callback);
1459189445c0a66d074dcded77b9c7322ef45422727George Mount                        registry.notifyCallbacks(CallbackRegistryTest.this, arg1, null);
1469189445c0a66d074dcded77b9c7322ef45422727George Mount                    }
1479189445c0a66d074dcded77b9c7322ef45422727George Mount                };
1489189445c0a66d074dcded77b9c7322ef45422727George Mount        registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier);
1499189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback1);
1509189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback2);
1519189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback3);
1529189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.notifyCallbacks(this, 0, null);
1539189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(1, notify1);
1549189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(2, notify2);
1559189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(3, notify3);
1569189445c0a66d074dcded77b9c7322ef45422727George Mount
1579189445c0a66d074dcded77b9c7322ef45422727George Mount        ArrayList<Integer> callbacks = registry.copyListeners();
1589189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(0, callbacks.size());
1599189445c0a66d074dcded77b9c7322ef45422727George Mount    }
1609189445c0a66d074dcded77b9c7322ef45422727George Mount
1619189445c0a66d074dcded77b9c7322ef45422727George Mount    public void testAddRemovedListener() {
1629189445c0a66d074dcded77b9c7322ef45422727George Mount
1639189445c0a66d074dcded77b9c7322ef45422727George Mount        CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier =
1649189445c0a66d074dcded77b9c7322ef45422727George Mount                new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() {
1659189445c0a66d074dcded77b9c7322ef45422727George Mount                    @Override
1669189445c0a66d074dcded77b9c7322ef45422727George Mount                    public void onNotifyCallback(Integer callback, CallbackRegistryTest sender,
1679189445c0a66d074dcded77b9c7322ef45422727George Mount                            int arg1, Integer arg) {
1689189445c0a66d074dcded77b9c7322ef45422727George Mount                        addNotifyCount(callback);
1699189445c0a66d074dcded77b9c7322ef45422727George Mount                        if (callback == callback1) {
1709189445c0a66d074dcded77b9c7322ef45422727George Mount                            registry.remove(callback2);
1719189445c0a66d074dcded77b9c7322ef45422727George Mount                        } else if (callback == callback3) {
1729189445c0a66d074dcded77b9c7322ef45422727George Mount                            registry.add(callback2);
1739189445c0a66d074dcded77b9c7322ef45422727George Mount                        }
1749189445c0a66d074dcded77b9c7322ef45422727George Mount                    }
1759189445c0a66d074dcded77b9c7322ef45422727George Mount                };
1769189445c0a66d074dcded77b9c7322ef45422727George Mount        registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier);
1779189445c0a66d074dcded77b9c7322ef45422727George Mount
1789189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback1);
1799189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback2);
1809189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback3);
1819189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.notifyCallbacks(this, 0, null);
1829189445c0a66d074dcded77b9c7322ef45422727George Mount
1839189445c0a66d074dcded77b9c7322ef45422727George Mount        ArrayList<Integer> callbacks = registry.copyListeners();
1849189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(3, callbacks.size());
1859189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(callback1, callbacks.get(0));
1869189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(callback3, callbacks.get(1));
1879189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(callback2, callbacks.get(2));
1889189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(1, notify1);
1899189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(1, notify2);
1909189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(1, notify3);
1919189445c0a66d074dcded77b9c7322ef45422727George Mount    }
1929189445c0a66d074dcded77b9c7322ef45422727George Mount
1939189445c0a66d074dcded77b9c7322ef45422727George Mount    public void testVeryDeepRemoveWhileNotifying() {
1949189445c0a66d074dcded77b9c7322ef45422727George Mount        final Integer[] callbacks = new Integer[deepNotifyCount.length];
1959189445c0a66d074dcded77b9c7322ef45422727George Mount        for (int i = 0; i < callbacks.length; i++) {
1969189445c0a66d074dcded77b9c7322ef45422727George Mount            callbacks[i] = i;
1979189445c0a66d074dcded77b9c7322ef45422727George Mount        }
1989189445c0a66d074dcded77b9c7322ef45422727George Mount        CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier =
1999189445c0a66d074dcded77b9c7322ef45422727George Mount                new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() {
2009189445c0a66d074dcded77b9c7322ef45422727George Mount                    @Override
2019189445c0a66d074dcded77b9c7322ef45422727George Mount                    public void onNotifyCallback(Integer callback, CallbackRegistryTest sender,
2029189445c0a66d074dcded77b9c7322ef45422727George Mount                            int arg1, Integer arg) {
2039189445c0a66d074dcded77b9c7322ef45422727George Mount                        addNotifyCount(callback);
2049189445c0a66d074dcded77b9c7322ef45422727George Mount                        registry.remove(callback);
2059189445c0a66d074dcded77b9c7322ef45422727George Mount                        registry.remove(callbacks[callbacks.length - callback - 1]);
2069189445c0a66d074dcded77b9c7322ef45422727George Mount                        registry.notifyCallbacks(CallbackRegistryTest.this, arg1, null);
2079189445c0a66d074dcded77b9c7322ef45422727George Mount                    }
2089189445c0a66d074dcded77b9c7322ef45422727George Mount                };
2099189445c0a66d074dcded77b9c7322ef45422727George Mount        registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier);
2109189445c0a66d074dcded77b9c7322ef45422727George Mount        for (int i = 0; i < callbacks.length; i++) {
2119189445c0a66d074dcded77b9c7322ef45422727George Mount            registry.add(callbacks[i]);
2129189445c0a66d074dcded77b9c7322ef45422727George Mount        }
2139189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.notifyCallbacks(this, 0, null);
2149189445c0a66d074dcded77b9c7322ef45422727George Mount        for (int i = 0; i < deepNotifyCount.length; i++) {
2159189445c0a66d074dcded77b9c7322ef45422727George Mount            int expectedCount = Math.min(i + 1, deepNotifyCount.length - i);
2169189445c0a66d074dcded77b9c7322ef45422727George Mount            assertEquals(expectedCount, deepNotifyCount[i]);
2179189445c0a66d074dcded77b9c7322ef45422727George Mount        }
2189189445c0a66d074dcded77b9c7322ef45422727George Mount
2199189445c0a66d074dcded77b9c7322ef45422727George Mount        ArrayList<Integer> callbackList = registry.copyListeners();
2209189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(0, callbackList.size());
2219189445c0a66d074dcded77b9c7322ef45422727George Mount    }
2229189445c0a66d074dcded77b9c7322ef45422727George Mount
2239189445c0a66d074dcded77b9c7322ef45422727George Mount    public void testClear() {
2249189445c0a66d074dcded77b9c7322ef45422727George Mount        CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier =
2259189445c0a66d074dcded77b9c7322ef45422727George Mount                new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() {
2269189445c0a66d074dcded77b9c7322ef45422727George Mount                    @Override
2279189445c0a66d074dcded77b9c7322ef45422727George Mount                    public void onNotifyCallback(Integer callback, CallbackRegistryTest sender,
2289189445c0a66d074dcded77b9c7322ef45422727George Mount                            int arg1, Integer arg) {
2299189445c0a66d074dcded77b9c7322ef45422727George Mount                        addNotifyCount(callback);
2309189445c0a66d074dcded77b9c7322ef45422727George Mount                    }
2319189445c0a66d074dcded77b9c7322ef45422727George Mount                };
2329189445c0a66d074dcded77b9c7322ef45422727George Mount        registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier);
2339189445c0a66d074dcded77b9c7322ef45422727George Mount        for (int i = 0; i < deepNotifyCount.length; i++) {
2349189445c0a66d074dcded77b9c7322ef45422727George Mount            registry.add(i);
2359189445c0a66d074dcded77b9c7322ef45422727George Mount        }
2369189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.clear();
2379189445c0a66d074dcded77b9c7322ef45422727George Mount
2389189445c0a66d074dcded77b9c7322ef45422727George Mount        ArrayList<Integer> callbackList = registry.copyListeners();
2399189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(0, callbackList.size());
2409189445c0a66d074dcded77b9c7322ef45422727George Mount
2419189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.notifyCallbacks(this, 0, null);
2429189445c0a66d074dcded77b9c7322ef45422727George Mount        for (int i = 0; i < deepNotifyCount.length; i++) {
2439189445c0a66d074dcded77b9c7322ef45422727George Mount            assertEquals(0, deepNotifyCount[i]);
2449189445c0a66d074dcded77b9c7322ef45422727George Mount        }
2459189445c0a66d074dcded77b9c7322ef45422727George Mount    }
2469189445c0a66d074dcded77b9c7322ef45422727George Mount
2479189445c0a66d074dcded77b9c7322ef45422727George Mount    public void testNestedClear() {
2489189445c0a66d074dcded77b9c7322ef45422727George Mount        CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier =
2499189445c0a66d074dcded77b9c7322ef45422727George Mount                new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() {
2509189445c0a66d074dcded77b9c7322ef45422727George Mount                    @Override
2519189445c0a66d074dcded77b9c7322ef45422727George Mount                    public void onNotifyCallback(Integer callback, CallbackRegistryTest sender,
2529189445c0a66d074dcded77b9c7322ef45422727George Mount                            int arg1, Integer arg) {
2539189445c0a66d074dcded77b9c7322ef45422727George Mount                        addNotifyCount(callback);
2549189445c0a66d074dcded77b9c7322ef45422727George Mount                        registry.clear();
2559189445c0a66d074dcded77b9c7322ef45422727George Mount                    }
2569189445c0a66d074dcded77b9c7322ef45422727George Mount                };
2579189445c0a66d074dcded77b9c7322ef45422727George Mount        registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier);
2589189445c0a66d074dcded77b9c7322ef45422727George Mount        for (int i = 0; i < deepNotifyCount.length; i++) {
2599189445c0a66d074dcded77b9c7322ef45422727George Mount            registry.add(i);
2609189445c0a66d074dcded77b9c7322ef45422727George Mount        }
2619189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.notifyCallbacks(this, 0, null);
2629189445c0a66d074dcded77b9c7322ef45422727George Mount        for (int i = 0; i < deepNotifyCount.length; i++) {
2639189445c0a66d074dcded77b9c7322ef45422727George Mount            assertEquals(1, deepNotifyCount[i]);
2649189445c0a66d074dcded77b9c7322ef45422727George Mount        }
2659189445c0a66d074dcded77b9c7322ef45422727George Mount
2669189445c0a66d074dcded77b9c7322ef45422727George Mount        ArrayList<Integer> callbackList = registry.copyListeners();
2679189445c0a66d074dcded77b9c7322ef45422727George Mount        assertEquals(0, callbackList.size());
2689189445c0a66d074dcded77b9c7322ef45422727George Mount    }
2699189445c0a66d074dcded77b9c7322ef45422727George Mount
2709189445c0a66d074dcded77b9c7322ef45422727George Mount    public void testIsEmpty() throws Exception {
2719189445c0a66d074dcded77b9c7322ef45422727George Mount        CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier =
2729189445c0a66d074dcded77b9c7322ef45422727George Mount                new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() {
2739189445c0a66d074dcded77b9c7322ef45422727George Mount                    @Override
2749189445c0a66d074dcded77b9c7322ef45422727George Mount                    public void onNotifyCallback(Integer callback, CallbackRegistryTest sender,
2759189445c0a66d074dcded77b9c7322ef45422727George Mount                            int arg, Integer arg2) {
2769189445c0a66d074dcded77b9c7322ef45422727George Mount                    }
2779189445c0a66d074dcded77b9c7322ef45422727George Mount                };
2789189445c0a66d074dcded77b9c7322ef45422727George Mount        registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier);
2799189445c0a66d074dcded77b9c7322ef45422727George Mount        Integer callback = 0;
2809189445c0a66d074dcded77b9c7322ef45422727George Mount
2819189445c0a66d074dcded77b9c7322ef45422727George Mount        assertTrue(registry.isEmpty());
2829189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback);
2839189445c0a66d074dcded77b9c7322ef45422727George Mount        assertFalse(registry.isEmpty());
2849189445c0a66d074dcded77b9c7322ef45422727George Mount    }
2859189445c0a66d074dcded77b9c7322ef45422727George Mount
2869189445c0a66d074dcded77b9c7322ef45422727George Mount    public void testClone() throws Exception {
2879189445c0a66d074dcded77b9c7322ef45422727George Mount        CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier =
2889189445c0a66d074dcded77b9c7322ef45422727George Mount                new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() {
2899189445c0a66d074dcded77b9c7322ef45422727George Mount                    @Override
2909189445c0a66d074dcded77b9c7322ef45422727George Mount                    public void onNotifyCallback(Integer callback, CallbackRegistryTest sender,
2919189445c0a66d074dcded77b9c7322ef45422727George Mount                            int arg, Integer arg2) {
2929189445c0a66d074dcded77b9c7322ef45422727George Mount                    }
2939189445c0a66d074dcded77b9c7322ef45422727George Mount                };
2949189445c0a66d074dcded77b9c7322ef45422727George Mount        registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier);
2959189445c0a66d074dcded77b9c7322ef45422727George Mount
2969189445c0a66d074dcded77b9c7322ef45422727George Mount        assertTrue(registry.isEmpty());
2979189445c0a66d074dcded77b9c7322ef45422727George Mount        CallbackRegistry<Integer, CallbackRegistryTest, Integer> registry2 = registry.clone();
2989189445c0a66d074dcded77b9c7322ef45422727George Mount        Integer callback = 0;
2999189445c0a66d074dcded77b9c7322ef45422727George Mount        registry.add(callback);
3009189445c0a66d074dcded77b9c7322ef45422727George Mount        assertFalse(registry.isEmpty());
3019189445c0a66d074dcded77b9c7322ef45422727George Mount        assertTrue(registry2.isEmpty());
3029189445c0a66d074dcded77b9c7322ef45422727George Mount        registry2 = registry.clone();
3039189445c0a66d074dcded77b9c7322ef45422727George Mount        assertFalse(registry2.isEmpty());
3049189445c0a66d074dcded77b9c7322ef45422727George Mount    }
3059189445c0a66d074dcded77b9c7322ef45422727George Mount}
306