10178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu/*
20178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * Copyright (C) 2016 The Android Open Source Project
30178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu *
40178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * Licensed under the Apache License, Version 2.0 (the "License");
50178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * you may not use this file except in compliance with the License.
60178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * You may obtain a copy of the License at
70178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu *
80178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu *      http://www.apache.org/licenses/LICENSE-2.0
90178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu *
100178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * Unless required by applicable law or agreed to in writing, software
110178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * distributed under the License is distributed on an "AS IS" BASIS,
120178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * See the License for the specific language governing permissions and
140178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * limitations under the License
150178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu */
160178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
170178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanupackage android.widget;
180178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
190178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.app.Activity;
200178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.os.Looper;
210178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.os.Bundle;
220178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.perftests.utils.PerfStatusReporter;
230178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.util.Log;
240178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.view.View;
250178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
260178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.perftests.utils.BenchmarkState;
270178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.perftests.utils.StubActivity;
280178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.support.test.filters.LargeTest;
290178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.support.test.runner.AndroidJUnit4;
300178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.support.test.rule.ActivityTestRule;
310178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.support.test.InstrumentationRegistry;
320178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
330178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport com.android.perftests.core.R;
340178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
350178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport java.util.Locale;
360178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport java.util.Collection;
370178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport java.util.Arrays;
380178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
390178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport org.junit.Test;
400178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport org.junit.Rule;
410178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport org.junit.runners.Parameterized;
420178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport org.junit.runners.Parameterized.Parameters;
430178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport org.junit.runner.RunWith;
440178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
450178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport static org.junit.Assert.assertTrue;
460178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
470178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu@LargeTest
480178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu@RunWith(Parameterized.class)
490178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanupublic class TextViewAutoSizeLayoutPerfTest {
500178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu    @Parameters(name = "{0}")
510178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu    public static Collection layouts() {
520178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu        return Arrays.asList(new Object[][] {
530178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                { "Basic TextView - no autosize", R.layout.test_basic_textview_layout},
540178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                { "Autosize TextView 5 sizes", R.layout.test_autosize_textview_5},
550178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                { "Autosize TextView 10 sizes", R.layout.test_autosize_textview_10},
560178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                { "Autosize TextView 50 sizes", R.layout.test_autosize_textview_50},
570178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                { "Autosize TextView 100 sizes", R.layout.test_autosize_textview_100},
580178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                { "Autosize TextView 300 sizes", R.layout.test_autosize_textview_300},
590178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                { "Autosize TextView 500 sizes", R.layout.test_autosize_textview_500},
600178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                { "Autosize TextView 1000 sizes", R.layout.test_autosize_textview_1000},
610178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                { "Autosize TextView 10000 sizes", R.layout.test_autosize_textview_10000},
620178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                { "Autosize TextView 100000 sizes", R.layout.test_autosize_textview_100000}
630178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu        });
640178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu    }
650178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
660178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu    private int mLayoutId;
670178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
680178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu    public TextViewAutoSizeLayoutPerfTest(String key, int layoutId) {
690178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu        mLayoutId = layoutId;
700178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu    }
710178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
720178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu    @Rule
730178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu    public ActivityTestRule<StubActivity> mActivityRule =
740178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu            new ActivityTestRule(StubActivity.class);
750178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
760178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu    @Rule
770178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu    public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
780178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
790178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu    @Test
800178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu    public void testConstruction() throws Throwable {
810178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu        mActivityRule.runOnUiThread(() -> {
820178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu            assertTrue("We should be running on the main thread",
830178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                    Looper.getMainLooper().getThread() == Thread.currentThread());
840178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu            assertTrue("We should be running on the main thread",
850178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                    Looper.myLooper() == Looper.getMainLooper());
860178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu            BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
870178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu            Activity activity = mActivityRule.getActivity();
880178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu            activity.setContentView(mLayoutId);
890178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu
900178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu            while (state.keepRunning()) {
910178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                TextView textView = new TextView(activity);
92ab18567419d8bd8b2c1bcbad771ebcbfbdab2ae8Andrei Stingaceanu                // TextView#onLayout() gets called, which triggers TextView#autoSizeText()
930178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                // which is the method we want to benchmark.
940178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu                textView.requestLayout();
950178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu            }
960178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu        });
970178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu    }
980178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu}
99