/*
 * Copyright (C) 2012 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.inputmethod.keyboard.internal;

import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;

@SmallTest
public class PointerTrackerQueueTests extends AndroidTestCase {
    public static class Element implements PointerTrackerQueue.Element {
        public static int sPhantomUpCount;
        public static final long NOT_HAPPENED = -1;

        public final int mId;
        public boolean mIsModifier;
        public boolean mIsInSlidingKeyInput;
        public long mPhantomUpEventTime = NOT_HAPPENED;

        public Element(int id) {
            mId = id;
        }

        @Override
        public boolean isModifier() {
            return mIsModifier;
        }

        @Override
        public boolean isInSlidingKeyInput() {
            return mIsInSlidingKeyInput;
        }

        @Override
        public void onPhantomUpEvent(long eventTime) {
            sPhantomUpCount++;
            mPhantomUpEventTime = eventTime + sPhantomUpCount;
        }

        @Override
        public void cancelTrackingForAction() {}

        @Override
        public String toString() {
            return Integer.toString(mId);
        }
    }

    private final Element mElement1 = new Element(1);
    private final Element mElement2 = new Element(2);
    private final Element mElement3 = new Element(3);
    private final Element mElement4 = new Element(4);
    private final PointerTrackerQueue mQueue = new PointerTrackerQueue();

    public void testEmpty() {
        assertEquals(0, mQueue.size());
        assertEquals("[]", mQueue.toString());
    }

    public void testAdd() {
        mQueue.add(mElement1);
        assertEquals(1, mQueue.size());
        assertEquals("[1]", mQueue.toString());
        mQueue.add(mElement2);
        assertEquals(2, mQueue.size());
        assertEquals("[1 2]", mQueue.toString());
        mQueue.add(mElement3);
        assertEquals(3, mQueue.size());
        assertEquals("[1 2 3]", mQueue.toString());
        mQueue.add(mElement4);
        assertEquals(4, mQueue.size());
        assertEquals("[1 2 3 4]", mQueue.toString());
    }

    public void testRemove() {
        Element.sPhantomUpCount = 0;

        mQueue.add(mElement1);
        mQueue.add(mElement2);
        mQueue.add(mElement3);
        mQueue.add(mElement4);

        mQueue.remove(mElement2);
        assertEquals(3, mQueue.size());
        assertEquals("[1 3 4]", mQueue.toString());
        mQueue.remove(mElement4);
        assertEquals(2, mQueue.size());
        assertEquals("[1 3]", mQueue.toString());
        mQueue.remove(mElement4);
        assertEquals(2, mQueue.size());
        assertEquals("[1 3]", mQueue.toString());
        mQueue.remove(mElement1);
        assertEquals(1, mQueue.size());
        assertEquals("[3]", mQueue.toString());
        mQueue.remove(mElement3);
        assertEquals(0, mQueue.size());
        assertEquals("[]", mQueue.toString());
        mQueue.remove(mElement1);
        assertEquals(0, mQueue.size());
        assertEquals("[]", mQueue.toString());

        assertEquals(0, Element.sPhantomUpCount);
        assertEquals(Element.NOT_HAPPENED, mElement1.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime);
    }

    public void testAddAndRemove() {
        Element.sPhantomUpCount = 0;

        mQueue.add(mElement1);
        mQueue.add(mElement2);
        mQueue.add(mElement3);
        mQueue.add(mElement4);

        mQueue.remove(mElement2);
        assertEquals(3, mQueue.size());
        assertEquals("[1 3 4]", mQueue.toString());
        mQueue.remove(mElement4);
        assertEquals(2, mQueue.size());
        assertEquals("[1 3]", mQueue.toString());
        mQueue.add(mElement2);
        assertEquals(3, mQueue.size());
        assertEquals("[1 3 2]", mQueue.toString());
        mQueue.remove(mElement4);
        assertEquals(3, mQueue.size());
        assertEquals("[1 3 2]", mQueue.toString());
        mQueue.remove(mElement1);
        assertEquals(2, mQueue.size());
        assertEquals("[3 2]", mQueue.toString());
        mQueue.add(mElement1);
        assertEquals(3, mQueue.size());
        assertEquals("[3 2 1]", mQueue.toString());
        mQueue.remove(mElement3);
        assertEquals(2, mQueue.size());
        assertEquals("[2 1]", mQueue.toString());
        mQueue.remove(mElement1);
        assertEquals(1, mQueue.size());
        assertEquals("[2]", mQueue.toString());

        assertEquals(Element.NOT_HAPPENED, mElement1.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime);
    }

    public void testReleaseAllPointers() {
        mElement2.mIsModifier = true;
        mQueue.add(mElement1);
        mQueue.add(mElement2);
        mQueue.add(mElement3);
        mQueue.add(mElement4);

        final long eventTime = 123;
        Element.sPhantomUpCount = 0;
        mQueue.releaseAllPointers(eventTime);
        assertEquals(4, Element.sPhantomUpCount);
        assertEquals(0, mQueue.size());
        assertEquals("[]", mQueue.toString());
        assertEquals(eventTime + 1, mElement1.mPhantomUpEventTime);
        assertEquals(eventTime + 2, mElement2.mPhantomUpEventTime);
        assertEquals(eventTime + 3, mElement3.mPhantomUpEventTime);
        assertEquals(eventTime + 4, mElement4.mPhantomUpEventTime);
    }

    public void testReleaseAllPointersOlderThanFirst() {
        mElement2.mIsModifier = true;
        mQueue.add(mElement1);
        mQueue.add(mElement2);
        mQueue.add(mElement3);

        final long eventTime = 123;
        Element.sPhantomUpCount = 0;
        mQueue.releaseAllPointersOlderThan(mElement1, eventTime);
        assertEquals(0, Element.sPhantomUpCount);
        assertEquals(3, mQueue.size());
        assertEquals("[1 2 3]", mQueue.toString());
        assertEquals(Element.NOT_HAPPENED, mElement1.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime);
    }

    public void testReleaseAllPointersOlderThanLast() {
        mElement2.mIsModifier = true;
        mQueue.add(mElement1);
        mQueue.add(mElement2);
        mQueue.add(mElement3);
        mQueue.add(mElement4);

        final long eventTime = 123;
        Element.sPhantomUpCount = 0;
        mQueue.releaseAllPointersOlderThan(mElement4, eventTime);
        assertEquals(2, Element.sPhantomUpCount);
        assertEquals(2, mQueue.size());
        assertEquals("[2 4]", mQueue.toString());
        assertEquals(eventTime + 1, mElement1.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime);
        assertEquals(eventTime + 2, mElement3.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime);
    }

    public void testReleaseAllPointersOlderThanWithoutModifierMiddle() {
        mQueue.add(mElement1);
        mQueue.add(mElement2);
        mQueue.add(mElement3);
        mQueue.add(mElement4);

        final long eventTime = 123;
        Element.sPhantomUpCount = 0;
        mQueue.releaseAllPointersOlderThan(mElement3, eventTime);
        assertEquals(2, Element.sPhantomUpCount);
        assertEquals(2, mQueue.size());
        assertEquals("[3 4]", mQueue.toString());
        assertEquals(eventTime + 1, mElement1.mPhantomUpEventTime);
        assertEquals(eventTime + 2, mElement2.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime);
    }

    public void testReleaseAllPointersOlderThanWithoutModifierLast() {
        mQueue.add(mElement1);
        mQueue.add(mElement2);
        mQueue.add(mElement3);
        mQueue.add(mElement4);

        final long eventTime = 123;
        Element.sPhantomUpCount = 0;
        mQueue.releaseAllPointersOlderThan(mElement4, eventTime);
        assertEquals(3, Element.sPhantomUpCount);
        assertEquals(1, mQueue.size());
        assertEquals("[4]", mQueue.toString());
        assertEquals(eventTime + 1, mElement1.mPhantomUpEventTime);
        assertEquals(eventTime + 2, mElement2.mPhantomUpEventTime);
        assertEquals(eventTime + 3, mElement3.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime);
    }

    public void testReleaseAllPointersExcept() {
        mElement2.mIsModifier = true;
        mQueue.add(mElement1);
        mQueue.add(mElement2);
        mQueue.add(mElement3);
        mQueue.add(mElement4);

        final long eventTime = 123;
        Element.sPhantomUpCount = 0;
        mQueue.releaseAllPointersExcept(mElement3, eventTime);
        assertEquals(3, Element.sPhantomUpCount);
        assertEquals(1, mQueue.size());
        assertEquals("[3]", mQueue.toString());
        assertEquals(eventTime + 1, mElement1.mPhantomUpEventTime);
        assertEquals(eventTime + 2, mElement2.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime);
        assertEquals(eventTime + 3, mElement4.mPhantomUpEventTime);
    }

    public void testHasModifierKeyOlderThan() {
        Element.sPhantomUpCount = 0;
        assertFalse("hasModifierKeyOlderThan empty", mQueue.hasModifierKeyOlderThan(mElement1));

        mQueue.add(mElement1);
        mQueue.add(mElement2);
        mQueue.add(mElement3);
        mQueue.add(mElement4);

        assertFalse(mQueue.hasModifierKeyOlderThan(mElement1));
        assertFalse(mQueue.hasModifierKeyOlderThan(mElement2));
        assertFalse(mQueue.hasModifierKeyOlderThan(mElement3));
        assertFalse(mQueue.hasModifierKeyOlderThan(mElement4));

        mElement2.mIsModifier = true;
        assertFalse(mQueue.hasModifierKeyOlderThan(mElement1));
        assertFalse(mQueue.hasModifierKeyOlderThan(mElement2));
        assertTrue(mQueue.hasModifierKeyOlderThan(mElement3));
        assertTrue(mQueue.hasModifierKeyOlderThan(mElement4));

        assertEquals(0, Element.sPhantomUpCount);
        assertEquals(4, mQueue.size());
        assertEquals("[1 2 3 4]", mQueue.toString());
        assertEquals(Element.NOT_HAPPENED, mElement1.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime);
    }

    public void testIsAnyInSlidingKeyInput() {
        Element.sPhantomUpCount = 0;
        assertFalse(mQueue.isAnyInSlidingKeyInput());

        mQueue.add(mElement1);
        mQueue.add(mElement2);
        mQueue.add(mElement3);
        mQueue.add(mElement4);

        assertFalse(mQueue.isAnyInSlidingKeyInput());

        mElement3.mIsInSlidingKeyInput = true;
        assertTrue(mQueue.isAnyInSlidingKeyInput());

        assertEquals(0, Element.sPhantomUpCount);
        assertEquals(4, mQueue.size());
        assertEquals("[1 2 3 4]", mQueue.toString());
        assertEquals(Element.NOT_HAPPENED, mElement1.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime);
        assertEquals(Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime);
    }
}
