aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/com/xtremelabs/robolectric/shadows/ViewTreeObserverTest.java
blob: 946f25b2d9c9fb2460d5d4b9c65ef3c5bfe070c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package com.xtremelabs.robolectric.shadows;

import android.view.ViewTreeObserver;
import com.xtremelabs.robolectric.Robolectric;
import com.xtremelabs.robolectric.WithTestDefaultsRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.List;

import static com.xtremelabs.robolectric.Robolectric.shadowOf;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

@RunWith(WithTestDefaultsRunner.class)
public class ViewTreeObserverTest {

    private ViewTreeObserver viewTreeObserver;
    private TestOnGlobalLayoutListener listener1;
    private TestOnGlobalLayoutListener listener2;

    @Before
    public void setUp() throws Exception {
        viewTreeObserver = Robolectric.Reflection.newInstanceOf(ViewTreeObserver.class);
        listener1 = new TestOnGlobalLayoutListener();
        listener2 = new TestOnGlobalLayoutListener();
    }

    @Test
    public void shouldRecordMultipleOnGlobalLayoutListenersAndFireThemWhenAsked() throws Exception {
        viewTreeObserver.addOnGlobalLayoutListener(listener1);
        viewTreeObserver.addOnGlobalLayoutListener(listener2);

        shadowOf(viewTreeObserver).fireOnGlobalLayoutListeners();
        assertTrue(listener1.onGlobalLayoutWasCalled);
        assertTrue(listener2.onGlobalLayoutWasCalled);

        listener1.reset();
        listener2.reset();
        viewTreeObserver.removeGlobalOnLayoutListener(listener1);
        shadowOf(viewTreeObserver).fireOnGlobalLayoutListeners();

        assertFalse(listener1.onGlobalLayoutWasCalled);
        assertTrue(listener2.onGlobalLayoutWasCalled);

        listener1.reset();
        listener2.reset();
        viewTreeObserver.removeGlobalOnLayoutListener(listener2);
        shadowOf(viewTreeObserver).fireOnGlobalLayoutListeners();

        assertFalse(listener1.onGlobalLayoutWasCalled);
        assertFalse(listener2.onGlobalLayoutWasCalled);
    }

    @Test
    public void getGlobalLayoutListeners_shouldReturnTheListeners() throws Exception {
        viewTreeObserver.addOnGlobalLayoutListener(listener1);
        viewTreeObserver.addOnGlobalLayoutListener(listener2);

        List<ViewTreeObserver.OnGlobalLayoutListener> listeners = shadowOf(viewTreeObserver).getOnGlobalLayoutListeners();
        assertTrue(listeners.size() == 2);
        assertTrue(listeners.contains(listener1));
        assertTrue(listeners.contains(listener2));
    }

    private static class TestOnGlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
        boolean onGlobalLayoutWasCalled;

        @Override
        public void onGlobalLayout() {
            onGlobalLayoutWasCalled = true;
        }

        public void reset() {
            onGlobalLayoutWasCalled = false;
        }
    }
}