From 2cd5eb71bb141e52040b2f1dc5d23a833913e815 Mon Sep 17 00:00:00 2001 From: hneemann Date: Sat, 7 Nov 2020 14:41:37 +0100 Subject: [PATCH] first working parameterized test cases, see #543 --- src/main/dig/generic/gray/GrayCounter.dig | 71 +++++++- .../digital/cli/CommandLineTester.java | 8 +- .../digital/draw/elements/Circuit.java | 64 ++++++- .../java/de/neemann/digital/gui/Main.java | 4 +- .../components/testing/ValueTableDialog.java | 63 +------ .../hdl/verilog2/VerilogTestBenchCreator.java | 3 + .../hdl/vhdl2/VHDLTestBenchCreator.java | 3 + .../digital/testing/FolderTestRunner.java | 6 +- .../digital/testing/TestCaseDescription.java | 2 +- .../neemann/digital/testing/TestExecutor.java | 169 +++++++++++------- src/main/resources/lang/lang_de.xml | 3 + src/main/resources/lang/lang_en.xml | 3 + .../draw/library/JarComponentManagerTest.java | 6 +- .../digital/integration/TestExamples.java | 22 +-- .../digital/testing/TestResultTest.java | 24 +-- 15 files changed, 276 insertions(+), 175 deletions(-) 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()); }