+package net.mograsim.logic.core.types;\r
+\r
+import static net.mograsim.logic.core.types.BitVector.*;\r
+import static net.mograsim.logic.core.types.Bit.*;\r
+import static org.junit.jupiter.api.Assertions.*;\r
+\r
+import java.math.BigInteger;\r
+import java.util.Iterator;\r
+\r
+import org.junit.jupiter.api.Test;\r
+\r
+class BitVectorTest\r
+{\r
+\r
+ @Test\r
+ void testOfBitArray()\r
+ {\r
+ BitVector.of(); // should be allowed and work\r
+\r
+ assertSame(SINGLE_U, BitVector.of(U));\r
+ assertSame(SINGLE_X, BitVector.of(X));\r
+ assertSame(SINGLE_0, BitVector.of(ZERO));\r
+ assertSame(SINGLE_1, BitVector.of(ONE));\r
+ assertSame(SINGLE_Z, BitVector.of(Z));\r
+ }\r
+\r
+ @Test\r
+ void testOfBitInt()\r
+ {\r
+ assertEquals(BitVector.of(), BitVector.of(ONE, 0));\r
+\r
+ assertSame(SINGLE_U, BitVector.of(U, 1));\r
+ assertSame(SINGLE_X, BitVector.of(X, 1));\r
+ assertSame(SINGLE_0, BitVector.of(ZERO, 1));\r
+ assertSame(SINGLE_1, BitVector.of(ONE, 1));\r
+ assertSame(SINGLE_Z, BitVector.of(Z, 1));\r
+\r
+ assertEquals(BitVector.of(X, X, X), BitVector.of(X, 3));\r
+ }\r
+\r
+ @Test\r
+ void testFrom()\r
+ {\r
+ assertEquals(BitVector.parse("101"), BitVector.from(BigInteger.valueOf(0b101), 3));\r
+ assertEquals(BitVector.parse("01010"), BitVector.from(BigInteger.valueOf(0b01010), 5));\r
+ assertEquals(BitVector.parse("10101"), BitVector.from(BigInteger.valueOf(-11), 5));\r
+ assertEquals(BitVector.parse("0000"), BitVector.from(BigInteger.valueOf(0), 4));\r
+ }\r
+\r
+ @Test\r
+ void testGetUnsignedValue()\r
+ {\r
+ assertEquals(BigInteger.valueOf(0b101), BitVector.parse("101").getUnsignedValue());\r
+ assertEquals(BigInteger.valueOf(0b01010), BitVector.parse("01010").getUnsignedValue());\r
+ assertEquals(BigInteger.valueOf(0), BitVector.parse("0000").getUnsignedValue());\r
+\r
+ assertThrows(NumberFormatException.class, () -> BitVector.parse("00X1").getUnsignedValue());\r
+\r
+ }\r
+\r
+ @Test\r
+ void testToBigInteger()\r
+ {\r
+ assertEquals(BigInteger.valueOf(0b101), BitVector.parse("101").toBigInteger(false));\r
+ assertEquals(BigInteger.valueOf(0b01010), BitVector.parse("01010").toBigInteger(false));\r
+ assertEquals(BigInteger.valueOf(0), BitVector.parse("0000").toBigInteger(false));\r
+\r
+// assertEquals(BigInteger.valueOf(-11), BitVector.parse("10101").toBigInteger(true)); TODO\r
+\r
+ assertThrows(NumberFormatException.class, () -> BitVector.parse("00X1").toBigInteger(false));\r
+ }\r
+\r
+ @Test\r
+ void testOfLongInt()\r
+ {\r
+ assertEquals(BitVector.parse("101"), BitVector.of(0b101L, 3));\r
+ assertEquals(BitVector.parse("01010"), BitVector.of(0b01010L, 5));\r
+ assertEquals(BitVector.parse("10101"), BitVector.of(-11L, 5));\r
+ assertEquals(BitVector.parse("0000"), BitVector.of(0L, 4));\r
+ }\r
+\r
+ @Test\r
+ void testOfBigIntegerInt()\r
+ {\r
+ assertEquals(BitVector.parse("101"), BitVector.of(BigInteger.valueOf(0b101), 3));\r
+ assertEquals(BitVector.parse("01010"), BitVector.of(BigInteger.valueOf(0b01010), 5));\r
+ assertEquals(BitVector.parse("10101"), BitVector.of(BigInteger.valueOf(-11), 5));\r
+ assertEquals(BitVector.parse("0000"), BitVector.of(BigInteger.valueOf(0), 4));\r
+ }\r
+\r
+ @Test\r
+ void testMutator()\r
+ {\r
+ var bv = BitVector.SINGLE_1;\r
+ var bvm = bv.mutator();\r
+\r
+ assertFalse(bvm.isEmpty());\r
+ assertEquals(ONE, bvm.getLSBit(0));\r
+ assertEquals(SINGLE_1, bvm.toBitVector());\r
+ }\r
+\r
+ @Test\r
+ void testGetMSBit()\r
+ {\r
+ assertEquals(ONE, SINGLE_1.getMSBit(0));\r
+ assertEquals(ONE, BitVector.of(ONE, X, X, X).getMSBit(0));\r
+ assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getMSBit(4));\r
+ }\r
+\r
+ @Test\r
+ void testGetLSBit()\r
+ {\r
+ assertEquals(ONE, SINGLE_1.getLSBit(0));\r
+ assertEquals(ONE, BitVector.of(X, X, X, ONE).getLSBit(0));\r
+ assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getLSBit(1));\r
+ }\r
+\r
+ @Test\r
+ void testGetBits()\r
+ {\r
+ assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.of(X, ONE, Z).getBits());\r
+ assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.parse("X1Z").getBits());\r
+ }\r
+\r
+ @Test\r
+ void testIsBinary()\r
+ {\r
+ assertTrue(SINGLE_0.isBinary());\r
+ assertTrue(SINGLE_1.isBinary());\r
+\r
+ assertFalse(SINGLE_U.isBinary());\r
+ assertFalse(SINGLE_X.isBinary());\r
+ assertFalse(SINGLE_Z.isBinary());\r
+\r
+ assertTrue(BitVector.of(ONE, ZERO, ONE, ONE, ZERO).isBinary());\r
+ assertFalse(BitVector.of(ONE, ZERO, ZERO, X).isBinary());\r
+ }\r
+\r
+ @Test\r
+ void testJoin()\r
+ {\r
+ // binary\r
+ assertEquals(SINGLE_0, SINGLE_0.join(SINGLE_0));\r
+ assertEquals(SINGLE_X, SINGLE_0.join(SINGLE_1));\r
+ assertEquals(SINGLE_1, SINGLE_1.join(SINGLE_1));\r
+\r
+ // other\r
+ assertEquals(SINGLE_1, SINGLE_Z.join(SINGLE_1));\r
+ assertEquals(SINGLE_U, SINGLE_0.join(SINGLE_U));\r
+ assertEquals(SINGLE_X, SINGLE_X.join(SINGLE_Z));\r
+\r
+ // higher length\r
+ var result = BitVector.of(U, X, ZERO, ONE, Z).join(BitVector.of(ONE, ZERO, ZERO, ONE, Z));\r
+ assertEquals(BitVector.of(U, X, ZERO, ONE, Z), result);\r
+ }\r
+\r
+ @Test\r
+ void testAnd()\r
+ {\r
+ // binary\r
+ assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_0));\r
+ assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_1));\r
+ assertEquals(SINGLE_1, SINGLE_1.and(SINGLE_1));\r
+\r
+ // other\r
+ assertEquals(SINGLE_X, SINGLE_Z.and(SINGLE_1));\r
+ assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_U));\r
+ assertEquals(SINGLE_X, SINGLE_X.and(SINGLE_Z));\r
+\r
+ // higher length\r
+ var result = BitVector.of(U, X, ZERO, ONE, ONE).and(BitVector.of(ONE, ONE, ZERO, ZERO, ONE));\r
+ assertEquals(BitVector.of(U, X, ZERO, ZERO, ONE), result);\r
+ }\r
+\r
+ @Test\r
+ void testOr()\r
+ {\r
+ // binary\r
+ assertEquals(SINGLE_0, SINGLE_0.or(SINGLE_0));\r
+ assertEquals(SINGLE_1, SINGLE_0.or(SINGLE_1));\r
+ assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_1));\r
+\r
+ // other\r
+ assertEquals(SINGLE_1, SINGLE_Z.or(SINGLE_1));\r
+ assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_U));\r
+ assertEquals(SINGLE_X, SINGLE_X.or(SINGLE_Z));\r
+\r
+ // higher length\r
+ var result = BitVector.of(U, X, ZERO, ONE, ZERO).or(BitVector.of(ZERO, ZERO, ZERO, ONE, ONE));\r
+ assertEquals(BitVector.of(U, X, ZERO, ONE, ONE), result);\r
+ }\r
+\r
+ @Test\r
+ void testXor()\r
+ {\r
+ // binary\r
+ assertEquals(SINGLE_0, SINGLE_0.xor(SINGLE_0));\r
+ assertEquals(SINGLE_1, SINGLE_0.xor(SINGLE_1));\r
+ assertEquals(SINGLE_0, SINGLE_1.xor(SINGLE_1));\r
+\r
+ // other\r
+ assertEquals(SINGLE_X, SINGLE_Z.xor(SINGLE_1));\r
+ assertEquals(SINGLE_U, SINGLE_0.xor(SINGLE_U));\r
+ assertEquals(SINGLE_X, SINGLE_X.xor(SINGLE_Z));\r
+\r
+ // higher length\r
+ var result = BitVector.of(U, X, ZERO, ONE, ONE).xor(BitVector.of(ONE, ZERO, ZERO, ZERO, ONE));\r
+ assertEquals(BitVector.of(U, X, ZERO, ONE, ZERO), result);\r
+ }\r
+\r
+ @Test\r
+ void testNot()\r
+ {\r
+ // binary\r
+ assertEquals(SINGLE_1, SINGLE_0.not());\r
+ assertEquals(SINGLE_0, SINGLE_1.not());\r
+\r
+ // other\r
+ assertEquals(SINGLE_U, SINGLE_U.not());\r
+ assertEquals(SINGLE_X, SINGLE_X.not());\r
+ assertEquals(SINGLE_X, SINGLE_Z.not());\r
+\r
+ // higher length\r
+ var result = BitVector.of(U, X, ZERO, ONE, Z).not();\r
+ assertEquals(BitVector.of(U, X, ONE, ZERO, X), result);\r
+ }\r
+\r
+ @Test\r
+ void testLength()\r
+ {\r
+ assertEquals(0, BitVector.of().length());\r
+ assertEquals(1, SINGLE_0.length());\r
+ assertEquals(3, BitVector.of(X, X, Z).length());\r
+ }\r
+\r
+ @Test\r
+ void testConcat()\r
+ {\r
+ assertEquals(BitVector.of(U, X), SINGLE_U.concat(SINGLE_X));\r
+ assertEquals(BitVector.of(Z, X, U, ONE, X), BitVector.of(Z, X, U).concat(BitVector.of(ONE, X)));\r
+ }\r
+\r
+ @Test\r
+ void testSubVectorInt()\r
+ {\r
+ assertEquals(SINGLE_0, SINGLE_0.subVector(0));\r
+ assertEquals(BitVector.of(), SINGLE_0.subVector(1));\r
+ assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1));\r
+ assertEquals(BitVector.of(X, Z), BitVector.of(ZERO, U, ONE, X, Z).subVector(3));\r
+ }\r
+\r
+ @Test\r
+ void testSubVectorIntInt()\r
+ {\r
+ assertEquals(SINGLE_0, SINGLE_0.subVector(0, 1));\r
+ assertEquals(BitVector.of(), SINGLE_0.subVector(0, 0));\r
+ assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1, 2));\r
+ assertEquals(BitVector.of(ONE, X), BitVector.of(ZERO, U, ONE, X, Z).subVector(2, 4));\r
+ }\r
+\r
+ @Test\r
+ void testEqualsObject()\r
+ {\r
+ assertEquals(SINGLE_X, SINGLE_X);\r
+ assertNotEquals(SINGLE_0, SINGLE_1);\r
+\r
+ assertEquals(BitVector.of(X, Z, U), BitVector.of(X, Z, U));\r
+ assertNotEquals(BitVector.of(X, Z, U), BitVector.of(X, X, U));\r
+ }\r
+\r
+ @Test\r
+ void testEqualsWithOffset()\r
+ {\r
+ assertTrue(SINGLE_X.equalsWithOffset(SINGLE_X, 0));\r
+ assertFalse(SINGLE_0.equalsWithOffset(SINGLE_1, 0));\r
+\r
+ assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(Z, U), 1));\r
+ assertFalse(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(X, U), 1));\r
+ assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(U), 2));\r
+ }\r
+\r
+ @Test\r
+ void testParse()\r
+ {\r
+ assertEquals(SINGLE_U, BitVector.parse("U"));\r
+ assertEquals(SINGLE_X, BitVector.parse("X"));\r
+ assertEquals(SINGLE_0, BitVector.parse("0"));\r
+ assertEquals(SINGLE_1, BitVector.parse("1"));\r
+ assertEquals(SINGLE_Z, BitVector.parse("Z"));\r
+\r
+ assertEquals(BitVector.of(X, U, Z, ONE, ZERO), BitVector.parse("XUZ10"));\r
+\r
+ assertThrows(RuntimeException.class, () -> BitVector.parse("01BX"));\r
+ }\r
+\r
+ @Test\r
+ void testIterator()\r
+ {\r
+ var bv = BitVector.of(U, Z, ONE, ZERO, X);\r
+ Iterator<Bit> it = bv.iterator();\r
+\r
+ assertEquals(U, it.next());\r
+ assertEquals(Z, it.next());\r
+ assertEquals(ONE, it.next());\r
+ assertEquals(ZERO, it.next());\r
+ assertEquals(X, it.next());\r
+ assertFalse(it.hasNext());\r
+ }\r
+}\r