diff --git a/src/main/dig/generic/gray/GrayCounter.dig b/src/main/dig/generic/gray/GrayCounter.dig
index 734c6184a..fb8f0fe47 100644
--- a/src/main/dig/generic/gray/GrayCounter.dig
+++ b/src/main/dig/generic/gray/GrayCounter.dig
@@ -35,6 +35,10 @@
Testcase
+
+ Label
+ 3 bits
+
Testdata
@@ -49,14 +53,7 @@ C 0
generic
- ?>C G
-0 0
-loop (n,(1<< <?=args.bits?> )-1)
-C ((n+1) ^ ((n+1)>>1))
-end loop
-C 0<?
-
-this.Testdata=output();
+ bits := 3;
@@ -140,6 +137,10 @@ ist als drei.}}
Bits
3
+
+ generic
+ this.Bits=int(args.bits);
+
@@ -164,7 +165,59 @@ if (args.bits>3) {
bits := 3;
-
+
+
+
+ Testcase
+
+
+ Label
+ 4 bits
+
+
+ Testdata
+
+ C G
+0 0
+loop (n,(1<<4)-1)
+C ((n+1) ^ ((n+1)>>1))
+end loop
+C 0
+
+
+
+
+ generic
+ bits := 4;
+
+
+
+
+
+ Testcase
+
+
+ Label
+ 5 bits
+
+
+ Testdata
+
+ C G
+0 0
+loop (n,(1<<5)-1)
+C ((n+1) ^ ((n+1)>>1))
+end loop
+C 0
+
+
+
+
+ generic
+ bits := 5;
+
+
+
diff --git a/src/main/java/de/neemann/digital/cli/CommandLineTester.java b/src/main/java/de/neemann/digital/cli/CommandLineTester.java
index 7bc3432d9..c27d356d0 100644
--- a/src/main/java/de/neemann/digital/cli/CommandLineTester.java
+++ b/src/main/java/de/neemann/digital/cli/CommandLineTester.java
@@ -9,7 +9,6 @@ import de.neemann.digital.cli.cli.Argument;
import de.neemann.digital.cli.cli.BasicCommand;
import de.neemann.digital.cli.cli.CLIException;
import de.neemann.digital.core.ErrorDetector;
-import de.neemann.digital.core.Model;
import de.neemann.digital.draw.elements.Circuit;
import de.neemann.digital.lang.Lang;
import de.neemann.digital.testing.TestExecutor;
@@ -74,12 +73,11 @@ public class CommandLineTester {
label = "unnamed";
try {
- Model model = circuitLoader.createModel();
ErrorDetector errorDetector = new ErrorDetector();
- model.addObserver(errorDetector);
- TestExecutor te = new TestExecutor(t.getTestCaseDescription())
+ TestExecutor te = new TestExecutor(t, circuitLoader.getCircuit(), circuitLoader.getLibrary())
.setAllowMissingInputs(allowMissingInputs)
- .create(model);
+ .addObserver(errorDetector)
+ .create();
if (te.allPassed()) {
out.println(label + ": passed");
diff --git a/src/main/java/de/neemann/digital/draw/elements/Circuit.java b/src/main/java/de/neemann/digital/draw/elements/Circuit.java
index ee5ac4187..f3993760e 100644
--- a/src/main/java/de/neemann/digital/draw/elements/Circuit.java
+++ b/src/main/java/de/neemann/digital/draw/elements/Circuit.java
@@ -351,9 +351,7 @@ public class Circuit implements Copyable {
public List getTestCases() {
ArrayList tc = new ArrayList<>();
for (VisualElement ve : getElements(v -> v.equalsDescription(TestCaseElement.TESTCASEDESCRIPTION) && v.getElementAttributes().get(Keys.ENABLED))) {
- tc.add(new TestCase(
- ve.getElementAttributes().getLabel(),
- new TestCaseDescription(ve.getElementAttributes().get(Keys.TESTDATA))));
+ tc.add(new TestCase(ve));
}
return tc;
}
@@ -361,13 +359,29 @@ public class Circuit implements Copyable {
/**
* A simple java bean to encapsulate a test case description
*/
- public static final class TestCase {
+ public static final class TestCase implements Comparable {
private final String label;
private final TestCaseDescription testCaseDescription;
+ private final boolean hasGenericCode;
+ private final VisualElement visualElement;
- private TestCase(String label, TestCaseDescription testCaseDescription) {
- this.label = label;
- this.testCaseDescription = testCaseDescription;
+ /**
+ * Used in some test cases.
+ * Don't use this constructor in production code!
+ *
+ * @param testCaseDescription the test case description
+ */
+ public TestCase(TestCaseDescription testCaseDescription) {
+ this(new VisualElement(TestCaseElement.TESTCASEDESCRIPTION.getName())
+ .setAttribute(Keys.TESTDATA, testCaseDescription));
+ }
+
+ private TestCase(VisualElement visualElement) {
+ this.visualElement = visualElement;
+ ElementAttributes attr = visualElement.getElementAttributes();
+ this.label = attr.getLabel();
+ this.testCaseDescription = attr.get(Keys.TESTDATA);
+ this.hasGenericCode = !attr.get(Keys.GENERIC).isEmpty();
}
/**
@@ -383,6 +397,42 @@ public class Circuit implements Copyable {
public TestCaseDescription getTestCaseDescription() {
return testCaseDescription;
}
+
+ /**
+ * @return true if the test case has generic code
+ */
+ public boolean hasGenericCode() {
+ return hasGenericCode;
+ }
+
+ /**
+ * @return the visual element which contains the test case, maybe null
+ */
+ public VisualElement getVisualElement() {
+ return visualElement;
+ }
+
+ @Override
+ public int compareTo(TestCase o) {
+ return label.compareTo(o.label);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ TestCase testCase = (TestCase) o;
+
+ return label.equals(testCase.label);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return label.hashCode();
+ }
+
}
/**
diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java
index e22afd582..706f44706 100644
--- a/src/main/java/de/neemann/digital/gui/Main.java
+++ b/src/main/java/de/neemann/digital/gui/Main.java
@@ -1127,9 +1127,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
*/
public void startTests() {
try {
- ArrayList tsl = new ArrayList<>();
- for (Circuit.TestCase tc : circuitComponent.getCircuit().getTestCases())
- tsl.add(new ValueTableDialog.TestSet(tc.getTestCaseDescription(), tc.getLabel()));
+ List tsl = circuitComponent.getCircuit().getTestCases();
if (tsl.isEmpty())
throw new TestingDataException(Lang.get("err_noTestData"));
diff --git a/src/main/java/de/neemann/digital/gui/components/testing/ValueTableDialog.java b/src/main/java/de/neemann/digital/gui/components/testing/ValueTableDialog.java
index 1b4b89730..9c24ab431 100644
--- a/src/main/java/de/neemann/digital/gui/components/testing/ValueTableDialog.java
+++ b/src/main/java/de/neemann/digital/gui/components/testing/ValueTableDialog.java
@@ -6,7 +6,6 @@
package de.neemann.digital.gui.components.testing;
import de.neemann.digital.core.ErrorDetector;
-import de.neemann.digital.core.Model;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.data.Value;
import de.neemann.digital.data.ValueTable;
@@ -15,11 +14,9 @@ import de.neemann.digital.draw.elements.Circuit;
import de.neemann.digital.draw.elements.PinException;
import de.neemann.digital.draw.library.ElementLibrary;
import de.neemann.digital.draw.library.ElementNotFoundException;
-import de.neemann.digital.draw.model.ModelCreator;
import de.neemann.digital.gui.SaveAsHelper;
import de.neemann.digital.gui.components.data.GraphDialog;
import de.neemann.digital.lang.Lang;
-import de.neemann.digital.testing.TestCaseDescription;
import de.neemann.digital.testing.TestExecutor;
import de.neemann.digital.testing.TestingDataException;
import de.neemann.gui.IconCreator;
@@ -121,24 +118,24 @@ public class ValueTableDialog extends JDialog {
* @throws PinException PinException
* @throws ElementNotFoundException ElementNotFoundException
*/
- public ValueTableDialog addTestResult(ArrayList tsl, Circuit circuit, ElementLibrary library) throws TestingDataException, ElementNotFoundException, PinException, NodeException {
+ public ValueTableDialog addTestResult(java.util.List tsl, Circuit circuit, ElementLibrary library) throws TestingDataException, ElementNotFoundException, PinException, NodeException {
Collections.sort(tsl);
int i = 0;
int errorTabIndex = -1;
- for (TestSet ts : tsl) {
- Model model = new ModelCreator(circuit, library).createModel(false);
+ for (Circuit.TestCase ts : tsl) {
ErrorDetector errorDetector = new ErrorDetector();
- model.addObserver(errorDetector);
try {
- TestExecutor testExecutor = new TestExecutor(ts.data).create(model);
+ TestExecutor testExecutor = new TestExecutor(ts, circuit, library)
+ .addObserver(errorDetector)
+ .create();
String tabName;
Icon tabIcon;
if (testExecutor.allPassed()) {
- tabName = Lang.get("msg_test_N_Passed", ts.name);
+ tabName = Lang.get("msg_test_N_Passed", ts.getLabel());
tabIcon = ICON_PASSED;
} else {
- tabName = Lang.get("msg_test_N_Failed", ts.name);
+ tabName = Lang.get("msg_test_N_Failed", ts.getLabel());
tabIcon = ICON_FAILED;
errorTabIndex = i;
}
@@ -152,9 +149,7 @@ public class ValueTableDialog extends JDialog {
i++;
errorDetector.check();
} catch (Exception e) {
- throw new TestingDataException(Lang.get("err_whileExecutingTests_N0", ts.name), e);
- } finally {
- model.close();
+ throw new TestingDataException(Lang.get("err_whileExecutingTests_N0", ts.getLabel()), e);
}
}
if (errorTabIndex >= 0)
@@ -200,48 +195,6 @@ public class ValueTableDialog extends JDialog {
return this;
}
- /**
- * A TestSet contains the {@link TestCaseDescription} and the name of the TestData.
- * Is only a value bean
- */
- public static class TestSet implements Comparable {
-
- private final TestCaseDescription data;
- private final String name;
-
- /**
- * Creates a new instance
- *
- * @param data the TestData
- * @param name the name of the data, eg. the used label
- */
- public TestSet(TestCaseDescription data, String name) {
- this.data = data;
- this.name = name;
- }
-
- @Override
- public int compareTo(TestSet o) {
- return name.compareTo(o.name);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- TestSet testSet = (TestSet) o;
-
- return name.equals(testSet.name);
-
- }
-
- @Override
- public int hashCode() {
- return name.hashCode();
- }
- }
-
private static class ValueRenderer extends DefaultTableCellRenderer {
@Override
diff --git a/src/main/java/de/neemann/digital/hdl/verilog2/VerilogTestBenchCreator.java b/src/main/java/de/neemann/digital/hdl/verilog2/VerilogTestBenchCreator.java
index a2a5d58d1..aca25323f 100644
--- a/src/main/java/de/neemann/digital/hdl/verilog2/VerilogTestBenchCreator.java
+++ b/src/main/java/de/neemann/digital/hdl/verilog2/VerilogTestBenchCreator.java
@@ -70,6 +70,9 @@ public class VerilogTestBenchCreator {
filename = filename.substring(0, p);
for (Circuit.TestCase tc : testCases) {
+ if (tc.hasGenericCode())
+ throw new HDLException(Lang.get("err_hdlTestCaseHasGenericCode"));
+
String testName = tc.getLabel();
if (testName.length() > 0)
testName = filename + "_" + testName + "_tb";
diff --git a/src/main/java/de/neemann/digital/hdl/vhdl2/VHDLTestBenchCreator.java b/src/main/java/de/neemann/digital/hdl/vhdl2/VHDLTestBenchCreator.java
index 6f8ac0c02..892aa63d6 100644
--- a/src/main/java/de/neemann/digital/hdl/vhdl2/VHDLTestBenchCreator.java
+++ b/src/main/java/de/neemann/digital/hdl/vhdl2/VHDLTestBenchCreator.java
@@ -64,6 +64,9 @@ public class VHDLTestBenchCreator {
VHDLRenaming renaming = new VHDLRenaming();
for (Circuit.TestCase tc : testCases) {
+ if (tc.hasGenericCode())
+ throw new HDLException(Lang.get("err_hdlTestCaseHasGenericCode"));
+
String testName = tc.getLabel();
if (testName.length() > 0) {
testName = filename + "_" + renaming.checkName(testName) + "_tb";
diff --git a/src/main/java/de/neemann/digital/testing/FolderTestRunner.java b/src/main/java/de/neemann/digital/testing/FolderTestRunner.java
index 1bea6fc4e..05dc27cc8 100644
--- a/src/main/java/de/neemann/digital/testing/FolderTestRunner.java
+++ b/src/main/java/de/neemann/digital/testing/FolderTestRunner.java
@@ -5,7 +5,6 @@
*/
package de.neemann.digital.testing;
-import de.neemann.digital.core.Model;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.draw.elements.Circuit;
import de.neemann.digital.draw.elements.PinException;
@@ -199,9 +198,8 @@ public class FolderTestRunner {
StringBuilder sb = new StringBuilder();
int rowCount = 0;
for (Circuit.TestCase tc : testCases) {
- Model model = new ModelCreator(circuit, library).createModel(false);
try {
- TestExecutor te = new TestExecutor(tc.getTestCaseDescription()).create(model);
+ TestExecutor te = new TestExecutor(tc, circuit, library).create();
if (te.allPassed()) {
rowCount += te.getResult().getRows();
} else {
@@ -222,7 +220,7 @@ public class FolderTestRunner {
setMessage(f, i, sb.toString(), FileToTest.Status.failed);
}
- } catch (IOException | NodeException | ElementNotFoundException | PinException | ParserException | RuntimeException e) {
+ } catch (IOException | ElementNotFoundException | PinException | ParserException | RuntimeException e) {
setMessage(f, i, e.getMessage(), FileToTest.Status.error);
}
}
diff --git a/src/main/java/de/neemann/digital/testing/TestCaseDescription.java b/src/main/java/de/neemann/digital/testing/TestCaseDescription.java
index 35e4ee235..0681cb220 100644
--- a/src/main/java/de/neemann/digital/testing/TestCaseDescription.java
+++ b/src/main/java/de/neemann/digital/testing/TestCaseDescription.java
@@ -63,7 +63,7 @@ public class TestCaseDescription {
}
private void check() throws TestingDataException {
- if (lines == null) {
+ if (lines == null || names == null) {
try {
Parser tdp = new Parser(dataString).parse();
lines = tdp.getLines();
diff --git a/src/main/java/de/neemann/digital/testing/TestExecutor.java b/src/main/java/de/neemann/digital/testing/TestExecutor.java
index 8b8f4beda..645a83def 100644
--- a/src/main/java/de/neemann/digital/testing/TestExecutor.java
+++ b/src/main/java/de/neemann/digital/testing/TestExecutor.java
@@ -6,9 +6,16 @@
package de.neemann.digital.testing;
import de.neemann.digital.core.*;
+import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.wiring.Clock;
import de.neemann.digital.data.Value;
import de.neemann.digital.data.ValueTable;
+import de.neemann.digital.draw.elements.Circuit;
+import de.neemann.digital.draw.elements.PinException;
+import de.neemann.digital.draw.library.ElementLibrary;
+import de.neemann.digital.draw.library.ElementNotFoundException;
+import de.neemann.digital.draw.library.ResolveGenerics;
+import de.neemann.digital.draw.model.ModelCreator;
import de.neemann.digital.lang.Lang;
import de.neemann.digital.testing.parser.Context;
import de.neemann.digital.testing.parser.LineEmitter;
@@ -26,6 +33,7 @@ public class TestExecutor {
private static final int ERR_RESULTS = MAX_RESULTS * 2;
private final ArrayList names;
+ private final Model model;
private final LineEmitter lines;
private final ValueTable results;
private boolean errorOccurred;
@@ -38,87 +46,117 @@ public class TestExecutor {
private boolean allowMissingInputs;
/**
- * Creates a new testing result
+ * Creates a new testing result.
*
- * @param testCaseDescription the testing data
- * @throws TestingDataException DataException
+ * @param testCase the testing data
+ * @param circuit the circuit
+ * @param library the library
+ * @throws TestingDataException DataException
+ * @throws ElementNotFoundException ElementNotFoundException
+ * @throws PinException PinException
+ * @throws NodeException NodeException
*/
- public TestExecutor(TestCaseDescription testCaseDescription) throws TestingDataException {
- names = testCaseDescription.getNames();
+ public TestExecutor(Circuit.TestCase testCase, Circuit circuit, ElementLibrary library) throws TestingDataException, NodeException, ElementNotFoundException, PinException {
+ this(testCase, createModel(testCase, circuit, library));
+ }
+
+ static private Model createModel(Circuit.TestCase testCase, Circuit circuit, ElementLibrary library) throws NodeException, ElementNotFoundException, PinException {
+ final Model model;
+ if (circuit != null && circuit.getAttributes().get(Keys.IS_GENERIC) && testCase.hasGenericCode()) {
+ Circuit c = new ResolveGenerics().resolveCircuit(testCase.getVisualElement(), circuit, library).getCircuit();
+ model = new ModelCreator(c, library, false).createModel(false);
+ } else
+ model = new ModelCreator(circuit, library).createModel(false);
+ return model;
+ }
+
+ /**
+ * Use for tests only! Do'nt use this constructor with a model you have created from a circuit.
+ * If a circuit is available use the other constructor.
+ *
+ * @param testCase the test case
+ * @param model the model
+ * @throws TestingDataException TestingDataException
+ */
+ public TestExecutor(Circuit.TestCase testCase, Model model) throws TestingDataException {
+ names = testCase.getTestCaseDescription().getNames();
+ this.model = model;
results = new ValueTable(names);
visibleRows = 0;
- lines = testCaseDescription.getLines();
+ lines = testCase.getTestCaseDescription().getLines();
}
/**
* Creates the result by comparing the testing vector with the given model-
*
- * @param model the model to check
* @return this for chained calls
* @throws TestingDataException DataException
* @throws NodeException NodeException
* @throws ParserException ParserException
*/
- public TestExecutor create(Model model) throws TestingDataException, NodeException, ParserException {
- HashSet usedSignals = new HashSet<>();
-
- inputs = new ArrayList<>();
- outputs = new ArrayList<>();
- for (Signal s : model.getInputs()) {
- final int index = getIndexOf(s.getName());
- if (index >= 0) {
- inputs.add(new TestSignal(index, s.getValue()));
- addTo(usedSignals, s.getName());
- }
- ObservableValue outValue = s.getBidirectionalReader();
- if (outValue != null) {
- final String outName = s.getName() + "_out";
- final int inIndex = getIndexOf(outName);
- if (inIndex >= 0) {
- outputs.add(new TestSignal(inIndex, outValue));
- addTo(usedSignals, outName);
+ public TestExecutor create() throws TestingDataException, NodeException, ParserException {
+ try {
+ HashSet usedSignals = new HashSet<>();
+ inputs = new ArrayList<>();
+ outputs = new ArrayList<>();
+ for (Signal s : model.getInputs()) {
+ final int index = getIndexOf(s.getName());
+ if (index >= 0) {
+ inputs.add(new TestSignal(index, s.getValue()));
+ addTo(usedSignals, s.getName());
+ }
+ ObservableValue outValue = s.getBidirectionalReader();
+ if (outValue != null) {
+ final String outName = s.getName() + "_out";
+ final int inIndex = getIndexOf(outName);
+ if (inIndex >= 0) {
+ outputs.add(new TestSignal(inIndex, outValue));
+ addTo(usedSignals, outName);
+ }
}
}
- }
- for (Clock c : model.getClocks()) {
- final int index = getIndexOf(c.getLabel());
- if (index >= 0) {
- inputs.add(new TestSignal(index, c.getClockOutput()));
- addTo(usedSignals, c.getLabel());
+ for (Clock c : model.getClocks()) {
+ final int index = getIndexOf(c.getLabel());
+ if (index >= 0) {
+ inputs.add(new TestSignal(index, c.getClockOutput()));
+ addTo(usedSignals, c.getLabel());
+ }
}
- }
- for (Signal s : model.getOutputs()) {
- final int index = getIndexOf(s.getName());
- if (index >= 0) {
- outputs.add(new TestSignal(index, s.getValue()));
- addTo(usedSignals, s.getName());
+ for (Signal s : model.getOutputs()) {
+ final int index = getIndexOf(s.getName());
+ if (index >= 0) {
+ outputs.add(new TestSignal(index, s.getValue()));
+ addTo(usedSignals, s.getName());
+ }
}
+
+ for (String name : names)
+ if (!usedSignals.contains(name))
+ if (allowMissingInputs)
+ inputs.add(new TestSignal(getIndexOf(name), null));
+ else
+ throw new TestingDataException(Lang.get("err_testSignal_N_notFound", name));
+
+ if (inputs.size() == 0)
+ throw new TestingDataException(Lang.get("err_noTestInputSignalsDefined"));
+
+ if (outputs.size() == 0)
+ throw new TestingDataException(Lang.get("err_noTestOutputSignalsDefined"));
+
+ model.init();
+ model.addObserver(event -> {
+ if (event.getType() == ModelEventType.ERROR_OCCURRED)
+ errorOccurred = true;
+ }, ModelEventType.ERROR_OCCURRED);
+
+ lines.emitLines(new LineListenerResolveDontCare(values -> checkRow(model, values), inputs), new Context().setModel(model));
+
+ return this;
+ } finally {
+ model.close();
}
-
- for (String name : names)
- if (!usedSignals.contains(name))
- if (allowMissingInputs)
- inputs.add(new TestSignal(getIndexOf(name), null));
- else
- throw new TestingDataException(Lang.get("err_testSignal_N_notFound", name));
-
- if (inputs.size() == 0)
- throw new TestingDataException(Lang.get("err_noTestInputSignalsDefined"));
-
- if (outputs.size() == 0)
- throw new TestingDataException(Lang.get("err_noTestOutputSignalsDefined"));
-
- model.init();
- model.addObserver(event -> {
- if (event.getType() == ModelEventType.ERROR_OCCURRED)
- errorOccurred = true;
- }, ModelEventType.ERROR_OCCURRED);
-
- lines.emitLines(new LineListenerResolveDontCare(values -> checkRow(model, values), inputs), new Context().setModel(model));
-
- return this;
}
private void addTo(HashSet signals, String name) throws TestingDataException {
@@ -271,6 +309,17 @@ public class TestExecutor {
return this;
}
+ /**
+ * Adds a observer to the model of this test executor
+ *
+ * @param observer the observer to add
+ * @return this for chained calls
+ */
+ public TestExecutor addObserver(ModelStateObserverTyped observer) {
+ model.addObserver(observer);
+ return this;
+ }
+
/**
* A test signal
*/
diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml
index 816f61ece..c695e5207 100644
--- a/src/main/resources/lang/lang_de.xml
+++ b/src/main/resources/lang/lang_de.xml
@@ -1047,6 +1047,9 @@ Sind evtl. die Namen der Variablen nicht eindeutig?
Es fehlt ein Name. Sind z.B. alle Pins benannt?
Es sind mehrere Ausgänge miteinander verbunden.
Diese Art der Verschaltung wird beim HDL-Export nicht unterstützt ({0}, {1}, {2}).
+ Testfälle mit generischer Parametrisierung werden im HDL-Export nicht
+ unterstützt!
+
unbenanntes Netz
Zu viele Variablen!
Ungültiger Ausdruck!
diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml
index 8e0b07634..c6d02b5f3 100644
--- a/src/main/resources/lang/lang_en.xml
+++ b/src/main/resources/lang/lang_en.xml
@@ -1057,6 +1057,9 @@
A name is missing. Have e.g. all pins a label set?
Several outputs are connected to each other.
This type of interconnection is not supported for HDL export. ({0}, {1}, {2}).
+ Test cases with generic parameterization are not supported in HDL
+ export!
+
unnamed net
Too many variables!
Invalid expression!
diff --git a/src/test/java/de/neemann/digital/draw/library/JarComponentManagerTest.java b/src/test/java/de/neemann/digital/draw/library/JarComponentManagerTest.java
index d8682141d..3613bf4e9 100644
--- a/src/test/java/de/neemann/digital/draw/library/JarComponentManagerTest.java
+++ b/src/test/java/de/neemann/digital/draw/library/JarComponentManagerTest.java
@@ -5,13 +5,9 @@
*/
package de.neemann.digital.draw.library;
-import de.neemann.digital.core.element.Keys;
import de.neemann.digital.draw.elements.Circuit;
-import de.neemann.digital.draw.elements.VisualElement;
import de.neemann.digital.integration.Resources;
import de.neemann.digital.integration.ToBreakRunner;
-import de.neemann.digital.testing.TestCaseDescription;
-import de.neemann.digital.testing.TestCaseElement;
import de.neemann.digital.testing.TestExecutor;
import junit.framework.TestCase;
@@ -38,6 +34,6 @@ public class JarComponentManagerTest extends TestCase {
};
for (Circuit.TestCase tc : br.getCircuit().getTestCases())
- assertTrue(new TestExecutor(tc.getTestCaseDescription()).create(br.getModel()).allPassed());
+ assertTrue(new TestExecutor(tc, br.getCircuit(), br.getLibrary()).create().allPassed());
}
}
diff --git a/src/test/java/de/neemann/digital/integration/TestExamples.java b/src/test/java/de/neemann/digital/integration/TestExamples.java
index ef540faec..0bc478a5b 100644
--- a/src/test/java/de/neemann/digital/integration/TestExamples.java
+++ b/src/test/java/de/neemann/digital/integration/TestExamples.java
@@ -17,7 +17,6 @@ import de.neemann.digital.draw.library.ElementNotFoundException;
import de.neemann.digital.draw.library.GenericInitCode;
import de.neemann.digital.draw.library.ResolveGenerics;
import de.neemann.digital.draw.model.ModelCreator;
-import de.neemann.digital.testing.TestCaseDescription;
import de.neemann.digital.testing.TestExecutor;
import junit.framework.TestCase;
@@ -41,7 +40,7 @@ public class TestExamples extends TestCase {
public void testDistExamples() throws Exception {
File examples = new File(Resources.getRoot().getParentFile().getParentFile(), "/main/dig");
assertEquals(302, new FileScanner(this::check).scan(examples));
- assertEquals(198, testCasesInFiles);
+ assertEquals(200, testCasesInFiles);
}
/**
@@ -82,22 +81,17 @@ public class TestExamples extends TestCase {
testCasesInFiles++;
String label = tc.getLabel();
- TestCaseDescription td = tc.getTestCaseDescription();
- Model model = new ModelCreator(br.getCircuit(), br.getLibrary()).createModel(false);
ErrorDetector ed = new ErrorDetector();
- model.addObserver(ed);
- try {
- TestExecutor tr = new TestExecutor(td).create(model);
+ TestExecutor tr = new TestExecutor(tc, br.getCircuit(), br.getLibrary())
+ .addObserver(ed)
+ .create();
- if (label.contains("Failing"))
- assertFalse(dig.getName() + ":" + label, tr.allPassed());
- else
- assertTrue(dig.getName() + ":" + label, tr.allPassed());
+ if (label.contains("Failing"))
+ assertFalse(dig.getName() + ":" + label, tr.allPassed());
+ else
+ assertTrue(dig.getName() + ":" + label, tr.allPassed());
- } finally {
- model.close();
- }
ed.check();
}
} catch (Exception e) {
diff --git a/src/test/java/de/neemann/digital/testing/TestResultTest.java b/src/test/java/de/neemann/digital/testing/TestResultTest.java
index 15d37e464..1e86ee6c1 100644
--- a/src/test/java/de/neemann/digital/testing/TestResultTest.java
+++ b/src/test/java/de/neemann/digital/testing/TestResultTest.java
@@ -47,8 +47,8 @@ public class TestResultTest extends TestCase {
+ "0 1 1\n"
+ "1 0 1\n"
+ "1 1 0\n");
- TestExecutor tr = new TestExecutor(data).create(model);
- assertEquals(4,tr.getResult().getRows());
+ TestExecutor tr = new TestExecutor(new Circuit.TestCase(data), model).create();
+ assertEquals(4, tr.getResult().getRows());
assertTrue(tr.allPassed());
}
@@ -60,9 +60,9 @@ public class TestResultTest extends TestCase {
+ "0 1 1\n"
+ "1 0 1\n"
+ "1 1 0\n");
- TestExecutor te = new TestExecutor(data).create(model);
+ TestExecutor te = new TestExecutor(new Circuit.TestCase(data), model).create();
ValueTable tr = te.getResult();
- assertEquals(4,tr.getRows());
+ assertEquals(4, tr.getRows());
assertFalse(te.allPassed());
assertEquals(true, ((MatchedValue) tr.getValue(0, 2)).isPassed());
assertEquals(true, ((MatchedValue) tr.getValue(1, 2)).isPassed());
@@ -78,9 +78,9 @@ public class TestResultTest extends TestCase {
+ "0 1 1\n"
+ "1 0 1\n"
+ "1 1 x\n");
- TestExecutor te = new TestExecutor(data).create(model);
+ TestExecutor te = new TestExecutor(new Circuit.TestCase(data), model).create();
ValueTable tr = te.getResult();
- assertEquals(4,tr.getRows());
+ assertEquals(4, tr.getRows());
assertTrue(te.allPassed());
}
@@ -92,9 +92,9 @@ public class TestResultTest extends TestCase {
+ "0 1 1\n"
+ "1 0 1\n"
+ "1 1 1\n");
- TestExecutor te = new TestExecutor(data).create(model);
+ TestExecutor te = new TestExecutor(new Circuit.TestCase(data), model).create();
ValueTable tr = te.getResult();
- assertEquals(4,tr.getRows());
+ assertEquals(4, tr.getRows());
assertTrue(te.allPassed());
}
@@ -104,9 +104,9 @@ public class TestResultTest extends TestCase {
"A B Y\n"
+ "x 0 0\n"
+ "x 1 1\n");
- TestExecutor te = new TestExecutor(data).create(model);
+ TestExecutor te = new TestExecutor(new Circuit.TestCase(data), model).create();
ValueTable tr = te.getResult();
- assertEquals(4,tr.getRows());
+ assertEquals(4, tr.getRows());
assertTrue(te.allPassed());
}
@@ -116,9 +116,9 @@ public class TestResultTest extends TestCase {
"A B C Y\n"
+ "x x 0 0\n"
+ "x x 1 1\n");
- TestExecutor te = new TestExecutor(data).create(model);
+ TestExecutor te = new TestExecutor(new Circuit.TestCase(data), model).create();
ValueTable tr = te.getResult();
- assertEquals(8,tr.getRows());
+ assertEquals(8, tr.getRows());
assertTrue(te.allPassed());
}