/* * 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.List; import java.util.Random; import java.util.Spliterator; import one.util.streamex.IntStreamEx; import one.util.streamex.PermutationSpliterator; import org.junit.Test; import static one.util.streamex.TestHelpers.*; import static org.junit.Assert.*; public class PermutationSpliteratorTest { private static final String PERMUTATIONS_4 = "0123,0132,0213,0231,0312,0321," + "1023,1032,1203,1230,1302,1320," + "2013,2031,2103,2130,2301,2310," + "3012,3021,3102,3120,3201,3210"; private static final String PERMUTATIONS_3 = "012,021,102,120,201,210"; private List<String> collect(Spliterator<int[]> spliterator) { List<String> strings = new ArrayList<>(); spliterator.forEachRemaining(i -> strings.add(IntStreamEx.of(i).mapToObj(String::valueOf).joining())); return strings; } private void collectRandomSplit(Spliterator<int[]> spliterator, Random r, List<String> strings) { if (spliterator.estimateSize() == 0) return; int n = r.nextInt((int) spliterator.estimateSize()) + 1; for (int i = 0; i < n; i++) { if (!spliterator.tryAdvance(is -> strings.add(IntStreamEx.of(is).mapToObj(String::valueOf).joining()))) return; } Spliterator<int[]> prefix = spliterator.trySplit(); if (prefix != null) collectRandomSplit(prefix, r, strings); collectRandomSplit(spliterator, r, strings); } @Test(expected = IllegalArgumentException.class) public void testOverflow() { new PermutationSpliterator(21); } @Test(expected = IllegalArgumentException.class) public void testUnderflow() { new PermutationSpliterator(-1); } @Test public void testAdvance3() { Spliterator<int[]> spliterator = new PermutationSpliterator(3); assertEquals(PERMUTATIONS_3, String.join(",", collect(spliterator))); } @Test public void testAdvance4() { Spliterator<int[]> spliterator = new PermutationSpliterator(4); assertEquals(PERMUTATIONS_4, String.join(",", collect(spliterator))); } @Test public void testSplit3() { Spliterator<int[]> spliterator = new PermutationSpliterator(3); Spliterator<int[]> prefix = spliterator.trySplit(); assertNotNull(prefix); assertEquals(3, spliterator.getExactSizeIfKnown()); assertEquals(3, prefix.getExactSizeIfKnown()); List<String> strings = collect(prefix); assertEquals(3, strings.size()); strings.addAll(collect(spliterator)); assertEquals(PERMUTATIONS_3, String.join(",", strings)); } @Test public void testSplit3Random() { withRandom(r -> repeat(100, i -> { List<String> strings = new ArrayList<>(); collectRandomSplit(new PermutationSpliterator(3), r, strings); assertEquals(String.valueOf(i), PERMUTATIONS_3, String.join(",", strings)); })); } @Test public void testSplit4() { Spliterator<int[]> spliterator = new PermutationSpliterator(4); Spliterator<int[]> prefix = spliterator.trySplit(); assertNotNull(prefix); assertEquals(12, spliterator.getExactSizeIfKnown()); assertEquals(12, prefix.getExactSizeIfKnown()); List<String> strings = collect(prefix); assertEquals(12, strings.size()); strings.addAll(collect(spliterator)); assertEquals(PERMUTATIONS_4, String.join(",", strings)); } @Test public void testSplit4Random() { withRandom(r -> repeat(100, i -> { List<String> strings = new ArrayList<>(); collectRandomSplit(new PermutationSpliterator(4), r, strings); assertEquals(String.valueOf(i), PERMUTATIONS_4, String.join(",", strings)); })); } }