package jmri.implementation; import jmri.ProgListener; import jmri.Programmer; import jmri.progdebugger.ProgDebugger; import org.junit.jupiter.api.*; import org.junit.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Test the ResettingOffsetHighCvProgrammerFacade class. * * @author Bob Jacobsen Copyright 2013, 2014 * */ public class ResettingOffsetHighCvProgrammerFacadeTest { int readValue = -2; boolean replied = false; @Test public void testWriteReadDirect() throws jmri.ProgrammerException, InterruptedException { ProgDebugger dp = new ProgDebugger(); dp.setTestReadLimit(256); dp.setTestWriteLimit(256); Programmer p = new ResettingOffsetHighCvProgrammerFacade(dp, "256", "7", "10", "100", "200"); ProgListener l = new ProgListener() { @Override public void programmingOpReply(int value, int status) { log.debug("callback value={} status={}", value, status); replied = true; readValue = value; } }; p.writeCV("4", 12, l); waitReply(); Assert.assertEquals("target written", 12, dp.getCvVal(4)); Assert.assertTrue("index not written", !dp.hasBeenWritten(7)); p.readCV("4", l); waitReply(); Assert.assertEquals("read back", 12, readValue); } @Test public void testWriteReadDirectHighCV() throws jmri.ProgrammerException, InterruptedException { ProgDebugger dp = new ProgDebugger(); dp.setTestReadLimit(1024); dp.setTestWriteLimit(1024); Programmer p = new ResettingOffsetHighCvProgrammerFacade(dp, "256", "7", "10", "100", "200"); ProgListener l = new ProgListener() { @Override public void programmingOpReply(int value, int status) { log.debug("callback value={} status={}", value, status); replied = true; readValue = value; } }; p.writeCV("258", 12, l); waitReply(); Assert.assertEquals("target written", 12, dp.getCvVal(258)); Assert.assertTrue("index not written", !dp.hasBeenWritten(7)); p.readCV("258", l); waitReply(); Assert.assertEquals("read back", 12, readValue); } @Test public void testWriteReadIndexed() throws jmri.ProgrammerException, InterruptedException { ProgDebugger dp = new ProgDebugger(); dp.setTestReadLimit(256); dp.setTestWriteLimit(256); Programmer p = new ResettingOffsetHighCvProgrammerFacade(dp, "256", "7", "10", "100", "200"); ProgListener l = new ProgListener() { @Override public void programmingOpReply(int value, int status) { log.debug("callback value={} status={}", value, status); replied = true; readValue = value; } }; p.writeCV("258", 12, l); waitReply(); Assert.assertTrue("target not written", !dp.hasBeenWritten(258)); Assert.assertEquals("index written", 0, dp.getCvVal(7)); // wrote 220, then wrote back Assert.assertEquals("value written", 12, dp.getCvVal(58)); Assert.assertEquals("did 3 operations", 3, dp.nOperations); } @Test public void testCvLimit() { ProgDebugger dp = new ProgDebugger(); dp.setTestReadLimit(256); dp.setTestWriteLimit(256); Programmer p = new ResettingOffsetHighCvProgrammerFacade(dp, "256", "7", "10", "100", "200"); Assert.assertTrue("CV limit read OK", p.getCanRead("1024")); Assert.assertTrue("CV limit write OK", p.getCanWrite("1024")); Assert.assertTrue("CV limit read fail", !p.getCanRead("1025")); Assert.assertTrue("CV limit write fail", !p.getCanWrite("1025")); } synchronized void waitReply() throws InterruptedException { while (!replied) { wait(200); } replied = false; } @BeforeEach public void setUp() { jmri.util.JUnitUtil.setUp(); } @AfterEach public void tearDown(){ jmri.util.JUnitUtil.tearDown(); } private static final Logger log = LoggerFactory.getLogger(ResettingOffsetHighCvProgrammerFacadeTest.class); }