/* * Copyright 2015, 2016 Tagir Valeev * * 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 one.util.streamex; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.Random; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.junit.Test; import static org.junit.Assert.*; /** * @author Tagir Valeev */ public class LimiterTest { @Test public void testLimiter() { Comparator<String> cmp = Comparator.nullsFirst(Comparator.comparingInt(String::length)); exerciseLimiter("str", Arrays.asList("abc", "abgdc", "abd", "a", "fgssdfg", "sfsvsx", null, "wrffvs", "xcvbxvcb", "sffg", "abe", "adf", "abh"), cmp); for (int i : new int[] { 10, 100, 1000, 10000, 100000 }) { List<Integer> ascending = IntStream.range(0, i).boxed().collect(Collectors.toList()); exerciseLimiter("asc, nat, " + i, ascending, Comparator.naturalOrder()); exerciseLimiter("asc, dec, " + i, ascending, Comparator.comparingInt(x -> x / 10)); List<Integer> descending = IntStream.range(0, i).mapToObj(x -> ~x).collect(Collectors.toList()); exerciseLimiter("desc, nat, " + i, descending, Comparator.naturalOrder()); exerciseLimiter("desc, dec, " + i, descending, Comparator.comparingInt(x -> x / 10)); List<Integer> random = new Random(1).ints(i).boxed().collect(Collectors.toList()); exerciseLimiter("rnd, nat, " + i, random, Comparator.naturalOrder()); exerciseLimiter("rnd, dec, " + i, random, Comparator.comparingInt(x -> x / 10)); List<Integer> randomRange = new Random(1).ints(i, -1000, 1000).boxed().collect(Collectors.toList()); exerciseLimiter("rnd2, nat, " + i, randomRange, Comparator.naturalOrder()); exerciseLimiter("rnd2, dec, " + i, randomRange, Comparator.comparingInt(x -> x / 10)); } List<Integer> list = IntStreamEx.range(100000).boxed().toList(); exerciseLimiter("big", list, list, 50000, Comparator.naturalOrder()); exerciseLimiter("big", list, list, 49999, Comparator.naturalOrder()); exerciseLimiter("big", list, list, 10000, Comparator.naturalOrder()); exerciseLimiter("big", list, list, Integer.MAX_VALUE/3, Comparator.naturalOrder()); exerciseLimiter("big", list, list, Integer.MAX_VALUE/2, Comparator.naturalOrder()); } public static <T> void exerciseLimiter(String msg, Collection<T> input, Comparator<T> comp) { for (int limit : new int[] { 0, 1, 2, 5, 10, 20, 100, 1000 }) { List<T> expected = new ArrayList<>(input); expected.sort(comp); exerciseLimiter(msg, expected, input, limit, comp); } } public static <T> void exerciseLimiter(String msg, List<T> expected, Collection<T> input, int limit, Comparator<T> comp) { List<T> subList = limit >= expected.size() ? expected : expected.subList(0, limit); List<T> actual = input.stream().collect(MoreCollectors.least(comp, limit)); assertEquals("Mismatch (sequential), " + msg + ", limit=" + limit, subList, actual); actual = input.parallelStream().collect(MoreCollectors.least(comp, limit)); assertEquals("Mismatch (parallel), " + msg + ", limit=" + limit, subList, actual); } }