From 6b3b5fea2fa871f686344a1e9f80faba92641162 Mon Sep 17 00:00:00 2001 From: Berack96 Date: Wed, 12 Feb 2025 21:22:26 +0100 Subject: [PATCH] Add toString method for Distribution class and unit tests for various distributions --- .../berack/upo/valpre/rand/Distribution.java | 30 +++++++++++++++++++ .../upo/valpre/sim/TestInteractions.java | 21 +++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/main/java/net/berack/upo/valpre/rand/Distribution.java b/src/main/java/net/berack/upo/valpre/rand/Distribution.java index be4e43b..bcda65d 100644 --- a/src/main/java/net/berack/upo/valpre/rand/Distribution.java +++ b/src/main/java/net/berack/upo/valpre/rand/Distribution.java @@ -32,6 +32,36 @@ public interface Distribution { return sample; } + /** + * Returns a string representation of the distribution. + * In case the distribution is null, an empty string is returned. + * + * @param distribution The distribution to represent. + * @return A string representation of the distribution. + * @throws IllegalArgumentException if the field cannot be accessed + * @throws IllegalAccessException if the field cannot be accessed + */ + public static String toString(Distribution distribution) throws IllegalArgumentException, IllegalAccessException { + if (distribution == null) + return ""; + + var builder = new StringBuilder(); + var dist = distribution.getClass(); + + builder.append(dist.getSimpleName()).append('('); + for (var param : dist.getFields()) { + var paramValue = param.get(distribution); + var str = paramValue instanceof Distribution + ? toString((Distribution) paramValue) + : paramValue; + + builder.append(str).append(", "); + } + + builder.delete(builder.length() - 2, builder.length()).append(')'); + return builder.toString(); + } + /** * Represents an exponential distribution. */ diff --git a/src/test/java/net/berack/upo/valpre/sim/TestInteractions.java b/src/test/java/net/berack/upo/valpre/sim/TestInteractions.java index df46f22..ee929af 100644 --- a/src/test/java/net/berack/upo/valpre/sim/TestInteractions.java +++ b/src/test/java/net/berack/upo/valpre/sim/TestInteractions.java @@ -8,6 +8,27 @@ import net.berack.upo.valpre.rand.Distribution; public class TestInteractions { + @Test + public void distributionToString() throws Exception { + var exp = new Distribution.Exponential(1.0); + assertEquals("Exponential(1.0)", Distribution.toString(exp)); + + var uniform = new Distribution.Uniform(0.0, 1.0); + assertEquals("Uniform(0.0, 1.0)", Distribution.toString(uniform)); + + var erlang = new Distribution.Erlang(2, 1.0); + assertEquals("Erlang(2, 1.0)", Distribution.toString(erlang)); + + var normal = new Distribution.Normal(3.2, 0.6); + assertEquals("Normal(3.2, 0.6)", Distribution.toString(normal)); + + var normalBoxMuller = new Distribution.NormalBoxMuller(3.2, 0.6); + assertEquals("NormalBoxMuller(3.2, 0.6)", Distribution.toString(normalBoxMuller)); + + var unavailable = new Distribution.UnavailableTime(0.1, exp); + assertEquals("UnavailableTime(0.1, Exponential(1.0))", Distribution.toString(unavailable)); + } + @Test public void netToString() { var net = new Net();