From a346437071c0dc6d453feb0d426e0b2d51fcc148 Mon Sep 17 00:00:00 2001 From: hneemann Date: Sat, 1 May 2021 09:02:31 +0200 Subject: [PATCH] adds a test case --- .../java/de/neemann/digital/StringList.java | 68 +++++++++++++ .../de/neemann/digital/data/ValueTable.java | 10 +- .../components/data/ValueTableObserver.java | 2 +- .../data/ValueTableObserverTest.java | 87 +++++++++++++++++ src/test/resources/dig/graph/simple.dig | 96 +++++++++++++++++++ src/test/resources/dig/graph/simple2.dig | 34 +++++++ 6 files changed, 293 insertions(+), 4 deletions(-) create mode 100644 src/main/java/de/neemann/digital/StringList.java create mode 100644 src/test/java/de/neemann/digital/gui/components/data/ValueTableObserverTest.java create mode 100644 src/test/resources/dig/graph/simple.dig create mode 100644 src/test/resources/dig/graph/simple2.dig diff --git a/src/main/java/de/neemann/digital/StringList.java b/src/main/java/de/neemann/digital/StringList.java new file mode 100644 index 000000000..ff28c3522 --- /dev/null +++ b/src/main/java/de/neemann/digital/StringList.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021 Helmut Neemann. + * Use of this source code is governed by the GPL v3 license + * that can be found in the LICENSE file. + */ +package de.neemann.digital; + +/** + * Helper to create a list of strings. + * Takes care of adding a separator at the right places in between the items. + */ +public class StringList { + + private final StringBuilder builder; + private boolean first; + private String sep; + + /** + * Create a new instance + */ + public StringList() { + this(new StringBuilder()); + } + + /** + * Creates a new instance + * + * @param builder the StringBuilder to use + */ + public StringList(StringBuilder builder) { + this.builder = builder; + this.first = true; + this.sep = " "; + } + + /** + * Sets the separator. + * The default value is a blank. + * + * @param sep the separator + * @return this for chained calls + */ + public StringList separator(String sep) { + this.sep = sep; + return this; + } + + /** + * Adds a item to the list. + * Adds a separator if needed. + * + * @param item the item to add. + * @return this for chained calls + */ + public StringList add(String item) { + if (first) + first = false; + else + builder.append(sep); + builder.append(item); + return this; + } + + @Override + public String toString() { + return builder.toString(); + } +} diff --git a/src/main/java/de/neemann/digital/data/ValueTable.java b/src/main/java/de/neemann/digital/data/ValueTable.java index 778b7b5d8..b762f3bae 100644 --- a/src/main/java/de/neemann/digital/data/ValueTable.java +++ b/src/main/java/de/neemann/digital/data/ValueTable.java @@ -5,6 +5,7 @@ */ package de.neemann.digital.data; +import de.neemann.digital.StringList; import de.neemann.digital.core.IntFormat; import de.neemann.digital.core.Observable; import de.neemann.digital.core.ValueFormatter; @@ -282,20 +283,23 @@ public class ValueTable extends Observable implements Iterable { @Override public String toString() { StringBuilder sb = new StringBuilder(); + StringList sl = new StringList(sb); for (String n : names) - sb.append(n).append(" "); + sl.add(n); sb.append("\n"); if (tableRowIndex == null) for (TestRow row : values) { + sl = new StringList(sb); for (Value v : row.getValues()) - sb.append(v.toString()).append(" "); + sl.add(v.toString()); sb.append("\n"); } else for (int i : tableRowIndex) { + sl = new StringList(sb); for (Value v : values.get(i).getValues()) - sb.append(v.toString()).append(" "); + sl.add(v.toString()); sb.append("\n"); } diff --git a/src/main/java/de/neemann/digital/gui/components/data/ValueTableObserver.java b/src/main/java/de/neemann/digital/gui/components/data/ValueTableObserver.java index e290f549c..33c55a20a 100644 --- a/src/main/java/de/neemann/digital/gui/components/data/ValueTableObserver.java +++ b/src/main/java/de/neemann/digital/gui/components/data/ValueTableObserver.java @@ -49,7 +49,7 @@ public class ValueTableObserver implements ModelStateObserverTyped { if (event == ModelEvent.STARTED) logData.clear(); - if (event.getType() == type) { + if (event.getType() == type || event.getType() == ModelEventType.CHECKBURN) { Value[] row = new Value[logData.getColumns()]; for (int i = 0; i < logData.getColumns(); i++) row[i] = new Value(signals.get(i).getValue()); diff --git a/src/test/java/de/neemann/digital/gui/components/data/ValueTableObserverTest.java b/src/test/java/de/neemann/digital/gui/components/data/ValueTableObserverTest.java new file mode 100644 index 000000000..d86dd1127 --- /dev/null +++ b/src/test/java/de/neemann/digital/gui/components/data/ValueTableObserverTest.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2021 Helmut Neemann + * Use of this source code is governed by the GPL v3 license + * that can be found in the LICENSE file. + */ +package de.neemann.digital.gui.components.data; + +import de.neemann.digital.core.Model; +import de.neemann.digital.core.ObservableValue; +import de.neemann.digital.core.Signal; +import de.neemann.digital.data.ValueTable; +import de.neemann.digital.integration.ToBreakRunner; +import junit.framework.TestCase; + +import java.util.ArrayList; + +public class ValueTableObserverTest extends TestCase { + + private static final class Case { + private final String name; + private final boolean microStep; + private final int clocks; + private final int expectedSize; + private final String expectedData; + + public Case(String name, boolean microStep, int clocks, int expectedSize, String expectedData) { + this.name = name; + this.microStep = microStep; + this.clocks = clocks; + this.expectedSize = expectedSize; + this.expectedData = expectedData; + } + } + + private final Case[] cases = new Case[]{ + new Case("dig/graph/simple.dig", false, 4, 4, + "C Y X Z\n" + + "1 1 0 1\n" + + "0 0 1 0\n" + + "1 1 0 1\n" + + "0 0 1 0\n"), + new Case("dig/graph/simple.dig", true, 4, 12, + "C Y X Z\n" + + "1 1 1 0\n" + + "1 1 0 0\n" + + "1 1 0 1\n" + + "0 0 0 1\n" + + "0 0 1 1\n" + + "0 0 1 0\n" + + "1 1 1 0\n" + + "1 1 0 0\n" + + "1 1 0 1\n" + + "0 0 0 1\n" + + "0 0 1 1\n" + + "0 0 1 0\n"), + new Case("dig/graph/simple2.dig", false, 4, 4, + "C Y\n" + + "1 1\n" + + "0 0\n" + + "1 1\n" + + "0 0\n"), + new Case("dig/graph/simple2.dig", true, 4, 4, + "C Y\n" + + "1 1\n" + + "0 0\n" + + "1 1\n" + + "0 0\n"), + }; + + + public void testTable() throws Exception { + for (Case c : cases) { + Model m = new ToBreakRunner(c.name).getModel(); + ArrayList list = m.getSignals(); + ValueTableObserver o = new ValueTableObserver(c.microStep, list, 100); + m.addObserver(o); + + ObservableValue clock = m.getClocks().get(0).getClockOutput(); + for (int i = 0; i < c.clocks; i++) + m.modify(() -> clock.setBool(!clock.getBool())); + + ValueTable logData = o.getLogData(); + assertEquals(c.expectedSize, logData.getRows()); + assertEquals(c.expectedData, logData.toString()); + } + } +} \ No newline at end of file diff --git a/src/test/resources/dig/graph/simple.dig b/src/test/resources/dig/graph/simple.dig new file mode 100644 index 000000000..e104e856d --- /dev/null +++ b/src/test/resources/dig/graph/simple.dig @@ -0,0 +1,96 @@ + + + 1 + + + + Clock + + + Label + C + + + + + + Out + + + Label + Y + + + + + + Not + + + + + Not + + + + + Out + + + Label + X + + + + + + Out + + + Label + Z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/dig/graph/simple2.dig b/src/test/resources/dig/graph/simple2.dig new file mode 100644 index 000000000..73e932006 --- /dev/null +++ b/src/test/resources/dig/graph/simple2.dig @@ -0,0 +1,34 @@ + + + 1 + + + + Clock + + + Label + C + + + + + + Out + + + Label + Y + + + + + + + + + + + + + \ No newline at end of file