package jmri.jmrix.loconet; import jmri.util.JUnitUtil; import jmri.util.StringUtil; import org.junit.Assert; import org.junit.jupiter.api.*; /** * Tests for the jmri.jmrix.loconet.LocoNetMessage class. *
* JMRI is free software; you can redistribute it and/or modify it under * the terms of version 2 of the GNU General Public License as published * by the Free Software Foundation. See the "COPYING" file for a copy * of this license. *
* JMRI is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. *
* Some of the message formats used in this class are Copyright Digitrax, Inc. * and used with permission as part of the JMRI project. That permission does * not extend to uses in other software products. If you wish to use this code, * algorithm or these message formats outside of JMRI, please contact Digitrax * Inc for separate permission. * * @author Bob Jacobsen * @author B. Milhaupt Copyright (C) 2018 */ public class LocoNetMessageTest { @Test public void testCtor() { LocoNetMessage m = new LocoNetMessage(3); Assert.assertEquals("length", 3, m.getNumDataElements()); m = new LocoNetMessage(2); Assert.assertEquals("length", 2, m.getNumDataElements()); new LocoNetMessage(1); jmri.util.JUnitAppender.assertErrorMessage("LocoNetMessage does not allow object creation if length is less than 2."); new LocoNetMessage(0); jmri.util.JUnitAppender.assertErrorMessage("LocoNetMessage does not allow object creation if length is less than 2."); new LocoNetMessage(-1); jmri.util.JUnitAppender.assertErrorMessage("LocoNetMessage does not allow object creation if length is less than 2."); } @Test public void testArrayCtor() { LocoNetMessage m = new LocoNetMessage(new int[]{11, 12, 13, 14}); Assert.assertEquals("length", 4, m.getNumDataElements()); Assert.assertEquals("first value", 11, m.getElement(0)); Assert.assertEquals("second value", 12, m.getElement(1)); Assert.assertEquals("third value", 13, m.getElement(2)); Assert.assertEquals("fourth value", 14, m.getElement(3)); new LocoNetMessage(new int[] {0x85}); jmri.util.JUnitAppender.assertErrorMessage("Cannot create a LocoNet message of length shorter than two."); byte[] t1 = new byte[]{(byte) 0x81}; new LocoNetMessage(t1); jmri.util.JUnitAppender.assertErrorMessage("Cannot create a LocoNet message of length shorter than two."); } @Test public void testGetPeerXfr() { // basic message LocoNetMessage m1 = LocoNetMessage.makePeerXfr(0x1050, 0x1051, new int[]{1, 2, 3, 4, 5, 6, 7, 8}, 0); checkPeerXfr(m1, 0x1050, 0x1051, new int[]{1, 2, 3, 4, 5, 6, 7, 8}, 0); // some high data bits set LocoNetMessage m2 = LocoNetMessage.makePeerXfr(0x1050, 0x1051, new int[]{0x80, 0x81, 3, 4, 0xf5, 6, 7, 0xf8}, 0); checkPeerXfr(m2, 0x1050, 0x1051, new int[]{0x80, 0x81, 3, 4, 0xf5, 6, 7, 0xf8}, 0); // all high data bits set LocoNetMessage m3 = LocoNetMessage.makePeerXfr(0x1050, 0x1051, new int[]{0x80, 0x81, 0x83, 0x84, 0xf5, 0x86, 0x87, 0xf8}, 0); checkPeerXfr(m3, 0x1050, 0x1051, new int[]{0x80, 0x81, 0x83, 0x84, 0xf5, 0x86, 0x87, 0xf8}, 0); // check code three times LocoNetMessage m4 = LocoNetMessage.makePeerXfr(0x1050, 0x1051, new int[]{1, 2, 3, 4, 5, 6, 7, 8}, 0x11); checkPeerXfr(m4, 0x1050, 0x1051, new int[]{1, 2, 3, 4, 5, 6, 7, 8}, 0x11); m4 = LocoNetMessage.makePeerXfr(0x1050, 0x1051, new int[]{1, 2, 3, 4, 5, 6, 7, 8}, 0x38); checkPeerXfr(m4, 0x1050, 0x1051, new int[]{1, 2, 3, 4, 5, 6, 7, 8}, 0x38); m4 = LocoNetMessage.makePeerXfr(0x1050, 0x1051, new int[]{1, 2, 3, 4, 5, 6, 7, 8}, 63); checkPeerXfr(m4, 0x1050, 0x1051, new int[]{1, 2, 3, 4, 5, 6, 7, 8}, 63); } @Test public void testConstructorNoParams() { LocoNetMessage m = new LocoNetMessage(); jmri.util.JUnitAppender.assertErrorMessage("LocoNetMessage does not allow a constructor with no argument"); Assert.assertEquals("expect 0-length LocoNetMessage object", 0, m.getNumDataElements()); } @Test public void testConstructorString() { LocoNetMessage m = new LocoNetMessage(""); jmri.util.JUnitAppender.assertErrorMessage("LocoNetMessage does not allow a constructor with a 'String' argument"); Assert.assertEquals("expect 0-length LocoNetMessage object", 0, m.getNumDataElements()); m = new LocoNetMessage("A"); jmri.util.JUnitAppender.assertErrorMessage("LocoNetMessage does not allow a constructor with a 'String' argument"); Assert.assertEquals("expect 0-length LocoNetMessage object", 0, m.getNumDataElements()); m = new LocoNetMessage("AB"); jmri.util.JUnitAppender.assertErrorMessage("LocoNetMessage does not allow a constructor with a 'String' argument"); Assert.assertEquals("expect 0-length LocoNetMessage object", 0, m.getNumDataElements()); m = new LocoNetMessage("ABC"); jmri.util.JUnitAppender.assertErrorMessage("LocoNetMessage does not allow a constructor with a 'String' argument"); Assert.assertEquals("expect 0-length LocoNetMessage object", 0, m.getNumDataElements()); m = new LocoNetMessage("ABCD"); jmri.util.JUnitAppender.assertErrorMessage("LocoNetMessage does not allow a constructor with a 'String' argument"); Assert.assertEquals("expect 0-length LocoNetMessage object", 0, m.getNumDataElements()); m = new LocoNetMessage("81 7E"); jmri.util.JUnitAppender.assertErrorMessage("LocoNetMessage does not allow a constructor with a 'String' argument"); Assert.assertEquals("expect 0-length LocoNetMessage object", 0, m.getNumDataElements()); m = new LocoNetMessage("81 7e"); jmri.util.JUnitAppender.assertErrorMessage("LocoNetMessage does not allow a constructor with a 'String' argument"); Assert.assertEquals("expect 0-length LocoNetMessage object", 0, m.getNumDataElements()); } // use the makePeerXfr calls, already tested to check the decoding @Test public void testGetPeerXfrData() { int[] test; int[] data; LocoNetMessage m; test = new int[]{1, 2, 3, 4, 5, 6, 7, 8}; m = LocoNetMessage.makePeerXfr(0x1050, 0x1051, test, 63); data = m.getPeerXfrData(); for (int i = 0; i < 8; i++) { Assert.assertEquals("simple value " + i, "" + test[i], "" + data[i]); } test = new int[]{0x81, 0x21, 0x83, 0x84, 0x54, 0x86, 0x66, 0x88}; m = LocoNetMessage.makePeerXfr(0x1050, 0x1051, test, 63); data = m.getPeerXfrData(); for (int i = 0; i < 8; i++) { Assert.assertEquals("high-bit value " + i, "" + test[i], "" + data[i]); } test = new int[]{0xB5, 0xD3, 0x63, 0xF4, 0x5E, 0x77, 0xFF, 0x22}; m = LocoNetMessage.makePeerXfr(0x1050, 0x1051, test, 63); data = m.getPeerXfrData(); for (int i = 0; i < 8; i++) { Assert.assertEquals("complicated value " + i, "" + test[i], "" + data[i]); } m.setOpCode(0); data = m.getPeerXfrData(); jmri.util.JUnitAppender.assertErrorMessage("getPeerXfrData called with wrong opcode 0"); m.setOpCode(0xe4); data = m.getPeerXfrData(); jmri.util.JUnitAppender.assertErrorMessage("getPeerXfrData called with wrong opcode 228"); m.setOpCode(0xe5); m.setElement(1, 9); data = m.getPeerXfrData(); jmri.util.JUnitAppender.assertErrorMessage("getPeerXfrData called with wrong secondary code 9"); m = new LocoNetMessage(new int[] {0xe5, 0x10, 0x42, 0x40, 0x00, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); data = m.getPeerXfrData(); jmri.util.JUnitAppender.assertErrorMessage("getPeerXfrData called with wrong length 17"); m = new LocoNetMessage(new int[] {0xe5, 0x10, 0x42, 0x40, 0x00, 0x00}); data = m.getPeerXfrData(); jmri.util.JUnitAppender.assertErrorMessage("getPeerXfrData called with wrong length 6"); m = new LocoNetMessage(new int[] {0xe5, 0x10, 0x42, 0x40, 0x00}); data = m.getPeerXfrData(); jmri.util.JUnitAppender.assertErrorMessage("getPeerXfrData called with wrong length 5"); for (int j = 0; j < 8; ++j) { test = new int[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; test[j] = 0x80; m = LocoNetMessage.makePeerXfr(0x101, 0x8581, test, 0); data = m.getPeerXfrData(); for (int i = 0; i < 8; i++) { Assert.assertEquals("complicated value " + i, "" + test[i], "" + data[i]); } } } @Test @SuppressWarnings("unlikely-arg-type") // int[] seems to be unrelated to LocoNetMessage public void testEqualsFromInt() { int[] t1 = new int[]{0x81, 0x01, 0x02, 0x02}; int[] t2 = new int[]{0x81, 0x01, 0x02, 0x02, 0x03}; int[] t3 = new int[]{0x81, 0x01, 0x02, 0x0F02}; int[] t4 = new int[]{0x81, 0x01, 0x03, 0x02}; int[] t5 = new int[]{0x81, 0x01, 0x02, 0x03}; // last byte not checked Assert.assertTrue((new LocoNetMessage(t1)).equals(new LocoNetMessage(t1))); Assert.assertTrue((new LocoNetMessage(t1)).equals(new LocoNetMessage(t3))); Assert.assertTrue(!(new LocoNetMessage(t1)).equals(new LocoNetMessage(t2))); Assert.assertTrue(!(new LocoNetMessage(t1)).equals(new LocoNetMessage(t4))); Assert.assertTrue((new LocoNetMessage(t1)).equals(new LocoNetMessage(t5))); Assert.assertFalse((new LocoNetMessage(t1)).equals(null)); Assert.assertFalse((new LocoNetMessage(t1)).equals(new int[] {0x81, 0x01, 0x02, 0x02})); } @Test public void testEqualsFromBytes() { byte[] t1 = new byte[]{(byte) 0x81, (byte) 0x01, (byte) 0x02, (byte) 0x02}; byte[] t2 = new byte[]{(byte) 0x81, (byte) 0x01, (byte) 0x02, (byte) 0x02, (byte) 0x03}; byte[] t3 = new byte[]{(byte) 0x81, (byte) 0x01, (byte) 0x02, (byte) 0x02}; byte[] t4 = new byte[]{(byte) 0x81, (byte) 0x01, (byte) 0x03, (byte) 0x02}; byte[] t5 = new byte[]{(byte) 0x81, (byte) 0x01, (byte) 0x02, (byte) 0x03}; // last byte not checked Assert.assertTrue((new LocoNetMessage(t1)).equals(new LocoNetMessage(t1))); Assert.assertTrue((new LocoNetMessage(t1)).equals(new LocoNetMessage(t3))); Assert.assertTrue(!(new LocoNetMessage(t1)).equals(new LocoNetMessage(t2))); Assert.assertTrue(!(new LocoNetMessage(t1)).equals(new LocoNetMessage(t4))); Assert.assertTrue((new LocoNetMessage(t1)).equals(new LocoNetMessage(t5))); } @Test public void testEqualsFromString() { LocoNetMessage t1 = new LocoNetMessage(StringUtil.bytesFromHexString("81 01 02 02")); LocoNetMessage t2 = new LocoNetMessage(StringUtil.bytesFromHexString("81 01 02 02 03")); LocoNetMessage t3 = new LocoNetMessage(StringUtil.bytesFromHexString("81 01 02 02")); LocoNetMessage t4 = new LocoNetMessage(StringUtil.bytesFromHexString("81 01 03 02")); LocoNetMessage t5 = new LocoNetMessage(StringUtil.bytesFromHexString("81 01 02 03")); Assert.assertTrue((new LocoNetMessage(t1)).equals(t1)); Assert.assertTrue((new LocoNetMessage(t1)).equals(t3)); Assert.assertTrue(!(new LocoNetMessage(t1)).equals(t2)); Assert.assertTrue(!(new LocoNetMessage(t1)).equals(t4)); Assert.assertTrue((new LocoNetMessage(t1)).equals(t5)); } @Test public void testEqualsSpecificCase() { LocoNetMessage t1 = new LocoNetMessage(StringUtil.bytesFromHexString("D7 12 00 09 20 13")); LocoNetMessage t2 = new LocoNetMessage(StringUtil.bytesFromHexString("D7 12 00 09 20 13")); LocoNetMessage t3 = new LocoNetMessage(StringUtil.bytesFromHexString("D7 1F 00 01 00 36")); LocoNetMessage t4 = new LocoNetMessage(StringUtil.bytesFromHexString("D7 1F 00 01 00 36")); Assert.assertTrue((new LocoNetMessage(t1)).equals(t1)); Assert.assertTrue((new LocoNetMessage(t1)).equals(t2)); Assert.assertTrue((new LocoNetMessage(t3)).equals(t3)); Assert.assertTrue((new LocoNetMessage(t3)).equals(t4)); Assert.assertTrue(!(new LocoNetMessage(t1)).equals(t3)); Assert.assertTrue(!(new LocoNetMessage(t3)).equals(t1)); } // service routine to check the contents of a single message (not a test) protected void checkPeerXfr(LocoNetMessage m, int src, int dst, int[] d, int code) { Assert.assertEquals("opcode ", 0xE5, m.getElement(0)); Assert.assertEquals("secondary op code ", 0x10, m.getElement(1)); // check the 8 data bytes int pxct1 = m.getElement(5); int pxct2 = m.getElement(10); Assert.assertEquals("data 0", d[0], (m.getElement(6) & 0x7F) + ((pxct1 & 0x01) != 0 ? 0x80 : 0)); Assert.assertEquals("data 1", d[1], (m.getElement(7) & 0x7F) + ((pxct1 & 0x02) != 0 ? 0x80 : 0)); Assert.assertEquals("data 2", d[2], (m.getElement(8) & 0x7F) + ((pxct1 & 0x04) != 0 ? 0x80 : 0)); Assert.assertEquals("data 3", d[3], (m.getElement(9) & 0x7F) + ((pxct1 & 0x08) != 0 ? 0x80 : 0)); Assert.assertEquals("data 4", d[4], (m.getElement(11) & 0x7F) + ((pxct2 & 0x01) != 0 ? 0x80 : 0)); Assert.assertEquals("data 5", d[5], (m.getElement(12) & 0x7F) + ((pxct2 & 0x02) != 0 ? 0x80 : 0)); Assert.assertEquals("data 6", d[6], (m.getElement(13) & 0x7F) + ((pxct2 & 0x04) != 0 ? 0x80 : 0)); Assert.assertEquals("data 7", d[7], (m.getElement(14) & 0x7F) + ((pxct2 & 0x08) != 0 ? 0x80 : 0)); // check code Assert.assertEquals("code low nibble", code & 0x7, (m.getElement(5) & 0x70) / 16); Assert.assertEquals("code high nibble", (code & 0x38) / 8, (m.getElement(10) & 0x70) / 16); // check the source address Assert.assertEquals("low 7 src address", src & 0x7F, m.getElement(2)); // check the dest address Assert.assertEquals("low 7 dst address", dst & 0x7F, m.getElement(3)); Assert.assertEquals("high 7 dst address", (dst & 0x7F00) / 256, m.getElement(4)); } @Test public void testToString() { LocoNetMessage m1, m2; m1 = new LocoNetMessage(new int[] {0x81, 0x7e}); m2 = new LocoNetMessage(new int[] {0xd0, 0x00, 0x40, 0x00, 0x48, 0x65}); Assert.assertEquals("first toString test", "81 7E", m1.toString()); Assert.assertEquals("second toString test", "D0 00 40 00 48 65", m2.toString()); m1 = new LocoNetMessage(new int[] {0xff, 0x00}); Assert.assertEquals("third toString test", "FF 00", m1.toString()); m2 = new LocoNetMessage(new int[] {0xEF, 0x0E, 0x01, 0x33, 0x03, 0x00, 0x30, 0x47, 0x00, 0x00, 0x00, 0x17, 0x53, 0x1C}); Assert.assertEquals("fourth toString test", "EF 0E 01 33 03 00 30 47 00 00 00 17 53 1C", m2.toString()); } @Test public void testToMonitorString() { LocoNetMessage m = new LocoNetMessage(new int[] {0xB2, 0x15, 0x63, 0x72}); Assert.assertEquals("no LocoNet Sensor Manager installed yet", "Sensor LS812 is Low\n", m.toMonitorString()); m = new LocoNetMessage(new int[] {0xb2, 0x1E, 0x47, 0x00}); LocoNetInterfaceScaffold lnis = new LocoNetInterfaceScaffold(new LocoNetSystemConnectionMemo()); LocoNetInterfaceScaffold lnis2 = new LocoNetInterfaceScaffold(new LocoNetSystemConnectionMemo("L2", "LocoNet2")); LnTurnoutManager lntm = new LnTurnoutManager(lnis.getSystemConnectionMemo(), lnis, false); LnTurnoutManager lntm2 = new LnTurnoutManager(lnis2.getSystemConnectionMemo(), lnis2, false); LnSensorManager lnsm = new LnSensorManager(lnis.getSystemConnectionMemo(), false); LnSensorManager lnsm2 = new LnSensorManager(lnis2.getSystemConnectionMemo(), false); jmri.InstanceManager.setTurnoutManager(lntm); jmri.InstanceManager.setTurnoutManager(lntm2); jmri.InstanceManager.setSensorManager(lnsm); jmri.InstanceManager.setSensorManager(lnsm2); LnSensor s1 = (LnSensor) lnsm.provideSensor("LS1853"); LnSensor s2 = (LnSensor) lnsm2.provideSensor("L2S1853"); Assert.assertEquals("Sensor LS1853 is Low\n", m.toMonitorString()); Assert.assertEquals("Sensor LS1853 is Low\n", m.toMonitorString("L")); Assert.assertEquals("Sensor L2S1853 is Low\n", m.toMonitorString("L2")); s1.setUserName("grime"); Assert.assertEquals("Sensor LS1853 (grime) is Low\n", m.toMonitorString()); Assert.assertEquals("Sensor LS1853 (grime) is Low\n", m.toMonitorString("L")); Assert.assertEquals("Sensor L2S1853 is Low\n", m.toMonitorString("L2")); s2.setUserName("brightly"); Assert.assertEquals("Sensor LS1853 (grime) is Low\n", m.toMonitorString()); Assert.assertEquals("Sensor LS1853 (grime) is Low\n", m.toMonitorString("L")); Assert.assertEquals("Sensor L2S1853 (brightly) is Low\n", m.toMonitorString("L2")); lntm.dispose(); lntm2.dispose(); lnsm.dispose(); lnsm2.dispose(); } @Test public void testLowByte() { for (int i = 0; i < 1025; ++i) { Assert.assertEquals("testing lowbyte for "+i, i & 0xFF, LocoNetMessage.lowByte(i)); } } @Test public void testHighByte() { for (int i = 0; i < 18; ++i) { Assert.assertEquals("testing highbyte for " + (1 << i), ((1 << i) & 0xFF00) >> 8, LocoNetMessage.highByte(1 << i)); Assert.assertEquals("testing highbyte for "+ (0x0ffff >> i), ((0xffff >> (i+8)) & 0xFF), LocoNetMessage.highByte(0xffff >> i)); } jmri.util.JUnitAppender.assertErrorMessage("highByte called with too large value: 10000"); jmri.util.JUnitAppender.assertErrorMessage("highByte called with too large value: 20000"); LocoNetMessage.highByte(0xfeffff); jmri.util.JUnitAppender.assertErrorMessage("highByte called with too large value: feffff"); } @Test public void testHighBit() { for (int i = -1; i < 1025; ++i) { Assert.assertEquals(((i & 0x80)== 0x80),LocoNetMessage.highBit(i)); if ((i < 0) || ((i > 255))) { jmri.util.JUnitAppender.assertErrorMessage( "highBit called with too large value: 0x"+Integer.toHexString(i)); } } } @Test public void testInputRepAddr() { LocoNetMessage m = new LocoNetMessage(2); m.setOpCode(0x81); Assert.assertEquals(-1, m.inputRepAddr()); m = new LocoNetMessage(new int[] {0xb2, 0x00, 0x00, 0x00}); Assert.assertEquals(0, m.inputRepAddr()); m.setElement(1, 0x1); Assert.assertEquals(2, m.inputRepAddr()); m.setElement(1, 0x0); m.setElement(2, 0x1); Assert.assertEquals(256, m.inputRepAddr()); m.setElement(2, 0x21); Assert.assertEquals(257, m.inputRepAddr()); } @Test public void testSensorAddr() { LocoNetMessage m = new LocoNetMessage(new int[] {0x00, 0x00, 0x00, 0x00}); Assert.assertEquals(0, m.sensorAddr()); for (int i = 0; i < 7; ++i) { m.setElement(1, 1<=0; --i) { expectHash = (expectHash << 7) +a[i]; } expectHash += m.getNumDataElements(); Assert.assertEquals(expectHash, m.hashCode()); LocoNetMessage m2 = new LocoNetMessage(new int[] {0x81, 0x52}); Assert.assertEquals(0x81+(0x52*128)+2, m2.hashCode()); LocoNetMessage m3 = new LocoNetMessage(new int[] {0x97}); Assert.assertEquals(0x98, m3.hashCode()); jmri.util.JUnitAppender.assertErrorMessage("Cannot create a LocoNet message of length shorter than two."); LocoNetMessage m4 = new LocoNetMessage(new int[] {}); Assert.assertEquals(0x0, m4.hashCode()); jmri.util.JUnitAppender.assertErrorMessage("Cannot create a LocoNet message of length shorter than two."); } @Test public void testSetParity() { int[] a = new int[] {0xE7, 0x0E, 0x02, 0x23, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x17, 0x53, 99}; LocoNetMessage m = new LocoNetMessage(a); m.setParity(); Assert.assertEquals(0x34, m.getElement(13)); int[] b = new int[] {0xD3, 0x12, 0x34, 0x56, 0x78, 0, 0x98, 0x87, 0x76, 0x65, 0}; m = new LocoNetMessage(b); m.setParity(); Assert.assertEquals("byte 5 expected", 0x24, m.getElement(5)); Assert.assertEquals("byte 10 expected", 0xF3, m.getElement(10)); int[] c = new int[] {0xD3, 0x34, 0x12, 0x78, 0x56, 0}; m = new LocoNetMessage(c); m.setParity(); Assert.assertEquals("byte 5 expected", 0x24, m.getElement(5)); int[] d = new int[] {0xD3, 0x34, 0x10, 0x78, 0x56, 0}; m = new LocoNetMessage(d); m.setParity(); Assert.assertEquals("byte 5 expected", 0x26, m.getElement(5)); } @Test public void testCheckParity() { int[] a = new int[] {0xD3, 0x12, 0x34, 0x56, 0x78, 0, 0x98, 0x87, 0x76, 0x65, 0}; LocoNetMessage m = new LocoNetMessage(a); Assert.assertEquals(11, m.getNumDataElements()); Assert.assertFalse(m.checkParity()); for (int i = 0; i < 128; ++i) { m.setElement(10, i); Assert.assertFalse(m.checkParity()); } m.setElement(5, 0x24); Assert.assertFalse(m.checkParity()); m.setElement(10, 0xF3); Assert.assertTrue(m.checkParity()); m.setElement(5, 0x23); Assert.assertFalse(m.checkParity()); a = new int[] {0xD3, 0x2, 0x4, 0x8, 0x20, 0}; m = new LocoNetMessage(a); Assert.assertFalse(m.checkParity()); m.setElement(5, 2); Assert.assertTrue(m.checkParity()); m = new LocoNetMessage(new int[] {0x89, 0x53, 0x3c, 0x12}); Assert.assertFalse(m.checkParity()); m.setElement(3, 0x19); Assert.assertTrue(m.checkParity()); } @BeforeEach public void setUp() { JUnitUtil.setUp(); } @AfterEach public void tearDown() { JUnitUtil.tearDown(); } }