WindowContainerTests.java revision d63594a8d116b9fb25a031cb489ca033f716226a
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.server.wm;
18
19import android.test.AndroidTestCase;
20import android.test.suitebuilder.annotation.SmallTest;
21
22import java.util.Comparator;
23
24/**
25 * Test class for {@link WindowContainer}.
26 *
27 * Build: mmma -j32 frameworks/base/services/tests/servicestests
28 * Install: adb install -r out/target/product/marlin/data/app/FrameworksServicesTests/FrameworksServicesTests.apk
29 * Run: adb shell am instrument -w -e class com.android.server.wm.WindowContainerTests com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
30 */
31@SmallTest
32public class WindowContainerTests extends AndroidTestCase {
33
34    public void testCreation() throws Exception {
35        final TestWindowContainer w = new TestWindowContainer();
36        assertNull("window must have no parent", w.getParentWindow());
37        assertEquals("window must have no children", 0, w.getChildrenCount());
38    }
39
40    public void testAdd() throws Exception {
41        final TestWindowContainer root = new TestWindowContainer();
42
43        final TestWindowContainer layer1 = root.addChildWindow(1);
44        final TestWindowContainer secondLayer1 = root.addChildWindow(1);
45        final TestWindowContainer layer2 = root.addChildWindow(2);
46        final TestWindowContainer layerNeg1 = root.addChildWindow(-1);
47        final TestWindowContainer layerNeg2 = root.addChildWindow(-2);
48        final TestWindowContainer secondLayerNeg1 = root.addChildWindow(-1);
49        final TestWindowContainer layer0 = root.addChildWindow(0);
50
51        assertEquals(7, root.getChildrenCount());
52
53        assertEquals(root, layer1.getParentWindow());
54        assertEquals(root, secondLayer1.getParentWindow());
55        assertEquals(root, layer2.getParentWindow());
56        assertEquals(root, layerNeg1.getParentWindow());
57        assertEquals(root, layerNeg2.getParentWindow());
58        assertEquals(root, secondLayerNeg1.getParentWindow());
59        assertEquals(root, layer0.getParentWindow());
60
61        assertEquals(layerNeg2, root.getChildAt(0));
62        assertEquals(secondLayerNeg1, root.getChildAt(1));
63        assertEquals(layerNeg1, root.getChildAt(2));
64        assertEquals(layer0, root.getChildAt(3));
65        assertEquals(layer1, root.getChildAt(4));
66        assertEquals(secondLayer1, root.getChildAt(5));
67        assertEquals(layer2, root.getChildAt(6));
68    }
69
70    public void testHasChild() throws Exception {
71        final TestWindowContainer root = new TestWindowContainer();
72
73        final TestWindowContainer child1 = root.addChildWindow(1);
74        final TestWindowContainer child2 = root.addChildWindow(1);
75        final TestWindowContainer child11 = child1.addChildWindow(1);
76        final TestWindowContainer child12 = child1.addChildWindow(1);
77        final TestWindowContainer child21 = child2.addChildWindow(1);
78
79        assertEquals(2, root.getChildrenCount());
80        assertEquals(2, child1.getChildrenCount());
81        assertEquals(1, child2.getChildrenCount());
82
83        assertTrue(root.hasChild(child1));
84        assertTrue(root.hasChild(child2));
85        assertTrue(root.hasChild(child11));
86        assertTrue(root.hasChild(child12));
87        assertTrue(root.hasChild(child21));
88
89        assertTrue(child1.hasChild(child11));
90        assertTrue(child1.hasChild(child12));
91        assertFalse(child1.hasChild(child21));
92
93        assertTrue(child2.hasChild(child21));
94        assertFalse(child2.hasChild(child11));
95        assertFalse(child2.hasChild(child12));
96   }
97
98    public void testRemove() throws Exception {
99        final TestWindowContainer root = new TestWindowContainer();
100
101        final TestWindowContainer child1 = root.addChildWindow(1);
102        final TestWindowContainer child2 = root.addChildWindow(1);
103        final TestWindowContainer child11 = child1.addChildWindow(1);
104        final TestWindowContainer child12 = child1.addChildWindow(1);
105        final TestWindowContainer child21 = child2.addChildWindow(1);
106
107        child12.remove();
108        assertNull(child12.getParentWindow());
109        assertEquals(1, child1.getChildrenCount());
110        assertFalse(child1.hasChild(child12));
111        assertFalse(root.hasChild(child12));
112
113        child2.remove();
114        assertNull(child2.getParentWindow());
115        assertNull(child21.getParentWindow());
116        assertEquals(0, child2.getChildrenCount());
117        assertEquals(1, root.getChildrenCount());
118        assertFalse(root.hasChild(child2));
119        assertFalse(root.hasChild(child21));
120
121        assertTrue(root.hasChild(child1));
122        assertTrue(root.hasChild(child11));
123
124        root.remove();
125        assertEquals(0, root.getChildrenCount());
126    }
127
128    /* Used so we can gain access to some protected members of the {@link WindowContainer} class */
129    private class TestWindowContainer extends WindowContainer {
130        private final int mLayer;
131
132        /**
133         * Compares 2 window layers and returns -1 if the first is lesser than the second in terms
134         * of z-order and 1 otherwise.
135         */
136        private final Comparator<WindowContainer> mWindowSubLayerComparator = (w1, w2) -> {
137            final int layer1 = ((TestWindowContainer)w1).mLayer;
138            final int layer2 = ((TestWindowContainer)w2).mLayer;
139            if (layer1 < layer2 || (layer1 == layer2 && layer2 < 0 )) {
140                // We insert the child window into the list ordered by the mLayer.
141                // For same layers, the negative one should go below others; the positive one should
142                // go above others.
143                return -1;
144            }
145            return 1;
146        };
147
148        TestWindowContainer() {
149            mLayer = 0;
150        }
151
152        TestWindowContainer(int layer) {
153            mLayer = layer;
154        }
155
156        TestWindowContainer getParentWindow() {
157            return (TestWindowContainer) getParent();
158        }
159
160        int getChildrenCount() {
161            return mChildren.size();
162        }
163
164        TestWindowContainer addChildWindow(int layer) {
165            TestWindowContainer child = new TestWindowContainer(layer);
166            addChild(child, mWindowSubLayerComparator);
167            return child;
168        }
169
170        TestWindowContainer getChildAt(int index) {
171            return (TestWindowContainer) mChildren.get(index);
172        }
173    }
174
175}
176