From 17fe0f4bca746d3f94335585c5ce8a757edfa8cc Mon Sep 17 00:00:00 2001 From: Florian Habermann Date: Mon, 5 Oct 2026 13:37:50 +0200 Subject: [PATCH] Fix HashMapIdObject.toString() on an empty map toString() always deleted the trailing ", " separator and replaced the last char with '}'. On an empty map the buffer only held "{", so deleteLast() emptied it and setLast() threw StringIndexOutOfBoundsException. An empty map now returns "{}". --- .../collections/HashMapIdObject.java | 5 ++ .../collections/HashMapIdObjectTest.java | 46 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 integration-tests/src/test/java/org/eclipse/serializer/collections/HashMapIdObjectTest.java diff --git a/base/src/main/java/org/eclipse/serializer/collections/HashMapIdObject.java b/base/src/main/java/org/eclipse/serializer/collections/HashMapIdObject.java index 6d7bd121..e726c053 100644 --- a/base/src/main/java/org/eclipse/serializer/collections/HashMapIdObject.java +++ b/base/src/main/java/org/eclipse/serializer/collections/HashMapIdObject.java @@ -296,6 +296,11 @@ public final int iterateValues(final Consumer procedure) @Override public final String toString() { + if(this.size == 0) + { + return "{}"; + } + final VarString vc = VarString.New().add('{'); for(Entry entry : this.hashSlots) { diff --git a/integration-tests/src/test/java/org/eclipse/serializer/collections/HashMapIdObjectTest.java b/integration-tests/src/test/java/org/eclipse/serializer/collections/HashMapIdObjectTest.java new file mode 100644 index 00000000..64022f01 --- /dev/null +++ b/integration-tests/src/test/java/org/eclipse/serializer/collections/HashMapIdObjectTest.java @@ -0,0 +1,46 @@ +package org.eclipse.serializer.collections; + +/*- + * #%L + * Eclipse Serializer Integration Tests + * %% + * Copyright (C) 2023 - 2026 MicroStream Software + * %% + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * #L% + */ + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class HashMapIdObjectTest +{ + @Test + void toString_emptyMap() + { + // regression: threw StringIndexOutOfBoundsException + assertEquals("{}", HashMapIdObject.New().toString()); + } + + @Test + void toString_singleEntry() + { + final HashMapIdObject map = HashMapIdObject.New(); + map.add(1L, "a"); + assertEquals("{1 -> a}", map.toString()); + } + + @Test + void toString_afterClear() + { + final HashMapIdObject map = HashMapIdObject.New(); + map.add(1L, "a"); + map.clear(); + assertEquals("{}", map.toString()); + } +}