1289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin/*
2289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin *
5289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * This code is free software; you can redistribute it and/or modify it
6289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * under the terms of the GNU General Public License version 2 only, as
7289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * published by the Free Software Foundation.
8289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin *
9289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * This code is distributed in the hope that it will be useful, but WITHOUT
10289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * version 2 for more details (a copy is included in the LICENSE file that
13289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * accompanied this code).
14289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin *
15289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * You should have received a copy of the GNU General Public License version
16289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * 2 along with this work; if not, write to the Free Software Foundation,
17289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin *
19289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * or visit www.oracle.com if you need additional information or have any
21289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * questions.
22289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin */
23289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinpackage org.openjdk.testlib.java.util.stream;
24289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
25289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.*;
26289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.stream.*;
27289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.BiConsumer;
28289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.BiPredicate;
29289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.BinaryOperator;
30289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.Consumer;
31289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.DoubleBinaryOperator;
32289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.DoubleConsumer;
33289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.DoublePredicate;
34289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.Function;
35289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.IntBinaryOperator;
36289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.IntConsumer;
37289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.IntFunction;
38289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.IntPredicate;
39289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.IntUnaryOperator;
40289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.LongBinaryOperator;
41289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.LongConsumer;
42289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.LongPredicate;
43289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.Predicate;
44289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.Supplier;
45289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.ToDoubleFunction;
46289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.ToIntFunction;
47289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.ToLongFunction;
48289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
49289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport static org.testng.Assert.assertEquals;
50289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport static org.testng.Assert.assertTrue;
51289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
52289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin/**
53289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * LambdaTestHelpers -- assertion methods and useful objects for lambda test cases
54289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin */
55289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinpublic class LambdaTestHelpers {
56289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final String LONG_STRING = "When in the Course of human events it becomes necessary for one people to dissolve the political bands which have connected them with another and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation.";
57289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
58289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    @SuppressWarnings("rawtypes")
59289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Consumer bEmpty = x -> {  };
60289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    @SuppressWarnings("rawtypes")
61289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final IntConsumer bIntEmpty = x -> {  };
62289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    @SuppressWarnings("rawtypes")
63289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final BiConsumer bBiEmpty = (x,y) -> { };
64289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    @SuppressWarnings("rawtypes")
65289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Consumer bHashCode = x -> { Objects.hashCode(x); };
66289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    @SuppressWarnings("rawtypes")
67289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final BiConsumer bBiHashCode = (x,y) -> { Objects.hash(x, y); };
68289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Function<Integer, Integer> mZero = x -> 0;
69289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Function<Integer, Integer> mId = x -> x;
70289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Function<Integer, Integer> mDoubler = x -> x * 2;
71289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Function<Integer, Stream<Integer>> mfId = e -> Collections.singletonList(e).stream();
72289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Function<Integer, Stream<Integer>> mfNull = e -> Collections.<Integer>emptyList().stream();
73289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Function<Integer, Stream<Integer>> mfLt = e -> {
74289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        List<Integer> l = new ArrayList<>();
75289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        for (int i=0; i<e; i++)
76289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            l.add(i);
77289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return l.stream();
78289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    };
79289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final ToIntFunction<Integer> imDoubler = x -> x * 2;
80289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final ToLongFunction<Long> lmDoubler = x -> x * 2;
81289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final ToDoubleFunction<Double> dmDoubler = x -> x * 2;
82289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Predicate<Integer> pFalse = x -> false;
83289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Predicate<Integer> pTrue = x -> true;
84289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Predicate<Integer> pEven = x -> 0 == x % 2;
85289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Predicate<Integer> pOdd = x -> 1 == x % 2;
86289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final IntPredicate ipFalse = x -> false;
87289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final IntPredicate ipTrue = x -> true;
88289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final IntPredicate ipEven = x -> 0 == x % 2;
89289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final IntPredicate ipOdd = x -> 1 == x % 2;
90289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final LongPredicate lpFalse = x -> false;
91289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final LongPredicate lpTrue = x -> true;
92289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final LongPredicate lpEven = x -> 0 == x % 2;
93289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final LongPredicate lpOdd = x -> 1 == x % 2;
94289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final DoublePredicate dpFalse = x -> false;
95289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final DoublePredicate dpTrue = x -> true;
96289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final DoublePredicate dpEven = x -> 0 == ((long) x) % 2;
97289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final DoublePredicate dpOdd = x -> 1 == ((long) x) % 2;
98289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final BinaryOperator<Integer> rPlus = (x, y) -> x+y;
99289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final BinaryOperator<Integer> rMax = (x, y) -> Math.max(x, y);
100289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final BinaryOperator<Integer> rMin = (x, y) -> Math.min(x,y);
101289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final IntBinaryOperator irPlus = (x, y) -> x+y;
102289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final IntBinaryOperator irMax = (x, y) -> Math.max(x, y);
103289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final IntBinaryOperator irMin = (x, y) -> Math.min(x,y);
104289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final IntUnaryOperator irDoubler = x -> x * 2;
105289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final LongBinaryOperator lrPlus = (x, y) -> x+y;
106289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final DoubleBinaryOperator drPlus = (x, y) -> x+y;
107289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Comparator<Integer> cInteger = (a, b) -> Integer.compare(a, b);
108289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final BiPredicate<?, ?> bipFalse = (x, y) -> false;
109289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final BiPredicate<?, ?> bipTrue = (x, y) -> true;
110289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final BiPredicate<Integer, Integer> bipBothEven = (x, y) -> 0 == (x % 2 + y % 2);
111289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final BiPredicate<Integer, Integer> bipBothOdd = (x, y) -> 2 == (x % 2 + y % 2);
112289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final BiPredicate<?, ?> bipSameString = (x, y) -> String.valueOf(x).equals(String.valueOf(y));
113289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
114289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final IntFunction<Integer[]> integerArrayGenerator = s -> new Integer[s];
115289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
116289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final IntFunction<Object[]> objectArrayGenerator = s -> new Object[s];
117289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
118289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Function<String, Stream<Character>> flattenChars = string -> {
119289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        List<Character> l = new ArrayList<>();
120289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        for (int i=0; i<string.length(); i++)
121289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            l.add(string.charAt(i));
122289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return l.stream();
123289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    };
124289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
125289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static final Function<String, IntStream> flattenInt
126289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            = string -> IntStream.range(0, string.length()).map(string::charAt);
127289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
128289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static <T, R> Function<T, R> forPredicate(Predicate<? super T> predicate, R forTrue, R forFalse) {
129289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        Objects.requireNonNull(predicate);
130289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
131289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return t -> predicate.test(t) ? forTrue : forFalse;
132289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
133289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
134289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static <T> Function<T, T> identity() {
135289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return t -> t;
136289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
137289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
138289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<V, T, R> Function<V, R> compose(Function<? super T, ? extends R> after, Function<? super V, ? extends T> before) {
139289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        Objects.requireNonNull(before);
140289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return (V v) -> after.apply(before.apply(v));
141289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
142289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
143289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static List<Integer> empty() {
144289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        ArrayList<Integer> list = new ArrayList<>();
145289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        list.add(null);
146289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return list;
147289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
148289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
149289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static List<Integer> countTo(int n) {
150289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return range(1, n);
151289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
152289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
153289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static List<Integer> range(int l, int u) {
154289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        ArrayList<Integer> list = new ArrayList<>(u - l + 1);
155289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        for (int i=l; i<=u; i++) {
156289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            list.add(i);
157289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
158289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return list;
159289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
160289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
161289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static List<Integer> repeat(int value, int n) {
162289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        ArrayList<Integer> list = new ArrayList<>(n);
163289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        for (int i=1; i<=n; i++) {
164289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            list.add(value);
165289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
166289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return list;
167289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
168289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
169289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static List<Double> asDoubles(List<Integer> integers) {
170289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        ArrayList<Double> list = new ArrayList<>();
171289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        for (Integer i : integers) {
172289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            list.add((double) i);
173289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
174289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return list;
175289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
176289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
177289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static List<Long> asLongs(List<Integer> integers) {
178289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        ArrayList<Long> list = new ArrayList<>();
179289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        for (Integer i : integers) {
180289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            list.add((long) i);
181289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
182289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return list;
183289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
184289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
185289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static void assertCountSum(Stream<? super Integer> it, int count, int sum) {
186289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        assertCountSum(it.iterator(), count, sum);
187289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
188289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
189289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static void assertCountSum(Iterable<? super Integer> it, int count, int sum) {
190289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        assertCountSum(it.iterator(), count, sum);
191289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
192289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
193289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static void assertCountSum(Iterator<? super Integer> it, int count, int sum) {
194289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        int c = 0;
195289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        int s = 0;
196289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        while (it.hasNext()) {
197289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            int i = (Integer) it.next();
198289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            c++;
199289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            s += i;
200289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
201289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
202289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        assertEquals(c, count);
203289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        assertEquals(s, sum);
204289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
205289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
206289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static void assertConcat(Iterator<Character> it, String result) {
207289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        StringBuilder sb = new StringBuilder();
208289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        while (it.hasNext()) {
209289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            sb.append(it.next());
210289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
211289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
212289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        assertEquals(result, sb.toString());
213289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
214289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
215289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T extends Comparable<? super T>> void assertSorted(Iterator<T> i) {
216289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        i = toBoxedList(i).iterator();
217289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
218289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        if (!i.hasNext())
219289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return;
220289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        T last = i.next();
221289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        while (i.hasNext()) {
222289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            T t = i.next();
223289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            assertTrue(last.compareTo(t) <= 0);
224289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            assertTrue(t.compareTo(last) >= 0);
225289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            last = t;
226289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
227289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
228289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
229289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T> void assertSorted(Iterator<T> i, Comparator<? super T> comp) {
230289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        if (i instanceof PrimitiveIterator.OfInt
231289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                || i instanceof PrimitiveIterator.OfDouble
232289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                || i instanceof PrimitiveIterator.OfLong) {
233289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            i = toBoxedList(i).iterator();
234289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
235289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
236289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        if (!i.hasNext())
237289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return;
238289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        T last = i.next();
239289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        while (i.hasNext()) {
240289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            T t = i.next();
241289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            assertTrue(comp.compare(last, t) <= 0);
242289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            assertTrue(comp.compare(t, last) >= 0);
243289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            last = t;
244289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
245289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
246289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
247289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T extends Comparable<? super T>> void assertSorted(Iterable<T> iter) {
248289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        assertSorted(iter.iterator());
249289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
250289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
251289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T> void assertSorted(Iterable<T> iter, Comparator<? super T> comp) {
252289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        assertSorted(iter.iterator(), comp);
253289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
254289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
255289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static <T> void assertUnique(Iterable<T> iter) {
256289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        assertUnique(iter.iterator());
257289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
258289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
259289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T> void assertUnique(Iterator<T> iter) {
260289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        if (!iter.hasNext()) {
261289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return;
262289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
263289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
264289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        if (iter instanceof PrimitiveIterator.OfInt
265289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            || iter instanceof PrimitiveIterator.OfDouble
266289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            || iter instanceof PrimitiveIterator.OfLong) {
267289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            iter = toBoxedList(iter).iterator();
268289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
269289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
270289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        Set<T> uniq = new HashSet<>();
271289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        while(iter.hasNext()) {
272289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            T each = iter.next();
273289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            assertTrue(!uniq.contains(each), "Not unique");
274289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            uniq.add(each);
275289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
276289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
277289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
278289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T> void assertContents(Iterable<T> actual, Iterable<T> expected) {
279289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        if (actual instanceof Collection && expected instanceof Collection) {
280289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            assertEquals(actual, expected);
281289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        } else {
282289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            assertContents(actual.iterator(), expected.iterator());
283289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
284289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
285289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
286289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T> void assertContents(Iterator<T> actual, Iterator<T> expected) {
287289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        assertEquals(toBoxedList(actual), toBoxedList(expected));
288289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
289289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
290289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    @SafeVarargs
291289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    @SuppressWarnings("varargs")
292289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T> void assertContents(Iterator<T> actual, T... expected) {
293289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        assertContents(actual, Arrays.asList(expected).iterator());
294289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
295289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
296289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    /**
297289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * The all consuming consumer (rampant capitalist) that can accepting a reference or any primitive value.
298289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     */
299289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    private static interface OmnivorousConsumer<T>
300289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            extends Consumer<T>, IntConsumer, LongConsumer, DoubleConsumer { }
301289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
302289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    @SuppressWarnings({"rawtypes", "unchecked"})
303289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T> Consumer<T> toBoxingConsumer(Consumer<? super T> c) {
304289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return (Consumer<T>) new OmnivorousConsumer() {
305289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            @Override
306289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public void accept(Object t) {
307289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                c.accept((T) t);
308289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
309289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
310289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            @Override
311289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public void accept(int t) {
312289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                accept((Object) t);
313289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
314289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
315289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            @Override
316289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public void accept(long t) {
317289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                accept((Object) t);
318289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
319289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
320289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            @Override
321289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public void accept(double t) {
322289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                accept((Object) t);
323289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
324289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        };
325289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
326289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
327289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    /**
328289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * Convert an iterator to a list using forEach with an implementation of
329289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * {@link java.util.stream.LambdaTestHelpers.OmnivorousConsumer}.
330289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     *
331289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * This ensures equality comparisons for test results do not trip
332289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * the boxing trip-wires.
333289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     */
334289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    private static<T> List<T> toBoxedList(Iterator<T> it) {
335289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        List<T> l = new ArrayList<>();
336289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        it.forEachRemaining(toBoxingConsumer(l::add));
337289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return l;
338289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
339289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
340289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    /**
341289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * Convert a spliterator to a list using forEach with an implementation of
342289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * {@link java.util.stream.LambdaTestHelpers.OmnivorousConsumer}.
343289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     *
344289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * This ensures equality comparisons for test results do not trip
345289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * the boxing trip-wires.
346289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     */
347289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T> List<T> toBoxedList(Spliterator<T> sp) {
348289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        List<T> l = new ArrayList<>();
349289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        sp.forEachRemaining(toBoxingConsumer(l::add));
350289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return l;
351289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
352289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
353289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    /**
354289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * Convert an iterator to a multi-set, represented as a Map, using forEach with an implementation of
355289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * {@link java.util.stream.LambdaTestHelpers.OmnivorousConsumer}.
356289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     *
357289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * This ensures equality comparisons for test results do not trip
358289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     * the boxing trip-wires.
359289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin     */
360289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    @SuppressWarnings("unchecked")
361289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    private static<T> Map<T, Integer> toBoxedMultiset(Iterator<T> it) {
362289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        Map<Object, Integer> result = new HashMap<>();
363289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
364289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        it.forEachRemaining(toBoxingConsumer(o -> {
365289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                if (result.containsKey(o))
366289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    result.put(o, result.get(o) + 1);
367289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                else
368289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    result.put(o, 1);
369289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }));
370289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
371289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return (Map<T, Integer>) result;
372289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
373289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
374289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    @SuppressWarnings("unchecked")
375289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T> Map<T, Integer> toBoxedMultiset(Spliterator<T> it) {
376289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        Map<Object, Integer> result = new HashMap<>();
377289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
378289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        it.forEachRemaining(toBoxingConsumer(o -> {
379289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                if (result.containsKey(o))
380289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    result.put(o, result.get(o) + 1);
381289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                else
382289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    result.put(o, 1);
383289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }));
384289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
385289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return (Map<T, Integer>) result;
386289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
387289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
388289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    @SuppressWarnings("unchecked")
389289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static void assertContentsEqual(Object a, Object b) {
390289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        if (a instanceof Iterable && b instanceof Iterable)
391289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            assertContents((Iterable) a, (Iterable) b);
392289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        else
393289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            assertEquals(a, b);
394289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
395289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
396289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T> void assertContentsUnordered(Iterable<T> actual, Iterable<T> expected) {
397289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        assertContentsUnordered(actual.iterator(), expected.iterator());
398289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
399289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
400289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static<T> void assertContentsUnordered(Iterator<T> actual, Iterator<T> expected) {
401289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        assertEquals(toBoxedMultiset(actual), toBoxedMultiset(expected));
402289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
403289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
404289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static void launderAssertion(Runnable r, Supplier<String> additionalInfo) {
405289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        try {
406289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            r.run();
407289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
408289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        catch (AssertionError ae) {
409289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            AssertionError cloned = new AssertionError(ae.getMessage() + String.format("%n%s", additionalInfo.get()));
410289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            cloned.setStackTrace(ae.getStackTrace());
411289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            if (ae.getCause() != null)
412289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                cloned.initCause(ae.getCause());
413289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            throw cloned;
414289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
415289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
416289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
417289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static <T, S extends BaseStream<T, S>>
418289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    List<Function<S, S>> permuteStreamFunctions(List<Function<S, S>> opFunctions) {
419289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        List<List<Function<S, S>>> opFunctionPermutations = perm(opFunctions);
420289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
421289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        List<Function<S, S>> appliedFunctions = new ArrayList<>();
422289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        for (List<Function<S, S>> fs : opFunctionPermutations) {
423289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            Function<S, S> applied = s -> {
424289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                for (Function<S, S> f : fs) {
425289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                    s = f.apply(s);
426289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                }
427289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                return s;
428289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            };
429289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            appliedFunctions.add(applied);
430289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
431289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
432289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return appliedFunctions;
433289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
434289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
435289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    private static <T> List<T> sub(List<T> l, int index) {
436289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        List<T> subL = new ArrayList<>(l);
437289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        subL.remove(index);
438289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return subL;
439289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
440289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
441289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static <T> List<List<T>> perm(List<T> l) {
442289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        List<List<T>> result = new ArrayList<>();
443289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        for (int i = 0; i < l.size(); i++) {
444289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            for (List<T> perm : perm(sub(l, i))) {
445289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                perm.add(0, l.get(i));
446289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                result.add(perm);
447289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
448289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
449289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        result.add(new ArrayList<T>());
450289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
451289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return result;
452289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
453289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
454289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static String flagsToString(int flags) {
455289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        StringJoiner sj = new StringJoiner(", ", "StreamOpFlag[", "]");
456289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        if (StreamOpFlag.DISTINCT.isKnown(flags)) sj.add("IS_DISTINCT");
457289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        if (StreamOpFlag.ORDERED.isKnown(flags)) sj.add("IS_ORDERED");
458289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        if (StreamOpFlag.SIZED.isKnown(flags)) sj.add("IS_SIZED");
459289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        if (StreamOpFlag.SORTED.isKnown(flags)) sj.add("IS_SORTED");
460289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        if (StreamOpFlag.SHORT_CIRCUIT.isKnown(flags)) sj.add("IS_SHORT_CIRCUIT");
461289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return sj.toString();
462289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
463289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin}
464