Quellcode durchsuchen

Fix compact fastmaps not returning null on invalid property values

malte0811 vor 4 Jahren
Ursprung
Commit
03c2765136

+ 11 - 2
common/src/main/java/malte0811/ferritecore/fastmap/BinaryFastMapKey.java

@@ -33,13 +33,22 @@ public class BinaryFastMapKey<T extends Comparable<T>> extends FastMapKey<T> {
 
     @Override
     public int replaceIn(int mapIndex, T newValue) {
+        final int newPartialIndex = toPartialMapIndex(newValue);
+        if (newPartialIndex < 0) {
+            return -1;
+        }
         final int keepMask = ~lowestNBits(firstBitAfterValue) | lowestNBits(firstBitInValue);
-        return (keepMask & mapIndex) | toPartialMapIndex(newValue);
+        return (keepMask & mapIndex) | newPartialIndex;
     }
 
     @Override
     public int toPartialMapIndex(Comparable<?> value) {
-        return getInternalIndex(value) << firstBitInValue;
+        final int internalIndex = getInternalIndex(value);
+        if (internalIndex < 0 || internalIndex >= numValues()) {
+            return -1;
+        } else {
+            return internalIndex << firstBitInValue;
+        }
     }
 
     @Override

+ 12 - 0
common/src/test/java/malte0811/ferritecore/fastmap/FastMapTest.java

@@ -37,6 +37,11 @@ public class FastMapTest {
         return forEachType(TestData::testBasic);
     }
 
+    @TestFactory
+    public Stream<DynamicTest> testWithInvalid() {
+        return forEachType(TestData::testWithInvalid);
+    }
+
     @TestFactory
     public Stream<DynamicTest> testWith() {
         return forEachType(TestData::testWith);
@@ -129,6 +134,13 @@ public class FastMapTest {
             }
         }
 
+        private void testWithInvalid() {
+            for (Map<Property<?>, Comparable<?>> baseMap : values.keySet()) {
+                final int baseIndex = map.getIndexOf(baseMap);
+                Assertions.assertNull(map.with(baseIndex, INT, 8));
+            }
+        }
+
         private <T extends Comparable<T>>
         void testSwaps(int baseIndex, Property<T> toSwap, Map<Property<?>, Comparable<?>> baseMap) {
             Map<Property<?>, Comparable<?>> expected = new HashMap<>(baseMap);