1/*
2 * Copyright (C) 2012 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.common.collect;
18
19import static java.util.Arrays.asList;
20
21import com.google.common.testing.NullPointerTester;
22import com.google.common.testing.SerializableTester;
23
24import junit.framework.TestCase;
25
26import java.util.NoSuchElementException;
27
28/**
29 * Tests for {@link EvictingQueue}.
30 *
31 * @author Kurt Alfred Kluever
32 */
33public class EvictingQueueTest extends TestCase {
34
35  public void testCreateWithNegativeSize() throws Exception {
36    try {
37      EvictingQueue.create(-1);
38      fail();
39    } catch (IllegalArgumentException expected) {
40    }
41  }
42
43  public void testCreateWithZeroSize() throws Exception {
44    EvictingQueue<String> queue = EvictingQueue.create(0);
45    assertEquals(0, queue.size());
46
47    assertTrue(queue.add("hi"));
48    assertEquals(0, queue.size());
49
50    assertTrue(queue.offer("hi"));
51    assertEquals(0, queue.size());
52
53    assertFalse(queue.remove("hi"));
54    assertEquals(0, queue.size());
55
56    try {
57      queue.element();
58      fail();
59    } catch (NoSuchElementException expected) {}
60
61    assertNull(queue.peek());
62    assertNull(queue.poll());
63    try {
64      queue.remove();
65      fail();
66    } catch (NoSuchElementException expected) {}
67  }
68
69  public void testRemainingCapacity_maxSize0() {
70    EvictingQueue<String> queue = EvictingQueue.create(0);
71    assertEquals(0, queue.remainingCapacity());
72  }
73
74  public void testRemainingCapacity_maxSize1() {
75    EvictingQueue<String> queue = EvictingQueue.create(1);
76    assertEquals(1, queue.remainingCapacity());
77    queue.add("hi");
78    assertEquals(0, queue.remainingCapacity());
79  }
80
81  public void testRemainingCapacity_maxSize3() {
82    EvictingQueue<String> queue = EvictingQueue.create(3);
83    assertEquals(3, queue.remainingCapacity());
84    queue.add("hi");
85    assertEquals(2, queue.remainingCapacity());
86    queue.add("hi");
87    assertEquals(1, queue.remainingCapacity());
88    queue.add("hi");
89    assertEquals(0, queue.remainingCapacity());
90  }
91
92  public void testEvictingAfterOne() throws Exception {
93    EvictingQueue<String> queue = EvictingQueue.create(1);
94    assertEquals(0, queue.size());
95    assertEquals(1, queue.remainingCapacity());
96
97    assertTrue(queue.add("hi"));
98    assertEquals("hi", queue.element());
99    assertEquals("hi", queue.peek());
100    assertEquals(1, queue.size());
101    assertEquals(0, queue.remainingCapacity());
102
103    assertTrue(queue.add("there"));
104    assertEquals("there", queue.element());
105    assertEquals("there", queue.peek());
106    assertEquals(1, queue.size());
107    assertEquals(0, queue.remainingCapacity());
108
109    assertEquals("there", queue.remove());
110    assertEquals(0, queue.size());
111    assertEquals(1, queue.remainingCapacity());
112  }
113
114  public void testEvictingAfterThree() throws Exception {
115    EvictingQueue<String> queue = EvictingQueue.create(3);
116    assertEquals(0, queue.size());
117    assertEquals(3, queue.remainingCapacity());
118
119    assertTrue(queue.add("one"));
120    assertTrue(queue.add("two"));
121    assertTrue(queue.add("three"));
122    assertEquals("one", queue.element());
123    assertEquals("one", queue.peek());
124    assertEquals(3, queue.size());
125    assertEquals(0, queue.remainingCapacity());
126
127    assertTrue(queue.add("four"));
128    assertEquals("two", queue.element());
129    assertEquals("two", queue.peek());
130    assertEquals(3, queue.size());
131    assertEquals(0, queue.remainingCapacity());
132
133    assertEquals("two", queue.remove());
134    assertEquals(2, queue.size());
135    assertEquals(1, queue.remainingCapacity());
136  }
137
138  public void testAddAll() throws Exception {
139    EvictingQueue<String> queue = EvictingQueue.create(3);
140    assertEquals(0, queue.size());
141    assertEquals(3, queue.remainingCapacity());
142
143    assertTrue(queue.addAll(asList("one", "two", "three")));
144    assertEquals("one", queue.element());
145    assertEquals("one", queue.peek());
146    assertEquals(3, queue.size());
147    assertEquals(0, queue.remainingCapacity());
148
149    assertTrue(queue.addAll(asList("four")));
150    assertEquals("two", queue.element());
151    assertEquals("two", queue.peek());
152    assertEquals(3, queue.size());
153    assertEquals(0, queue.remainingCapacity());
154
155    assertEquals("two", queue.remove());
156    assertEquals(2, queue.size());
157    assertEquals(1, queue.remainingCapacity());
158  }
159
160  public void testNullPointerExceptions() {
161    NullPointerTester tester = new NullPointerTester();
162    tester.testAllPublicStaticMethods(EvictingQueue.class);
163    tester.testAllPublicConstructors(EvictingQueue.class);
164    EvictingQueue<String> queue = EvictingQueue.create(5);
165    // The queue must be non-empty so it throws a NPE correctly
166    queue.add("one");
167    tester.testAllPublicInstanceMethods(queue);
168  }
169
170  public void testSerialization() {
171    EvictingQueue<String> original = EvictingQueue.create(5);
172    original.add("one");
173    original.add("two");
174    original.add("three");
175
176    EvictingQueue<String> copy = SerializableTester.reserialize(original);
177    assertEquals(copy.maxSize, original.maxSize);
178    assertEquals("one", copy.remove());
179    assertEquals("two", copy.remove());
180    assertEquals("three", copy.remove());
181    assertTrue(copy.isEmpty());
182  }
183}
184