/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.core;
import com.google.common.collect.Lists;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
/**
* Tests {@link Pages}.
*
* @author Yevhenii Voevodin
*/
public class PagesTest {
private TestPagesSupplier testSource;
@BeforeSuite
private void setUp() {
String[] strings = new String[10];
for (int i = 0; i < strings.length; i++) {
strings[i] = "test-string-" + i;
}
testSource = new TestPagesSupplier(strings);
}
@Test
public void eagerlyStreamsAllElements() {
List<String> result = Pages.stream(testSource::getStrings, 2).collect(Collectors.toList());
assertEquals(result, testSource.strings);
}
@Test
public void eagerlyIteratesAllElements() {
ArrayList<String> result = Lists.newArrayList(Pages.iterate(testSource::getStrings, 2));
assertEquals(result, testSource.strings);
}
@Test
public void lazyStreamsAllElements() {
List<String> result = Pages.streamLazily(testSource::getStrings, 2).collect(Collectors.toList());
assertEquals(result, testSource.strings);
}
@Test
public void lazyIteratesAllElements() {
ArrayList<String> result = Lists.newArrayList(Pages.iterateLazily(testSource::getStrings, 2));
assertEquals(result, testSource.strings);
}
@Test
public void lazyStreamingDoesNotPollNextPageUntilNeeded() {
TestPagesSupplier src = spy(new TestPagesSupplier("string1", "string2", "string3"));
assertTrue(Pages.streamLazily(src::getStrings, 1).anyMatch(s -> s.equals("string2")));
verify(src, times(2)).getStrings(anyInt(), anyLong());
verify(src).getStrings(1, 0);
verify(src).getStrings(1, 1);
}
@Test
public void lazyIteratingDoesNotPollNextPageUntilNeeded() {
TestPagesSupplier src = spy(new TestPagesSupplier("string1", "string2", "string3"));
Iterator<String> it = Pages.iterateLazily(src::getStrings, 1).iterator();
it.next();
it.next();
verify(src, times(2)).getStrings(anyInt(), anyLong());
verify(src).getStrings(1, 0);
verify(src).getStrings(1, 1);
}
@Test
public void returnsEmptyStreamWhenFetchingEagerly() {
Stream<String> stream = Pages.stream(new TestPagesSupplier()::getStrings);
assertFalse(stream.findAny().isPresent());
}
@Test
public void returnsIterableWithNoElementsWhileFetchingEagerly() {
Iterator<String> it = Pages.iterate(new TestPagesSupplier()::getStrings).iterator();
assertFalse(it.hasNext());
}
@Test
public void returnsEmptyStreamWhenFetchingLazily() {
Stream<String> stream = Pages.streamLazily(new TestPagesSupplier()::getStrings);
assertFalse(stream.findAny().isPresent());
}
@Test
public void returnsIterableWithNoeElementsWhileFetchingLazily() {
Iterator<String> it = Pages.iterateLazily(new TestPagesSupplier()::getStrings).iterator();
assertFalse(it.hasNext());
}
private static class TestPagesSupplier {
private final List<String> strings;
private TestPagesSupplier(String... strings) {
this.strings = Arrays.asList(strings);
}
public Page<String> getStrings(int max, long skip) {
List<String> items = strings.stream()
.skip(skip)
.limit(max)
.collect(Collectors.toList());
return new Page<>(items, skip, max, strings.size());
}
}
}