/*************************************************************************** * Copyright (C) 2012 by H-Store Project * * Brown University * * Massachusetts Institute of Technology * * Yale University * * * * http://hstore.cs.brown.edu/ * * * * Permission is hereby granted, free of charge, to any person obtaining * * a copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, sublicense, and/or sell copies of the Software, and to * * permit persons to whom the Software is furnished to do so, subject to * * the following conditions: * * * * The above copyright notice and this permission notice shall be * * included in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR * * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * * OTHER DEALINGS IN THE SOFTWARE. * ***************************************************************************/ package edu.brown.benchmark.auctionmark.util; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import junit.framework.TestCase; import edu.brown.statistics.Histogram; import edu.brown.statistics.ObjectHistogram; public class TestUserId extends TestCase { private static final Random rand = new Random(1); /** * testUserId */ public void testUserId() { for (int i = 0; i < 100; i++) { int size = rand.nextInt(10000); for (int offset = 0; offset < 10; offset++) { UserId user_id = new UserId(size, offset); assertNotNull(user_id); assertEquals(size, user_id.getItemCount()); assertEquals(offset, user_id.getOffset()); } // FOR } // FOR } /** * testEquals */ public void testEquals() { UserId user_id = new UserId(rand.nextLong()); assert(user_id.getItemCount() > 0); assert(user_id.getOffset() > 0); UserId clone = new UserId(user_id.getItemCount(), user_id.getOffset()); assertEquals(user_id, clone); assertEquals(user_id.hashCode(), clone.hashCode()); assertEquals(0, user_id.compareTo(clone)); } /** * testCompareTo */ public void testCompareTo() throws Throwable { Histogram<UserId> h = new ObjectHistogram<UserId>(); List<UserId> orig = new ArrayList<UserId>(); Set<Long> seen_encode = new HashSet<Long>(); Set<Integer> seen_hash = new HashSet<Integer>(); Set<long[]> seen_array = new HashSet<long[]>(); SortedMap<UserId, Boolean> seen_map = new TreeMap<UserId, Boolean>(); int num_ids = 100; for (int i = 0; i < num_ids; i++) { UserId user_id = new UserId(rand.nextLong()); assert(user_id.getItemCount() > 0); assert(user_id.getOffset() > 0); if (orig.contains(user_id)) { i--; continue; } System.err.println(String.format("[%02d] %-50s => %d / %d %s%s%s%s", h.getValueCount(), user_id, user_id.hashCode(), user_id.encode(), (seen_hash.contains(user_id.hashCode()) ? "!!! HASH" : ""), (seen_encode.contains(user_id.encode()) ? "!!! ENCODE" : ""), (seen_array.contains(user_id.toArray()) ? "!!! ARRAY" : ""), (seen_map.containsKey(user_id) ? "!!! MAP" : "") )); h.put(user_id, i+1); assertTrue(user_id.toString(), h.contains(user_id)); assertNotNull(user_id.toString(), h.get(user_id)); assertEquals(user_id.toString(), i+1, h.get(user_id).intValue()); assertEquals(i+1, h.getValueCount()); orig.add(user_id); seen_hash.add(user_id.hashCode()); seen_encode.add(user_id.encode()); seen_array.add(user_id.toArray()); seen_map.put(user_id, true); } // FOR assertEquals(num_ids, orig.size()); assertEquals(num_ids, h.values().size()); assertEquals(num_ids, h.getValueCount()); assertEquals(num_ids, seen_hash.size()); assertEquals(num_ids, seen_encode.size()); for (int i = 0; i < num_ids; i++) { UserId user_id = orig.get(i); assertTrue(user_id.toString(), seen_encode.contains(user_id.encode())); assertTrue(user_id.toString(), seen_hash.contains(user_id.hashCode())); assertTrue(user_id.toString(), seen_map.containsKey(user_id)); assertNotNull(user_id.toString(), h.get(user_id)); assertEquals(user_id.toString(), i+1, h.get(user_id).intValue()); } // Randomly delete a bunch and make sure that they're not in our histogram anymore Set<UserId> deleted = new HashSet<UserId>(); for (int i = 0; i < num_ids; i++) { if (rand.nextBoolean()) { UserId user_id = orig.get(i); assertNotNull(user_id); h.remove(user_id); deleted.add(user_id); } } // FOR assertFalse(deleted.isEmpty()); assertEquals(orig.size() - deleted.size(), h.getValueCount()); for (UserId user_id : orig) { assertEquals(user_id.toString(), deleted.contains(user_id) == false, h.contains(user_id)); } // FOR } /** * testUserIdEncode */ public void testUserIdEncode() { for (int i = 0; i < 100; i++) { int size = rand.nextInt(10000); for (int offset = 0; offset < 10; offset++) { long encoded = new UserId(size, offset).encode(); assert(encoded >= 0); UserId user_id = new UserId(encoded); assertNotNull(user_id); assertEquals(size, user_id.getItemCount()); assertEquals(offset, user_id.getOffset()); } // FOR } // FOR } /** * testUserIdDecode */ public void testUserIdDecode() { for (int i = 0; i < 100; i++) { int size = rand.nextInt(10000); for (int offset = 0; offset < 10; offset++) { long values[] = { offset, size }; long encoded = new UserId(size, offset).encode(); assert(encoded >= 0); long new_values[] = new UserId(encoded).toArray(); assertEquals(values.length, new_values.length); for (int j = 0; j < new_values.length; j++) { assertEquals(values[j], new_values[j]); } // FOR } // FOR } // FOR } }