1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 * use this file except in compliance with the License. You may obtain a copy of 6 * the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 17 package com.android.inputmethod.keyboard.internal; 18 19 import android.test.AndroidTestCase; 20 21 public class PointerTrackerQueueTests extends AndroidTestCase { 22 public static class Element implements PointerTrackerQueue.Element { 23 public static int sPhantomUpCount; 24 public static final long NOT_HAPPENED = -1; 25 26 public final int mId; 27 public boolean mIsModifier; 28 public boolean mIsInSlidingKeyInput; 29 public long mPhantomUpEventTime = NOT_HAPPENED; 30 Element(int id)31 public Element(int id) { 32 mId = id; 33 } 34 35 @Override isModifier()36 public boolean isModifier() { 37 return mIsModifier; 38 } 39 40 @Override isInSlidingKeyInput()41 public boolean isInSlidingKeyInput() { 42 return mIsInSlidingKeyInput; 43 } 44 45 @Override onPhantomUpEvent(long eventTime)46 public void onPhantomUpEvent(long eventTime) { 47 sPhantomUpCount++; 48 mPhantomUpEventTime = eventTime + sPhantomUpCount; 49 } 50 51 @Override toString()52 public String toString() { 53 return Integer.toString(mId); 54 } 55 } 56 57 private final Element mElement1 = new Element(1); 58 private final Element mElement2 = new Element(2); 59 private final Element mElement3 = new Element(3); 60 private final Element mElement4 = new Element(4); 61 private final PointerTrackerQueue mQueue = new PointerTrackerQueue(); 62 testEmpty()63 public void testEmpty() { 64 assertEquals("empty queue", 0, mQueue.size()); 65 assertEquals("empty queue", "[]", mQueue.toString()); 66 } 67 testAdd()68 public void testAdd() { 69 mQueue.add(mElement1); 70 assertEquals("add element1", 1, mQueue.size()); 71 assertEquals("after adding element1", "[1]", mQueue.toString()); 72 mQueue.add(mElement2); 73 assertEquals("add element2", 2, mQueue.size()); 74 assertEquals("after adding element2", "[1 2]", mQueue.toString()); 75 mQueue.add(mElement3); 76 assertEquals("add element3", 3, mQueue.size()); 77 assertEquals("after adding element3", "[1 2 3]", mQueue.toString()); 78 mQueue.add(mElement4); 79 assertEquals("add element4", 4, mQueue.size()); 80 assertEquals("after adding element4", "[1 2 3 4]", mQueue.toString()); 81 } 82 testRemove()83 public void testRemove() { 84 Element.sPhantomUpCount = 0; 85 86 mQueue.add(mElement1); 87 mQueue.add(mElement2); 88 mQueue.add(mElement3); 89 mQueue.add(mElement4); 90 91 mQueue.remove(mElement2); 92 assertEquals("remove element2", 3, mQueue.size()); 93 assertEquals("after removing element2", "[1 3 4]", mQueue.toString()); 94 mQueue.remove(mElement4); 95 assertEquals("remove element4", 2, mQueue.size()); 96 assertEquals("after removing element4", "[1 3]", mQueue.toString()); 97 mQueue.remove(mElement4); 98 assertEquals("remove element4 again", 2, mQueue.size()); 99 assertEquals("after removing element4 again", "[1 3]", mQueue.toString()); 100 mQueue.remove(mElement1); 101 assertEquals("remove element1", 1, mQueue.size()); 102 assertEquals("after removing element4", "[3]", mQueue.toString()); 103 mQueue.remove(mElement3); 104 assertEquals("remove element3", 0, mQueue.size()); 105 assertEquals("after removing element3", "[]", mQueue.toString()); 106 mQueue.remove(mElement1); 107 assertEquals("remove element1 again", 0, mQueue.size()); 108 assertEquals("after removing element1 again", "[]", mQueue.toString()); 109 110 assertEquals("after remove elements", 0, Element.sPhantomUpCount); 111 assertEquals("after remove element1", 112 Element.NOT_HAPPENED, mElement1.mPhantomUpEventTime); 113 assertEquals("after remove element2", 114 Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime); 115 assertEquals("after remove element3", 116 Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime); 117 assertEquals("after remove element4", 118 Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime); 119 } 120 testAddAndRemove()121 public void testAddAndRemove() { 122 Element.sPhantomUpCount = 0; 123 124 mQueue.add(mElement1); 125 mQueue.add(mElement2); 126 mQueue.add(mElement3); 127 mQueue.add(mElement4); 128 129 mQueue.remove(mElement2); 130 assertEquals("remove element2", 3, mQueue.size()); 131 assertEquals("after removing element2", "[1 3 4]", mQueue.toString()); 132 mQueue.remove(mElement4); 133 assertEquals("remove element4", 2, mQueue.size()); 134 assertEquals("after removing element4", "[1 3]", mQueue.toString()); 135 mQueue.add(mElement2); 136 assertEquals("add element2", 3, mQueue.size()); 137 assertEquals("after adding element2", "[1 3 2]", mQueue.toString()); 138 mQueue.remove(mElement4); 139 assertEquals("remove element4 again", 3, mQueue.size()); 140 assertEquals("after removing element4 again", "[1 3 2]", mQueue.toString()); 141 mQueue.remove(mElement1); 142 assertEquals("remove element1", 2, mQueue.size()); 143 assertEquals("after removing element4", "[3 2]", mQueue.toString()); 144 mQueue.add(mElement1); 145 assertEquals("add element1", 3, mQueue.size()); 146 assertEquals("after adding element1", "[3 2 1]", mQueue.toString()); 147 mQueue.remove(mElement3); 148 assertEquals("remove element3", 2, mQueue.size()); 149 assertEquals("after removing element3", "[2 1]", mQueue.toString()); 150 mQueue.remove(mElement1); 151 assertEquals("remove element1 again", 1, mQueue.size()); 152 assertEquals("after removing element1 again", "[2]", mQueue.toString()); 153 154 assertEquals("after remove element1", 155 Element.NOT_HAPPENED, mElement1.mPhantomUpEventTime); 156 assertEquals("after remove element2", 157 Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime); 158 assertEquals("after remove element3", 159 Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime); 160 assertEquals("after remove element4", 161 Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime); 162 } 163 testReleaseAllPointers()164 public void testReleaseAllPointers() { 165 mElement2.mIsModifier = true; 166 mQueue.add(mElement1); 167 mQueue.add(mElement2); 168 mQueue.add(mElement3); 169 mQueue.add(mElement4); 170 171 final long eventTime = 123; 172 Element.sPhantomUpCount = 0; 173 mQueue.releaseAllPointers(eventTime); 174 assertEquals("after releaseAllPointers", 4, Element.sPhantomUpCount); 175 assertEquals("after releaseAllPointers", 0, mQueue.size()); 176 assertEquals("after releaseAllPointers", "[]", mQueue.toString()); 177 assertEquals("after releaseAllPointers element1", 178 eventTime + 1, mElement1.mPhantomUpEventTime); 179 assertEquals("after releaseAllPointers element2", 180 eventTime + 2, mElement2.mPhantomUpEventTime); 181 assertEquals("after releaseAllPointers element3", 182 eventTime + 3, mElement3.mPhantomUpEventTime); 183 assertEquals("after releaseAllPointers element4", 184 eventTime + 4, mElement4.mPhantomUpEventTime); 185 } 186 testReleaseAllPointersOlderThan()187 public void testReleaseAllPointersOlderThan() { 188 mElement2.mIsModifier = true; 189 mQueue.add(mElement1); 190 mQueue.add(mElement2); 191 mQueue.add(mElement3); 192 mQueue.add(mElement4); 193 194 final long eventTime = 123; 195 Element.sPhantomUpCount = 0; 196 mQueue.releaseAllPointersOlderThan(mElement4, eventTime); 197 assertEquals("after releaseAllPointersOlderThan", 2, Element.sPhantomUpCount); 198 assertEquals("after releaseAllPointersOlderThan", 2, mQueue.size()); 199 assertEquals("after releaseAllPointersOlderThan", "[2 4]", mQueue.toString()); 200 assertEquals("after releaseAllPointersOlderThan element1", 201 eventTime + 1, mElement1.mPhantomUpEventTime); 202 assertEquals("after releaseAllPointersOlderThan element2", 203 Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime); 204 assertEquals("after releaseAllPointersOlderThan element3", 205 eventTime + 2, mElement3.mPhantomUpEventTime); 206 assertEquals("after releaseAllPointersOlderThan element4", 207 Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime); 208 } 209 testReleaseAllPointersOlderThanWithoutModifier()210 public void testReleaseAllPointersOlderThanWithoutModifier() { 211 mQueue.add(mElement1); 212 mQueue.add(mElement2); 213 mQueue.add(mElement3); 214 mQueue.add(mElement4); 215 216 final long eventTime = 123; 217 Element.sPhantomUpCount = 0; 218 mQueue.releaseAllPointersOlderThan(mElement4, eventTime); 219 assertEquals("after releaseAllPointersOlderThan without modifier", 220 3, Element.sPhantomUpCount); 221 assertEquals("after releaseAllPointersOlderThan without modifier", 1, mQueue.size()); 222 assertEquals("after releaseAllPointersOlderThan without modifier", 223 "[4]", mQueue.toString()); 224 assertEquals("after releaseAllPointersOlderThan without modifier element1", 225 eventTime + 1, mElement1.mPhantomUpEventTime); 226 assertEquals("after releaseAllPointersOlderThan without modifier element2", 227 eventTime + 2, mElement2.mPhantomUpEventTime); 228 assertEquals("after releaseAllPointersOlderThan without modifier element3", 229 eventTime + 3, mElement3.mPhantomUpEventTime); 230 assertEquals("after releaseAllPointersOlderThan without modifier element4", 231 Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime); 232 } 233 testReleaseAllPointersExcept()234 public void testReleaseAllPointersExcept() { 235 mElement2.mIsModifier = true; 236 mQueue.add(mElement1); 237 mQueue.add(mElement2); 238 mQueue.add(mElement3); 239 mQueue.add(mElement4); 240 241 final long eventTime = 123; 242 Element.sPhantomUpCount = 0; 243 mQueue.releaseAllPointersExcept(mElement3, eventTime); 244 assertEquals("after releaseAllPointersExcept", 3, Element.sPhantomUpCount); 245 assertEquals("after releaseAllPointersExcept", 1, mQueue.size()); 246 assertEquals("after releaseAllPointersExcept", "[3]", mQueue.toString()); 247 assertEquals("after releaseAllPointersExcept element1", 248 eventTime + 1, mElement1.mPhantomUpEventTime); 249 assertEquals("after releaseAllPointersExcept element2", 250 eventTime + 2, mElement2.mPhantomUpEventTime); 251 assertEquals("after releaseAllPointersExcept element3", 252 Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime); 253 assertEquals("after releaseAllPointersExcept element4", 254 eventTime + 3, mElement4.mPhantomUpEventTime); 255 } 256 testHasModifierKeyOlderThan()257 public void testHasModifierKeyOlderThan() { 258 Element.sPhantomUpCount = 0; 259 assertFalse("hasModifierKeyOlderThan empty", mQueue.hasModifierKeyOlderThan(mElement1)); 260 261 mQueue.add(mElement1); 262 mQueue.add(mElement2); 263 mQueue.add(mElement3); 264 mQueue.add(mElement4); 265 266 assertFalse("hasModifierKeyOlderThan element1", mQueue.hasModifierKeyOlderThan(mElement1)); 267 assertFalse("hasModifierKeyOlderThan element2", mQueue.hasModifierKeyOlderThan(mElement2)); 268 assertFalse("hasModifierKeyOlderThan element3", mQueue.hasModifierKeyOlderThan(mElement3)); 269 assertFalse("hasModifierKeyOlderThan element4", mQueue.hasModifierKeyOlderThan(mElement4)); 270 271 mElement2.mIsModifier = true; 272 assertFalse("hasModifierKeyOlderThan element1", mQueue.hasModifierKeyOlderThan(mElement1)); 273 assertFalse("hasModifierKeyOlderThan element2", mQueue.hasModifierKeyOlderThan(mElement2)); 274 assertTrue("hasModifierKeyOlderThan element3", mQueue.hasModifierKeyOlderThan(mElement3)); 275 assertTrue("hasModifierKeyOlderThan element4", mQueue.hasModifierKeyOlderThan(mElement4)); 276 277 assertEquals("after hasModifierKeyOlderThan", 0, Element.sPhantomUpCount); 278 assertEquals("after hasModifierKeyOlderThan", 4, mQueue.size()); 279 assertEquals("after hasModifierKeyOlderThan", "[1 2 3 4]", mQueue.toString()); 280 assertEquals("after hasModifierKeyOlderThan element1", 281 Element.NOT_HAPPENED, mElement1.mPhantomUpEventTime); 282 assertEquals("after hasModifierKeyOlderThan element2", 283 Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime); 284 assertEquals("after hasModifierKeyOlderThan element3", 285 Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime); 286 assertEquals("after hasModifierKeyOlderThan element4", 287 Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime); 288 } 289 testIsAnyInSlidingKeyInput()290 public void testIsAnyInSlidingKeyInput() { 291 Element.sPhantomUpCount = 0; 292 assertFalse("isAnyInSlidingKeyInput empty", mQueue.isAnyInSlidingKeyInput()); 293 294 mQueue.add(mElement1); 295 mQueue.add(mElement2); 296 mQueue.add(mElement3); 297 mQueue.add(mElement4); 298 299 assertFalse("isAnyInSlidingKeyInput element1", mQueue.isAnyInSlidingKeyInput()); 300 301 mElement3.mIsInSlidingKeyInput = true; 302 assertTrue("isAnyInSlidingKeyInput element1", mQueue.isAnyInSlidingKeyInput()); 303 304 assertEquals("after isAnyInSlidingKeyInput", 0, Element.sPhantomUpCount); 305 assertEquals("after isAnyInSlidingKeyInput", 4, mQueue.size()); 306 assertEquals("after isAnyInSlidingKeyInput", "[1 2 3 4]", mQueue.toString()); 307 assertEquals("after isAnyInSlidingKeyInput element1", 308 Element.NOT_HAPPENED, mElement1.mPhantomUpEventTime); 309 assertEquals("after isAnyInSlidingKeyInput element2", 310 Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime); 311 assertEquals("after isAnyInSlidingKeyInput element3", 312 Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime); 313 assertEquals("after isAnyInSlidingKeyInput element4", 314 Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime); 315 } 316 } 317