/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.drawee.view;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.view.MotionEvent;
import com.facebook.testing.robolectric.v2.WithTestDefaultsRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import static junit.framework.Assert.*;
import static org.mockito.Mockito.*;
/**
* Tests for {@link MultiDraweeHolder}
*/
@RunWith(WithTestDefaultsRunner.class)
public class MultiDraweeHolderTest {
MultiDraweeHolder mMultiHolder;
DraweeHolder mHolder1;
DraweeHolder mHolder2;
DraweeHolder mHolder3;
@Before
public void setUp() {
mMultiHolder = new MultiDraweeHolder();
mHolder1 = mock(DraweeHolder.class);
mHolder2 = mock(DraweeHolder.class);
mHolder3 = mock(DraweeHolder.class);
mMultiHolder.add(mHolder1);
mMultiHolder.add(mHolder2);
mMultiHolder.add(mHolder3);
}
@Test
public void testAttaching() {
mMultiHolder.onAttach();
verify(mHolder1).onAttach();
verify(mHolder2).onAttach();
verify(mHolder3).onAttach();
mMultiHolder.onDetach();
verify(mHolder1).onDetach();
verify(mHolder2).onDetach();
verify(mHolder3).onDetach();
}
@Test
public void testTouchEvent_Handled() {
MotionEvent event = mock(MotionEvent.class);
when(mHolder1.onTouchEvent(event)).thenReturn(false);
when(mHolder2.onTouchEvent(event)).thenReturn(true);
when(mHolder3.onTouchEvent(event)).thenReturn(true);
boolean ret = mMultiHolder.onTouchEvent(event);
assertEquals(true, ret);
verify(mHolder1).onTouchEvent(event);
verify(mHolder2).onTouchEvent(event);
verify(mHolder3, never()).onTouchEvent(event);
}
@Test
public void testTouchEvent_NotHandled() {
MotionEvent event = mock(MotionEvent.class);
when(mHolder1.onTouchEvent(event)).thenReturn(false);
when(mHolder2.onTouchEvent(event)).thenReturn(false);
when(mHolder3.onTouchEvent(event)).thenReturn(false);
boolean ret = mMultiHolder.onTouchEvent(event);
assertEquals(false, ret);
verify(mHolder1).onTouchEvent(event);
verify(mHolder2).onTouchEvent(event);
verify(mHolder3).onTouchEvent(event);
}
@Test
public void testClear_Detached() {
assertEquals(3, mMultiHolder.mHolders.size());
mMultiHolder.clear();
assertTrue(mMultiHolder.mHolders.isEmpty());
}
@Test
public void testClear_Attached() {
mMultiHolder.onAttach();
reset(mHolder1, mHolder2, mHolder3);
assertEquals(3, mMultiHolder.mHolders.size());
mMultiHolder.clear();
assertTrue(mMultiHolder.mHolders.isEmpty());
verify(mHolder1).onDetach();
verify(mHolder2).onDetach();
verify(mHolder2).onDetach();
}
@Test
public void testAdd_Detached() {
mMultiHolder.clear();
reset(mHolder1, mHolder2, mHolder3);
assertEquals(0, mMultiHolder.mHolders.size());
mMultiHolder.add(mHolder1);
assertEquals(1, mMultiHolder.mHolders.size());
assertEquals(mHolder1, mMultiHolder.mHolders.get(0));
mMultiHolder.add(1, mHolder3);
assertEquals(2, mMultiHolder.mHolders.size());
assertEquals(mHolder1, mMultiHolder.mHolders.get(0));
assertEquals(mHolder3, mMultiHolder.mHolders.get(1));
mMultiHolder.add(1, mHolder2);
assertEquals(3, mMultiHolder.mHolders.size());
assertEquals(mHolder1, mMultiHolder.mHolders.get(0));
assertEquals(mHolder2, mMultiHolder.mHolders.get(1));
assertEquals(mHolder3, mMultiHolder.mHolders.get(2));
verify(mHolder1, never()).onAttach();
verify(mHolder2, never()).onAttach();
verify(mHolder3, never()).onAttach();
}
@Test
public void testAdd_Attached() {
mMultiHolder.clear();
mMultiHolder.onAttach();
reset(mHolder1, mHolder2, mHolder3);
assertEquals(0, mMultiHolder.mHolders.size());
mMultiHolder.add(mHolder1);
assertEquals(mHolder1, mMultiHolder.mHolders.get(0));
mMultiHolder.add(1, mHolder3);
assertEquals(mHolder1, mMultiHolder.mHolders.get(0));
assertEquals(mHolder3, mMultiHolder.mHolders.get(1));
mMultiHolder.add(1, mHolder2);
assertEquals(3, mMultiHolder.mHolders.size());
assertEquals(mHolder1, mMultiHolder.mHolders.get(0));
assertEquals(mHolder2, mMultiHolder.mHolders.get(1));
assertEquals(mHolder3, mMultiHolder.mHolders.get(2));
verify(mHolder1).onAttach();
verify(mHolder2).onAttach();
verify(mHolder3).onAttach();
}
@Test
public void testRemove_Detached() {
assertEquals(3, mMultiHolder.mHolders.size());
assertEquals(mHolder1, mMultiHolder.mHolders.get(0));
assertEquals(mHolder2, mMultiHolder.mHolders.get(1));
assertEquals(mHolder3, mMultiHolder.mHolders.get(2));
mMultiHolder.remove(1);
assertEquals(2, mMultiHolder.mHolders.size());
assertEquals(mHolder1, mMultiHolder.mHolders.get(0));
assertEquals(mHolder3, mMultiHolder.mHolders.get(1));
mMultiHolder.remove(1);
assertEquals(1, mMultiHolder.mHolders.size());
assertEquals(mHolder1, mMultiHolder.mHolders.get(0));
mMultiHolder.remove(0);
assertEquals(0, mMultiHolder.mHolders.size());
}
@Test
public void testRemove_attached() {
mMultiHolder.onAttach();
reset(mHolder1, mHolder2, mHolder3);
assertEquals(3, mMultiHolder.mHolders.size());
assertEquals(mHolder1, mMultiHolder.mHolders.get(0));
assertEquals(mHolder2, mMultiHolder.mHolders.get(1));
assertEquals(mHolder3, mMultiHolder.mHolders.get(2));
mMultiHolder.remove(1);
assertEquals(2, mMultiHolder.mHolders.size());
assertEquals(mHolder1, mMultiHolder.mHolders.get(0));
assertEquals(mHolder3, mMultiHolder.mHolders.get(1));
mMultiHolder.remove(1);
assertEquals(1, mMultiHolder.mHolders.size());
assertEquals(mHolder1, mMultiHolder.mHolders.get(0));
mMultiHolder.remove(0);
assertEquals(0, mMultiHolder.mHolders.size());
verify(mHolder1).onDetach();
verify(mHolder2).onDetach();
verify(mHolder3).onDetach();
}
@Test
public void testGet() {
assertEquals(mHolder1, mMultiHolder.get(0));
assertEquals(mHolder2, mMultiHolder.get(1));
assertEquals(mHolder3, mMultiHolder.get(2));
}
@Test
public void testDraw() {
Canvas canvas = mock(Canvas.class);
Drawable drawable1 = mock(Drawable.class);
Drawable drawable2 = mock(Drawable.class);
Drawable drawable3 = mock(Drawable.class);
when(mHolder1.getTopLevelDrawable()).thenReturn(drawable1);
when(mHolder2.getTopLevelDrawable()).thenReturn(drawable2);
when(mHolder3.getTopLevelDrawable()).thenReturn(drawable3);
mMultiHolder.draw(canvas);
verify(drawable1).draw(canvas);
verify(drawable2).draw(canvas);
verify(drawable3).draw(canvas);
}
@Test
public void testVerifyDrawable() {
Drawable drawable1 = mock(Drawable.class);
Drawable drawable2 = mock(Drawable.class);
when(mHolder1.getTopLevelDrawable()).thenReturn(drawable1);
assertTrue(mMultiHolder.verifyDrawable(drawable1));
assertFalse(mMultiHolder.verifyDrawable(drawable2));
}
}