import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.junit.*;
public class ResizingHashMapExtraTest {
	@Test
	public void extrTest_put_get_resize_get() {
		String[] strings = new String[200];

		ResizingHashMap<Integer, String> map = new ResizingHashMap<Integer, String>(20);
		for(int i = 0; i < 200; i++) {
			strings[i] = getRndString();
			assertTrue(map.put(i, strings[i]));
		}
		for(int i = 0; i < 200; i++) assertEquals(strings[i], map.get(i));
		map.resize(200);
		for(int i = 0; i < 200; i++) assertEquals(strings[i], map.get(i));
		assertEquals("Anzahl an Buckets stimmt nicht!", map.buckets.length, 200);
	}
	@Test
	public void extrTest_put_on_same_index() {
		ResizingHashMap<Integer, String> map = new ResizingHashMap<Integer, String>(20);
		map.put(1230971238, "Hallo Welt!");
		map.put(1230971238, new String("Auf Wiedersehen Welt!"));
		assertEquals(map.get(1230971238), new String("Auf Wiedersehen Welt!"));
	}
	@Test
	public void extrTest_some_fun_with_null_pointer__put_get_put_contains_get_remove_contains_remove() {
		ResizingHashMap<Integer, String> map = new ResizingHashMap<Integer, String>(20);
		try {
			map.put(null, "Hallo Welt!");
			System.err.println("An deiner Stelle wuerde ich in put(...) fuer key = null eine IAE werfen");
		}catch(Exception e) {
			if(e.getClass() != IllegalArgumentException.class) {
				System.err.println("An deiner Stelle wuerde ich in put(...) fuer key = null eine IAE werfen");
			}
		}
		try {
			assertEquals(map.get(null), "Hallo Welt!");
			System.err.println("An deiner Stelle wuerde ich in get(...) fuer key = null eine IAE werfen");
		}catch(Exception e) {
			if(e.getClass() != IllegalArgumentException.class) {
				System.err.println("An deiner Stelle wuerde ich in get(...) fuer key = null eine IAE werfen");
			}
		}
		try {
			assertFalse(map.containsKey(null));
			System.err.println("An deiner Stelle wuerde ich in containsKey(...) fuer key = null eine IAE werfen");
		}catch(Exception e) {
			if(e.getClass() != IllegalArgumentException.class) {
				System.err.println("An deiner Stelle wuerde ich in containsKey(...) fuer key = null eine IAE werfen");
			}
		}
		try {
			int i = map.getBucketIndex(null);
			assertEquals("Irgendetwas sollte falsch laufen.. man kann nicht den null key mappen!", i, -1);
			System.err.println("An deiner Stelle wuerde ich in getBucketIndex(...) fuer key = null eine IAE werfen");
		}catch(Exception e) {
			if(e.getClass() != IllegalArgumentException.class) {
				System.err.println("An deiner Stelle wuerde ich in getBucketIndex(...) fuer key = null eine IAE werfen");
			}
		}
		map.put(new Integer(444), null);
		assertTrue(map.containsKey(new Integer(444)));
		assertEquals(map.get(new Integer(444)), null);
		assertTrue(map.remove(new Integer(444)));
		assertFalse(map.containsKey(new Integer(444)));
		assertFalse(map.remove(new Integer(444)));
	}
	private String getRndString() {
		String c = "";
		for(int i = 0; i < 3; i++) 
			c += (char)((int)(Math.random()*(122.0-48.0) + 48.0));
		return c;
	}
}