/* * Quasar: lightweight threads and actors for the JVM. * Copyright (c) 2013-2015, Parallel Universe Software Co. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 3.0 * as published by the Free Software Foundation. */ package co.paralleluniverse.strands.queues; import co.paralleluniverse.common.test.TestUtil; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import java.util.Queue; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestName; import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; /** * Simple, single-threaded tests * * @author pron */ @RunWith(Parameterized.class) public class SingleConsumerQueueTest { @Rule public TestName name = new TestName(); @Rule public TestRule watchman = TestUtil.WATCHMAN; final SingleConsumerQueue<String> queue; // public SingleConsumerQueueTest() { // this.queue = new SingleConsumerLinkedArrayObjectQueue<String>(); // } public SingleConsumerQueueTest(int queueType) { switch (queueType) { case 1: this.queue = new SingleConsumerArrayObjectQueue<String>(10); break; case 2: this.queue = new SingleConsumerLinkedObjectQueue<String>(); break; case 3: this.queue = new SingleConsumerLinkedArrayObjectQueue<String>(); break; default: throw new AssertionError(); } } @Parameterized.Parameters public static Collection<Object[]> data() { return Arrays.asList(new Object[][]{{1}, {2}, {3}}); } @Test public void testEmptyQueue() { assertThat(queue.size(), is(0)); assertTrue(queue.isEmpty()); assertThat(queue.peek(), is(nullValue())); assertThat(queue.poll(), is(nullValue())); try { queue.element(); fail(); } catch (NoSuchElementException e) { } try { queue.remove(); fail(); } catch (NoSuchElementException e) { } } @Test public void testOffer() { queue.offer("one"); queue.offer("two"); queue.offer("three"); assertThat(queue.isEmpty(), is(false)); assertThat(queue.size(), is(3)); assertThat(list(queue), is(equalTo(list("one", "two", "three")))); } @Test public void testPoll() { int j = 1; int k = 1; for (int i = 0; i < 8; i++) { queue.offer("x" + (j++)); queue.offer("x" + (j++)); String s = queue.poll(); assertThat(s, equalTo("x" + (k++))); } assertThat(queue.size(), is(8)); assertThat(list(queue), is(equalTo(list("x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16")))); for (int i = 0; i < 8; i++) { String s = queue.poll(); assertThat(s, equalTo("x" + (k++))); } testEmptyQueue(); } @Test public void testIteratorRemove() { int j = 1; int k = 1; for (int i = 0; i < 9; i++) queue.offer("x" + (j++)); for (Iterator<String> it = queue.iterator(); it.hasNext();) { it.next(); if ((k++) % 2 == 0) it.remove(); } assertThat(list(queue), is(equalTo(list("x1", "x3", "x5", "x7", "x9")))); for (int i = 0; i < 4; i++) queue.offer("x" + (j++)); k = 1; for (Iterator<String> it = queue.iterator(); it.hasNext();) { it.next(); if ((k++) % 2 != 0) it.remove(); } assertThat(list(queue), is(equalTo(list("x3", "x7", "x10", "x12")))); } @Test public void testIteratorRemoveFirst() { queue.offer("one"); queue.offer("two"); queue.offer("three"); queue.offer("four"); Iterator<String> it = queue.iterator(); it.next(); it.remove(); it.next(); it.remove(); assertThat(queue.size(), is(2)); assertThat(list(queue), is(equalTo(list("three", "four")))); queue.offer("five"); queue.offer("six"); it.next(); it.remove(); it.next(); it.remove(); assertThat(queue.size(), is(2)); assertThat(list(queue), is(equalTo(list("five", "six")))); } @Test public void testIteratorRemoveLast() { queue.offer("one"); queue.offer("two"); queue.offer("three"); queue.offer("four"); QueueIterator<String> it = queue.iterator(); while (it.hasNext()) it.next(); it.remove(); it.reset(); while (it.hasNext()) it.next(); it.remove(); assertThat(queue.size(), is(2)); assertThat(list(queue), is(equalTo(list("one", "two")))); queue.offer("five"); queue.offer("six"); it.reset(); while (it.hasNext()) it.next(); it.remove(); it.reset(); while (it.hasNext()) it.next(); it.remove(); assertThat(queue.size(), is(2)); assertThat(list(queue), is(equalTo(list("one", "two")))); } @Test public void testIteratorRemoveOnly() { queue.offer("one"); Iterator<String> it = queue.iterator(); it.next(); it.remove(); testEmptyQueue(); queue.offer("one"); assertThat(queue.size(), is(1)); assertThat(list(queue), is(equalTo(list("one")))); it = queue.iterator(); it.next(); it.remove(); testEmptyQueue(); queue.offer("one"); assertThat(queue.size(), is(1)); assertThat(list(queue), is(equalTo(list("one")))); } private static <E> List<E> list(Queue<E> queue) { return new ArrayList<>(queue); } private static <E> List<E> list(E... vals) { return Arrays.asList(vals); } }