Made WordAddressableMemoryTest less random and better at finding errors.
[Mograsim.git] / net.mograsim.machine / test / net / mograsim / machine / standard / memory / WordAddressableMemoryTest.java
index 5f50dbc..9571e93 100644 (file)
@@ -4,42 +4,45 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.math.BigInteger;
 import java.util.Random;
+import java.util.stream.LongStream;
 
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 
 import net.mograsim.logic.core.timeline.Timeline;
 import net.mograsim.logic.core.types.Bit;
 import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+import net.mograsim.logic.core.wires.CoreWire;
+import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
 import net.mograsim.machine.MainMemoryDefinition;
 
-class WordAddressableMemoryTest {
-       
+class WordAddressableMemoryTest
+{
+
        private Timeline t = new Timeline(10);
 
-       @Test
-       public void wordAddressableMemoryLargeTest()
+       @ParameterizedTest(name = "seed = {0}")
+       @MethodSource("seedsForRandom")
+       public void wordAddressableMemoryLargeTest(long seed)
        {
-               Wire rW = new Wire(t, 1, 2);
-               Wire data = new Wire(t, 16, 2);
-               Wire address = new Wire(t, 64, 2);
+               CoreWire rW = new CoreWire(t, 1, 2);
+               CoreWire data = new CoreWire(t, 16, 2);
+               CoreWire address = new CoreWire(t, 64, 2);
                ReadWriteEnd rWI = rW.createReadWriteEnd();
                ReadWriteEnd dataI = data.createReadWriteEnd();
                ReadWriteEnd addressI = address.createReadWriteEnd();
 
                @SuppressWarnings("unused")
-               WordAddressableMemoryComponent memory = new WordAddressableMemoryComponent(t, 4, MainMemoryDefinition.create(64, 16, 4096L, Long.MAX_VALUE), data.createReadWriteEnd(),
+               CoreWordAddressableMemory memory = new CoreWordAddressableMemory(t, 4,
+                               new WordAddressableMemory(MainMemoryDefinition.create(64, 16, 4096L, Long.MAX_VALUE)), data.createReadWriteEnd(),
                                rW.createReadOnlyEnd(), address.createReadOnlyEnd());
 
-               Random r = new Random();
+               Random r = new Random(seed);
                for (long j = 1; j > 0; j *= 2)
                {
-                       for (int i = 0; i < 50; i++)
+                       for (int i = 0; i < 100; i++)
                        {
-                               String sAddress = String.format("%64s", BigInteger.valueOf(4096 + i + j).toString(2)).replace(' ', '0');
-                               sAddress = new StringBuilder(sAddress).reverse().toString();
-                               BitVector bAddress = BitVector.parse(sAddress);
+                               BitVector bAddress = BitVector.from(4096 + i + j, 64);
                                addressI.feedSignals(bAddress);
                                t.executeAll();
                                String random = BigInteger.valueOf(Math.abs(r.nextInt())).toString(5);
@@ -55,9 +58,13 @@ class WordAddressableMemoryTest {
                                dataI.clearSignals();
                                t.executeAll();
 
-                               assertEquals(dataI.getValues(), vector);
+                               assertEquals(dataI.getValues(), vector, "seed=" + seed + ", j=" + j + ", i=" + i);
                        }
                }
        }
 
+       public static LongStream seedsForRandom()
+       {
+               return LongStream.range(0, 100);
+       }
 }