GridWidgetTest.java revision e7ead88853562603f76b92189a828ba14d5c4bcb
1062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu/*
2062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Copyright (C) 2015 The Android Open Source Project
3062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu *
4062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Licensed under the Apache License, Version 2.0 (the "License");
5062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * you may not use this file except in compliance with the License.
6062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * You may obtain a copy of the License at
7062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu *
8062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu *      http://www.apache.org/licenses/LICENSE-2.0
9062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu *
10062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * Unless required by applicable law or agreed to in writing, software
11062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * distributed under the License is distributed on an "AS IS" BASIS,
12062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * See the License for the specific language governing permissions and
14062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * limitations under the License.
15062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */
16062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gupackage android.support.v17.leanback.widget;
17062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
18062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.test.ActivityInstrumentationTestCase2;
19062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.util.Log;
20062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.view.KeyEvent;
21062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.view.View;
22062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.view.ViewGroup;
23062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.app.Instrumentation;
24062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport android.content.Intent;
25062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
26062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.ArrayList;
27062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.Arrays;
28062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.Comparator;
29062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.HashMap;
30062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Guimport java.util.Iterator;
31062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
32062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu/**
33062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu * @hide from javadoc
34062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu */
35062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gupublic class GridWidgetTest extends ActivityInstrumentationTestCase2<GridActivity> {
36062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
37062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    protected GridActivity mActivity;
38062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    protected Instrumentation mInstrumentation;
39062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    protected BaseGridView mGridView;
40062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    protected int mOrientation;
41062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
42062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    private final Comparator<View> mRowSortComparator = new Comparator<View>() {
43062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        public int compare(View lhs, View rhs) {
44062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            if (mOrientation == BaseGridView.HORIZONTAL) {
45062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu                return lhs.getLeft() - rhs.getLeft();
46062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            } else {
47062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu                return lhs.getTop() - rhs.getTop();
48062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            }
49062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        };
50062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    };
51062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
52062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    /**
53062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu     * Verify margins between items on same row are same.
54062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu     */
55062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    private final Runnable mVerifyLayout = new Runnable() {
56062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        @Override
57062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        public void run() {
58e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            verifyMargin();
59062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        }
60062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    };
61062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
62062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    public GridWidgetTest() {
63062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        super("android.support.v17.leanback.tests", GridActivity.class);
64062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    }
65062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
66062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    /**
67062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu     * Wait for grid view stop scroll and optionally verify state of grid view.
68062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu     */
69062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    protected void waitForScrollIdle(Runnable verify) throws Throwable {
70062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        while (mGridView.getLayoutManager().isSmoothScrolling() ||
71062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu                mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE) {
72062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            try {
73062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu                Thread.sleep(100);
74062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            } catch (InterruptedException ex) {
75062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu                break;
76062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            }
77062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            if (verify != null) {
78062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu                runTestOnUiThread(verify);
79062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu            }
80062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        }
81062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    }
82062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
83062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    /**
84062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu     * Wait for grid view stop scroll.
85062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu     */
86062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    protected void waitForScrollIdle() throws Throwable {
87062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        waitForScrollIdle(null);
88062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    }
89062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
90e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    /**
91e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu     * Group and sort children by their position on each row (HORIZONTAL) or column(VERTICAL).
92e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu     */
93e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    protected View[][] sortByRows() {
94e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        final HashMap<Integer, ArrayList<View>> rows = new HashMap<Integer, ArrayList<View>>();
95e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        for (int i = 0; i < mGridView.getChildCount(); i++) {
96e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            View v = mGridView.getChildAt(i);
97e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            int rowLocation;
98e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            if (mOrientation == BaseGridView.HORIZONTAL) {
99e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                rowLocation = v.getTop();
100e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            } else {
101e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                rowLocation = mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL ?
102e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    v.getRight() : v.getLeft();
103e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            }
104e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            ArrayList<View> views = rows.get(rowLocation);
105e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            if (views == null) {
106e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                views = new ArrayList<View>();
107e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                rows.put(rowLocation, views);
108e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            }
109e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            views.add(v);
110e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        }
111e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        assertEquals(rows.size(), mActivity.mRows);
112e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        View[][] sorted = new View[rows.size()][];
113e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        int i = 0;
114e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        for (Iterator<ArrayList<View>> iter = rows.values().iterator(); iter.hasNext(); ) {
115e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            ArrayList<View> arr = iter.next();
116e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            View[] views = arr.toArray(new View[arr.size()]);
117e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            Arrays.sort(views, mRowSortComparator);
118e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            sorted[i++] = views;
119e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        }
120e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        return sorted;
121e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    }
122e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
123e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    protected void verifyMargin() {
124e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        View[][] sorted = sortByRows();
125e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        for (int row = 0; row < sorted.length; row++) {
126e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            View[] views = sorted[row];
127e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            int margin = -1;
128e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            for (int i = 1; i < views.length; i++) {
129e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                if (mOrientation == BaseGridView.HORIZONTAL) {
130e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    if (i == 1) {
131e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        margin = views[i].getLeft() - views[i - 1].getRight();
132e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    } else {
133e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        assertEquals(margin, views[i].getLeft() - views[i - 1].getRight());
134e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    }
135e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                } else {
136e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    if (i == 1) {
137e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        margin = views[i].getTop() - views[i - 1].getBottom();
138e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    } else {
139e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        assertEquals(margin, views[i].getTop() - views[i - 1].getBottom());
140e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    }
141e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                }
142e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            }
143e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        }
144e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    }
145e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
146e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    protected void verifyBeginAligned() {
147e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        View[][] sorted = sortByRows();
148e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        int alignedLocation = 0;
149e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        if (mOrientation == BaseGridView.HORIZONTAL) {
150e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
151e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                for (int i = 0; i < sorted.length; i++) {
152e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    if (i == 0) {
153e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        alignedLocation = sorted[i][sorted[i].length - 1].getRight();
154e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    } else {
155e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        assertEquals(alignedLocation, sorted[i][sorted[i].length - 1].getRight());
156e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    }
157e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                }
158e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            } else {
159e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                for (int i = 0; i < sorted.length; i++) {
160e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    if (i == 0) {
161e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        alignedLocation = sorted[i][0].getLeft();
162e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    } else {
163e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                        assertEquals(alignedLocation, sorted[i][0].getLeft());
164e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    }
165e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                }
166e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            }
167e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        } else {
168e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            for (int i = 0; i < sorted.length; i++) {
169e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                if (i == 0) {
170e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    alignedLocation = sorted[i][0].getTop();
171e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                } else {
172e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                    assertEquals(alignedLocation, sorted[i][0].getTop());
173e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu                }
174e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu            }
175e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        }
176e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    }
177e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
178e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    public void testThreeRowHorizontalBasic() throws Throwable {
179062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
180062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        mInstrumentation = getInstrumentation();
181062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
182e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 100);
183e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        intent.putExtra(GridActivity.EXTRA_ROWS, 3);
184e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        mOrientation = BaseGridView.HORIZONTAL;
185e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        intent.putExtra(GridActivity.EXTRA_ORIENTATION, mOrientation);
186062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        setActivityIntent(intent);
187062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        mActivity = getActivity();
188062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        mGridView = mActivity.mGridView;
189062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
190062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_RIGHT);
191062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        waitForScrollIdle(mVerifyLayout);
192062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
193e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        assertEquals(mActivity.getBoundCount(), 100);
194e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
195062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_LEFT);
196062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu        waitForScrollIdle(mVerifyLayout);
197062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
198e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        verifyBeginAligned();
199062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu    }
200062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu
201e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    public void testThreeColumnVerticalBasic() throws Throwable {
202e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
203e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        mInstrumentation = getInstrumentation();
204e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
205e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
206e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        intent.putExtra(GridActivity.EXTRA_ROWS, 3);
207e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        mOrientation = BaseGridView.VERTICAL;
208e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        intent.putExtra(GridActivity.EXTRA_ORIENTATION, mOrientation);
209e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        setActivityIntent(intent);
210e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        mActivity = getActivity();
211e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        mGridView = mActivity.mGridView;
212e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
213e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_DOWN);
214e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        waitForScrollIdle(mVerifyLayout);
215e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
216e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        assertEquals(mActivity.getBoundCount(), 200);
217e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
218e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        sendRepeatedKeys(100, KeyEvent.KEYCODE_DPAD_UP);
219e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        waitForScrollIdle(mVerifyLayout);
220e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu
221e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu        verifyBeginAligned();
222e7ead88853562603f76b92189a828ba14d5c4bcbDake Gu    }
223062f7f7667bce6e9bf4814d0bb5344fe518ed89eDake Gu}
224