From 08f091d232e6b6dd379ea7ccdbdf5b8fe4d6a03d Mon Sep 17 00:00:00 2001 From: hneemann Date: Sun, 7 Mar 2021 12:12:23 +0100 Subject: [PATCH] preserves the test case seed value during a debug session, closes #675 --- src/main/java/de/neemann/digital/gui/Main.java | 3 +++ .../digital/testing/TestCaseDescription.java | 15 +++++++++++++++ .../de/neemann/digital/testing/parser/Parser.java | 11 ++++++++++- .../digital/testing/parser/functions/Random.java | 14 +++++++++++++- 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index e877ec8e2..258fc6311 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -1194,6 +1194,9 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS if (tsl.isEmpty()) throw new TestingDataException(Lang.get("err_noTestData")); + for (Circuit.TestCase tc : tsl) + tc.getTestCaseDescription().setNewSeed(); + windowPosManager.register("testResult", new ValueTableDialog(Main.this, Lang.get("msg_testResult")) .addTestResult(tsl, circuitComponent.getCircuit(), library)) .setVisible(true); diff --git a/src/main/java/de/neemann/digital/testing/TestCaseDescription.java b/src/main/java/de/neemann/digital/testing/TestCaseDescription.java index 03e89f944..e0f4bd286 100644 --- a/src/main/java/de/neemann/digital/testing/TestCaseDescription.java +++ b/src/main/java/de/neemann/digital/testing/TestCaseDescription.java @@ -7,6 +7,7 @@ package de.neemann.digital.testing; import de.neemann.digital.lang.Lang; import de.neemann.digital.testing.parser.*; +import de.neemann.digital.testing.parser.functions.Random; import java.io.IOException; import java.util.ArrayList; @@ -20,6 +21,8 @@ public class TestCaseDescription { private transient ArrayList names; private transient ArrayList virtualSignals; private transient ModelInitializer modelInitializer; + private transient Random random; + private transient long seed; /** @@ -48,6 +51,14 @@ public class TestCaseDescription { */ public TestCaseDescription(TestCaseDescription valueToCopy) { this.dataString = valueToCopy.dataString; + this.seed = valueToCopy.seed; + } + + /** + * Creates a new seed value + */ + public void setNewSeed() { + seed = 0; } /** @@ -65,6 +76,9 @@ public class TestCaseDescription { throw new TestingDataException(Lang.get("err_errorParsingTestdata"), e); } } + if (seed == 0) + seed = System.currentTimeMillis(); + random.setSeed(seed); } private void parseDataString() throws IOException, ParserException { @@ -73,6 +87,7 @@ public class TestCaseDescription { names = tdp.getNames(); virtualSignals = tdp.getVirtualSignals(); modelInitializer = tdp.getModelInitializer(); + random = tdp.getRandom(); } /** diff --git a/src/main/java/de/neemann/digital/testing/parser/Parser.java b/src/main/java/de/neemann/digital/testing/parser/Parser.java index 80829ee2e..dbed4523d 100644 --- a/src/main/java/de/neemann/digital/testing/parser/Parser.java +++ b/src/main/java/de/neemann/digital/testing/parser/Parser.java @@ -37,6 +37,7 @@ public class Parser { private final ArrayList virtualSignals; private final Tokenizer tok; private final HashMap functions = new HashMap<>(); + private final Random random; private LineEmitter emitter; /** @@ -46,7 +47,8 @@ public class Parser { */ public Parser(String data) { functions.put("signExt", new SignExtend()); - functions.put("random", new Random()); + random = new Random(); + functions.put("random", random); functions.put("ite", new IfThenElse()); names = new ArrayList<>(); virtualSignals = new ArrayList<>(); @@ -302,6 +304,13 @@ public class Parser { return modelInit; } + /** + * @return the random function + */ + public Random getRandom() { + return random; + } + /** * @return the line emitter */ diff --git a/src/main/java/de/neemann/digital/testing/parser/functions/Random.java b/src/main/java/de/neemann/digital/testing/parser/functions/Random.java index 595796a63..ecd654a4a 100644 --- a/src/main/java/de/neemann/digital/testing/parser/functions/Random.java +++ b/src/main/java/de/neemann/digital/testing/parser/functions/Random.java @@ -17,15 +17,27 @@ import java.util.ArrayList; */ public class Random extends Function { + private final java.util.Random rnd; + /** * Creates a new function */ public Random() { super(1); + this.rnd = new java.util.Random(); + } + + /** + * Sets the random seed + * + * @param seed the seed + */ + public void setSeed(long seed) { + rnd.setSeed(seed); } @Override public long calcValue(Context c, ArrayList args) throws ParserException { - return (long) (Math.random() * args.get(0).value(c)); + return (long) (rnd.nextDouble() * args.get(0).value(c)); } }