/* --------------------------------------------------------------------- * Numenta Platform for Intelligent Computing (NuPIC) * Copyright (C) 2014, Numenta, Inc. Unless you have an agreement * with Numenta, Inc., for a separate license for this software code, the * following terms and conditions apply: * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero Public License version 3 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Affero Public License for more details. * * You should have received a copy of the GNU Affero Public License * along with this program. If not, see http://www.gnu.org/licenses. * * http://numenta.org/licenses/ * --------------------------------------------------------------------- */ package org.numenta.nupic.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.Iterator; import org.junit.Test; public class DequeTest { @Test public void testConstruction() { Deque<Integer> deque = new Deque<Integer>(2); assertEquals(2, deque.capacity()); } @Test public void testCapacity() { Deque<Integer> deque = new Deque<Integer>(2); assertEquals(2, deque.capacity()); deque.append(1); deque.append(2); assertEquals(deque.size(), deque.capacity()); assertTrue(1 == deque.peekFirst()); assertTrue(2 == deque.peekLast()); deque.append(3); assertEquals(2, deque.size()); } @Test public void testAppend() { Deque<Integer> deque = new Deque<Integer>(2); assertEquals(2, deque.capacity()); deque.append(1); deque.append(2); assertEquals(deque.size(), deque.capacity()); assertTrue(1 == deque.peekFirst()); assertTrue(2 == deque.peekLast()); deque.append(3); assertEquals(2, deque.size()); assertTrue(2 == deque.peekFirst()); assertTrue(3 == deque.peekLast()); assertEquals(deque.size(), deque.capacity()); } @Test public void testInsert() { Deque<Integer> deque = new Deque<Integer>(2); assertEquals(2, deque.capacity()); deque.insert(1); deque.insert(2); assertEquals(deque.size(), deque.capacity()); assertTrue(2 == deque.peekFirst()); assertTrue(1 == deque.peekLast()); deque.insert(3); assertEquals(2, deque.size()); assertTrue(3 == deque.peekFirst()); assertTrue(2 == deque.peekLast()); assertEquals(deque.size(), deque.capacity()); } @Test public void testPushLast() { Deque<Integer> deque = new Deque<Integer>(2); assertEquals(2, deque.capacity()); Integer pushResult = null; pushResult = deque.pushLast(1); assertNull(pushResult); pushResult = deque.pushLast(2); assertNull(pushResult); assertEquals(deque.size(), deque.capacity()); assertTrue(1 == deque.peekFirst()); assertTrue(2 == deque.peekLast()); pushResult = deque.pushLast(3); //Assert that the head item is removed and returned assertTrue(1 == pushResult); assertEquals(2, deque.size()); assertTrue(2 == deque.peekFirst()); assertTrue(3 == deque.peekLast()); assertEquals(deque.size(), deque.capacity()); } @Test public void testPushFirst() { Deque<Integer> deque = new Deque<Integer>(2); assertEquals(2, deque.capacity()); Integer pushResult = null; pushResult = deque.pushFirst(1); assertNull(pushResult); pushResult = deque.pushFirst(2); assertNull(pushResult); assertEquals(deque.size(), deque.capacity()); assertTrue(2 == deque.peekFirst()); assertTrue(1 == deque.peekLast()); pushResult = deque.pushFirst(3); //Assert that the tail item is removed and returned assertTrue(1 == pushResult); assertEquals(2, deque.size()); assertTrue(3 == deque.peekFirst()); assertTrue(2 == deque.peekLast()); assertEquals(deque.size(), deque.capacity()); } @Test public void testClear() { Deque<Integer> deque = new Deque<Integer>(2); assertEquals(2, deque.capacity()); deque.append(1); deque.append(2); assertEquals(deque.size(), deque.capacity()); assertTrue(1 == deque.peekFirst()); assertTrue(2 == deque.peekLast()); deque.clear(); assertEquals(2, deque.capacity()); assertEquals(0, deque.size()); assertNull(deque.takeFirst()); assertNull(deque.takeLast()); } @Test public void takeFirst() { Deque<Integer> deque = new Deque<Integer>(2); assertEquals(2, deque.capacity()); deque.append(1); deque.append(2); assertEquals(deque.size(), deque.capacity()); assertTrue(1 == deque.peekFirst()); assertTrue(2 == deque.peekLast()); Integer f = deque.takeFirst(); assertEquals(new Integer(1), f); assertEquals(1, deque.size()); deque.insert(1); Integer l = deque.takeLast(); assertEquals(new Integer(2), l); assertEquals(1, deque.size()); } @Test public void takeLast() { Deque<Integer> deque = new Deque<Integer>(2); assertEquals(2, deque.capacity()); deque.append(1); deque.append(2); assertEquals(deque.size(), deque.capacity()); assertTrue(1 == deque.peekFirst()); assertTrue(2 == deque.peekLast()); Integer f = deque.takeFirst(); assertEquals(new Integer(1), f); assertEquals(1, deque.size()); deque.insert(1); Integer l = deque.takeLast(); assertEquals(new Integer(2), l); assertEquals(1, deque.size()); } @Test public void peekFirst() { Deque<Integer> deque = new Deque<Integer>(2); assertEquals(2, deque.capacity()); deque.append(1); deque.append(2); assertEquals(deque.size(), deque.capacity()); assertTrue(1 == deque.peekFirst()); assertTrue(2 == deque.peekLast()); assertEquals(deque.size(), deque.capacity()); } @Test public void peekLast() { Deque<Integer> deque = new Deque<Integer>(2); assertEquals(2, deque.capacity()); deque.append(1); deque.append(2); assertEquals(deque.size(), deque.capacity()); assertTrue(1 == deque.peekFirst()); assertTrue(2 == deque.peekLast()); assertEquals(deque.size(), deque.capacity()); } @Test public void testResize() { Deque<Integer> deque = new Deque<Integer>(2); assertEquals(2, deque.capacity()); deque.append(1); deque.append(2); assertEquals(deque.size(), deque.capacity()); assertEquals(2, deque.size()); deque.append(3); assertEquals(deque.size(), deque.capacity()); assertEquals(2, deque.size()); deque.resize(3); assertEquals(3, deque.capacity()); assertEquals(2, deque.size()); Integer result = deque.pushLast(4); assertNull(result); assertTrue(2 == deque.peekFirst()); assertTrue(4 == deque.peekLast()); assertEquals(3, deque.size()); } @Test public void testIterator() { Deque<Integer> deque = new Deque<Integer>(2); assertEquals(2, deque.capacity()); deque.append(1); deque.append(2); assertEquals(deque.size(), deque.capacity()); assertEquals(2, deque.size()); Iterator<Integer> i = deque.iterator(); assertEquals(new Integer(1), i.next()); assertEquals(new Integer(2), i.next()); assertTrue(!i.hasNext()); } @Test public void testHeadTail() { Deque<Integer> deque = new Deque<Integer>(2); deque.append(1); deque.append(2); assertEquals(1, (int)deque.head()); assertEquals(2, (int)deque.tail()); } @Test public void testHashCodeAndEquals() { Deque<Integer> deque = new Deque<Integer>(2); deque.append(1); deque.append(2); Deque<Integer> deque2 = new Deque<Integer>(2); deque2.append(1); deque2.append(2); assertEquals(deque, deque2); assertEquals(deque.hashCode(), deque2.hashCode()); Deque<Integer> deque3 = new Deque<Integer>(2); deque3.append(3); deque3.append(2); assertNotEquals(deque, deque3); assertNotEquals(deque.hashCode(), deque3.hashCode()); } }