/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.wm.flicker.monitor;

import static com.android.server.wm.flicker.AutomationUtils.wakeUpAndGoToHomeScreen;

import androidx.test.InstrumentationRegistry;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

/**
 * Contains {@link WindowAnimationFrameStatsMonitor} tests.
 * To run this test: {@code atest FlickerLibTest:WindowAnimationFrameStatsMonitorTest}
 */
public class WindowAnimationFrameStatsMonitorTest {
    private WindowAnimationFrameStatsMonitor mWindowAnimationFrameStatsMonitor;

    @Before
    public void setup() {
        mWindowAnimationFrameStatsMonitor = new WindowAnimationFrameStatsMonitor(
                InstrumentationRegistry.getInstrumentation());
        wakeUpAndGoToHomeScreen();
    }

    // TODO(vishnun)
    @Ignore("Disabled until app-helper libraries are available.")
    @Test
    public void captureWindowAnimationFrameStats() throws Exception {
        mWindowAnimationFrameStatsMonitor.start();
        //AppHelperWrapper.getInstance().getHelper(CHROME).open();
        //AppHelperWrapper.getInstance().getHelper(CHROME).exit();
        mWindowAnimationFrameStatsMonitor.stop();
    }
}
