/*
 * Copyright (C) 2016 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 android.transition.cts;

import static com.android.compatibility.common.util.CtsMockitoUtils.within;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import android.transition.ChangeBounds;
import android.transition.Fade;
import android.transition.Transition;
import android.transition.TransitionSet;

import androidx.test.filters.MediumTest;
import androidx.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

@MediumTest
@RunWith(AndroidJUnit4.class)
public class TransitionSetTest extends BaseTransitionTest {
    @Test
    public void testTransitionTogether() throws Throwable {
        TransitionSet transitionSet = new TransitionSet();
        Fade fade = new Fade();
        final Transition.TransitionListener fadeListener =
                mock(Transition.TransitionListener.class);
        fade.addListener(fadeListener);
        ChangeBounds changeBounds = new ChangeBounds();
        final Transition.TransitionListener changeBoundsListener =
                mock(Transition.TransitionListener.class);
        changeBounds.addListener(changeBoundsListener);
        transitionSet.addTransition(fade);
        transitionSet.addTransition(changeBounds);
        mTransition = transitionSet;
        resetListener();

        assertEquals(TransitionSet.ORDERING_TOGETHER, transitionSet.getOrdering());
        enterScene(R.layout.scene1);
        startTransition(R.layout.scene3);
        mActivityRule.runOnUiThread(() -> {
            verify(fadeListener, times(1)).onTransitionStart(any());
            verify(changeBoundsListener, times(1)).onTransitionStart(any());
        });
    }

    @Test
    public void testTransitionSequentially() throws Throwable {
        TransitionSet transitionSet = new TransitionSet();
        Fade fade = new Fade();
        fade.setDuration(500);
        final Transition.TransitionListener fadeListener =
                mock(Transition.TransitionListener.class);
        fade.addListener(fadeListener);
        ChangeBounds changeBounds = new ChangeBounds();
        final Transition.TransitionListener changeBoundsListener =
                mock(Transition.TransitionListener.class);
        changeBounds.addListener(changeBoundsListener);
        transitionSet.addTransition(fade);
        transitionSet.addTransition(changeBounds);
        mTransition = transitionSet;
        resetListener();

        assertEquals(TransitionSet.ORDERING_TOGETHER, transitionSet.getOrdering());
        transitionSet.setOrdering(TransitionSet.ORDERING_SEQUENTIAL);
        assertEquals(TransitionSet.ORDERING_SEQUENTIAL, transitionSet.getOrdering());

        enterScene(R.layout.scene1);
        startTransition(R.layout.scene3);
        verify(fadeListener, within(500)).onTransitionStart(any());
        verify(fadeListener, times(1)).onTransitionStart(any());

        // change bounds shouldn't start until after fade finishes
        verify(fadeListener, times(0)).onTransitionEnd(any());
        verify(changeBoundsListener, times(0)).onTransitionStart(any());

        // now wait for the fade transition to end
        verify(fadeListener, within(1000)).onTransitionEnd(any());

        // The change bounds should start soon after
        verify(changeBoundsListener, within(500)).onTransitionStart(any());
        verify(changeBoundsListener, times(1)).onTransitionStart(any());
    }

    @Test
    public void testTransitionCount() throws Throwable {
        TransitionSet transitionSet = new TransitionSet();
        assertEquals(0, transitionSet.getTransitionCount());

        Fade fade = new Fade();
        ChangeBounds changeBounds = new ChangeBounds();
        transitionSet.addTransition(fade);
        transitionSet.addTransition(changeBounds);

        assertEquals(2, transitionSet.getTransitionCount());
        assertSame(fade, transitionSet.getTransitionAt(0));
        assertSame(changeBounds, transitionSet.getTransitionAt(1));

        transitionSet.removeTransition(fade);

        assertEquals(1, transitionSet.getTransitionCount());
        assertSame(changeBounds, transitionSet.getTransitionAt(0));

        transitionSet.removeTransition(fade); // remove one that isn't there
        assertEquals(1, transitionSet.getTransitionCount());
        assertSame(changeBounds, transitionSet.getTransitionAt(0));
    }
}

