package com.mopub.nativeads;
import com.mopub.common.test.support.SdkTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.robolectric.annotation.Config;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.mopub.nativeads.PlacementData.NOT_FOUND;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@Config(manifest=Config.NONE)
@RunWith(SdkTestRunner.class)
public class PlacementDataTest {
private PlacementData noAds;
private PlacementData adAt0;
private PlacementData adAt1;
private PlacementData adsAt01;
private PlacementData adsAt1234;
private PlacementData adsAt14;
private PlacementData adsRepeating;
private PlacementData adsAt15repeating;
@Mock private NativeAdData mockNativeAdData;
@Mock private NativeAdData mockNativeAdData2;
@Mock private NativeAdData mockNativeAdData3;
@Mock private NativeAdData mockNativeAdData4;
@Mock private NativeResponse mockNativeResponse;
@Mock private NativeResponse mockNativeResponse2;
@Mock private NativeResponse mockNativeResponse3;
@Mock private NativeResponse mockNativeResponse4;
@Before
public void setup() {
noAds = PlacementData.fromAdPositioning(MoPubNativeAdPositioning.clientPositioning());
adAt0 = PlacementData.fromAdPositioning(MoPubNativeAdPositioning.clientPositioning()
.addFixedPosition(0));
adAt1 = PlacementData.fromAdPositioning(MoPubNativeAdPositioning.clientPositioning()
.addFixedPosition(1));
adsAt01 = PlacementData.fromAdPositioning(MoPubNativeAdPositioning.clientPositioning()
.addFixedPosition(0)
.addFixedPosition(1));
adsAt14 = PlacementData.fromAdPositioning(MoPubNativeAdPositioning.clientPositioning()
.addFixedPosition(1)
.addFixedPosition(4));
adsRepeating = PlacementData.fromAdPositioning(MoPubNativeAdPositioning.clientPositioning()
.enableRepeatingPositions(3));
adsAt15repeating = PlacementData.fromAdPositioning(MoPubNativeAdPositioning.clientPositioning()
.addFixedPosition(1)
.addFixedPosition(5)
.enableRepeatingPositions(3));
adsAt1234 = PlacementData.fromAdPositioning(MoPubNativeAdPositioning.clientPositioning()
.addFixedPosition(1)
.addFixedPosition(2)
.addFixedPosition(3)
.addFixedPosition(4));
when(mockNativeAdData.getAd()).thenReturn(mockNativeResponse);
when(mockNativeAdData2.getAd()).thenReturn(mockNativeResponse2);
when(mockNativeAdData3.getAd()).thenReturn(mockNativeResponse3);
when(mockNativeAdData4.getAd()).thenReturn(mockNativeResponse4);
}
@Test
public void initialState_isDesired() {
assertThat(noAds.shouldPlaceAd(0)).isFalse();
assertThat(noAds.shouldPlaceAd(1)).isFalse();
assertThat(noAds.shouldPlaceAd(2)).isFalse();
assertThat(noAds.shouldPlaceAd(3)).isFalse();
assertThat(noAds.shouldPlaceAd(4)).isFalse();
assertThat(adAt0.shouldPlaceAd(0)).isTrue();
assertThat(adAt0.shouldPlaceAd(1)).isFalse();
assertThat(adAt0.shouldPlaceAd(2)).isFalse();
assertThat(adAt0.shouldPlaceAd(3)).isFalse();
assertThat(adAt0.shouldPlaceAd(4)).isFalse();
assertThat(adAt1.shouldPlaceAd(0)).isFalse();
assertThat(adAt1.shouldPlaceAd(1)).isTrue();
assertThat(adAt1.shouldPlaceAd(2)).isFalse();
assertThat(adAt1.shouldPlaceAd(3)).isFalse();
assertThat(adAt1.shouldPlaceAd(4)).isFalse();
assertThat(adsAt01.shouldPlaceAd(0)).isTrue();
assertThat(adsAt01.shouldPlaceAd(1)).isFalse();
assertThat(adsAt01.shouldPlaceAd(2)).isFalse();
assertThat(adsAt01.shouldPlaceAd(3)).isFalse();
assertThat(adsAt01.shouldPlaceAd(4)).isFalse();
assertThat(adsAt14.shouldPlaceAd(0)).isFalse();
assertThat(adsAt14.shouldPlaceAd(1)).isTrue();
assertThat(adsAt14.shouldPlaceAd(2)).isFalse();
assertThat(adsAt14.shouldPlaceAd(3)).isTrue();
assertThat(adsAt14.shouldPlaceAd(4)).isFalse();
assertThat(adsRepeating.shouldPlaceAd(0)).isFalse();
assertThat(adsRepeating.shouldPlaceAd(1)).isFalse();
assertThat(adsRepeating.shouldPlaceAd(2)).isTrue();
assertThat(adsRepeating.shouldPlaceAd(3)).isFalse();
assertThat(adsRepeating.shouldPlaceAd(4)).isTrue();
assertThat(adsRepeating.shouldPlaceAd(5)).isFalse();
assertThat(adsRepeating.shouldPlaceAd(6)).isTrue();
assertThat(adsAt15repeating.shouldPlaceAd(0)).isFalse();
assertThat(adsAt15repeating.shouldPlaceAd(1)).isTrue();
assertThat(adsAt15repeating.shouldPlaceAd(2)).isFalse();
assertThat(adsAt15repeating.shouldPlaceAd(3)).isFalse();
assertThat(adsAt15repeating.shouldPlaceAd(4)).isTrue();
assertThat(adsAt15repeating.shouldPlaceAd(5)).isFalse();
assertThat(adsAt15repeating.shouldPlaceAd(6)).isTrue();
assertThat(adsAt15repeating.shouldPlaceAd(7)).isFalse();
assertThat(adsAt15repeating.shouldPlaceAd(8)).isTrue();
assertThat(adsAt1234.shouldPlaceAd(0)).isFalse();
assertThat(adsAt1234.shouldPlaceAd(1)).isTrue();
assertThat(adsAt1234.shouldPlaceAd(2)).isFalse();
assertThat(adsAt1234.shouldPlaceAd(3)).isFalse();
}
@Test
public void initialState_nextInsertionPosition() {
assertThat(noAds.nextInsertionPosition(0)).isEqualTo(NOT_FOUND);
assertThat(noAds.nextInsertionPosition(1)).isEqualTo(NOT_FOUND);
assertThat(adAt0.nextInsertionPosition(0)).isEqualTo(NOT_FOUND);
assertThat(adAt0.nextInsertionPosition(1)).isEqualTo(NOT_FOUND);
assertThat(adAt1.nextInsertionPosition(0)).isEqualTo(1);
assertThat(adAt1.nextInsertionPosition(1)).isEqualTo(NOT_FOUND);
assertThat(adAt1.nextInsertionPosition(2)).isEqualTo(NOT_FOUND);
assertThat(adsAt01.nextInsertionPosition(0)).isEqualTo(NOT_FOUND);
assertThat(adsAt01.nextInsertionPosition(1)).isEqualTo(NOT_FOUND);
assertThat(adsAt01.nextInsertionPosition(2)).isEqualTo(NOT_FOUND);
assertThat(adsAt14.nextInsertionPosition(0)).isEqualTo(1);
assertThat(adsAt14.nextInsertionPosition(1)).isEqualTo(3);
assertThat(adsAt14.nextInsertionPosition(2)).isEqualTo(3);
assertThat(adsAt14.nextInsertionPosition(3)).isEqualTo(NOT_FOUND);
assertThat(adsAt14.nextInsertionPosition(4)).isEqualTo(NOT_FOUND);
assertThat(adsRepeating.nextInsertionPosition(0)).isEqualTo(2);
assertThat(adsRepeating.nextInsertionPosition(1)).isEqualTo(2);
assertThat(adsRepeating.nextInsertionPosition(2)).isEqualTo(4);
assertThat(adsRepeating.nextInsertionPosition(3)).isEqualTo(4);
assertThat(adsRepeating.nextInsertionPosition(4)).isEqualTo(6);
assertThat(adsRepeating.nextInsertionPosition(5)).isEqualTo(6);
assertThat(adsRepeating.nextInsertionPosition(6)).isEqualTo(8);
assertThat(adsAt15repeating.nextInsertionPosition(0)).isEqualTo(1);
assertThat(adsAt15repeating.nextInsertionPosition(1)).isEqualTo(4);
assertThat(adsAt15repeating.nextInsertionPosition(2)).isEqualTo(4);
assertThat(adsAt15repeating.nextInsertionPosition(3)).isEqualTo(4);
assertThat(adsAt15repeating.nextInsertionPosition(4)).isEqualTo(6);
assertThat(adsAt15repeating.nextInsertionPosition(5)).isEqualTo(6);
assertThat(adsAt15repeating.nextInsertionPosition(6)).isEqualTo(8);
assertThat(adsAt15repeating.nextInsertionPosition(7)).isEqualTo(8);
assertThat(adsAt15repeating.nextInsertionPosition(8)).isEqualTo(10);
assertThat(adsAt1234.nextInsertionPosition(0)).isEqualTo(1);
assertThat(adsAt1234.nextInsertionPosition(1)).isEqualTo(NOT_FOUND);
assertThat(adsAt1234.nextInsertionPosition(2)).isEqualTo(NOT_FOUND);
assertThat(adsAt1234.nextInsertionPosition(3)).isEqualTo(NOT_FOUND);
assertThat(adsAt1234.nextInsertionPosition(4)).isEqualTo(NOT_FOUND);
assertThat(adsAt1234.nextInsertionPosition(5)).isEqualTo(NOT_FOUND);
}
@Test
public void initialState_prevInsertionPosition() {
assertThat(noAds.previousInsertionPosition(0)).isEqualTo(NOT_FOUND);
assertThat(noAds.previousInsertionPosition(1)).isEqualTo(NOT_FOUND);
assertThat(adAt0.previousInsertionPosition(0)).isEqualTo(NOT_FOUND);
assertThat(adAt0.previousInsertionPosition(1)).isEqualTo(0);
assertThat(adAt0.previousInsertionPosition(2)).isEqualTo(0);
assertThat(adAt1.previousInsertionPosition(0)).isEqualTo(NOT_FOUND);
assertThat(adAt1.previousInsertionPosition(1)).isEqualTo(NOT_FOUND);
assertThat(adAt1.previousInsertionPosition(2)).isEqualTo(1);
assertThat(adAt1.previousInsertionPosition(3)).isEqualTo(1);
assertThat(adsAt01.previousInsertionPosition(0)).isEqualTo(NOT_FOUND);
assertThat(adsAt01.previousInsertionPosition(1)).isEqualTo(0);
assertThat(adsAt01.previousInsertionPosition(2)).isEqualTo(0);
assertThat(adsAt01.previousInsertionPosition(3)).isEqualTo(0);
assertThat(adsAt14.previousInsertionPosition(0)).isEqualTo(NOT_FOUND);
assertThat(adsAt14.previousInsertionPosition(1)).isEqualTo(NOT_FOUND);
assertThat(adsAt14.previousInsertionPosition(2)).isEqualTo(1);
assertThat(adsAt14.previousInsertionPosition(3)).isEqualTo(1);
assertThat(adsAt14.previousInsertionPosition(4)).isEqualTo(3);
assertThat(adsAt14.previousInsertionPosition(5)).isEqualTo(3);
assertThat(adsRepeating.previousInsertionPosition(0)).isEqualTo(NOT_FOUND);
assertThat(adsRepeating.previousInsertionPosition(1)).isEqualTo(NOT_FOUND);
assertThat(adsRepeating.previousInsertionPosition(2)).isEqualTo(NOT_FOUND);
assertThat(adsRepeating.previousInsertionPosition(3)).isEqualTo(2);
assertThat(adsRepeating.previousInsertionPosition(4)).isEqualTo(2);
assertThat(adsRepeating.previousInsertionPosition(5)).isEqualTo(4);
assertThat(adsRepeating.previousInsertionPosition(6)).isEqualTo(4);
assertThat(adsRepeating.previousInsertionPosition(7)).isEqualTo(6);
assertThat(adsAt15repeating.previousInsertionPosition(0)).isEqualTo(NOT_FOUND);
assertThat(adsAt15repeating.previousInsertionPosition(1)).isEqualTo(NOT_FOUND);
assertThat(adsAt15repeating.previousInsertionPosition(2)).isEqualTo(1);
assertThat(adsAt15repeating.previousInsertionPosition(3)).isEqualTo(1);
assertThat(adsAt15repeating.previousInsertionPosition(4)).isEqualTo(1);
assertThat(adsAt15repeating.previousInsertionPosition(5)).isEqualTo(4);
assertThat(adsAt15repeating.previousInsertionPosition(6)).isEqualTo(4);
assertThat(adsAt15repeating.previousInsertionPosition(7)).isEqualTo(6);
assertThat(adsAt15repeating.previousInsertionPosition(8)).isEqualTo(6);
assertThat(adsAt15repeating.previousInsertionPosition(9)).isEqualTo(8);
assertThat(adsAt1234.previousInsertionPosition(0)).isEqualTo(NOT_FOUND);
assertThat(adsAt1234.previousInsertionPosition(1)).isEqualTo(NOT_FOUND);
assertThat(adsAt1234.previousInsertionPosition(2)).isEqualTo(1);
assertThat(adsAt1234.previousInsertionPosition(3)).isEqualTo(1);
}
@Test
public void initialState_isPlacedAd() {
assertThat(adsAt15repeating.isPlacedAd(0)).isFalse();
assertThat(adsAt15repeating.isPlacedAd(1)).isFalse();
assertThat(adsAt15repeating.isPlacedAd(10)).isFalse();
assertThat(adsAt15repeating.isPlacedAd(1000)).isFalse();
assertThat(noAds.isPlacedAd(0)).isFalse();
assertThat(noAds.isPlacedAd(1000)).isFalse();
}
@Test
public void initialState_getOriginalPosition() {
assertThat(adsAt15repeating.getOriginalPosition(0)).isEqualTo(0);
assertThat(adsAt15repeating.getOriginalPosition(1)).isEqualTo(1);
assertThat(adsAt15repeating.getOriginalPosition(10)).isEqualTo(10);
assertThat(adsAt15repeating.getOriginalPosition(1000)).isEqualTo(1000);
assertThat(noAds.getOriginalPosition(0)).isEqualTo(0);
assertThat(noAds.getOriginalPosition(1000)).isEqualTo(1000);
}
@Test
public void initialState_getOriginalCount() {
assertThat(adsAt15repeating.getOriginalCount(0)).isEqualTo(0);
assertThat(adsAt15repeating.getOriginalCount(1)).isEqualTo(1);
assertThat(adsAt15repeating.getOriginalCount(10)).isEqualTo(10);
assertThat(adsAt15repeating.getOriginalCount(1000)).isEqualTo(1000);
assertThat(noAds.getOriginalCount(0)).isEqualTo(0);
assertThat(noAds.getOriginalCount(1000)).isEqualTo(1000);
}
@Test
public void initialState_getAdjustedPosition() {
assertThat(adsAt15repeating.getAdjustedPosition(0)).isEqualTo(0);
assertThat(adsAt15repeating.getAdjustedPosition(1)).isEqualTo(1);
assertThat(adsAt15repeating.getAdjustedPosition(10)).isEqualTo(10);
assertThat(adsAt15repeating.getAdjustedPosition(1000)).isEqualTo(1000);
assertThat(noAds.getAdjustedPosition(0)).isEqualTo(0);
assertThat(noAds.getAdjustedPosition(1000)).isEqualTo(1000);
}
@Test
public void initialState_getAdjustedCount() {
assertThat(adsAt15repeating.getAdjustedCount(0)).isEqualTo(0);
assertThat(adsAt15repeating.getAdjustedCount(1)).isEqualTo(1);
assertThat(adsAt15repeating.getAdjustedCount(10)).isEqualTo(10);
assertThat(adsAt15repeating.getAdjustedCount(1000)).isEqualTo(1000);
assertThat(noAds.getAdjustedCount(0)).isEqualTo(0);
assertThat(noAds.getAdjustedCount(1000)).isEqualTo(1000);
}
@Test
public void placeAds_inOrder_shouldUpdatePositions() {
checkInsertionPositions(10, adsAt15repeating, 1, 4, 6, 8, 10);
checkPlacedPositions(20, adsAt15repeating);
adsAt15repeating.placeAd(1, mockNativeAdData);
checkInsertionPositions(10, adsAt15repeating, 5, 7, 9);
checkPlacedPositions(20, adsAt15repeating, 1);
adsAt15repeating.placeAd(5, mockNativeAdData);
checkInsertionPositions(10, adsAt15repeating, 8, 10);
checkPlacedPositions(20, adsAt15repeating, 1, 5);
adsAt15repeating.placeAd(8, mockNativeAdData);
checkInsertionPositions(10, adsAt15repeating);
checkPlacedPositions(20, adsAt15repeating, 1, 5, 8);
}
@Test
public void placeAds_outOfOrder_shouldUpdatePositions() {
checkInsertionPositions(10, adsAt15repeating, 1, 4, 6, 8, 10);
checkPlacedPositions(20, adsAt15repeating);
adsAt15repeating.placeAd(6, mockNativeAdData);
checkInsertionPositions(10, adsAt15repeating, 1, 4, 9);
checkPlacedPositions(20, adsAt15repeating, 6);
adsAt15repeating.placeAd(4, mockNativeAdData);
checkInsertionPositions(10, adsAt15repeating, 1, 10);
checkPlacedPositions(20, adsAt15repeating, 4, 7);
adsAt15repeating.placeAd(1, mockNativeAdData);
checkInsertionPositions(10, adsAt15repeating);
checkPlacedPositions(20, adsAt15repeating, 1, 5, 8);
}
@Test
public void placedAds_getOriginalPositionAndCount() {
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
assertThat(adsAt15repeating.getOriginalPosition(0)).isEqualTo(0);
assertThat(adsAt15repeating.getOriginalPosition(1)).isEqualTo(NOT_FOUND);
assertThat(adsAt15repeating.getOriginalPosition(2)).isEqualTo(1);
assertThat(adsAt15repeating.getOriginalPosition(3)).isEqualTo(2);
assertThat(adsAt15repeating.getOriginalPosition(4)).isEqualTo(3);
assertThat(adsAt15repeating.getOriginalPosition(5)).isEqualTo(NOT_FOUND);
assertThat(adsAt15repeating.getOriginalPosition(6)).isEqualTo(4);
assertThat(adsAt15repeating.getOriginalPosition(7)).isEqualTo(5);
assertThat(adsAt15repeating.getOriginalPosition(8)).isEqualTo(NOT_FOUND);
assertThat(adsAt15repeating.getOriginalPosition(9)).isEqualTo(6);
assertThat(adsAt15repeating.getOriginalPosition(10)).isEqualTo(7);
assertThat(adsAt15repeating.getOriginalCount(0)).isEqualTo(0);
assertThat(adsAt15repeating.getOriginalCount(10)).isEqualTo(7);
assertThat(adsAt15repeating.getOriginalCount(20)).isEqualTo(17);
}
@Test
public void placedAds_getAdjustedPositionAndCount() {
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
assertThat(adsAt15repeating.getAdjustedPosition(0)).isEqualTo(0);
// Ad here
assertThat(adsAt15repeating.getAdjustedPosition(1)).isEqualTo(2);
assertThat(adsAt15repeating.getAdjustedPosition(2)).isEqualTo(3);
assertThat(adsAt15repeating.getAdjustedPosition(3)).isEqualTo(4);
// Ad here
assertThat(adsAt15repeating.getAdjustedPosition(4)).isEqualTo(6);
assertThat(adsAt15repeating.getAdjustedPosition(5)).isEqualTo(7);
// Ad here
assertThat(adsAt15repeating.getAdjustedPosition(6)).isEqualTo(9);
assertThat(adsAt15repeating.getAdjustedPosition(7)).isEqualTo(10);
assertThat(adsAt15repeating.getAdjustedPosition(8)).isEqualTo(11);
assertThat(adsAt15repeating.getAdjustedPosition(9)).isEqualTo(12);
assertThat(adsAt15repeating.getAdjustedPosition(10)).isEqualTo(13);
assertThat(adsAt15repeating.getAdjustedCount(0)).isEqualTo(0);
assertThat(adsAt15repeating.getAdjustedCount(10)).isEqualTo(13);
assertThat(adsAt15repeating.getAdjustedCount(20)).isEqualTo(23);
}
@Test
public void placeAdsClumped_shouldPlaceAdsInOrder() {
int nextPosition = adsAt1234.nextInsertionPosition(0);
adsAt1234.placeAd(nextPosition, mockNativeAdData);
nextPosition = adsAt1234.nextInsertionPosition(nextPosition);
adsAt1234.placeAd(nextPosition, mockNativeAdData2);
nextPosition = adsAt1234.nextInsertionPosition(nextPosition);
adsAt1234.placeAd(nextPosition, mockNativeAdData3);
nextPosition = adsAt1234.nextInsertionPosition(nextPosition);
adsAt1234.placeAd(nextPosition, mockNativeAdData4);
nextPosition = adsAt1234.nextInsertionPosition(nextPosition);
assertThat(nextPosition).isEqualTo(NOT_FOUND);
assertThat(adsAt1234.isPlacedAd(0)).isFalse();
assertThat(adsAt1234.getPlacedAd(1)).isEqualTo(mockNativeAdData);
assertThat(adsAt1234.getPlacedAd(2)).isEqualTo(mockNativeAdData2);
assertThat(adsAt1234.getPlacedAd(3)).isEqualTo(mockNativeAdData3);
assertThat(adsAt1234.getPlacedAd(4)).isEqualTo(mockNativeAdData4);
assertThat(adsAt1234.isPlacedAd(5)).isFalse();
}
@Test
public void placeAdsClumped_thenRemoveContentBeforeClumpedAds_shouldShiftAds() {
adsAt1234.placeAd(1, mockNativeAdData);
adsAt1234.placeAd(2, mockNativeAdData2);
adsAt1234.placeAd(3, mockNativeAdData3);
adsAt1234.placeAd(4, mockNativeAdData4);
adsAt1234.removeItem(0);
assertThat(adsAt1234.getPlacedAd(0)).isEqualTo(mockNativeAdData);
assertThat(adsAt1234.getPlacedAd(1)).isEqualTo(mockNativeAdData2);
assertThat(adsAt1234.getPlacedAd(2)).isEqualTo(mockNativeAdData3);
assertThat(adsAt1234.getPlacedAd(3)).isEqualTo(mockNativeAdData4);
assertThat(adsAt1234.isPlacedAd(4)).isFalse();
adsAt1234.removeItem(0);
assertThat(adsAt1234.getPlacedAd(0)).isEqualTo(mockNativeAdData);
assertThat(adsAt1234.getPlacedAd(1)).isEqualTo(mockNativeAdData2);
assertThat(adsAt1234.getPlacedAd(2)).isEqualTo(mockNativeAdData3);
assertThat(adsAt1234.getPlacedAd(3)).isEqualTo(mockNativeAdData4);
assertThat(adsAt1234.isPlacedAd(4)).isFalse();
}
@Test
public void placeAdsClumped_thenRemoveContentAfterClumpedAds_shouldNotShiftAds() {
adsAt1234.placeAd(1, mockNativeAdData);
adsAt1234.placeAd(2, mockNativeAdData2);
adsAt1234.placeAd(3, mockNativeAdData3);
adsAt1234.placeAd(4, mockNativeAdData4);
adsAt1234.removeItem(1);
assertThat(adsAt1234.isPlacedAd(0)).isFalse();
assertThat(adsAt1234.getPlacedAd(1)).isEqualTo(mockNativeAdData);
assertThat(adsAt1234.getPlacedAd(2)).isEqualTo(mockNativeAdData2);
assertThat(adsAt1234.getPlacedAd(3)).isEqualTo(mockNativeAdData3);
assertThat(adsAt1234.getPlacedAd(4)).isEqualTo(mockNativeAdData4);
assertThat(adsAt1234.isPlacedAd(5)).isFalse();
adsAt1234.removeItem(2);
assertThat(adsAt1234.isPlacedAd(0)).isFalse();
assertThat(adsAt1234.getPlacedAd(1)).isEqualTo(mockNativeAdData);
assertThat(adsAt1234.getPlacedAd(2)).isEqualTo(mockNativeAdData2);
assertThat(adsAt1234.getPlacedAd(3)).isEqualTo(mockNativeAdData3);
assertThat(adsAt1234.getPlacedAd(4)).isEqualTo(mockNativeAdData4);
assertThat(adsAt1234.isPlacedAd(5)).isFalse();
}
@Test
public void placeAdsClumped_thenInsertContentBeforeClumpedAds_shouldShiftAds() {
adsAt1234.placeAd(1, mockNativeAdData);
adsAt1234.placeAd(2, mockNativeAdData2);
adsAt1234.placeAd(3, mockNativeAdData3);
adsAt1234.placeAd(4, mockNativeAdData4);
adsAt1234.insertItem(1);
assertThat(adsAt1234.isPlacedAd(0)).isFalse();
assertThat(adsAt1234.isPlacedAd(1)).isFalse();
assertThat(adsAt1234.getPlacedAd(2)).isEqualTo(mockNativeAdData);
assertThat(adsAt1234.getPlacedAd(3)).isEqualTo(mockNativeAdData2);
assertThat(adsAt1234.getPlacedAd(4)).isEqualTo(mockNativeAdData3);
assertThat(adsAt1234.getPlacedAd(5)).isEqualTo(mockNativeAdData4);
assertThat(adsAt1234.isPlacedAd(6)).isFalse();
adsAt1234.insertItem(0);
assertThat(adsAt1234.isPlacedAd(0)).isFalse();
assertThat(adsAt1234.isPlacedAd(1)).isFalse();
assertThat(adsAt1234.isPlacedAd(2)).isFalse();
assertThat(adsAt1234.getPlacedAd(3)).isEqualTo(mockNativeAdData);
assertThat(adsAt1234.getPlacedAd(4)).isEqualTo(mockNativeAdData2);
assertThat(adsAt1234.getPlacedAd(5)).isEqualTo(mockNativeAdData3);
assertThat(adsAt1234.getPlacedAd(6)).isEqualTo(mockNativeAdData4);
assertThat(adsAt1234.isPlacedAd(7)).isFalse();
}
@Test
public void placeAdsClumped_thenInsertContentAfterClumpedAds_shouldNotShiftAds() {
adsAt1234.placeAd(1, mockNativeAdData);
adsAt1234.placeAd(2, mockNativeAdData2);
adsAt1234.placeAd(3, mockNativeAdData3);
adsAt1234.placeAd(4, mockNativeAdData4);
adsAt1234.insertItem(2);
assertThat(adsAt1234.isPlacedAd(0)).isFalse();
assertThat(adsAt1234.getPlacedAd(1)).isEqualTo(mockNativeAdData);
assertThat(adsAt1234.getPlacedAd(2)).isEqualTo(mockNativeAdData2);
assertThat(adsAt1234.getPlacedAd(3)).isEqualTo(mockNativeAdData3);
assertThat(adsAt1234.getPlacedAd(4)).isEqualTo(mockNativeAdData4);
assertThat(adsAt1234.isPlacedAd(5)).isFalse();
adsAt1234.removeItem(3);
assertThat(adsAt1234.isPlacedAd(0)).isFalse();
assertThat(adsAt1234.getPlacedAd(1)).isEqualTo(mockNativeAdData);
assertThat(adsAt1234.getPlacedAd(2)).isEqualTo(mockNativeAdData2);
assertThat(adsAt1234.getPlacedAd(3)).isEqualTo(mockNativeAdData3);
assertThat(adsAt1234.getPlacedAd(4)).isEqualTo(mockNativeAdData4);
assertThat(adsAt1234.isPlacedAd(5)).isFalse();
}
@Test
public void placedAds_thenClearEmptyRange_doesNothing() {
checkPlacedPositions(15, adsAt15repeating);
checkPlacedPositions(15, adsAt15repeating);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 6, 8, 10, 12, 14);
adsAt15repeating.clearAdsInRange(0, 0);
checkPlacedPositions(15, adsAt15repeating);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 6, 8, 10, 12, 14);
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
checkPlacedPositions(15, adsAt15repeating, 1, 5, 8);
checkInsertionPositions(15, adsAt15repeating, 11, 13, 15);
adsAt15repeating.clearAdsInRange(4, 4);
checkPlacedPositions(15, adsAt15repeating, 1, 5, 8);
checkInsertionPositions(15, adsAt15repeating, 11, 13, 15);
}
@Test
public void placedAds_thenClearAll_shouldResetInsertionPositions() {
checkPlacedPositions(15, adsAt15repeating);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 6, 8, 10, 12, 14);
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
checkPlacedPositions(15, adsAt15repeating, 1, 5, 8);
checkInsertionPositions(15, adsAt15repeating, 11, 13, 15);
adsAt15repeating.clearAdsInRange(1, 10);
checkPlacedPositions(15, adsAt15repeating);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 6, 8, 10, 12, 14);
}
@Test
public void placedAds_thenClearRange_inOrder_shouldResetInsertionPositions() {
checkPlacedPositions(15, adsAt15repeating);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 6, 8, 10, 12, 14);
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
checkPlacedPositions(15, adsAt15repeating, 1, 5, 8);
checkInsertionPositions(15, adsAt15repeating, 11, 13, 15);
adsAt15repeating.clearAdsInRange(1, 2);
checkPlacedPositions(15, adsAt15repeating, 4, 7);
checkInsertionPositions(15, adsAt15repeating, 1, 10, 12, 14);
adsAt15repeating.clearAdsInRange(4, 5);
checkPlacedPositions(15, adsAt15repeating, 6);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 9, 11, 13, 15);
adsAt15repeating.clearAdsInRange(6, 7);
checkPlacedPositions(15, adsAt15repeating);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 6, 8, 10, 12, 14);
}
@Test
public void placedAds_thenClearRange_descending_shouldResetInsertionPositions() {
checkPlacedPositions(15, adsAt15repeating);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 6, 8, 10, 12, 14);
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
checkPlacedPositions(15, adsAt15repeating, 1, 5, 8);
checkInsertionPositions(15, adsAt15repeating, 11, 13, 15);
adsAt15repeating.clearAdsInRange(8, 9);
checkPlacedPositions(15, adsAt15repeating, 1, 5);
checkInsertionPositions(15, adsAt15repeating, 8, 10, 12, 14);
adsAt15repeating.clearAdsInRange(5, 6);
checkPlacedPositions(15, adsAt15repeating, 1);
checkInsertionPositions(15, adsAt15repeating, 5, 7, 9, 11, 13, 15);
adsAt15repeating.clearAdsInRange(1, 2);
checkPlacedPositions(15, adsAt15repeating);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 6, 8, 10, 12, 14);
}
@Test
public void placedAds_thenClearRange_multiple_shouldResetInsertionPositions() {
checkPlacedPositions(15, adsAt15repeating);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 6, 8, 10, 12, 14);
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
checkPlacedPositions(15, adsAt15repeating, 1, 5, 8);
checkInsertionPositions(15, adsAt15repeating, 11, 13, 15);
adsAt15repeating.clearAdsInRange(1, 6);
checkPlacedPositions(15, adsAt15repeating, 6);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 9, 11, 13, 15);
adsAt15repeating.clearAdsInRange(5, 10);
checkPlacedPositions(15, adsAt15repeating);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 6, 8, 10, 12, 14);
}
@Test
public void placedAds_thenClearRange_descending_multiple_shouldResetInsertionPositions() {
checkPlacedPositions(15, adsAt15repeating);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 6, 8, 10, 12, 14);
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
checkPlacedPositions(15, adsAt15repeating, 1, 5, 8);
checkInsertionPositions(15, adsAt15repeating, 11, 13, 15);
adsAt15repeating.clearAdsInRange(5, 9);
checkPlacedPositions(15, adsAt15repeating, 1);
checkInsertionPositions(15, adsAt15repeating, 5, 7, 9, 11, 13, 15);
adsAt15repeating.clearAdsInRange(1, 5);
checkPlacedPositions(15, adsAt15repeating);
checkInsertionPositions(15, adsAt15repeating, 1, 4, 6, 8, 10, 12, 14);
}
@Test
public void placeAds_thenClear_shouldCallDestroy() {
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData2);
adsAt15repeating.placeAd(8, mockNativeAdData3);
adsAt15repeating.clearAdsInRange(5, 10);
verify(mockNativeResponse, never()).destroy();
verify(mockNativeResponse2).destroy();
verify(mockNativeResponse3).destroy();
}
@Test
public void insertItems_afterPlacing() {
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
adsAt15repeating.insertItem(1);
adsAt15repeating.insertItem(4);
adsAt15repeating.insertItem(12);
checkPlacedPositions(20, adsAt15repeating, 2, 7, 10);
}
@Test
public void insertItems_beforePlacing() {
checkInsertionPositions(7, adsAt15repeating, 1, 4, 6);
adsAt15repeating.insertItem(4);
adsAt15repeating.insertItem(7);
checkInsertionPositions(9, adsAt15repeating, 1, 5, 8);
}
@Test
public void removeThenInsertItem_atZero_shouldBeAtZero() {
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
adsAt15repeating.removeItem(0);
checkPlacedPositions(20, adsAt15repeating, 0, 4, 7);
checkInsertionPositions(16, adsAt15repeating, 10, 12, 14, 16);
adsAt15repeating.insertItem(0);
checkPlacedPositions(20, adsAt15repeating, 1, 5, 8);
checkInsertionPositions(16, adsAt15repeating, 11, 13, 15);
}
@Test
public void placeThenInsertThenPlace() {
adsAt15repeating.placeAd(4, mockNativeAdData);
adsAt15repeating.insertItem(4);
adsAt15repeating.placeAd(1, mockNativeAdData);
checkPlacedPositions(20, adsAt15repeating, 1, 6);
}
@Test
public void removeItems_afterPlacing() {
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
checkPlacedPositions(20, adsAt15repeating, 1, 5, 8);
adsAt15repeating.removeItem(3);
adsAt15repeating.removeItem(5);
checkPlacedPositions(20, adsAt15repeating, 1, 4, 7);
// Check the adjusted positions.
assertThat(adsAt15repeating.getAdjustedPosition(0)).isEqualTo(0);
assertThat(adsAt15repeating.getAdjustedPosition(1)).isEqualTo(2);
assertThat(adsAt15repeating.getAdjustedPosition(2)).isEqualTo(3);
assertThat(adsAt15repeating.getAdjustedPosition(3)).isEqualTo(5);
assertThat(adsAt15repeating.getAdjustedPosition(4)).isEqualTo(6);
assertThat(adsAt15repeating.getAdjustedPosition(5)).isEqualTo(8);
}
@Test
public void removeItemsBetweenAds_thenInsert_shouldClumpAds() {
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
adsAt15repeating.removeItem(4);
adsAt15repeating.removeItem(4);
checkPlacedPositions(20, adsAt15repeating, 1, 5, 6);
adsAt15repeating.insertItem(5);
checkPlacedPositions(20, adsAt15repeating, 1, 5, 6);
adsAt15repeating.insertItem(4);
checkPlacedPositions(20, adsAt15repeating, 1, 6, 7);
}
@Test
public void removeItems_beforePlacing() {
checkInsertionPositions(7, adsAt15repeating, 1, 4, 6);
adsAt15repeating.removeItem(4);
// Check insertion positions.
checkInsertionPositions(7, adsAt15repeating, 1, 4, 5, 7);
}
@Test
public void removeItem_withClumpedAdsBeforeIt_shouldCorrectlyRemoveItem() throws Exception {
adsRepeating.placeAd(2, mockNativeAdData);
adsRepeating.placeAd(5, mockNativeAdData);
adsRepeating.placeAd(8, mockNativeAdData);
checkPlacedPositions(20, adsRepeating, 2, 5, 8);
assertThat(adsRepeating.getAdjustedCount(7)).isEqualTo(10);
// Removing from the head will cause ads to pile up
adsRepeating.removeItem(0);
adsRepeating.removeItem(0);
adsRepeating.removeItem(0);
adsRepeating.removeItem(0);
adsRepeating.removeItem(0);
adsRepeating.removeItem(0);
checkPlacedPositions(20, adsRepeating, 0, 1, 2);
adsRepeating.removeItem(0);
checkPlacedPositions(20, adsRepeating, 0, 1, 2);
}
@Test
public void removeItems_afterClumpedAds_shouldStayClumped() {
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
adsAt15repeating.removeItem(4);
adsAt15repeating.removeItem(4);
checkPlacedPositions(20, adsAt15repeating, 1, 5, 6);
// Shouldn't move any ads.
adsAt15repeating.removeItem(4);
checkPlacedPositions(20, adsAt15repeating, 1, 5, 6);
adsAt15repeating.removeItem(3);
checkPlacedPositions(20, adsAt15repeating, 1, 4, 5);
}
@Test
public void moveItems_afterPlacing() {
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData);
adsAt15repeating.placeAd(8, mockNativeAdData);
assertThat(adsAt15repeating.getAdjustedPosition(4)).isEqualTo(6);
assertThat(adsAt15repeating.getAdjustedPosition(5)).isEqualTo(7);
adsAt15repeating.moveItem(4, 2);
checkPlacedPositions(20, adsAt15repeating, 1, 6, 8);
assertThat(adsAt15repeating.getAdjustedPosition(4)).isEqualTo(5);
assertThat(adsAt15repeating.getAdjustedPosition(5)).isEqualTo(7);
}
@Test
public void clearAll_shouldCallDestroyOnAdData_shouldResetPositions() {
when(mockNativeAdData.getAd()).thenReturn(mockNativeResponse);
when(mockNativeAdData2.getAd()).thenReturn(mockNativeResponse2);
when(mockNativeAdData3.getAd()).thenReturn(mockNativeResponse3);
adsAt15repeating.placeAd(1, mockNativeAdData);
adsAt15repeating.placeAd(5, mockNativeAdData2);
adsAt15repeating.placeAd(8, mockNativeAdData3);
adsAt15repeating.clearAds();
verify(mockNativeResponse).destroy();
verify(mockNativeResponse2).destroy();
verify(mockNativeResponse3).destroy();
// Should reset to original positions
checkInsertionPositions(10, adsAt15repeating, 1, 4, 6, 8, 10);
checkPlacedPositions(20, adsAt15repeating);
}
void checkInsertionPositions(int maxValue, PlacementData placementData, Integer... positions) {
List<Integer> expected = Arrays.asList(positions);
List<Integer> actual = new ArrayList<Integer>();
for (int i = 0; i <= maxValue; i++) {
if (placementData.shouldPlaceAd(i)) {
actual.add(i);
}
}
assertThat(actual).isEqualTo(expected);
}
void checkPlacedPositions(int maxValue, PlacementData placementData, Integer... positions) {
List<Integer> expected = Arrays.asList(positions);
List<Integer> actual = new ArrayList<Integer>();
for (int i = 0; i < maxValue; i++) {
if (placementData.isPlacedAd(i)) {
actual.add(i);
assertThat(placementData.getPlacedAd(i)).isEqualTo(mockNativeAdData);
} else {
assertThat(placementData.getPlacedAd(i)).isNull();
}
}
assertThat(actual).isEqualTo(expected);
// Also check getPlacedAdPositions
List<Integer> actualFromAdPositions = new ArrayList<Integer>();
for (Integer position : placementData.getPlacedAdPositions()) {
actualFromAdPositions.add(position);
}
assertThat(actualFromAdPositions).isEqualTo(expected);
}
}