blob: e3c4ad12249831894ec26e84002604033054bc72 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package libcore.java.util;
import java.util.HashMap;
import java.util.Map;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.fail;
public class MapDefaultMethodTester {
private MapDefaultMethodTester() {}
public static void test_getOrDefault(Map<Integer, Double> m, boolean acceptsNullKey,
boolean acceptsNullValue) {
// Unmapped key
assertEquals(-1.0, m.getOrDefault(1, -1.0));
// Mapped key
m.put(1, 11.0);
assertEquals(11.0, m.getOrDefault(1, -1.0));
// Check for null value
if (acceptsNullValue) {
m.put(1, null);
assertEquals(null, m.getOrDefault(1, -1.0));
}
// Check for null key
if (acceptsNullKey) {
m.put(null, 1.0);
assertEquals(1.0, m.getOrDefault(null, -1.0));
}
}
public static void test_forEach(Map<Integer, Double> m) {
Map<Integer, Double> replica = new HashMap<>();
m.put(1, 10.0);
m.put(2, 20.0);
m.forEach(replica::put);
assertEquals(10.0, replica.get(1));
assertEquals(20.0, replica.get(2));
assertEquals(2, replica.size());
// Null pointer exception for empty function
try {
m.forEach(null);
} catch (NullPointerException expected) {
}
}
public static void test_putIfAbsent(Map<Integer, Double> m, boolean acceptsNullKey,
boolean acceptsNullValue) {
// For unmapped key
assertNull(m.putIfAbsent(1, 1.0));
assertEquals(1.0, m.getOrDefault(1, -1.0));
// For already mapped key
m.put(1, 1.0);
assertEquals(1.0, m.putIfAbsent(1, 2.0));
assertEquals(1.0, m.getOrDefault(1, -1.0));
if (acceptsNullValue) {
m.put(1, null);
assertNull(m.putIfAbsent(1, 1.0));
assertEquals(1.0, m.getOrDefault(1, -1.0));
m.remove(1);
assertNull(m.putIfAbsent(1, null));
assertNull(m.getOrDefault(1, -1.0));
} else {
try {
m.remove(1);
m.putIfAbsent(1, null);
fail();
} catch (NullPointerException expected) {
}
}
if (acceptsNullKey) {
m.put(null, 1.0);
assertEquals(1.0, m.putIfAbsent(null, 5.0));
assertEquals(1.0, m.getOrDefault(null, -1.0));
} else {
try {
m.putIfAbsent(null, 1.0);
fail();
} catch (NullPointerException expected) {
}
}
}
public static void test_remove(Map<Integer, Double> m, boolean acceptsNullKey,
boolean acceptsNullValue) {
// For unmapped key
assertFalse(m.remove(1, 1.0));
// mapped key with the wrong value
m.put(1, 1.0);
assertFalse(m.remove(1, 2.0));
assertTrue(m.containsKey(1));
// mapped key with the correct value
assertTrue(m.remove(1, 1.0));
assertFalse(m.containsKey(1));
// Check for null key and value
if (acceptsNullValue) {
m.put(1, null);
assertTrue(m.remove(1, null));
assertFalse(m.containsKey(1));
}
if (acceptsNullKey) {
m.put(null, 1.0);
assertTrue(m.remove(null, 1.0));
assertFalse(m.containsKey(null));
} else {
try {
m.remove(null, 1.0);
fail();
} catch (NullPointerException expected) {}
}
}
public static void test_replace$K$V$V(Map<Integer, Double> m, boolean acceptsNullKey,
boolean acceptsNullValue) {
// For unmapped key
assertFalse(m.replace(1, 1.0, 2.0));
assertFalse(m.containsKey(1));
// For mapped key and wrong value
m.put(1, 1.0);
assertFalse(m.replace(1, 2.0, 2.0));
assertEquals(1.0, m.getOrDefault(1, -1.0));
// For mapped key and correct value
m.put(1, 1.0);
assertTrue(m.replace(1, 1.0, 2.0));
assertEquals(2.0, m.getOrDefault(1, -1.0));
if (acceptsNullKey) {
m.put(null, 1.0);
assertTrue(m.replace(null, 1.0, 2.0));
assertEquals(2.0, m.getOrDefault(null, -1.0));
} else {
try {
m.replace(null, 1.0, 2.0);
fail();
} catch (NullPointerException expected) {}
}
if (acceptsNullValue) {
m.put(1, null);
assertTrue(m.replace(1, null, 1.0));
assertEquals(1.0, m.getOrDefault(1, -1.0));
} else {
try {
m.put(1, 1.0);
m.replace(1, 1.0, null);
fail();
} catch (NullPointerException expected) {}
}
}
public static void test_replace$K$V(Map<Integer, Double> m, boolean acceptsNullKey,
boolean acceptsNullValue) {
// For unmapped key
assertNull(m.replace(1, 1.0));
assertFalse(m.containsKey(1));
// For already mapped key
m.put(1, 1.0);
assertEquals(1.0, m.replace(1, 2.0));
assertEquals(2.0, m.getOrDefault(1, -1.0));
if (acceptsNullValue) {
m.put(1, 1.0);
assertEquals(1.0, m.replace(1, null));
assertNull(m.getOrDefault(1, -1.0));
} else {
try {
m.put(1, 5.0);
m.replace(1, null);
fail();
} catch (NullPointerException expected) {}
}
if (acceptsNullKey) {
m.put(null, 1.0);
assertEquals(1.0, m.replace(null, 2.0));
assertEquals(2.0, m.getOrDefault(null, -1.0));
} else {
try {
m.replace(null, 5.0);
fail();
} catch (NullPointerException expected) {}
}
}
public static void test_computeIfAbsent(Map<Integer, Double> m, boolean acceptsNullKey,
boolean acceptsNullValue) {
// For unmapped key
assertEquals(5.0, m.computeIfAbsent(1, (k) -> 5.0 * k));
assertEquals(5.0, m.getOrDefault(1, -1.0));
// For already mapped key
m.put(1, 1.0);
assertEquals(1.0, m.computeIfAbsent(1, k -> 6.0 * k));
assertEquals(1.0, m.getOrDefault(1, -1.0));
// If mapping function returns null for a mapped key
m.put(1, 1.0);
assertEquals(1.0, m.computeIfAbsent(1, k -> null));
assertEquals(1.0, m.getOrDefault(1, -1.0));
// If mapping function returns null for an unmapped key
assertNull(m.computeIfAbsent(100, k-> null));
// If mapping function is null
try {
m.computeIfAbsent(1, null);
fail();
} catch (NullPointerException expected) {}
if (acceptsNullValue) {
// For key associated to a null value
m.put(1, null);
assertEquals(1.0, m.computeIfAbsent(1, k -> 1.0));
assertEquals(1.0, m.getOrDefault(1, -1.0));
}
if (acceptsNullKey) {
m.put(null, 1.0);
assertEquals(1.0, m.computeIfAbsent(null, (k) -> 5.0 * k));
} else {
try {
m.computeIfAbsent(null, k -> 5.0);
fail();
} catch (NullPointerException expected) {}
}
}
public static void test_computeIfPresent(Map<Integer, Double> m, boolean acceptsNullKey) {
// For an unmapped key
assertNull(m.computeIfPresent(1, (k, v) -> 5.0 * k + v));
// For a mapped key
m.put(1, 5.0);
assertEquals(11.0, m.computeIfPresent(1, (k, v) -> 6.0 * k + v));
assertEquals(11.0, m.getOrDefault(1, -1.0));
// If the remapping function returns null
assertNull(m.computeIfPresent(1, (k, v) -> null));
assertFalse(m.containsKey(1));
// If the remapping function is null
try {
m.computeIfPresent(1, null);
} catch (NullPointerException expected) {}
if (acceptsNullKey) {
m.put(null, 1.0);
assertEquals(1.0, m.computeIfPresent(null, (k, v) -> v));
} else {
try {
m.computeIfPresent(null, (k, v) -> 5.0);
} catch (NullPointerException expected) {}
}
}
public static void test_compute(Map<Integer, Double> m, boolean acceptsNullKey) {
// For unmapped key
assertEquals(5.0, m.compute(1, (k, v) -> 5.0));
assertEquals(5.0, m.getOrDefault(1, -1.0));
// For already mapped key
m.put(1, 10.0);
assertEquals(11.0, m.compute(1, (k, v) -> k + v));
assertEquals(11.0, m.getOrDefault(1, -1.0));
// If the remapping function returns null
assertNull(m.compute(1, (k, v) -> null));
assertFalse(m.containsKey(1));
// If the remapping function is null
try {
m.compute(1, null);
fail();
} catch (NullPointerException expected) {}
if (acceptsNullKey) {
assertEquals(10.0, m.compute(null, (k, v) -> 10.0));
assertEquals(10.0, m.getOrDefault(null, -1.0));
} else {
try {
m.compute(null, (k, v) -> 5.0);
fail();
} catch (NullPointerException expected) {
}
}
}
public static void test_merge(Map<Integer, Double> m, boolean acceptsNullKey) {
// Checking for unmapped key
assertEquals(10.0, m.merge(1, 10.0, (v1, v2) -> v2));
assertEquals(10.0, m.getOrDefault(1, -1.0));
// Checking for already mapped key
m.put(1, 10.0);
assertEquals(25.0, m.merge(1, 15.0, (v1, v2) -> v1 + v2));
assertEquals(25.0, m.getOrDefault(1, -1.0));
// If lambda function returns null
m.put(1, 10.0);
m.merge(1, 10.0, (k, v) -> null);
assertFalse(m.containsKey(1));
// If the remapping function is null
try {
m.merge(1, 5.0, null);
fail();
} catch (NullPointerException expected) {}
if (acceptsNullKey) {
m.put(null, 1.0);
assertEquals(15.0, m.merge(null, 15.0, (v1, v2) -> v2));
assertEquals(15.0, m.getOrDefault(null, -1.0));
} else {
try {
m.merge(null, 15.0, (v1, v2) -> v2);
fail();
} catch (NullPointerException expected) {}
}
}
}