diff --git a/opc-ua-stack/stack-core/src/main/java/org/eclipse/milo/opcua/stack/core/types/builtin/StatusCode.java b/opc-ua-stack/stack-core/src/main/java/org/eclipse/milo/opcua/stack/core/types/builtin/StatusCode.java index a15efc477d..f883dbd833 100644 --- a/opc-ua-stack/stack-core/src/main/java/org/eclipse/milo/opcua/stack/core/types/builtin/StatusCode.java +++ b/opc-ua-stack/stack-core/src/main/java/org/eclipse/milo/opcua/stack/core/types/builtin/StatusCode.java @@ -15,6 +15,7 @@ import java.util.StringJoiner; import org.eclipse.milo.opcua.stack.core.StatusCodes; import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger; +import org.jspecify.annotations.NonNull; public record StatusCode(long value) { @@ -161,11 +162,13 @@ public Optional getDataValueInfoBits() { } @Override - public String toString() { - return new StringJoiner(", ", StatusCode.class.getSimpleName() + "[", "]") - .add("value=0x%08X".formatted(value)) - .add("quality=" + quality(this)) - .toString(); + public @NonNull String toString() { + var joiner = new StringJoiner(", ", StatusCode.class.getSimpleName() + "[", "]"); + + StatusCodes.lookup(value).ifPresent(nameAndDesc -> joiner.add("name=" + nameAndDesc[0])); + joiner.add("value=0x%08X".formatted(value)).add("quality=" + quality(this)); + + return joiner.toString(); } /** diff --git a/opc-ua-stack/stack-core/src/test/java/org/eclipse/milo/opcua/stack/core/StatusCodesTest.java b/opc-ua-stack/stack-core/src/test/java/org/eclipse/milo/opcua/stack/core/StatusCodesTest.java index 394ca2f2f5..648508fdb2 100644 --- a/opc-ua-stack/stack-core/src/test/java/org/eclipse/milo/opcua/stack/core/StatusCodesTest.java +++ b/opc-ua-stack/stack-core/src/test/java/org/eclipse/milo/opcua/stack/core/StatusCodesTest.java @@ -83,6 +83,13 @@ void infoBitsDataValueWithOverflow() { @Test void toStringValue() { - assertEquals("StatusCode[value=0x00000000, quality=good]", StatusCode.GOOD.toString()); + assertEquals( + "StatusCode[name=Good, value=0x00000000, quality=good]", StatusCode.GOOD.toString()); + assertEquals( + "StatusCode[name=Uncertain_InitialValue, value=0x40920000, quality=uncertain]", + new StatusCode(StatusCodes.Uncertain_InitialValue).toString()); + assertEquals( + "StatusCode[name=Bad_InternalError, value=0x80020000, quality=bad]", + new StatusCode(StatusCodes.Bad_InternalError).toString()); } }