/* * Copyright 2015, The Querydsl Team (http://www.querydsl.com/team) * * 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 com.querydsl.core.util; import static java.util.Arrays.asList; import static org.junit.Assert.*; import java.util.*; import org.junit.Test; import com.mysema.commons.lang.IteratorAdapter; @SuppressWarnings("unchecked") public class MultiIteratorTest { private MultiIterator it; private List<Integer> list1 = Arrays.asList(1, 2); private List<Integer> list2 = Collections.emptyList(); private List<Integer> list3, list4; @Test public void emptyList() { it = new MultiIterator(Arrays.asList(list1, list2)); while (it.hasNext()) { it.next(); fail("should return false on hasNext()"); } } @Test public void oneLevel() { it = new MultiIterator(Arrays.asList(list1)); assertIteratorEquals(Arrays.asList(row(1), row(2)).iterator(), it); } @Test public void twoLevels() { list2 = Arrays.asList(10, 20, 30); it = new MultiIterator(Arrays.asList(list1, list2)); Iterator<Object[]> base = Arrays.asList(row(1, 10), row(1, 20), row(1, 30), row(2, 10), row(2, 20), row(2, 30)).iterator(); assertIteratorEquals(base, it); } @Test public void threeLevels() { list1 = Arrays.asList(1, 2); list2 = Arrays.asList(10, 20, 30); list3 = Arrays.asList(100, 200, 300, 400); it = new MultiIterator(Arrays.asList(list1, list2, list3)); List<Object[]> list = new ArrayList<Object[]>(); for (Object a : row(1, 2)) { for (Object b : row(10, 20, 30)) { for (Object c : row(100, 200, 300, 400)) { list.add(row(a, b, c)); } } } assertIteratorEquals(list.iterator(), it); } @Test public void fourLevels() { list1 = Arrays.asList(1, 2); list2 = Arrays.asList(10, 20, 30); list3 = Arrays.asList(100, 200, 300, 400); list4 = Arrays.asList(1000, 2000, 3000, 4000, 5000); it = new MultiIterator(Arrays.asList(list1, list2, list3, list4)); List<Object[]> list = new ArrayList<Object[]>(); for (Object a : row(1, 2)) { for (Object b : row(10, 20, 30)) { for (Object c : row(100, 200, 300, 400)) { for (Object d : row(1000, 2000, 3000, 4000, 5000)) { list.add(row(a, b, c, d)); } } } } assertIteratorEquals(list.iterator(), it); } @Test public void fourLevels2() { list1 = new ArrayList<Integer>(100); for (int i = 0; i < 100; i++) { list1.add(i + 1); } list2 = list1; it = new MultiIterator(Arrays.asList(list1, list2)); while (it.hasNext()) { it.next(); } } @Test public void test() { List<Integer> list1 = asList(1, 2, 3, 4); List<Integer> list2 = asList(10, 20, 30); MultiIterator<Integer> iterator = new MultiIterator<Integer>(asList(list1, list2)); List<Object[]> list = IteratorAdapter.asList(iterator); assertEquals(asList(1, 10), asList(list.get(0))); assertEquals(asList(1, 20), asList(list.get(1))); assertEquals(asList(1, 30), asList(list.get(2))); assertEquals(asList(2, 10), asList(list.get(3))); assertEquals(asList(2, 20), asList(list.get(4))); assertEquals(asList(2, 30), asList(list.get(5))); assertEquals(asList(3, 10), asList(list.get(6))); assertEquals(asList(3, 20), asList(list.get(7))); assertEquals(asList(3, 30), asList(list.get(8))); assertEquals(asList(4, 10), asList(list.get(9))); assertEquals(asList(4, 20), asList(list.get(10))); assertEquals(asList(4, 30), asList(list.get(11))); } protected void assertIteratorEquals(Iterator<Object[]> a, Iterator<Object[]> b) { while (a.hasNext()) { assertEquals(Arrays.asList(a.next()), Arrays.asList(b.next())); } assertFalse(b.hasNext()); } protected Object[] row(Object... row) { return row; } }