blob: a110434fc2a01933a840ee6c84a3fa4d6c6af282 [file] [log] [blame]
// Copyright 2018 The Feed Authors.
//
// 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.google.android.libraries.feed.sharedstream.logging;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.MockitoAnnotations.initMocks;
import android.app.Activity;
import android.graphics.Point;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
import com.google.android.libraries.feed.api.host.config.Configuration;
import com.google.android.libraries.feed.api.host.config.Configuration.ConfigKey;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
/** Tests for {@link VisibilityMonitor}. */
@RunWith(RobolectricTestRunner.class)
public class VisibilityMonitorTest {
private static final Configuration CONFIGURATION =
new Configuration.Builder().put(ConfigKey.VIEW_LOG_THRESHOLD, .50).build();
private static final int VIEW_HEIGHT = 100;
private static final int VIEW_WIDTH = 50;
@Mock private VisibilityListener visibilityListener;
private Activity context;
private ViewGroup parentView;
private View view;
private VisibilityMonitor visibilityMonitor;
@Before
public void setUp() {
initMocks(this);
context = Robolectric.setupActivity(Activity.class);
setUpViews(
((child, r, offset) -> {
r.set(0, 0, VIEW_WIDTH, VIEW_HEIGHT);
return true;
}));
}
@Test
public void testPreDraw_notifiesListener() {
context.setContentView(parentView);
visibilityMonitor.onPreDraw();
verify(visibilityListener).onViewVisible();
}
@Test
public void testPreDraw_notifiesListenerIfVisibleViewHeightIsAtThreshold() {
setUpViews(
(child, r, offset) -> {
r.set(0, 0, VIEW_WIDTH, 50);
return true;
});
context.setContentView(parentView);
visibilityMonitor.onPreDraw();
verify(visibilityListener).onViewVisible();
}
@Test
public void testPreDraw_doesNotNotifyListenerIfAlreadyVisible() {
context.setContentView(parentView);
visibilityMonitor.onPreDraw();
reset(visibilityListener);
visibilityMonitor.onPreDraw();
verify(visibilityListener, never()).onViewVisible();
}
@Test
public void testPreDraw_doesNotNotifyListenerIfVisibleViewHeightIsBelowThreshold() {
setUpViews(
(child, r, offset) -> {
r.set(0, 0, VIEW_WIDTH, 49);
return true;
});
context.setContentView(parentView);
visibilityMonitor.onPreDraw();
verify(visibilityListener, never()).onViewVisible();
}
@Test
public void testPreDraw_doesNotNotifyListenerIfViewNotAttached() {
setUpViews((child, r, offset) -> false);
visibilityMonitor.onPreDraw();
verify(visibilityListener, never()).onViewVisible();
}
@Test
public void testPreDraw_doesNotNotifyListenerIfParentIsNull() {
visibilityMonitor = new VisibilityMonitor(new FrameLayout(context), CONFIGURATION);
visibilityMonitor.setListener(null);
visibilityMonitor.onPreDraw();
verify(visibilityListener, never()).onViewVisible();
}
private void setUpViews(ChildVisibleRectMock childVisibleRectMock) {
view = new FrameLayout(context);
view.setLayoutParams(new LayoutParams(VIEW_WIDTH, VIEW_HEIGHT));
parentView =
new FrameLayout(context) {
@Override
public boolean getChildVisibleRect(View child, Rect r, Point offset) {
return childVisibleRectMock.getChildVisibleRect(child, r, offset);
}
};
parentView.addView(view);
visibilityMonitor = new VisibilityMonitor(view, CONFIGURATION);
visibilityMonitor.setListener(visibilityListener);
}
interface ChildVisibleRectMock {
boolean getChildVisibleRect(View child, Rect r, Point offset);
}
}