From 89a726dc25b3fe0541ce8f63316d5d16b5dd2faf Mon Sep 17 00:00:00 2001 From: hneemann Date: Wed, 24 Aug 2016 11:02:49 +0200 Subject: [PATCH] refactoring of testing: separated test execution from test result/test case visualization. --- .../digital/draw/elements/Circuit.java | 2 +- .../digital/draw/library/ElementLibrary.java | 2 +- .../digital/draw/shapes/ShapeFactory.java | 2 +- .../java/de/neemann/digital/gui/Main.java | 8 +- .../digital/gui/components/EditorFactory.java | 4 +- .../gui/components/test/package-info.java | 6 - .../{test => testing}/TestDataDialog.java | 10 +- .../{test => testing}/TestDataEditor.java | 3 +- .../{test => testing}/TestResultDialog.java | 11 +- .../components/testing/TestResultModel.java | 70 +++++++++ .../{test => testing}/TextLineNumber.java | 2 +- .../gui/components/testing/package-info.java | 6 + .../test => testing}/MatchedValue.java | 2 +- .../test => testing}/TestCaseElement.java | 2 +- .../components/test => testing}/TestData.java | 8 +- .../test => testing}/TestDataParser.java | 14 +- .../test => testing}/TestResult.java | 143 ++++++++---------- .../TestingDataException.java} | 8 +- .../components/test => testing}/Value.java | 8 +- .../neemann/digital/testing/package-info.java | 10 ++ src/main/resources/lang/lang_de.xml | 2 +- src/main/resources/lang/lang_en.xml | 2 +- .../digital/integration/TestExamples.java | 1 + .../integration/TestTestableExamples.java | 6 +- .../test => testing}/TestDataParserTest.java | 8 +- .../test => testing}/TestDataTest.java | 4 +- .../test => testing}/TestResultTest.java | 13 +- .../test => testing}/ValueTest.java | 4 +- 28 files changed, 214 insertions(+), 147 deletions(-) delete mode 100644 src/main/java/de/neemann/digital/gui/components/test/package-info.java rename src/main/java/de/neemann/digital/gui/components/{test => testing}/TestDataDialog.java (92%) rename src/main/java/de/neemann/digital/gui/components/{test => testing}/TestDataEditor.java (95%) rename src/main/java/de/neemann/digital/gui/components/{test => testing}/TestResultDialog.java (93%) create mode 100644 src/main/java/de/neemann/digital/gui/components/testing/TestResultModel.java rename src/main/java/de/neemann/digital/gui/components/{test => testing}/TextLineNumber.java (99%) create mode 100644 src/main/java/de/neemann/digital/gui/components/testing/package-info.java rename src/main/java/de/neemann/digital/{gui/components/test => testing}/MatchedValue.java (95%) rename src/main/java/de/neemann/digital/{gui/components/test => testing}/TestCaseElement.java (96%) rename src/main/java/de/neemann/digital/{gui/components/test => testing}/TestData.java (87%) rename src/main/java/de/neemann/digital/{gui/components/test => testing}/TestDataParser.java (82%) rename src/main/java/de/neemann/digital/{gui/components/test => testing}/TestResult.java (58%) rename src/main/java/de/neemann/digital/{gui/components/test/DataException.java => testing/TestingDataException.java} (57%) rename src/main/java/de/neemann/digital/{gui/components/test => testing}/Value.java (93%) create mode 100644 src/main/java/de/neemann/digital/testing/package-info.java rename src/test/java/de/neemann/digital/{gui/components/test => testing}/TestDataParserTest.java (91%) rename src/test/java/de/neemann/digital/{gui/components/test => testing}/TestDataTest.java (93%) rename src/test/java/de/neemann/digital/{gui/components/test => testing}/TestResultTest.java (85%) rename src/test/java/de/neemann/digital/{gui/components/test => testing}/ValueTest.java (92%) 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 f67f445ff..f381c32ab 100644 --- a/src/main/java/de/neemann/digital/draw/elements/Circuit.java +++ b/src/main/java/de/neemann/digital/draw/elements/Circuit.java @@ -20,7 +20,7 @@ import de.neemann.digital.draw.shapes.Drawable; import de.neemann.digital.draw.shapes.InputShape; import de.neemann.digital.draw.shapes.ShapeFactory; import de.neemann.digital.gui.components.AttributeDialog; -import de.neemann.digital.gui.components.test.TestData; +import de.neemann.digital.testing.TestData; import de.neemann.digital.gui.sync.NoSync; import de.neemann.digital.gui.sync.Sync; import de.neemann.digital.lang.Lang; diff --git a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java index 4b3de0558..0b5c6975c 100644 --- a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java +++ b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java @@ -15,7 +15,7 @@ import de.neemann.digital.gui.components.data.DummyElement; import de.neemann.digital.gui.components.graphics.GraphicCard; import de.neemann.digital.gui.components.terminal.Keyboard; import de.neemann.digital.gui.components.terminal.Terminal; -import de.neemann.digital.gui.components.test.TestCaseElement; +import de.neemann.digital.testing.TestCaseElement; import de.neemann.digital.lang.Lang; import java.io.File; diff --git a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java index cb8ec6be3..078056bee 100644 --- a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java +++ b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java @@ -18,7 +18,7 @@ import de.neemann.digital.draw.shapes.ieee.IEEEOrShape; import de.neemann.digital.draw.shapes.ieee.IEEEXOrShape; import de.neemann.digital.gui.LibrarySelector; import de.neemann.digital.gui.components.data.DummyElement; -import de.neemann.digital.gui.components.test.TestCaseElement; +import de.neemann.digital.testing.TestCaseElement; import de.neemann.digital.lang.Lang; import java.util.HashMap; diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 5e0fec4ac..a3b9fbc14 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -28,9 +28,9 @@ import de.neemann.digital.gui.components.data.DataSetDialog; import de.neemann.digital.gui.components.expression.ExpressionDialog; import de.neemann.digital.gui.components.listing.ROMListingDialog; import de.neemann.digital.gui.components.table.TableDialog; -import de.neemann.digital.gui.components.test.DataException; -import de.neemann.digital.gui.components.test.TestCaseElement; -import de.neemann.digital.gui.components.test.TestResultDialog; +import de.neemann.digital.testing.TestingDataException; +import de.neemann.digital.testing.TestCaseElement; +import de.neemann.digital.gui.components.testing.TestResultDialog; import de.neemann.digital.gui.remote.DigitalHandler; import de.neemann.digital.gui.remote.RemoteException; import de.neemann.digital.gui.remote.RemoteSever; @@ -552,7 +552,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E el.getElementAttributes().getCleanLabel())); if (tsl.isEmpty()) - throw new DataException(Lang.get("err_noTestData")); + throw new TestingDataException(Lang.get("err_noTestData")); windowPosManager.register("testresult", new TestResultDialog(Main.this, tsl, circuitComponent.getCircuit(), library)).setVisible(true); diff --git a/src/main/java/de/neemann/digital/gui/components/EditorFactory.java b/src/main/java/de/neemann/digital/gui/components/EditorFactory.java index 0db9aa9a9..ddfcd898c 100644 --- a/src/main/java/de/neemann/digital/gui/components/EditorFactory.java +++ b/src/main/java/de/neemann/digital/gui/components/EditorFactory.java @@ -7,8 +7,8 @@ import de.neemann.digital.core.element.Rotation; import de.neemann.digital.core.io.IntFormat; import de.neemann.digital.core.memory.DataField; import de.neemann.digital.core.memory.ROM; -import de.neemann.digital.gui.components.test.TestData; -import de.neemann.digital.gui.components.test.TestDataEditor; +import de.neemann.digital.testing.TestData; +import de.neemann.digital.gui.components.testing.TestDataEditor; import de.neemann.digital.gui.sync.NoSync; import de.neemann.digital.lang.Lang; import de.neemann.gui.ErrorMessage; diff --git a/src/main/java/de/neemann/digital/gui/components/test/package-info.java b/src/main/java/de/neemann/digital/gui/components/test/package-info.java deleted file mode 100644 index 735c93aa7..000000000 --- a/src/main/java/de/neemann/digital/gui/components/test/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Classes to handle test cases - * - * @author hneemann - */ -package de.neemann.digital.gui.components.test; diff --git a/src/main/java/de/neemann/digital/gui/components/test/TestDataDialog.java b/src/main/java/de/neemann/digital/gui/components/testing/TestDataDialog.java similarity index 92% rename from src/main/java/de/neemann/digital/gui/components/test/TestDataDialog.java rename to src/main/java/de/neemann/digital/gui/components/testing/TestDataDialog.java index 72b4799d4..342553884 100644 --- a/src/main/java/de/neemann/digital/gui/components/test/TestDataDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/testing/TestDataDialog.java @@ -1,10 +1,12 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.gui.components.testing; import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.Key; import de.neemann.digital.gui.components.CircuitComponent; import de.neemann.digital.gui.components.table.ShowStringDialog; import de.neemann.digital.lang.Lang; +import de.neemann.digital.testing.TestingDataException; +import de.neemann.digital.testing.TestData; import de.neemann.gui.ErrorMessage; import de.neemann.gui.ToolTipAction; @@ -13,7 +15,7 @@ import java.awt.*; import java.awt.event.ActionEvent; /** - * Dialog to show and edit the test data source. + * Dialog to show and edit the testing data source. * * @author hneemann */ @@ -76,7 +78,7 @@ public class TestDataDialog extends JDialog { cc.getCircuit().modified(); cc.getMain().startTests(); } - } catch (DataException e1) { + } catch (TestingDataException e1) { new ErrorMessage(e1.getMessage()).show(TestDataDialog.this); } } @@ -96,7 +98,7 @@ public class TestDataDialog extends JDialog { } } dispose(); - } catch (DataException e1) { + } catch (TestingDataException e1) { new ErrorMessage(e1.getMessage()).show(TestDataDialog.this); } } diff --git a/src/main/java/de/neemann/digital/gui/components/test/TestDataEditor.java b/src/main/java/de/neemann/digital/gui/components/testing/TestDataEditor.java similarity index 95% rename from src/main/java/de/neemann/digital/gui/components/test/TestDataEditor.java rename to src/main/java/de/neemann/digital/gui/components/testing/TestDataEditor.java index a392267c2..208aeb0aa 100644 --- a/src/main/java/de/neemann/digital/gui/components/test/TestDataEditor.java +++ b/src/main/java/de/neemann/digital/gui/components/testing/TestDataEditor.java @@ -1,10 +1,11 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.gui.components.testing; import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.Key; import de.neemann.digital.gui.Main; import de.neemann.digital.gui.components.EditorFactory; import de.neemann.digital.lang.Lang; +import de.neemann.digital.testing.TestData; import de.neemann.gui.ToolTipAction; import javax.swing.*; diff --git a/src/main/java/de/neemann/digital/gui/components/test/TestResultDialog.java b/src/main/java/de/neemann/digital/gui/components/testing/TestResultDialog.java similarity index 93% rename from src/main/java/de/neemann/digital/gui/components/test/TestResultDialog.java rename to src/main/java/de/neemann/digital/gui/components/testing/TestResultDialog.java index 1a0f5c211..a353a5a6b 100644 --- a/src/main/java/de/neemann/digital/gui/components/test/TestResultDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/testing/TestResultDialog.java @@ -1,4 +1,4 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.gui.components.testing; import de.neemann.digital.core.Model; import de.neemann.digital.core.NodeException; @@ -7,6 +7,7 @@ import de.neemann.digital.draw.elements.PinException; import de.neemann.digital.draw.library.ElementLibrary; import de.neemann.digital.draw.model.ModelCreator; import de.neemann.digital.lang.Lang; +import de.neemann.digital.testing.*; import javax.swing.*; import javax.swing.table.DefaultTableCellRenderer; @@ -15,7 +16,7 @@ import java.util.ArrayList; import java.util.Collections; /** - * Dialog to show the test results. + * Dialog to show the testing results. * * @author hneemann */ @@ -31,10 +32,10 @@ public class TestResultDialog extends JDialog { * @param circuit the circuit * @param library the library to use * @throws NodeException NodeException - * @throws DataException DataException + * @throws TestingDataException DataException * @throws PinException PinException */ - public TestResultDialog(JFrame owner, ArrayList tsl, Circuit circuit, ElementLibrary library) throws NodeException, DataException, PinException { + public TestResultDialog(JFrame owner, ArrayList tsl, Circuit circuit, ElementLibrary library) throws NodeException, TestingDataException, PinException { super(owner, Lang.get("msg_testResult"), false); setDefaultCloseOperation(DISPOSE_ON_CLOSE); @@ -46,7 +47,7 @@ public class TestResultDialog extends JDialog { TestResult tr = new TestResult(ts.data).create(model); - JTable table = new JTable(tr); + JTable table = new JTable(new TestResultModel(tr)); table.setDefaultRenderer(MatchedValue.class, new MyRenderer()); String tabName; diff --git a/src/main/java/de/neemann/digital/gui/components/testing/TestResultModel.java b/src/main/java/de/neemann/digital/gui/components/testing/TestResultModel.java new file mode 100644 index 000000000..57b26bcb2 --- /dev/null +++ b/src/main/java/de/neemann/digital/gui/components/testing/TestResultModel.java @@ -0,0 +1,70 @@ +package de.neemann.digital.gui.components.testing; + +import de.neemann.digital.testing.MatchedValue; +import de.neemann.digital.testing.TestResult; + +import javax.swing.event.TableModelListener; +import javax.swing.table.TableModel; + +/** + * The table model to present a test result. + *

+ * Created by hneemann on 24.08.16. + */ +public class TestResultModel implements TableModel { + + private final TestResult testResult; + + /** + * Creates a new table model + * + * @param testResult the testresult to wrap + */ + public TestResultModel(TestResult testResult) { + this.testResult = testResult; + } + + @Override + public int getRowCount() { + return testResult.getRows(); + } + + @Override + public int getColumnCount() { + return testResult.getSignalCount(); + } + + @Override + public String getColumnName(int columnIndex) { + return testResult.getSignalName(columnIndex); + } + + @Override + public Class getColumnClass(int columnIndex) { + return MatchedValue.class; + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return false; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return testResult.getResultValue(rowIndex, columnIndex); + } + + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + } + + @Override + public void addTableModelListener(TableModelListener l) { + } + + @Override + public void removeTableModelListener(TableModelListener l) { + } + +} diff --git a/src/main/java/de/neemann/digital/gui/components/test/TextLineNumber.java b/src/main/java/de/neemann/digital/gui/components/testing/TextLineNumber.java similarity index 99% rename from src/main/java/de/neemann/digital/gui/components/test/TextLineNumber.java rename to src/main/java/de/neemann/digital/gui/components/testing/TextLineNumber.java index 92831234b..3e75eb42c 100644 --- a/src/main/java/de/neemann/digital/gui/components/test/TextLineNumber.java +++ b/src/main/java/de/neemann/digital/gui/components/testing/TextLineNumber.java @@ -1,4 +1,4 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.gui.components.testing; import javax.swing.*; import javax.swing.border.Border; diff --git a/src/main/java/de/neemann/digital/gui/components/testing/package-info.java b/src/main/java/de/neemann/digital/gui/components/testing/package-info.java new file mode 100644 index 000000000..2d1119c82 --- /dev/null +++ b/src/main/java/de/neemann/digital/gui/components/testing/package-info.java @@ -0,0 +1,6 @@ +/** + * Classes to handle testing cases + * + * @author hneemann + */ +package de.neemann.digital.gui.components.testing; diff --git a/src/main/java/de/neemann/digital/gui/components/test/MatchedValue.java b/src/main/java/de/neemann/digital/testing/MatchedValue.java similarity index 95% rename from src/main/java/de/neemann/digital/gui/components/test/MatchedValue.java rename to src/main/java/de/neemann/digital/testing/MatchedValue.java index 44a4379bc..7241c2fe7 100644 --- a/src/main/java/de/neemann/digital/gui/components/test/MatchedValue.java +++ b/src/main/java/de/neemann/digital/testing/MatchedValue.java @@ -1,4 +1,4 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.testing; import de.neemann.digital.core.ObservableValue; import de.neemann.digital.lang.Lang; diff --git a/src/main/java/de/neemann/digital/gui/components/test/TestCaseElement.java b/src/main/java/de/neemann/digital/testing/TestCaseElement.java similarity index 96% rename from src/main/java/de/neemann/digital/gui/components/test/TestCaseElement.java rename to src/main/java/de/neemann/digital/testing/TestCaseElement.java index ebdf18a50..6180524b8 100644 --- a/src/main/java/de/neemann/digital/gui/components/test/TestCaseElement.java +++ b/src/main/java/de/neemann/digital/testing/TestCaseElement.java @@ -1,4 +1,4 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.testing; import de.neemann.digital.core.Model; import de.neemann.digital.core.NodeException; diff --git a/src/main/java/de/neemann/digital/gui/components/test/TestData.java b/src/main/java/de/neemann/digital/testing/TestData.java similarity index 87% rename from src/main/java/de/neemann/digital/gui/components/test/TestData.java rename to src/main/java/de/neemann/digital/testing/TestData.java index a088a6b65..3eaf729a8 100644 --- a/src/main/java/de/neemann/digital/gui/components/test/TestData.java +++ b/src/main/java/de/neemann/digital/testing/TestData.java @@ -1,4 +1,4 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.testing; import java.util.ArrayList; @@ -42,9 +42,9 @@ public class TestData { * Sets the data and checks its validity * * @param data the data - * @throws DataException thrown if data is not valid + * @throws TestingDataException thrown if data is not valid */ - public void setDataString(String data) throws DataException { + public void setDataString(String data) throws TestingDataException { if (!data.equals(dataString)) { TestDataParser tdp = new TestDataParser(data).parse(); dataString = data; @@ -59,7 +59,7 @@ public class TestData { TestDataParser tdp = new TestDataParser(dataString).parse(); lines = tdp.getLines(); names = tdp.getNames(); - } catch (DataException e) { + } catch (TestingDataException e) { e.printStackTrace(); } } diff --git a/src/main/java/de/neemann/digital/gui/components/test/TestDataParser.java b/src/main/java/de/neemann/digital/testing/TestDataParser.java similarity index 82% rename from src/main/java/de/neemann/digital/gui/components/test/TestDataParser.java rename to src/main/java/de/neemann/digital/testing/TestDataParser.java index f7a95b4d3..a23cef8dd 100644 --- a/src/main/java/de/neemann/digital/gui/components/test/TestDataParser.java +++ b/src/main/java/de/neemann/digital/testing/TestDataParser.java @@ -1,4 +1,4 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.testing; import de.neemann.digital.lang.Lang; @@ -37,9 +37,9 @@ public class TestDataParser { * The data then can be found in lines and names. * * @return this for chained calls - * @throws DataException DataException + * @throws TestingDataException DataException */ - public TestDataParser parse() throws DataException { + public TestDataParser parse() throws TestingDataException { try { String header = readNonEmptyLine(r); if (header != null) { @@ -55,18 +55,18 @@ public class TestDataParser { } } catch (IOException e) { - throw new DataException(e); + throw new TestingDataException(e); } return this; } - private void addLine(String line) throws DataException { + private void addLine(String line) throws TestingDataException { StringTokenizer tok; tok = new StringTokenizer(line); Value[] row = new Value[names.size()]; int cols = tok.countTokens(); if (cols != names.size()) - throw new DataException(Lang.get("err_testDataExpected_N0_found_N1_numbersInLine_N2", names.size(), cols, lineNumber)); + throw new TestingDataException(Lang.get("err_testDataExpected_N0_found_N1_numbersInLine_N2", names.size(), cols, lineNumber)); for (int i = 0; i < cols; i++) { String numStr = null; @@ -74,7 +74,7 @@ public class TestDataParser { numStr = tok.nextToken(); row[i] = new Value(numStr); } catch (NumberFormatException e) { - throw new DataException(Lang.get("err_notANumber_N0_inLine_N1", numStr, lineNumber)); + throw new TestingDataException(Lang.get("err_notANumber_N0_inLine_N1", numStr, lineNumber)); } } lines.add(row); diff --git a/src/main/java/de/neemann/digital/gui/components/test/TestResult.java b/src/main/java/de/neemann/digital/testing/TestResult.java similarity index 58% rename from src/main/java/de/neemann/digital/gui/components/test/TestResult.java rename to src/main/java/de/neemann/digital/testing/TestResult.java index a3d530688..11a725882 100644 --- a/src/main/java/de/neemann/digital/gui/components/test/TestResult.java +++ b/src/main/java/de/neemann/digital/testing/TestResult.java @@ -1,4 +1,4 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.testing; import de.neemann.digital.core.Model; import de.neemann.digital.core.NodeException; @@ -7,18 +7,15 @@ import de.neemann.digital.core.Signal; import de.neemann.digital.core.wiring.Clock; import de.neemann.digital.lang.Lang; -import javax.swing.event.TableModelListener; -import javax.swing.table.TableModel; import java.util.ArrayList; /** * Stores the test results created by a single {@link TestData} instance. * The class also performs the tests. - * Implemements {@link TableModel}, so the result can easily be shown in a {@link javax.swing.JTable}. * * @author hneemann */ -public class TestResult implements TableModel { +public class TestResult { private final ArrayList names; private final ArrayList lines; @@ -26,9 +23,9 @@ public class TestResult implements TableModel { private boolean allPassed; /** - * Creates a new test result + * Creates a new testing result * - * @param testData the test data + * @param testData the testing data */ public TestResult(TestData testData) { names = testData.getNames(); @@ -37,14 +34,14 @@ public class TestResult implements TableModel { } /** - * Creates the result by comparing the test vector with the given model- + * Creates the result by comparing the testing vector with the given model- * * @param model the model to check * @return this for chained calls - * @throws DataException DataException + * @throws TestingDataException DataException * @throws NodeException NodeException */ - public TestResult create(Model model) throws DataException, NodeException { + public TestResult create(Model model) throws TestingDataException, NodeException { allPassed = true; ArrayList inputs = new ArrayList<>(); for (Signal s : model.getInputs()) @@ -62,35 +59,32 @@ public class TestResult implements TableModel { Value[] res = new Value[row.length]; - boolean isClockValue = false; + boolean clockIsUsed = false; + // set all values except the clocks for (TestSignal in : inputs) { if (row[in.index].getType() != Value.Type.CLOCK) { - row[in.index].setTo(in.value); + row[in.index].copyTo(in.value); } else { - isClockValue = true; + clockIsUsed = true; } res[in.index] = row[in.index]; } - if (isClockValue) { + if (clockIsUsed) { // a clock signal is used model.doStep(); // propagate all except clock - for (TestSignal in : inputs) { - if (row[in.index].getType() == Value.Type.CLOCK) { - row[in.index].setTo(in.value); - } - } + // set clock + for (TestSignal in : inputs) + if (row[in.index].getType() == Value.Type.CLOCK) + row[in.index].copyTo(in.value); - model.doStep(); // propagate clock high + // propagate clock change + model.doStep(); - for (TestSignal in : inputs) { // reset clock values - if (row[in.index].getType() == Value.Type.CLOCK) { - if (row[in.index].getValue() != 0) - in.value.set(0, false); - else - in.value.set(1, false); - } - } + // restore clock + for (TestSignal in : inputs) // invert the clock values + if (row[in.index].getType() == Value.Type.CLOCK) + in.value.setBool(!in.value.getBool()); } model.doStep(); @@ -114,16 +108,51 @@ public class TestResult implements TableModel { return allPassed; } - private int getIndexOf(String name) throws DataException { + private int getIndexOf(String name) throws TestingDataException { if (name == null || name.length() == 0) - throw new DataException(Lang.get("err_unnamedSignal", name)); + throw new TestingDataException(Lang.get("err_unnamedSignal", name)); for (int i = 0; i < names.size(); i++) { String n = names.get(i); if (n.equals(name)) return i; } - throw new DataException(Lang.get("err_signal_N_notInTextVector", name)); + throw new TestingDataException(Lang.get("err_signal_N_notInTestVector", name)); + } + + /** + * @return the number of rows + */ + public int getRows() { + return results.size(); + } + + /** + * @return the number of signals + */ + public int getSignalCount() { + return names.size(); + } + + /** + * returns a signal name + * + * @param index the index of the requested signals name + * @return the signals name + */ + public String getSignalName(int index) { + return names.get(index); + } + + /** + * Returns the typed value + * + * @param rowIndex rowIndex + * @param columnIndex columnIndex + * @return the value + */ + public Value getResultValue(int rowIndex, int columnIndex) { + return results.get(rowIndex)[columnIndex]; } private static class TestSignal { @@ -136,56 +165,4 @@ public class TestResult implements TableModel { } } - @Override - public int getRowCount() { - return results.size(); - } - - @Override - public int getColumnCount() { - return names.size(); - } - - @Override - public String getColumnName(int columnIndex) { - return names.get(columnIndex); - } - - @Override - public Class getColumnClass(int columnIndex) { - return MatchedValue.class; - } - - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - return false; - } - - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - return getValue(rowIndex, columnIndex); - } - - /** - * Returns the typed value - * - * @param rowIndex rowIndex - * @param columnIndex columnIndex - * @return the value - */ - public Value getValue(int rowIndex, int columnIndex) { - return results.get(rowIndex)[columnIndex]; - } - - @Override - public void setValueAt(Object aValue, int rowIndex, int columnIndex) { - } - - @Override - public void addTableModelListener(TableModelListener l) { - } - - @Override - public void removeTableModelListener(TableModelListener l) { - } } diff --git a/src/main/java/de/neemann/digital/gui/components/test/DataException.java b/src/main/java/de/neemann/digital/testing/TestingDataException.java similarity index 57% rename from src/main/java/de/neemann/digital/gui/components/test/DataException.java rename to src/main/java/de/neemann/digital/testing/TestingDataException.java index adcba1ded..db24f5f1e 100644 --- a/src/main/java/de/neemann/digital/gui/components/test/DataException.java +++ b/src/main/java/de/neemann/digital/testing/TestingDataException.java @@ -1,15 +1,15 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.testing; /** * @author hneemann */ -public class DataException extends Exception { +public class TestingDataException extends Exception { /** * creates a new instance * * @param cause the cause */ - public DataException(Exception cause) { + public TestingDataException(Exception cause) { super(cause); } @@ -18,7 +18,7 @@ public class DataException extends Exception { * * @param message the message */ - public DataException(String message) { + public TestingDataException(String message) { super(message); } } diff --git a/src/main/java/de/neemann/digital/gui/components/test/Value.java b/src/main/java/de/neemann/digital/testing/Value.java similarity index 93% rename from src/main/java/de/neemann/digital/gui/components/test/Value.java rename to src/main/java/de/neemann/digital/testing/Value.java index b7444e42e..57a8bb77f 100644 --- a/src/main/java/de/neemann/digital/gui/components/test/Value.java +++ b/src/main/java/de/neemann/digital/testing/Value.java @@ -1,4 +1,4 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.testing; import de.neemann.digital.core.ObservableValue; @@ -130,11 +130,11 @@ public class Value { } /** - * Sets this value to a copy of the given {@link ObservableValue} + * Sets this value to the given {@link ObservableValue} * - * @param ov the ObservableValue to copy + * @param ov the ObservableValue to update */ - public void setTo(ObservableValue ov) { + public void copyTo(ObservableValue ov) { ov.set(value, isHighZ()); } } diff --git a/src/main/java/de/neemann/digital/testing/package-info.java b/src/main/java/de/neemann/digital/testing/package-info.java new file mode 100644 index 000000000..20bca940f --- /dev/null +++ b/src/main/java/de/neemann/digital/testing/package-info.java @@ -0,0 +1,10 @@ +/** + * Classes used to test a circuit. + * You can add a test to a circuit like a regular gate. + * There you can edit the test case and this test case can be run and the expected results are + * compared with the calculated results. + * It's somewhat like a unit test in java, but less flexible at the moment. + * + * @author hneemann + */ +package de.neemann.digital.testing; diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 2950daa4c..f766329c4 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -181,7 +181,7 @@ Zur Analyse können Sie die Schaltung im Gatterschrittmodus ausführen. Unerwartetes Ende des Ausdrucks Wert {0} in Zeile {1} ist keine Zahl! Erwarte {0} anstelle von {1} Werten in Zeile {2}! - Signal {0} ist im Testvektor nicht vorhanden! + Signal {0} ist im Testvektor nicht vorhanden! Keine Testdaten vorhanden. Es gibt ein unbenanntes Signal Adress Bits diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 708ed8b8c..0caa2df76 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -181,7 +181,7 @@ To analyse you can run the circuit in single gate step mode. Unexpected end of expression Value {0} in line {1} is not a number! Expected {0} but found {1} values in line {2}! - Signal {0} is not present in test vector! + Signal {0} is not present in test vector! Not test data found. There is a unnamed signal! Address Bits diff --git a/src/test/java/de/neemann/digital/integration/TestExamples.java b/src/test/java/de/neemann/digital/integration/TestExamples.java index 426a4b5b2..b4287cdc1 100644 --- a/src/test/java/de/neemann/digital/integration/TestExamples.java +++ b/src/test/java/de/neemann/digital/integration/TestExamples.java @@ -8,6 +8,7 @@ import java.io.File; * Reads all examples and tries to create the model. * Makes sure that all examples are creatable (one can build the model) * Does not ensure that they work correctly! + * Correctness is tested by {@link TestTestableExamples}. * * @author hneemann */ diff --git a/src/test/java/de/neemann/digital/integration/TestTestableExamples.java b/src/test/java/de/neemann/digital/integration/TestTestableExamples.java index acb94aa7c..01247dc1e 100644 --- a/src/test/java/de/neemann/digital/integration/TestTestableExamples.java +++ b/src/test/java/de/neemann/digital/integration/TestTestableExamples.java @@ -3,9 +3,9 @@ package de.neemann.digital.integration; import de.neemann.digital.core.Model; import de.neemann.digital.draw.elements.VisualElement; import de.neemann.digital.draw.model.ModelCreator; -import de.neemann.digital.gui.components.test.TestCaseElement; -import de.neemann.digital.gui.components.test.TestData; -import de.neemann.digital.gui.components.test.TestResult; +import de.neemann.digital.testing.TestCaseElement; +import de.neemann.digital.testing.TestData; +import de.neemann.digital.testing.TestResult; import junit.framework.TestCase; import java.io.File; diff --git a/src/test/java/de/neemann/digital/gui/components/test/TestDataParserTest.java b/src/test/java/de/neemann/digital/testing/TestDataParserTest.java similarity index 91% rename from src/test/java/de/neemann/digital/gui/components/test/TestDataParserTest.java rename to src/test/java/de/neemann/digital/testing/TestDataParserTest.java index 1f021565d..29810eff2 100644 --- a/src/test/java/de/neemann/digital/gui/components/test/TestDataParserTest.java +++ b/src/test/java/de/neemann/digital/testing/TestDataParserTest.java @@ -1,4 +1,4 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.testing; import junit.framework.TestCase; @@ -7,7 +7,7 @@ import junit.framework.TestCase; */ public class TestDataParserTest extends TestCase { - public void testOk() throws DataException { + public void testOk() throws TestingDataException { TestDataParser td = new TestDataParser("A B\n0 1\n1 0\nX x").parse(); assertEquals(2,td.getNames().size()); assertEquals(3,td.getLines().size()); @@ -32,7 +32,7 @@ public class TestDataParserTest extends TestCase { try { new TestDataParser("A B\n0 0\n1").parse(); assertTrue(false); - } catch (DataException e) { + } catch (TestingDataException e) { assertTrue(true); } } @@ -41,7 +41,7 @@ public class TestDataParserTest extends TestCase { try { new TestDataParser("A B\n0 0\n1 u").parse(); assertTrue(false); - } catch (DataException e) { + } catch (TestingDataException e) { assertTrue(true); } } diff --git a/src/test/java/de/neemann/digital/gui/components/test/TestDataTest.java b/src/test/java/de/neemann/digital/testing/TestDataTest.java similarity index 93% rename from src/test/java/de/neemann/digital/gui/components/test/TestDataTest.java rename to src/test/java/de/neemann/digital/testing/TestDataTest.java index 461ece8d5..7ac24c593 100644 --- a/src/test/java/de/neemann/digital/gui/components/test/TestDataTest.java +++ b/src/test/java/de/neemann/digital/testing/TestDataTest.java @@ -1,4 +1,4 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.testing; import junit.framework.TestCase; @@ -19,7 +19,7 @@ public class TestDataTest extends TestCase { try { td.setDataString(DATA3); assertTrue(false); - } catch (DataException e) { + } catch (TestingDataException e) { assertTrue(true); } // TestData remains unchanged! diff --git a/src/test/java/de/neemann/digital/gui/components/test/TestResultTest.java b/src/test/java/de/neemann/digital/testing/TestResultTest.java similarity index 85% rename from src/test/java/de/neemann/digital/gui/components/test/TestResultTest.java rename to src/test/java/de/neemann/digital/testing/TestResultTest.java index 98cd215a8..b15523ab9 100644 --- a/src/test/java/de/neemann/digital/gui/components/test/TestResultTest.java +++ b/src/test/java/de/neemann/digital/testing/TestResultTest.java @@ -1,4 +1,4 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.testing; import de.neemann.digital.analyse.expression.Expression; import de.neemann.digital.analyse.parser.ParseException; @@ -17,6 +17,9 @@ import junit.framework.TestCase; import java.io.IOException; import java.util.ArrayList; +import static de.neemann.digital.analyse.expression.Not.not; +import static de.neemann.digital.analyse.expression.Variable.v; + /** * @author hneemann */ @@ -55,10 +58,10 @@ public class TestResultTest extends TestCase { + "1 1 0\n"); TestResult tr = new TestResult(data).create(model); assertFalse(tr.allPassed()); - assertEquals(true, ((MatchedValue)tr.getValue(0,2)).isPassed()); - assertEquals(true, ((MatchedValue)tr.getValue(1,2)).isPassed()); - assertEquals(true, ((MatchedValue)tr.getValue(2,2)).isPassed()); - assertEquals(false, ((MatchedValue)tr.getValue(3,2)).isPassed()); + assertEquals(true, ((MatchedValue) tr.getResultValue(0, 2)).isPassed()); + assertEquals(true, ((MatchedValue) tr.getResultValue(1, 2)).isPassed()); + assertEquals(true, ((MatchedValue) tr.getResultValue(2, 2)).isPassed()); + assertEquals(false, ((MatchedValue) tr.getResultValue(3, 2)).isPassed()); } public void testResultDontCare() throws Exception { diff --git a/src/test/java/de/neemann/digital/gui/components/test/ValueTest.java b/src/test/java/de/neemann/digital/testing/ValueTest.java similarity index 92% rename from src/test/java/de/neemann/digital/gui/components/test/ValueTest.java rename to src/test/java/de/neemann/digital/testing/ValueTest.java index a2b0e69f1..fdad320fd 100644 --- a/src/test/java/de/neemann/digital/gui/components/test/ValueTest.java +++ b/src/test/java/de/neemann/digital/testing/ValueTest.java @@ -1,5 +1,6 @@ -package de.neemann.digital.gui.components.test; +package de.neemann.digital.testing; +import de.neemann.digital.testing.Value; import junit.framework.TestCase; /** @@ -43,5 +44,6 @@ public class ValueTest extends TestCase { assertEquals("X",new Value("X").toString()); assertEquals("Z",new Value("Z").toString()); assertEquals("2",new Value("2").toString()); + assertEquals("C",new Value("C").toString()); } } \ No newline at end of file