strolch-plc/plc-core/src/test/java/li/strolch/plc/core/hw/PlcTest.java

118 lines
3.3 KiB
Java

package li.strolch.plc.core.hw;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
import li.strolch.model.StrolchValueType;
import li.strolch.plc.model.ConnectionState;
import li.strolch.plc.model.PlcAddress;
import li.strolch.plc.model.PlcAddressType;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlcTest {
private static final Logger logger = LoggerFactory.getLogger(PlcTest.class);
private static Plc plc;
// conveyor: on/off and occupied
private static TestPlcConnection conveyorCon;
private static AtomicBoolean stateOnOff;
private static PlcAddress positionOn;
private static PlcAddress positionOff;
private static PlcAddress positionOccupied;
@BeforeClass
public static void beforeClass() {
// plc
plc = new DefaultPlc();
// conveyor connection with keys
stateOnOff = new AtomicBoolean();
conveyorCon = new TestPlcConnection(plc, "Connection.Conveyor01",
new HashSet<>(asList("Conveyor.Occupied", "Conveyor.OnOff")), e -> stateOnOff.set((Boolean) e));
conveyorCon.initialize(Collections.emptyMap());
plc.addConnection(conveyorCon);
positionOn = new PlcAddress(PlcAddressType.Telegram, "Conveyor", "On", "Conveyor.OnOff",
StrolchValueType.BOOLEAN, true, false, false);
positionOff = new PlcAddress(PlcAddressType.Telegram, "Conveyor", "Off", "Conveyor.OnOff",
StrolchValueType.BOOLEAN, false, false, false);
positionOccupied = new PlcAddress(PlcAddressType.Notification, "Conveyor", "Occupied", "Conveyor.Occupied",
StrolchValueType.BOOLEAN, null, false, false);
plc.registerNotificationMapping(positionOccupied);
}
@Test
public void shouldTestConveyorOnOff() {
assertFalse(stateOnOff.get());
plc.send(positionOn);
assertTrue(stateOnOff.get());
plc.send(positionOff);
assertFalse(stateOnOff.get());
}
@Test
public void shouldTestConveyorOccupied() {
AtomicBoolean state = new AtomicBoolean(false);
plc.register(positionOccupied, (key, value) -> state.set((Boolean) value));
conveyorCon.notify("Conveyor.Occupied", true);
assertTrue(state.get());
conveyorCon.notify("Conveyor.Occupied", false);
assertFalse(state.get());
}
static class TestPlcConnection extends PlcConnection {
private final Set<String> addresses;
private final Consumer<Object> sendHandler;
public TestPlcConnection(Plc plc, String id, Set<String> addresses, Consumer<Object> sendHandler) {
super(plc, id);
this.addresses = addresses;
this.sendHandler = sendHandler;
}
@Override
public void initialize(Map<String, Object> parameters) {
// no-op
}
@Override
public boolean connect() {
this.connectionState = ConnectionState.Connected;
return true;
}
@Override
public void disconnect() {
//
}
@Override
public Set<String> getAddresses() {
return this.addresses;
}
@Override
public void send(String address, Object value) {
this.sendHandler.accept(value);
}
public void notify(String address, Object value) {
this.plc.syncNotify(address, value);
}
}
}