1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of 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, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.widget.cts; 18 19 import com.android.cts.stub.R; 20 21 import dalvik.annotation.TestLevel; 22 import dalvik.annotation.TestTargetClass; 23 import dalvik.annotation.TestTargetNew; 24 import dalvik.annotation.TestTargets; 25 26 import org.xmlpull.v1.XmlPullParser; 27 import org.xmlpull.v1.XmlPullParserException; 28 29 import android.app.Activity; 30 import android.content.Context; 31 import android.test.ActivityInstrumentationTestCase2; 32 import android.test.UiThreadTest; 33 import android.util.AttributeSet; 34 import android.util.Xml; 35 import android.view.MotionEvent; 36 import android.view.View; 37 import android.view.animation.cts.DelayedCheck; 38 import android.widget.ImageView; 39 import android.widget.SlidingDrawer; 40 import android.widget.TextView; 41 import android.widget.SlidingDrawer.OnDrawerCloseListener; 42 import android.widget.SlidingDrawer.OnDrawerOpenListener; 43 import android.widget.SlidingDrawer.OnDrawerScrollListener; 44 45 import java.io.IOException; 46 47 /** 48 * Test {@link SlidingDrawer}. 49 */ 50 @TestTargetClass(SlidingDrawer.class) 51 public class SlidingDrawerTest 52 extends ActivityInstrumentationTestCase2<SlidingDrawerStubActivity> { 53 54 private static final long TEST_TIMEOUT = 5000L; 55 private Activity mActivity; 56 private Object mLock; 57 58 public SlidingDrawerTest() { 59 super("com.android.cts.stub", SlidingDrawerStubActivity.class); 60 } 61 62 @Override 63 protected void setUp() throws Exception { 64 super.setUp(); 65 mActivity = getActivity(); 66 mLock = new Object(); 67 } 68 69 @TestTargets({ 70 @TestTargetNew( 71 level = TestLevel.COMPLETE, 72 method = "SlidingDrawer", 73 args = {Context.class, AttributeSet.class} 74 ), 75 @TestTargetNew( 76 level = TestLevel.COMPLETE, 77 method = "SlidingDrawer", 78 args = {Context.class, AttributeSet.class, int.class} 79 ) 80 }) 81 public void testConstructor() throws XmlPullParserException, IOException { 82 XmlPullParser parser = mActivity.getResources().getLayout(R.layout.sliding_drawer_layout); 83 AttributeSet attrs = Xml.asAttributeSet(parser); 84 85 try { 86 new SlidingDrawer(mActivity, attrs); 87 fail("did not throw IllegalArgumentException"); 88 } catch (IllegalArgumentException e) { 89 // expected 90 } 91 92 try { 93 new SlidingDrawer(mActivity, attrs, 0); 94 fail("did not throw IllegalArgumentException"); 95 } catch (IllegalArgumentException e) { 96 // expected 97 } 98 } 99 100 @TestTargetNew( 101 level = TestLevel.COMPLETE, 102 method = "getHandle", 103 args = {} 104 ) 105 public void testGetHandle() { 106 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 107 View handle = drawer.getHandle(); 108 assertTrue(handle instanceof ImageView); 109 assertEquals(R.id.handle, handle.getId()); 110 } 111 112 @TestTargetNew( 113 level = TestLevel.COMPLETE, 114 method = "getContent", 115 args = {} 116 ) 117 public void testGetContent() { 118 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 119 View content = drawer.getContent(); 120 assertTrue(content instanceof TextView); 121 assertEquals(R.id.content, content.getId()); 122 } 123 124 @TestTargets({ 125 @TestTargetNew( 126 level = TestLevel.COMPLETE, 127 method = "open", 128 args = {} 129 ), 130 @TestTargetNew( 131 level = TestLevel.COMPLETE, 132 method = "close", 133 args = {} 134 ), 135 @TestTargetNew( 136 level = TestLevel.COMPLETE, 137 method = "isOpened", 138 args = {} 139 ) 140 }) 141 @UiThreadTest 142 public void testOpenAndClose() { 143 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 144 View content = drawer.getContent(); 145 assertFalse(drawer.isOpened()); 146 assertEquals(View.GONE, content.getVisibility()); 147 148 drawer.open(); 149 assertTrue(drawer.isOpened()); 150 assertEquals(View.VISIBLE, content.getVisibility()); 151 152 drawer.close(); 153 assertFalse(drawer.isOpened()); 154 assertEquals(View.GONE, content.getVisibility()); 155 } 156 157 @TestTargets({ 158 @TestTargetNew( 159 level = TestLevel.COMPLETE, 160 method = "animateOpen", 161 args = {} 162 ), 163 @TestTargetNew( 164 level = TestLevel.COMPLETE, 165 method = "animateClose", 166 args = {} 167 ), 168 @TestTargetNew( 169 level = TestLevel.COMPLETE, 170 method = "isOpened", 171 args = {} 172 ), 173 @TestTargetNew( 174 level = TestLevel.COMPLETE, 175 method = "isMoving", 176 args = {} 177 ) 178 }) 179 public void testAnimateOpenAndClose() throws Throwable { 180 final SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 181 View content = drawer.getContent(); 182 assertFalse(drawer.isMoving()); 183 assertFalse(drawer.isOpened()); 184 assertEquals(View.GONE, content.getVisibility()); 185 186 runTestOnUiThread(new Runnable() { 187 public void run() { 188 drawer.animateOpen(); 189 } 190 }); 191 assertTrue(drawer.isMoving()); 192 assertFalse(drawer.isOpened()); 193 assertEquals(View.GONE, content.getVisibility()); 194 195 new DelayedCheck() { 196 @Override 197 protected boolean check() { 198 return !drawer.isMoving(); 199 } 200 }.run(); 201 assertTrue(drawer.isOpened()); 202 assertEquals(View.VISIBLE, content.getVisibility()); 203 204 runTestOnUiThread(new Runnable() { 205 public void run() { 206 drawer.animateClose(); 207 } 208 }); 209 assertTrue(drawer.isMoving()); 210 assertTrue(drawer.isOpened()); 211 assertEquals(View.GONE, content.getVisibility()); 212 213 new DelayedCheck() { 214 @Override 215 protected boolean check() { 216 return !drawer.isMoving(); 217 } 218 }.run(); 219 assertFalse(drawer.isOpened()); 220 assertEquals(View.GONE, content.getVisibility()); 221 } 222 223 @TestTargets({ 224 @TestTargetNew( 225 level = TestLevel.COMPLETE, 226 method = "animateToggle", 227 args = {} 228 ), 229 @TestTargetNew( 230 level = TestLevel.COMPLETE, 231 method = "isOpened", 232 args = {} 233 ), 234 @TestTargetNew( 235 level = TestLevel.COMPLETE, 236 method = "isMoving", 237 args = {} 238 ) 239 }) 240 public void testAnimateToggle() throws Throwable { 241 final SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 242 View content = drawer.getContent(); 243 assertFalse(drawer.isMoving()); 244 assertFalse(drawer.isOpened()); 245 assertEquals(View.GONE, content.getVisibility()); 246 247 runTestOnUiThread(new Runnable() { 248 public void run() { 249 drawer.animateToggle(); 250 } 251 }); 252 assertTrue(drawer.isMoving()); 253 assertFalse(drawer.isOpened()); 254 assertEquals(View.GONE, content.getVisibility()); 255 256 new DelayedCheck() { 257 @Override 258 protected boolean check() { 259 return !drawer.isMoving(); 260 } 261 }.run(); 262 assertTrue(drawer.isOpened()); 263 assertEquals(View.VISIBLE, content.getVisibility()); 264 265 runTestOnUiThread(new Runnable() { 266 public void run() { 267 drawer.animateToggle(); 268 } 269 }); 270 assertTrue(drawer.isMoving()); 271 assertTrue(drawer.isOpened()); 272 assertEquals(View.GONE, content.getVisibility()); 273 274 new DelayedCheck() { 275 @Override 276 protected boolean check() { 277 return !drawer.isMoving(); 278 } 279 }.run(); 280 assertFalse(drawer.isOpened()); 281 assertEquals(View.GONE, content.getVisibility()); 282 } 283 284 @TestTargets({ 285 @TestTargetNew( 286 level = TestLevel.COMPLETE, 287 method = "toggle", 288 args = {} 289 ), 290 @TestTargetNew( 291 level = TestLevel.COMPLETE, 292 method = "isOpened", 293 args = {} 294 ) 295 }) 296 @UiThreadTest 297 public void testToggle() { 298 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 299 View content = drawer.getContent(); 300 assertFalse(drawer.isOpened()); 301 assertEquals(View.GONE, content.getVisibility()); 302 303 drawer.toggle(); 304 assertTrue(drawer.isOpened()); 305 assertEquals(View.VISIBLE, content.getVisibility()); 306 307 drawer.toggle(); 308 assertFalse(drawer.isOpened()); 309 assertEquals(View.GONE, content.getVisibility()); 310 } 311 312 @TestTargets({ 313 @TestTargetNew( 314 level = TestLevel.COMPLETE, 315 method = "lock", 316 args = {} 317 ), 318 @TestTargetNew( 319 level = TestLevel.COMPLETE, 320 method = "unlock", 321 args = {} 322 ) 323 }) 324 @UiThreadTest 325 public void testLockAndUnlock() { 326 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 327 View handle = drawer.getHandle(); 328 View content = drawer.getContent(); 329 assertFalse(drawer.isOpened()); 330 assertEquals(View.GONE, content.getVisibility()); 331 332 handle.performClick(); 333 assertTrue(drawer.isOpened()); 334 assertEquals(View.VISIBLE, content.getVisibility()); 335 336 handle.performClick(); 337 assertFalse(drawer.isOpened()); 338 assertEquals(View.GONE, content.getVisibility()); 339 340 drawer.lock(); 341 handle.performClick(); 342 assertFalse(drawer.isOpened()); 343 assertEquals(View.GONE, content.getVisibility()); 344 345 drawer.unlock(); 346 handle.performClick(); 347 assertTrue(drawer.isOpened()); 348 assertEquals(View.VISIBLE, content.getVisibility()); 349 } 350 351 @TestTargetNew( 352 level = TestLevel.COMPLETE, 353 method = "setOnDrawerOpenListener", 354 args = {android.widget.SlidingDrawer.OnDrawerOpenListener.class} 355 ) 356 @UiThreadTest 357 public void testSetOnDrawerOpenListener() { 358 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 359 MockOnDrawerOpenListener listener = new MockOnDrawerOpenListener(); 360 drawer.setOnDrawerOpenListener(listener); 361 362 assertFalse(listener.hadOpenedDrawer()); 363 364 drawer.open(); 365 assertTrue(listener.hadOpenedDrawer()); 366 } 367 368 @TestTargetNew( 369 level = TestLevel.COMPLETE, 370 method = "setOnDrawerCloseListener", 371 args = {android.widget.SlidingDrawer.OnDrawerCloseListener.class} 372 ) 373 @UiThreadTest 374 public void testSetOnDrawerCloseListener() { 375 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 376 MockOnDrawerCloseListener listener = new MockOnDrawerCloseListener(); 377 drawer.setOnDrawerCloseListener(listener); 378 379 assertFalse(listener.hadClosedDrawer()); 380 381 drawer.open(); 382 assertFalse(listener.hadClosedDrawer()); 383 384 drawer.close(); 385 assertTrue(listener.hadClosedDrawer()); 386 } 387 388 @TestTargetNew( 389 level = TestLevel.COMPLETE, 390 method = "setOnDrawerScrollListener", 391 args = {android.widget.SlidingDrawer.OnDrawerScrollListener.class} 392 ) 393 public void testSetOnDrawerScrollListener() throws Throwable { 394 final SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 395 MockOnDrawerScrollListener listener = new MockOnDrawerScrollListener(); 396 drawer.setOnDrawerScrollListener(listener); 397 assertFalse(listener.hadStartedScroll()); 398 assertFalse(listener.hadEndedScroll()); 399 400 runTestOnUiThread(new Runnable() { 401 public void run() { 402 drawer.animateOpen(); 403 } 404 }); 405 if ( !listener.hadStartedScroll() ) { 406 synchronized (mLock) { 407 mLock.wait(TEST_TIMEOUT); 408 } 409 } 410 assertTrue(listener.hadStartedScroll()); 411 412 if ( !listener.hadEndedScroll() ) { 413 synchronized (mLock) { 414 mLock.wait(TEST_TIMEOUT); 415 } 416 } 417 assertTrue(listener.hadStartedScroll()); 418 assertTrue(listener.hadEndedScroll()); 419 } 420 421 @TestTargetNew( 422 level = TestLevel.NOT_NECESSARY, 423 method = "onLayout", 424 args = {boolean.class, int.class, int.class, int.class, int.class} 425 ) 426 public void testOnLayout() { 427 // onLayout() is implementation details, do NOT test 428 } 429 430 @TestTargetNew( 431 level = TestLevel.NOT_NECESSARY, 432 method = "onMeasure", 433 args = {int.class, int.class} 434 ) 435 public void testOnMeasure() { 436 // onMeasure() is implementation details, do NOT test 437 } 438 439 @TestTargetNew( 440 level = TestLevel.NOT_NECESSARY, 441 method = "onFinishInflate", 442 args = {} 443 ) 444 public void testOnFinishInflate() { 445 // onFinishInflate() is implementation details, do NOT test 446 } 447 448 @TestTargetNew( 449 level = TestLevel.NOT_NECESSARY, 450 method = "dispatchDraw", 451 args = {android.graphics.Canvas.class} 452 ) 453 public void testDispatchDraw() { 454 // dispatchDraw() is implementation details, do NOT test 455 } 456 457 @TestTargetNew( 458 level = TestLevel.NOT_NECESSARY, 459 method = "onInterceptTouchEvent", 460 args = {MotionEvent.class} 461 ) 462 public void testOnInterceptTouchEvent() { 463 // onInterceptTouchEvent() is implementation details, do NOT test 464 } 465 466 @TestTargetNew( 467 level = TestLevel.NOT_NECESSARY, 468 method = "onTouchEvent", 469 args = {MotionEvent.class} 470 ) 471 public void testOnTouchEvent() { 472 // onTouchEvent() is implementation details, do NOT test 473 } 474 475 private static final class MockOnDrawerOpenListener implements OnDrawerOpenListener { 476 private boolean mHadOpenedDrawer = false; 477 478 public void onDrawerOpened() { 479 mHadOpenedDrawer = true; 480 } 481 482 public boolean hadOpenedDrawer() { 483 return mHadOpenedDrawer; 484 } 485 } 486 487 private static final class MockOnDrawerCloseListener implements OnDrawerCloseListener { 488 private boolean mHadClosedDrawer = false; 489 490 public void onDrawerClosed() { 491 mHadClosedDrawer = true; 492 } 493 494 public boolean hadClosedDrawer() { 495 return mHadClosedDrawer; 496 } 497 } 498 499 private final class MockOnDrawerScrollListener implements OnDrawerScrollListener { 500 private boolean mHadEndedScroll = false; 501 private boolean mHadStartedScroll = false; 502 503 public void onScrollEnded() { 504 synchronized (mLock) { 505 assertTrue(mHadStartedScroll); 506 mHadEndedScroll = true; 507 mLock.notify(); 508 } 509 } 510 511 public void onScrollStarted() { 512 synchronized (mLock) { 513 mHadStartedScroll = true; 514 mLock.notify(); 515 } 516 } 517 518 public boolean hadEndedScroll() { 519 return mHadEndedScroll; 520 } 521 522 public boolean hadStartedScroll() { 523 return mHadStartedScroll; 524 } 525 } 526 } 527