git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 12/11] Add a test for LongMap, IndexPack's helper class

From
Shawn O. Pearce <spearce@spearce.org>
Date
Apr 29, 2009, 20:42 UTC
Message-ID
<20090429204235.GJ23604@spearce.org>
In-Reply-To
<200904292145.34462.robin.rosenberg@dewire.com>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 Robin Rosenberg <robin.rosenberg@dewire.com> wrote:
 > tisdag 28 april 2009 23:12:23 skrev "Shawn O. Pearce" <spearce@spearce.org>:
 > > We now use a custom Map implementation which supports primitive long
 > > as the hash key, rather than requiring boxing for java.util.HashMap.
 > > This removes the issue FindBugs was identifying.
 > 
 > No unit test for LongMap?
 .../org/spearce/jgit/transport/LongMapTest.java    |  132 ++++++++++++++++++++
 1 files changed, 132 insertions(+), 0 deletions(-)
 create mode 100644 org.spearce.jgit.test/tst/org/spearce/jgit/transport/LongMapTest.java
diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/transport/LongMapTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/transport/LongMapTest.java
new file mode 100644
index 0000000..c59fd1f
--- /dev/null
+++ b/org.spearce.jgit.test/tst/org/spearce/jgit/transport/LongMapTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2009, Google Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Git Development Community nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.spearce.jgit.transport;
+
+import junit.framework.TestCase;
+
+public class LongMapTest extends TestCase {
+	private LongMap<Long> map;
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		map = new LongMap<Long>();
+	}
+
+	public void testEmptyMap() {
+		assertFalse(map.containsKey(0));
+		assertFalse(map.containsKey(1));
+
+		assertNull(map.get(0));
+		assertNull(map.get(1));
+
+		assertNull(map.remove(0));
+		assertNull(map.remove(1));
+	}
+
+	public void testInsertMinValue() {
+		final Long min = Long.valueOf(Long.MIN_VALUE);
+		assertNull(map.put(Long.MIN_VALUE, min));
+		assertTrue(map.containsKey(Long.MIN_VALUE));
+		assertSame(min, map.get(Long.MIN_VALUE));
+		assertFalse(map.containsKey(Integer.MIN_VALUE));
+	}
+
+	public void testReplaceMaxValue() {
+		final Long min = Long.valueOf(Long.MAX_VALUE);
+		final Long one = Long.valueOf(1);
+		assertNull(map.put(Long.MAX_VALUE, min));
+		assertSame(min, map.get(Long.MAX_VALUE));
+		assertSame(min, map.put(Long.MAX_VALUE, one));
+		assertSame(one, map.get(Long.MAX_VALUE));
+	}
+
+	public void testRemoveOne() {
+		final long start = 1;
+		assertNull(map.put(start, Long.valueOf(start)));
+		assertEquals(Long.valueOf(start), map.remove(start));
+		assertFalse(map.containsKey(start));
+	}
+
+	public void testRemoveCollision1() {
+		// This test relies upon the fact that we always >>> 1 the value
+		// to derive an unsigned hash code. Thus, 0 and 1 fall into the
+		// same hash bucket. Further it relies on the fact that we add
+		// the 2nd put at the top of the chain, so removing the 1st will
+		// cause a different code path.
+		//
+		assertNull(map.put(0, Long.valueOf(0)));
+		assertNull(map.put(1, Long.valueOf(1)));
+		assertEquals(Long.valueOf(0), map.remove(0));
+
+		assertFalse(map.containsKey(0));
+		assertTrue(map.containsKey(1));
+	}
+
+	public void testRemoveCollision2() {
+		// This test relies upon the fact that we always >>> 1 the value
+		// to derive an unsigned hash code. Thus, 0 and 1 fall into the
+		// same hash bucket. Further it relies on the fact that we add
+		// the 2nd put at the top of the chain, so removing the 2nd will
+		// cause a different code path.
+		//
+		assertNull(map.put(0, Long.valueOf(0)));
+		assertNull(map.put(1, Long.valueOf(1)));
+		assertEquals(Long.valueOf(1), map.remove(1));
+
+		assertTrue(map.containsKey(0));
+		assertFalse(map.containsKey(1));
+	}
+
+	public void testSmallMap() {
+		final long start = 12;
+		final long n = 8;
+		for (long i = start; i < start + n; i++)
+			assertNull(map.put(i, Long.valueOf(i)));
+		for (long i = start; i < start + n; i++)
+			assertEquals(Long.valueOf(i), map.get(i));
+	}
+
+	public void testLargeMap() {
+		final long start = Integer.MAX_VALUE;
+		final long n = 100000;
+		for (long i = start; i < start + n; i++)
+			assertNull(map.put(i, Long.valueOf(i)));
+		for (long i = start; i < start + n; i++)
+			assertEquals(Long.valueOf(i), map.get(i));
+	}
+}
-- 
1.6.3.rc3.199.g24398
Previous: Robin RosenbergNext: Robin Rosenberg
Message 16 of 18 in “Misc. bug fixes and cleanups”
  1. 00/13 Misc. bug fixes and cleanupsShawn O. Pearce, Apr 28, 2009
  2. 01/13 Fix performance problem recently introduced to DeltaPackedObjectLoaderShawn O. Pearce, Apr 28, 2009
  3. 02/13 Don't use ByteWindows when checking pack file headers/footersShawn O. Pearce, Apr 28, 2009
  4. 03/13 Rewrite WindowCache to be easier to follow and maintainShawn O. Pearce, Apr 28, 2009
  5. 04/13 Document the IllegalArgumentException thrown by WindowCache.reconfigureShawn O. Pearce, Apr 28, 2009
  6. 05/13 Create the new WindowCache before clearing the old oneShawn O. Pearce, Apr 28, 2009
  7. 06/13 Better handle concurrent reads during a WindowCache reconfigurationShawn O. Pearce, Apr 28, 2009
  8. 07/13 Clear dead OffsetCache cells when clearing a referenceShawn O. Pearce, Apr 28, 2009
  9. 08/13 Work around Sun JVM bug "Cleared SoftReference not added to queue"Shawn O. Pearce, Apr 28, 2009
  10. 09/13 Replace inefficient new String(String) constructor to silence FindBugsShawn O. Pearce, Apr 28, 2009
  11. 10/13 Replace inefficient new Long(long) constructor to silence FindBugsShawn O. Pearce, Apr 28, 2009
  12. 11/13 Change IndexPack to use ObjectIdSubclassMap instead of ObjectIdMapShawn O. Pearce, Apr 28, 2009
  13. 12/13 Use getCachedBytes in IndexPack to avoid an unnecessary copyShawn O. Pearce, Apr 28, 2009
  14. 13/13 Remove ObjectIdMap from the JGit libraryShawn O. Pearce, Apr 28, 2009
  15. Robin RosenbergApr 29, 2009
  16. 12/11 Add a test for LongMap, IndexPack's helper classShawn O. Pearce, Apr 29, 2009
  17. Robin RosenbergApr 29, 2009
  18. Shawn O. PearceApr 29, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.