test/java/util/Map/Defaults.java

Print this page
rev 8947 : 8030016: HashMap.computeIfAbsent generates spurious access event
Reviewed-by: duke

*** 78,116 **** --- 78,124 ---- assertNull(map.getOrDefault(EXTRA_KEY, null), "null not returned as default"); } @Test(dataProvider = "Map<IntegerEnum,String> rw=true keys=withNull values=withNull") public void testPutIfAbsentNulls(String description, Map<IntegerEnum, String> map) { + // null -> null assertTrue(map.containsKey(null), "null key absent"); assertNull(map.get(null), "value not null"); assertNull(map.putIfAbsent(null, EXTRA_VALUE), "previous not null"); + // null -> EXTRA_VALUE assertTrue(map.containsKey(null), "null key absent"); assertSame(map.get(null), EXTRA_VALUE, "unexpected value"); assertSame(map.putIfAbsent(null, null), EXTRA_VALUE, "previous not expected value"); assertTrue(map.containsKey(null), "null key absent"); assertSame(map.get(null), EXTRA_VALUE, "unexpected value"); assertSame(map.remove(null), EXTRA_VALUE, "removed unexpected value"); + // null -> <absent> assertFalse(map.containsKey(null), description + ": key present after remove"); assertNull(map.putIfAbsent(null, null), "previous not null"); + // null -> null assertTrue(map.containsKey(null), "null key absent"); assertNull(map.get(null), "value not null"); assertNull(map.putIfAbsent(null, EXTRA_VALUE), "previous not null"); assertSame(map.get(null), EXTRA_VALUE, "value not expected"); } @Test(dataProvider = "Map<IntegerEnum,String> rw=true keys=all values=all") public void testPutIfAbsent(String description, Map<IntegerEnum, String> map) { + // 1 -> 1 assertTrue(map.containsKey(KEYS[1])); Object expected = map.get(KEYS[1]); assertTrue(null == expected || expected == VALUES[1]); assertSame(map.putIfAbsent(KEYS[1], EXTRA_VALUE), expected); assertSame(map.get(KEYS[1]), expected); + // EXTRA_KEY -> <absent> assertFalse(map.containsKey(EXTRA_KEY)); assertSame(map.putIfAbsent(EXTRA_KEY, EXTRA_VALUE), null); assertSame(map.get(EXTRA_KEY), EXTRA_VALUE); + assertSame(map.putIfAbsent(EXTRA_KEY, VALUES[2]), EXTRA_VALUE); + assertSame(map.get(EXTRA_KEY), EXTRA_VALUE); } @Test(dataProvider = "Map<IntegerEnum,String> rw=all keys=all values=all") public void testForEach(String description, Map<IntegerEnum, String> map) { IntegerEnum[] EACH_KEY = new IntegerEnum[map.size()];
*** 266,292 **** assertSame(map.get(EXTRA_KEY), EXTRA_VALUE); } @Test(dataProvider = "Map<IntegerEnum,String> rw=true keys=withNull values=withNull") public void testComputeIfAbsentNulls(String description, Map<IntegerEnum, String> map) { assertTrue(map.containsKey(null), "null key absent"); assertNull(map.get(null), "value not null"); ! assertSame(map.computeIfAbsent(null, (k) -> EXTRA_VALUE), EXTRA_VALUE, description); ! assertSame(map.get(null), EXTRA_VALUE, description); } @Test(dataProvider = "Map<IntegerEnum,String> rw=true keys=all values=all") public void testComputeIfAbsent(String description, Map<IntegerEnum, String> map) { assertTrue(map.containsKey(KEYS[1])); Object expected = map.get(KEYS[1]); assertTrue(null == expected || expected == VALUES[1], description + String.valueOf(expected)); expected = (null == expected) ? EXTRA_VALUE : expected; assertSame(map.computeIfAbsent(KEYS[1], (k) -> EXTRA_VALUE), expected, description); assertSame(map.get(KEYS[1]), expected, description); assertFalse(map.containsKey(EXTRA_KEY)); assertSame(map.computeIfAbsent(EXTRA_KEY, (k) -> EXTRA_VALUE), EXTRA_VALUE); assertSame(map.get(EXTRA_KEY), EXTRA_VALUE); } @Test(dataProvider = "Map<IntegerEnum,String> rw=true keys=all values=all") public void testComputeIfAbsentNullFunction(String description, Map<IntegerEnum, String> map) { --- 274,318 ---- assertSame(map.get(EXTRA_KEY), EXTRA_VALUE); } @Test(dataProvider = "Map<IntegerEnum,String> rw=true keys=withNull values=withNull") public void testComputeIfAbsentNulls(String description, Map<IntegerEnum, String> map) { + // null -> null + assertTrue(map.containsKey(null), "null key absent"); + assertNull(map.get(null), "value not null"); + assertSame(map.computeIfAbsent(null, (k) -> null), null, "not expected result"); assertTrue(map.containsKey(null), "null key absent"); assertNull(map.get(null), "value not null"); ! assertSame(map.computeIfAbsent(null, (k) -> EXTRA_VALUE), EXTRA_VALUE, "not mapped to result"); ! // null -> EXTRA_VALUE ! assertTrue(map.containsKey(null), "null key absent"); ! assertSame(map.get(null), EXTRA_VALUE, "not expected value"); ! assertSame(map.remove(null), EXTRA_VALUE, "removed unexpected value"); ! // null -> <absent> ! assertFalse(map.containsKey(null), "null key present"); ! assertSame(map.computeIfAbsent(null, (k) -> EXTRA_VALUE), EXTRA_VALUE, "not mapped to result"); ! // null -> EXTRA_VALUE ! assertTrue(map.containsKey(null), "null key absent"); ! assertSame(map.get(null), EXTRA_VALUE, "not expected value"); } @Test(dataProvider = "Map<IntegerEnum,String> rw=true keys=all values=all") public void testComputeIfAbsent(String description, Map<IntegerEnum, String> map) { + // 1 -> 1 assertTrue(map.containsKey(KEYS[1])); Object expected = map.get(KEYS[1]); assertTrue(null == expected || expected == VALUES[1], description + String.valueOf(expected)); expected = (null == expected) ? EXTRA_VALUE : expected; assertSame(map.computeIfAbsent(KEYS[1], (k) -> EXTRA_VALUE), expected, description); assertSame(map.get(KEYS[1]), expected, description); + // EXTRA_KEY -> <absent> + assertFalse(map.containsKey(EXTRA_KEY)); + assertNull(map.computeIfAbsent(EXTRA_KEY, (k) -> null)); assertFalse(map.containsKey(EXTRA_KEY)); assertSame(map.computeIfAbsent(EXTRA_KEY, (k) -> EXTRA_VALUE), EXTRA_VALUE); + // EXTRA_KEY -> EXTRA_VALUE assertSame(map.get(EXTRA_KEY), EXTRA_VALUE); } @Test(dataProvider = "Map<IntegerEnum,String> rw=true keys=all values=all") public void testComputeIfAbsentNullFunction(String description, Map<IntegerEnum, String> map) {