This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-collections.git


The following commit(s) were added to refs/heads/master by this push:
     new 08b4cdb88 Refactor tests to allow more flexibility in subclasses
08b4cdb88 is described below

commit 08b4cdb8841a7bfb172bd750eef17ceac59ba968
Author: Gary Gregory <[email protected]>
AuthorDate: Thu Oct 3 11:32:18 2024 -0400

    Refactor tests to allow more flexibility in subclasses
    
    For Apache Commons BeanUtils bean map tests
---
 .../commons/collections4/map/AbstractMapTest.java  | 82 +++++++++++++++-------
 1 file changed, 56 insertions(+), 26 deletions(-)

diff --git 
a/src/test/java/org/apache/commons/collections4/map/AbstractMapTest.java 
b/src/test/java/org/apache/commons/collections4/map/AbstractMapTest.java
index f8aac17c8..b3faa0133 100644
--- a/src/test/java/org/apache/commons/collections4/map/AbstractMapTest.java
+++ b/src/test/java/org/apache/commons/collections4/map/AbstractMapTest.java
@@ -40,6 +40,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
 import java.util.function.Supplier;
 
 import org.apache.commons.collections4.AbstractObjectTest;
@@ -598,6 +599,17 @@ public abstract class AbstractMapTest<M extends Map<K, V>, 
K, V> extends Abstrac
         return new TestMapValues();
     }
 
+    /**
+     * Subclasses can override for special cases, like Apache Commons 
BeanUtils.
+     *
+     * @param key             See @{link {@link Map#computeIfAbsent(Object, 
Function)}.
+     * @param mappingFunction See @{link {@link Map#computeIfAbsent(Object, 
Function)}.
+     * @return See @{link {@link Map#computeIfAbsent(Object, Function)}.
+     */
+    protected V computeIfAbsent(final K key, final Function<? super K, ? 
extends V> mappingFunction) {
+        return getMap().computeIfAbsent(key, mappingFunction);
+    }
+
     @SuppressWarnings("unchecked")
     protected <E> List<E> getAsList(final Object[] o) {
         final ArrayList<E> result = new ArrayList<>();
@@ -787,15 +799,15 @@ public abstract class AbstractMapTest<M extends Map<K, 
V>, K, V> extends Abstrac
         return false;
     }
 
-    protected boolean isLazyMapTest() {
-        return false;
-    }
-
     // tests begin here. Each test adds a little bit of tested functionality.
     // Many methods assume previous methods passed. That is, they do not
     // exhaustively recheck things that have already been checked in a previous
     // test methods.
 
+    protected boolean isLazyMapTest() {
+        return false;
+    }
+
     /**
      * Returns true if the maps produced by {@link #makeObject()} and {@link 
#makeFullMap()} support the {@link Map#put(Object, Object)} and
      * {@link Map#putAll(Map)} operations adding new mappings.
@@ -914,6 +926,17 @@ public abstract class AbstractMapTest<M extends Map<K, V>, 
K, V> extends Abstrac
     @Override
     public abstract M makeObject();
 
+    /**
+     * Subclasses can override for special cases, like Apache Commons 
BeanUtils.
+     *
+     * @param key   See @{link {@link Map#putIfAbsent(Object, Object)}.
+     * @param value See @{link {@link Map#putIfAbsent(Object, Object)}.
+     * @return See @{link {@link Map#putIfAbsent(Object, Object)}.
+     */
+    protected V putIfAbsent(final K key, final V value) {
+        return getMap().putIfAbsent(key, value);
+    }
+
     /**
      * Resets the {@link #map}, {@link #entrySet}, {@link #keySet}, {@link 
#values} and {@link #confirmed} fields to empty.
      */
@@ -1403,7 +1426,7 @@ public abstract class AbstractMapTest<M extends Map<K, 
V>, K, V> extends Abstrac
                 final V value = values[i];
                 final boolean expectKey = key != null && value != null || key 
== null && !getMap().containsKey(key);
                 final Map<K, V> oldMap = new HashMap<>(getMap());
-                final Object currValue = getMap().computeIfAbsent(key, k -> 
value);
+                final Object currValue = computeIfAbsent(key, k -> value);
                 // map is updated if new value is not null
                 getConfirmed().computeIfAbsent(key, k -> value);
                 if (!isLazyMapTest()) {
@@ -1431,7 +1454,7 @@ public abstract class AbstractMapTest<M extends Map<K, 
V>, K, V> extends Abstrac
                     final boolean valueAlreadyPresent = 
getMap().containsValue(value);
                     final V prevValue = getMap().get(key);
                     final Map<K, V> oldMap = new HashMap<>(getMap());
-                    final Object computedValue = getMap().computeIfAbsent(key, 
k -> value);
+                    final Object computedValue = computeIfAbsent(key, k -> 
value);
                     getConfirmed().computeIfAbsent(key, k -> value);
                     if (!isLazyMapTest()) {
                         // TODO LazyMap tests do not like this check
@@ -1471,7 +1494,7 @@ public abstract class AbstractMapTest<M extends Map<K, 
V>, K, V> extends Abstrac
             } else {
                 try {
                     // two possible exception here, either valid
-                    getMap().computeIfAbsent(keys[0], k -> newValues[0]);
+                    computeIfAbsent(keys[0], k -> newValues[0]);
                     fail("Expected IllegalArgumentException or 
UnsupportedOperationException on putIfAbsent (change)");
                 } catch (final IllegalArgumentException | 
UnsupportedOperationException ex) {
                     // ignore
@@ -1480,7 +1503,7 @@ public abstract class AbstractMapTest<M extends Map<K, 
V>, K, V> extends Abstrac
         } else if (isPutChangeSupported()) {
             resetEmpty();
             try {
-                getMap().computeIfAbsent(keys[0], k -> values[0]);
+                computeIfAbsent(keys[0], k -> values[0]);
                 fail("Expected UnsupportedOperationException or 
IllegalArgumentException on putIfAbsent (add) when fixed size");
             } catch (final IllegalArgumentException | 
UnsupportedOperationException ex) {
                 // ignore
@@ -1656,14 +1679,12 @@ public abstract class AbstractMapTest<M extends Map<K, 
V>, K, V> extends Abstrac
                     }
                 }
             }
+        } else if (getMap().containsKey(keys[0])) {
+            assertThrows(UnsupportedOperationException.class, () -> 
getMap().computeIfPresent(keys[0], (k, v) -> values[0]),
+                    "Expected UnsupportedOperationException on put (add)");
         } else {
-            if (getMap().containsKey(keys[0])) {
-                assertThrows(UnsupportedOperationException.class, () -> 
getMap().computeIfPresent(keys[0], (k, v) -> values[0]),
-                        "Expected UnsupportedOperationException on put (add)");
-            } else {
-                // doesn't throw
-                getMap().computeIfPresent(keys[0], (k, v) -> values[0]);
-            }
+            // doesn't throw
+            getMap().computeIfPresent(keys[0], (k, v) -> values[0]);
         }
     }
 
@@ -1981,7 +2002,7 @@ public abstract class AbstractMapTest<M extends Map<K, 
V>, K, V> extends Abstrac
             for (int i = 0; i < keys.length; i++) {
                 final K key = keys[i];
                 final V value = values[i];
-                final Object o = getMap().putIfAbsent(key, value);
+                final Object o = putIfAbsent(key, value);
                 getConfirmed().putIfAbsent(key, value);
                 verify();
                 assertNull(o, "First map.putIfAbsent should return null");
@@ -1995,7 +2016,7 @@ public abstract class AbstractMapTest<M extends Map<K, 
V>, K, V> extends Abstrac
                     final V newValue = newValues[i];
                     final boolean newValueAlready = 
getMap().containsValue(newValue);
                     final V prevValue = getMap().get(key);
-                    final Object oldValue = getMap().putIfAbsent(key, 
newValue);
+                    final Object oldValue = putIfAbsent(key, newValue);
                     getConfirmed().putIfAbsent(key, newValue);
                     verify();
                     final V arrValue = values[i];
@@ -2023,7 +2044,7 @@ public abstract class AbstractMapTest<M extends Map<K, 
V>, K, V> extends Abstrac
             } else {
                 try {
                     // two possible exception here, either valid
-                    getMap().putIfAbsent(keys[0], newValues[0]);
+                    putIfAbsent(keys[0], newValues[0]);
                     fail("Expected IllegalArgumentException or 
UnsupportedOperationException on putIfAbsent (change)");
                 } catch (final IllegalArgumentException | 
UnsupportedOperationException ex) {
                     // ignore
@@ -2031,11 +2052,21 @@ public abstract class AbstractMapTest<M extends Map<K, 
V>, K, V> extends Abstrac
             }
         } else if (isPutChangeSupported()) {
             resetEmpty();
-            try {
-                getMap().putIfAbsent(keys[0], values[0]);
-                fail("Expected UnsupportedOperationException or 
IllegalArgumentException on putIfAbsent (add) when fixed size");
-            } catch (final IllegalArgumentException | 
UnsupportedOperationException ex) {
-                // ignore
+            final K key0 = keys[0];
+            final V value0 = values[0];
+            if (getMap().containsKey(key0)) {
+                // don't throw
+                assertEquals(getMap().get(key0), putIfAbsent(key0, value0));
+            } else if (isPutAddSupported()) {
+                putIfAbsent(key0, value0);
+            } else {
+                // throw (fixed size for example)
+                try {
+                    putIfAbsent(key0, value0);
+                    fail("Expected UnsupportedOperationException or 
IllegalArgumentException on putIfAbsent (add) when fixed size");
+                } catch (final IllegalArgumentException | 
UnsupportedOperationException ex) {
+                    // ignore
+                }
             }
             resetFull();
             int i = 0;
@@ -2044,7 +2075,7 @@ public abstract class AbstractMapTest<M extends Map<K, 
V>, K, V> extends Abstrac
                 final V newValue = newValues[i];
                 final boolean newValueAlready = 
getMap().containsValue(newValue);
                 final V prevValue = getMap().get(key);
-                final V oldValue = getMap().putIfAbsent(key, newValue);
+                final V oldValue = putIfAbsent(key, newValue);
                 final V value = getConfirmed().putIfAbsent(key, newValue);
                 verify();
                 assertEquals(value, oldValue, "Map.putIfAbsent should return 
previous value when changed");
@@ -2067,8 +2098,7 @@ public abstract class AbstractMapTest<M extends Map<K, 
V>, K, V> extends Abstrac
                 }
             }
         } else {
-            assertThrows(UnsupportedOperationException.class, () -> 
getMap().putIfAbsent(keys[0], values[0]),
-                    "Expected UnsupportedOperationException on put (add)");
+            assertThrows(UnsupportedOperationException.class, () -> 
putIfAbsent(keys[0], values[0]), "Expected UnsupportedOperationException on put 
(add)");
         }
     }
 

Reply via email to